[LLVMbugs] [Bug 9246] New: LLVM fails to merge blocks with calls that only differ in attributes.
bugzilla-daemon at llvm.org
bugzilla-daemon at llvm.org
Fri Feb 18 08:52:04 PST 2011
http://llvm.org/bugs/show_bug.cgi?id=9246
Summary: LLVM fails to merge blocks with calls that only differ
in attributes.
Product: libraries
Version: trunk
Platform: PC
OS/Version: All
Status: NEW
Severity: enhancement
Priority: P
Component: Scalar Optimizations
AssignedTo: unassignedbugs at nondot.org
ReportedBy: benny.kra at gmail.com
CC: llvmbugs at cs.uiuc.edu
Created an attachment (id=6177)
--> (http://llvm.org/bugs/attachment.cgi?id=6177)
preprocessed C testcase
For the attached test case clang -O3 generates
===
define i8* @foo(i8* %x, i8* %y) nounwind ssp {
entry:
%0 = tail call i64 @llvm.objectsize.i64(i8* %x, i1 false)
%cmp = icmp eq i64 %0, -1
br i1 %cmp, label %cond.false, label %cond.true
cond.true: ; preds = %entry
%call = tail call i8* @__memcpy_chk(i8* %x, i8* %y, i64 42, i64 %0)
br label %cond.end
cond.false: ; preds = %entry
%call.i = tail call i8* @__memcpy_chk(i8* %x, i8* %y, i64 42, i64 %0)
nounwind
br label %cond.end
cond.end: ; preds = %cond.false,
%cond.true
%cond = phi i8* [ %call, %cond.true ], [ %call.i, %cond.false ]
ret i8* %cond
}
declare i64 @llvm.objectsize.i64(i8*, i1) nounwind readnone
declare i8* @__memcpy_chk(i8*, i8*, i64, i64) nounwind
===
cond.true and cond.false should be merged, eliminating the icmp+branch.
This happens because darwin10's headers expand memcpy into a normal
__memcpy_chk call and a call to an inlined function. At this point neither
__memcpy_chk have a nounwind attribute. When the inliner inlines the function
it detects that it was "nounwind" and applies the attribute to the inlined
call.
--
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