[LLVMbugs] [Bug 2343] New: llvm-gcc bootstrap is broken
bugzilla-daemon at cs.uiuc.edu
bugzilla-daemon at cs.uiuc.edu
Mon May 19 10:03:20 PDT 2008
http://llvm.org/bugs/show_bug.cgi?id=2343
Summary: llvm-gcc bootstrap is broken
Product: libraries
Version: trunk
Platform: PC
OS/Version: Linux
Status: NEW
Severity: critical
Priority: P2
Component: Common Code Generator Code
AssignedTo: unassignedbugs at nondot.org
ReportedBy: asl at math.spbu.ru
CC: evan.cheng at apple.com, llvmbugs at cs.uiuc.edu,
nlewycky at google.com
Created an attachment (id=1655)
--> (http://llvm.org/bugs/attachment.cgi?id=1655)
Function is question
It seems, that recent taildup changes revealed some subtle bugs not known
before. Consider attached .bc file. The C snippet in question is:
tree cases = get_cases_for_edge (e, stmt);
/* If we have a list of cases associated with E, then use it
as it's a lot faster than walking the entire case vector. */
if (cases)
{
edge e2 = find_edge (e->src, dest);
tree last, first;
first = cases;
while (cases)
{
last = cases;
CASE_LABEL (cases) = label;
cases = TREE_CHAIN (cases);
}
/* If there was already an edge in the CFG, then we need
to move all the cases associated with E to E2. */
if (e2)
{
tree cases2 = get_cases_for_edge (e2, stmt);
TREE_CHAIN (last) = TREE_CHAIN (cases2);
TREE_CHAIN (cases2) = first;
}
}
>From this we can see, that last is the 'if (e2)' is always non-NULL. The LLVM
IR is also fine (only part showed):
bb392: ; preds = %bb379, %bb319
%last.0 = phi %struct.tree_node* [ undef, %bb319 ], [ %cases.0, %bb379
] ; <%struct.tree_node*> [#use$
%cases.0 = phi %struct.tree_node* [ %tmp314, %bb319 ], [ %tmp391,
%bb379 ] ; <%struct.tree_node*> [#use$
%tmp394 = icmp eq %struct.tree_node* %cases.0, null ; <i1>
[#uses=1]
br i1 %tmp394, label %bb397, label %bb326
This is header of the loop and jump from %bb319 is possible iff %tmp314 is
non-null, thus loop executes at least one time and %last.0 is properly
initialized (thus - non null).
Let's look into generated assembler:
movl %ecx, %ebx
testl %ebx, %ebx
jne .LBB1_47 # bb326
.LBB1_52: # bb397
testl %eax, %eax
je .LBB1_80 # bb695
.LBB1_53: # bb402
movl %esi, 4(%esp)
movl %eax, (%esp)
call get_cases_for_edge
movl (%eax), %esi
movl %esi, (%ebx)
here %last.0 is %ebx and we saw that after call %ebx is always zero! I suppose,
that codedegen 'merged' %last.0 and %cases.0 somehow (or some codegen passes)
--
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
More information about the llvm-bugs
mailing list