Skip to content

Commit 44e5d12

Browse files
committed
Merging r326521:
------------------------------------------------------------------------ r326521 | indutny | 2018-03-01 16:59:27 -0800 (Thu, 01 Mar 2018) | 13 lines [ArgumentPromotion] don't break musttail invariant PR36543 Summary: Do not break musttail invariant by promoting arguments of musttail callee or caller. Reviewers: sanjoy, dberlin, hfinkel, george.burgess.iv, fhahn, rnk Reviewed By: rnk Subscribers: rnk, llvm-commits Differential Revision: https://reviews.llvm.org/D43926 ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_60@329858 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent b67ea33 commit 44e5d12

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

lib/Transforms/IPO/ArgumentPromotion.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -847,10 +847,20 @@ promoteArguments(Function *F, function_ref<AAResults &(Function &F)> AARGetter,
847847
if (CS.getInstruction() == nullptr || !CS.isCallee(&U))
848848
return nullptr;
849849

850+
// Can't change signature of musttail callee
851+
if (CS.isMustTailCall())
852+
return nullptr;
853+
850854
if (CS.getInstruction()->getParent()->getParent() == F)
851855
isSelfRecursive = true;
852856
}
853857

858+
// Can't change signature of musttail caller
859+
// FIXME: Support promoting whole chain of musttail functions
860+
for (BasicBlock &BB : *F)
861+
if (BB.getTerminatingMustTailCall())
862+
return nullptr;
863+
854864
const DataLayout &DL = F->getParent()->getDataLayout();
855865

856866
AAResults &AAR = AARGetter(*F);
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
; RUN: opt < %s -argpromotion -S | FileCheck %s
2+
; PR36543
3+
4+
; Don't promote arguments of musttail callee
5+
6+
%T = type { i32, i32, i32, i32 }
7+
8+
; CHECK-LABEL: define internal i32 @test(%T* %p)
9+
define internal i32 @test(%T* %p) {
10+
%a.gep = getelementptr %T, %T* %p, i64 0, i32 3
11+
%b.gep = getelementptr %T, %T* %p, i64 0, i32 2
12+
%a = load i32, i32* %a.gep
13+
%b = load i32, i32* %b.gep
14+
%v = add i32 %a, %b
15+
ret i32 %v
16+
}
17+
18+
; CHECK-LABEL: define i32 @caller(%T* %p)
19+
define i32 @caller(%T* %p) {
20+
%v = musttail call i32 @test(%T* %p)
21+
ret i32 %v
22+
}
23+
24+
; Don't promote arguments of musttail caller
25+
26+
define i32 @foo(%T* %p, i32 %v) {
27+
ret i32 0
28+
}
29+
30+
; CHECK-LABEL: define internal i32 @test2(%T* %p, i32 %p2)
31+
define internal i32 @test2(%T* %p, i32 %p2) {
32+
%a.gep = getelementptr %T, %T* %p, i64 0, i32 3
33+
%b.gep = getelementptr %T, %T* %p, i64 0, i32 2
34+
%a = load i32, i32* %a.gep
35+
%b = load i32, i32* %b.gep
36+
%v = add i32 %a, %b
37+
%ca = musttail call i32 @foo(%T* undef, i32 %v)
38+
ret i32 %ca
39+
}
40+
41+
; CHECK-LABEL: define i32 @caller2(%T* %g)
42+
define i32 @caller2(%T* %g) {
43+
%v = call i32 @test2(%T* %g, i32 0)
44+
ret i32 %v
45+
}

0 commit comments

Comments
 (0)