[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