[PATCH] Stop putting operations after a tail call
Tim Northover
t.p.northover at gmail.com
Tue Jul 2 12:25:10 PDT 2013
Hi,
compnerd recently pointed out a disturbingly trivial failure when
enabling tail calls on ARM Linux targets (though fortunately probably
inaccessible from clang):
declare i8* @g(i8*)
define i8* @f(i8* %a) {
entry:
%0 = tail call i8* @g(i8* %a)
ret i8* %0
}
When compiled at -O0 this hits an assertion failure[1]. There are many
steps along the way, but I think the first objectively wrong decision
is putting a tokenfactor for vreg exports (and hence possibly other
operations) after the TC_RETURN instruction.
The attached patch simply forgets about any pending vreg exports when
a tail-call is encountered. Intuitively this seems like right (or at
least harmless) behaviour, but I'm not familiar enough with FastISel
to be sure.
Does it seem reasonable?
Cheers.
Tim.
[1] Via Schroedinger's FastISel; not supported on Thumb Linux but
still gets vregs set ready for it.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: remove-defs-after-tail.diff
Type: application/octet-stream
Size: 1722 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130702/03e188d0/attachment.obj>
More information about the llvm-commits
mailing list