Re: gcc 4.5.1 / as 2.20.51.0.11 miscompiling drivers/char/i8k.c ?

From: Jakub Jelinek
Date: Mon Nov 15 2010 - 14:13:47 EST


On Mon, Nov 15, 2010 at 07:58:48PM +0100, Jakub Jelinek wrote:
> Now, not sure why this happens, as there is
> case GIMPLE_ASM:
> for (i = 0; i < gimple_asm_nclobbers (stmt); i++)
> {
> tree op = gimple_asm_clobber_op (stmt, i);
> if (simple_cst_equal(TREE_VALUE (op), memory_identifier_string) == 1)
> {
> if (dump_file)
> fprintf (dump_file, " memory asm clobber is not const/pure");
> /* Abandon all hope, ye who enter here. */
> local->pure_const_state = IPA_NEITHER;
> }
> }
> Debugging...

Ah, the problem is that memory_identifier_string is only initialized in
ipa-reference.c's initialization, so it can be (and is in this case) NULL in
ipa-pure-const.c.

Two possible fixes (the latter is apparently what is used in
tree-ssa-operands.c, so is probably sufficient). Guess ipa-reference.c
should be changed to do the same and just drop memory_identifier_string.

Jakub
--- gcc/ipa-pure-const.c.jj 2010-08-11 16:06:19.000000000 +0200
+++ gcc/ipa-pure-const.c 2010-11-15 20:06:36.121310614 +0100
@@ -460,7 +460,10 @@ check_stmt (gimple_stmt_iterator *gsip,
for (i = 0; i < gimple_asm_nclobbers (stmt); i++)
{
tree op = gimple_asm_clobber_op (stmt, i);
- if (simple_cst_equal(TREE_VALUE (op), memory_identifier_string) == 1)
+ if (TREE_CODE (TREE_VALUE (op)) == STRING_CST
+ && TREE_STRING_LENGTH (TREE_VALUE (op)) == sizeof ("memory")
+ && memcmp (TREE_STRING_POINTER (TREE_VALUE (op)), "memory",
+ sizeof ("memory")) == 0)
{
if (dump_file)
fprintf (dump_file, " memory asm clobber is not const/pure");
--- gcc/ipa-pure-const.c.jj 2010-08-11 16:06:19.000000000 +0200
+++ gcc/ipa-pure-const.c 2010-11-15 20:07:51.463716989 +0100
@@ -460,7 +460,7 @@ check_stmt (gimple_stmt_iterator *gsip,
for (i = 0; i < gimple_asm_nclobbers (stmt); i++)
{
tree op = gimple_asm_clobber_op (stmt, i);
- if (simple_cst_equal(TREE_VALUE (op), memory_identifier_string) == 1)
+ if (strcmp (TREE_STRING_POINTER (TREE_VALUE (link)), "memory") == 0)
{
if (dump_file)
fprintf (dump_file, " memory asm clobber is not const/pure");