------- Comment #16 from rguenth at gcc dot gnu dot org 2007-01-05 13:01 ------- Reconfirmed. The problem still exists.
#1 0x0844d296 in copy_to_mode_reg (mode=SImode, x=0xb7c8b1a0) at /home/richard/src/gcc-4_1-branch/gcc/explow.c:577 577 gcc_assert (GET_MODE (x) == mode || GET_MODE (x) == VOIDmode); (gdb) call debug_rtx (x) (reg:HI 59 [ test$type ]) #1 0x0844d296 in copy_to_mode_reg (mode=SImode, x=0xb7c8b1a0) at /home/richard/src/gcc-4_1-branch/gcc/explow.c:577 #2 0x086464b7 in prepare_operand (icode=928, x=0xb7c8b1a0, opnum=1, mode=SImode, wider_mode=SImode, unsignedp=0) at /home/richard/src/gcc-4_1-branch/gcc/optabs.c:3576 #3 0x0864672d in emit_cmp_and_jump_insn_1 (x=0xb7c8b190, y=0xb7c8b1a0, mode=SImode, comparison=EQ, unsignedp=0, label=0x0) at /home/richard/src/gcc-4_1-branch/gcc/optabs.c:3632 #4 0x086468a6 in emit_cmp_and_jump_insns (x=0xb7c8b190, y=0xb7c8b1a0, comparison=EQ, size=0x0, mode=SImode, unsignedp=0, label=0x0) at /home/richard/src/gcc-4_1-branch/gcc/optabs.c:3696 #5 0x086468ea in emit_cmp_insn (x=0xb7c8b190, y=0xb7c8b1a0, comparison=EQ, size=0x0, mode=SImode, unsignedp=0) at /home/richard/src/gcc-4_1-branch/gcc/optabs.c:3705 #6 0x08413b00 in compare_from_rtx (op0=0xb7c8b190, op1=0xb7c8b1a0, code=EQ, unsignedp=0, mode=SImode, size=0x0) at /home/richard/src/gcc-4_1-branch/gcc/dojump.c:824 #7 0x0846185b in emit_store_flag (target=0xb7c8b210, code=EQ, op0=0xb7c8b190, op1=0xb7c8b1a0, mode=SImode, unsignedp=0, normalizep=1) at /home/richard/src/gcc-4_1-branch/gcc/expmed.c:5302 #8 0x08490ceb in do_store_flag (exp=0xb7be2168, target=0xb7c8b210, mode=SImode, only_cheap=0) at /home/richard/src/gcc-4_1-branch/gcc/expr.c:8943 #9 0x0848a2da in expand_expr_real_1 (exp=0xb7be2168, target=0xb7c8b210, tmode=SImode, modifier=EXPAND_NORMAL, alt_rtl=0x0) at /home/richard/src/gcc-4_1-branch/gcc/expr.c:8227 (gdb) call debug_tree (exp) <eq_expr 0xb7be2168 type <integer_type 0xb7bec284 int sizes-gimplified public SI size <integer_cst 0xb7bda3f0 constant invariant 32> unit size <integer_cst 0xb7bda180 constant invariant 4> align 32 symtab 0 alias set -1 precision 32 min <integer_cst 0xb7bda3a8 -2147483648> max <integer_cst 0xb7bda3c0 2147483647> pointer_to_this <pointer_type 0xb7becc38>> arg 0 <var_decl 0xb7c8a5d8 SR.40 type <integer_type 0xb7bec284 int> used ignored SI file t.i line 9 size <integer_cst 0xb7bda3f0 32> unit size <integer_cst 0xb7bda180 4> align 32 context <function_decl 0xb7c7ee80 f> (reg:SI 58 [ SR.40 ])> arg 1 <var_decl 0xb7c8a528 test$type type <integer_type 0xb7bec1cc short int HI size <integer_cst 0xb7bda300 constant invariant 16> unit size <integer_cst 0xb7bda318 constant invariant 2> align 16 symtab 0 alias set -1 precision 16 min <integer_cst 0xb7bda2a0 -32768> max <integer_cst 0xb7bda2d0 32767>> used HI file t.i line 8 size <integer_cst 0xb7bda300 16> unit size <integer_cst 0xb7bda318 2> align 16 context <function_decl 0xb7c7ee80 f> (reg:HI 59 [ test$type ])>> so we have wrong types on the tree we expand (gdb) call debug_generic_expr (exp) SR.40D.1791 == test$typeD.1789 out-of-ssa / TER introduce this mismatch. After .t92.uncprop we have int f() () { intD.2 SR.40D.1798; short intD.12 SR.39D.1797; short intD.12 test$typeD.1796; struct GeometryD.1732 testD.1740; short intD.12 D.1745; short intD.12 D.1744; struct GeometryD.1732 D.1743; struct GeometryD.1732 D.1741; intD.2 D.1742; <bb 0>: D.1744_10 = SR.40D.1798_9; D.1742_7 = D.1744_10 == test$typeD.1796_11; return D.1742_7; } while .t93.optimized contains Analyzing Edge Insertions. int f() () { intD.2 SR.40D.1798; short intD.12 SR.39D.1797; short intD.12 test$typeD.1796; struct GeometryD.1732 testD.1740; short intD.12 D.1745; short intD.12 D.1744; struct GeometryD.1732 D.1743; struct GeometryD.1732 D.1741; intD.2 D.1742; <bb 0>: return SR.40D.1798 == test$typeD.1796; } -- rguenth at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |amacleod at redhat dot com Last reconfirmed|2006-10-21 21:32:50 |2007-01-05 13:01:17 date| | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27826