This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c++/27826] [4.0/4.1 Regression] ICE in copy_to_mode_reg



------- 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]