[Bug rtl-optimization/24034] New: Regrename: Inconsistency Failure
krebbel1 at de dot ibm dot com
gcc-bugzilla@gcc.gnu.org
Fri Sep 23 13:49:00 GMT 2005
gcc -v:
Configured with: /build/gcc-4.1/configure --prefix=/build/gcc-4.1-install
--enable-shared --with-system-zlib --enable-threads=posix --enable-__cxa_atexit
--enable-checking=release --program-suffix=-4.1 --disable-multilib
Thread model: posix
gcc version 4.1.0 20050920 (experimental)
Testcase reduced from 920501-4.c:
Compile with -O3 -funroll-loops
foo ()
{
int r0[8186];
int r1[2];
int i, m, n, m_max;
int f;
double fm, ft;
while (1)
{
if (m % 4 == 2)
++m;
if (m_max != 0 && m > m_max)
break;
while (n % f == 0)
{
while ((ft != 0) && (ft < fm))
{
r1[i] = 0;
}
while (r0[i] != 0 && r1[i] != 0)
{
if (r0[i] < r1[i])
{
}
}
}
}
}
global alloc puts the uninitialized variables n, f, m_max into r1.
Because global alloc does not consider quantities for uninitialized variables
conflicting with others r1 is also used locally in bb6, bb10 and in bb20.
37.greg:
(insn 265 201 203 20 (set (reg:SI 1 %r1 [93])
(const_int 0 [0x0])) 51 {*movsi_zarch} (nil)
(expr_list:REG_EQUIV (const_int 0 [0x0])
(nil)))
(insn:QI 203 265 204 20 (parallel [
(set (reg:CCL3 33 %cc)
(compare:CCL3 (reg:SI 1 %r1 [93])
(reg:SI 2 %r2 [89])))
(clobber (reg:SI 1 %r1 [93]))
])
Updated life info in 41.csa says that r1 is dead at begin and life at end of bb20.
Regrename then decides to rename r1 to r5 and performs a local life update.
Because r1 is not set in bb20 anymore and it is live at bb end it can be
concluded that r1 has to be live at bb start. But this differs from the
state before and the assertion in verify_local_live_at_start ist triggered.
44.rnreg:
Basic block 20:
Closing chain %r1 at insn 203 (terminate_dead)
Register %r1 (1): 265 [GENERAL_REGS] 203 [GENERAL_REGS] 203 [GENERAL_REGS]
Register %r1 in insn 203, renamed as %r5
live_at_start mismatch in bb 20, aborting
New:
first = 0x80531570 current = 0x80531570 indx = 0
0x80531570 next = (nil) prev = (nil) indx = 0
bits = { 0 1 2 3 4 13 15 16 }
Old:
;; basic block 20, loop depth 1, count 0
;; prev block 19, next block 21
;; pred: 18 [79.0%] 19 [100.0%] (fallthru)
;; succ: 10 [3.5%] (loop_exit) 21 [96.5%] (fallthru)
;; Registers live at start: 0 [%r0] 2 [%r2] 3 [%r3] 4 [%r4] 13 [%r13] 15 [%r15]
16 [%f0
]
...
(insn 265 201 203 20 (set (reg:SI 5 %r5 [93])
(const_int 0 [0x0])) 51 {*movsi_zarch} (nil)
(expr_list:REG_EQUIV (const_int 0 [0x0])
(nil)))
(insn:QI 203 265 204 20 (parallel [
(set (reg:CCL3 33 %cc)
(compare:CCL3 (reg:SI 5 %r5 [93])
(reg:SI 2 %r2 [89])))
(clobber (reg:SI 5 %r5 [93]))
])
The problem was already discussed on gcc mailing list:
http://gcc.gnu.org/ml/gcc/2005-08/msg00448.html
A possible solution could be performing a global live update instead of a local
which would not trigger the assertion. Additionally for correct live info we
should call the make_accurate_live_analysis which is used in global alloc
afterwards.
--
Summary: Regrename: Inconsistency Failure
Product: gcc
Version: 4.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: rtl-optimization
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: krebbel1 at de dot ibm dot com
CC: gcc-bugs at gcc dot gnu dot org
GCC build triplet: s390x-ibm-linux
GCC host triplet: s390x-ibm-linux
GCC target triplet: s390x-ibm-linux
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24034
More information about the Gcc-bugs
mailing list