http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52573

             Bug #: 52573
           Summary: [4.5/4.6/4.7/4.8 regression] regrename creates
                    overlapping register allocations for output operands
    Classification: Unclassified
           Product: gcc
           Version: 4.8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: sch...@linux-m68k.org
            Target: m86k-*


gcc.c-torture/execute/20040709-1.c when compiled with -O3 -funroll-loops (which
enables -frename-registers) generates:

        muls.l #-2004318071,%d1:%d1

which produces undefined results.  regrename transforms

(insn 118 200 119 7 (parallel [
            (set (reg:SI 1 %d1 [235])
                (truncate:SI (lshiftrt:DI (mult:DI (sign_extend:DI (reg:SI 3
%d3 [236]))
                            (const_int -2004318071 [0x88888889]))
                        (const_int 32 [0x20]))))
            (clobber (reg:SI 3 %d3 [236]))
        ]) ../gcc/gcc/testsuite/gcc.c-torture/execute/20040709-1.c:91 192
{const_smulsi3_highpart}
     (expr_list:REG_DEAD (reg:SI 3 %d3 [236])
        (expr_list:REG_UNUSED (reg:SI 3 %d3 [236])
            (nil))))

into

(insn 118 200 119 7 (parallel [
            (set (reg:SI 1 %d1 [235])
                (truncate:SI (lshiftrt:DI (mult:DI (sign_extend:DI (reg:SI 1
%d1 [236]))
                            (const_int -2004318071 [0x88888889]))
                        (const_int 32 [0x20]))))
            (clobber (reg:SI 1 %d1 [236]))
        ]) ../gcc/gcc/testsuite/gcc.c-torture/execute/20040709-1.c:91 192
{const_smulsi3_highpart}
     (expr_list:REG_DEAD (reg:SI 3 %d3 [236])
        (expr_list:REG_UNUSED (reg:SI 3 %d3 [236])
            (nil))))

The simplified testcase:

int mod (int a) { return a % 15; }

reproduces the bug with 4.5 and 4.6, though not with 4.7/4.8.

Reply via email to