summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2013-12-13 08:00:01 +0000
committerChandler Carruth <chandlerc@gmail.com>2013-12-13 08:00:01 +0000
commit37d25de4593ea5df6f9910841a2c599c621049b3 (patch)
tree58b6468883e20d08ff7b38eadf55e898320c78fb /llvm/test/Transforms
parent0814d2adf0fa6cd524b55ec73227e3724938d775 (diff)
downloadbcm5719-llvm-37d25de4593ea5df6f9910841a2c599c621049b3.tar.gz
bcm5719-llvm-37d25de4593ea5df6f9910841a2c599c621049b3.zip
[inliner] Fix PR18206 by preventing inlining functions that call setjmp
through an invoke instruction. The original patch for this was written by Mark Seaborn, but I've reworked his test case into the existing returns_twice test case and implemented the fix by the prior refactoring to actually run the cost analysis over invoke instructions, and then here fixing our detection of the returns_twice attribute to work for both calls and invokes. We never noticed because we never saw an invoke. =[ llvm-svn: 197216
Diffstat (limited to 'llvm/test/Transforms')
-rw-r--r--llvm/test/Transforms/Inline/inline_returns_twice.ll71
1 files changed, 57 insertions, 14 deletions
diff --git a/llvm/test/Transforms/Inline/inline_returns_twice.ll b/llvm/test/Transforms/Inline/inline_returns_twice.ll
index 6dfd1c72e2c..36042640cc0 100644
--- a/llvm/test/Transforms/Inline/inline_returns_twice.ll
+++ b/llvm/test/Transforms/Inline/inline_returns_twice.ll
@@ -4,38 +4,81 @@
; if they are themselves marked as such.
declare i32 @a() returns_twice
-declare i32 @b() returns_twice
-define i32 @f() {
+define i32 @inner1() {
entry:
%call = call i32 @a() returns_twice
%add = add nsw i32 1, %call
ret i32 %add
}
-define i32 @g() {
+define i32 @outer1() {
entry:
-; CHECK-LABEL: define i32 @g(
-; CHECK: call i32 @f()
-; CHECK-NOT: call i32 @a()
- %call = call i32 @f()
+; CHECK-LABEL: define i32 @outer1(
+; CHECK: call i32 @inner1()
+ %call = call i32 @inner1()
%add = add nsw i32 1, %call
ret i32 %add
}
-define i32 @h() returns_twice {
+define i32 @inner2() returns_twice {
entry:
- %call = call i32 @b() returns_twice
+ %call = call i32 @a() returns_twice
+ %add = add nsw i32 1, %call
+ ret i32 %add
+}
+
+define i32 @outer2() {
+entry:
+; CHECK-LABEL: define i32 @outer2(
+; CHECK: call i32 @a()
+ %call = call i32 @inner2() returns_twice
%add = add nsw i32 1, %call
ret i32 %add
}
-define i32 @i() {
+define i32 @inner3() {
+entry:
+ %invoke = invoke i32 @a() returns_twice
+ to label %cont unwind label %lpad
+
+cont:
+ %add = add nsw i32 1, %invoke
+ ret i32 %add
+
+lpad:
+ %lp = landingpad i32 personality i8* null cleanup
+ resume i32 %lp
+}
+
+define i32 @outer3() {
+entry:
+; CHECK-LABEL: define i32 @outer3(
+; CHECK: call i32 @inner3()
+ %call = call i32 @inner3()
+ %add = add nsw i32 1, %call
+ ret i32 %add
+}
+
+define i32 @inner4() returns_twice {
+entry:
+ %invoke = invoke i32 @a() returns_twice
+ to label %cont unwind label %lpad
+
+cont:
+ %add = add nsw i32 1, %invoke
+ ret i32 %add
+
+lpad:
+ %lp = landingpad i32 personality i8* null cleanup
+ resume i32 %lp
+}
+
+define i32 @outer4() {
entry:
-; CHECK-LABEL: define i32 @i(
-; CHECK: call i32 @b()
-; CHECK-NOT: call i32 @h()
- %call = call i32 @h() returns_twice
+; CHECK-LABEL: define i32 @outer4(
+; CHECK: invoke i32 @a()
+ %call = call i32 @inner4() returns_twice
%add = add nsw i32 1, %call
ret i32 %add
}
OpenPOWER on IntegriCloud