RFC: PR 19650
Dale Johannesen
dalej@apple.com
Fri Jan 28 00:42:00 GMT 2005
This is due to a problem in folding. fold() is given this:
<mult_expr 0x77d150
type <integer_type 0x4240c400 long unsigned int public unsigned
sizetype SI
arg 0 <nop_expr 0x77fd80 type <integer_type 0x4240c400 long
unsigned int>
arg 0 <eq_expr 0x77dcf0 type <boolean_type 0x4240ca80 bool>
arg 0 <var_decl 0x77a280>
arg 1 <integer_cst 0x424dcda0 constant invariant 2>>>
arg 1 <integer_cst 0x4240e380 4>>
which gets into the optimization in
fold_binary_op_with_conditional_arg, which asks fold to do this:
<mult_expr 0x73e180
type <integer_type 0x4240c400 long unsigned int public unsigned
sizetype SI
constant invariant
arg 0 <integer_cst 0x4240e9a0 type <boolean_type 0x4240ca80 bool>
constant invariant 1>
arg 1 <integer_cst 0x4240e380 4>>
which gets evaluated in type boolean, resulting in 0 rather than 4.
I'm not sure where in the twisty
little passages this should be fixed, but
fold_binary_op_with_conditional_arg is taking a type
from the EQ_EXPR, even though that should always be boolean (right)?
Which is suspicious,
and I'm inclined to think it should be using the input type instead.
Like this:
Index: fold-const.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/fold-const.c,v
retrieving revision 1.497
diff -u -d -b -w -p -r1.497 fold-const.c
--- fold-const.c 23 Jan 2005 15:05:29 -0000 1.497
+++ fold-const.c 27 Jan 2005 22:45:48 -0000
@@ -5412,10 +5412,10 @@ fold_binary_op_with_conditional_arg (enu
}
else
{
- tree testtype = TREE_TYPE (cond);
+ /*tree testtype = TREE_TYPE (cond);*/
test = cond;
- true_value = constant_boolean_node (true, testtype);
- false_value = constant_boolean_node (false, testtype);
+ true_value = constant_boolean_node (true, /*test*/type);
+ false_value = constant_boolean_node (false, /*test*/type);
}
if (lhs == 0)
Does this look like the right approach?
More information about the Gcc
mailing list