summaryrefslogtreecommitdiff
path: root/test/Transforms
diff options
context:
space:
mode:
authorDavide Italiano <davide@freebsd.org>2017-12-31 16:47:16 +0000
committerDavide Italiano <davide@freebsd.org>2017-12-31 16:47:16 +0000
commit8bb867a7399fbfa3483e64c15bb06f1cd67ae262 (patch)
treef3d239591afdfd0b15d740228746a76825a39ddb /test/Transforms
parent890c1de445a2d5950fa028f7f13ba606bc93bb4d (diff)
[SimplifyCFG] Stop hoisting musttail calls incorrectly.
PR35774. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@321603 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Transforms')
-rw-r--r--test/Transforms/SimplifyCFG/pr35774.ll35
1 files changed, 35 insertions, 0 deletions
diff --git a/test/Transforms/SimplifyCFG/pr35774.ll b/test/Transforms/SimplifyCFG/pr35774.ll
new file mode 100644
index 00000000000..149252085d5
--- /dev/null
+++ b/test/Transforms/SimplifyCFG/pr35774.ll
@@ -0,0 +1,35 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -simplifycfg -S %s | FileCheck %s
+
+%foo = type { i32 (%foo)*, i32 }
+
+declare i32 @putchar(i32)
+
+define i32 @intercept(%foo %f) {
+; CHECK-LABEL: @intercept(
+; CHECK-NEXT: [[FN:%.*]] = extractvalue [[FOO:%.*]] %f, 0
+; CHECK-NEXT: [[X:%.*]] = extractvalue [[FOO]] %f, 1
+; CHECK-NEXT: [[X0:%.*]] = icmp eq i32 [[X]], 0
+; CHECK-NEXT: br i1 [[X0]], label [[ZERO:%.*]], label [[NONZERO:%.*]]
+; CHECK: Zero:
+; CHECK-NEXT: [[R0:%.*]] = musttail call i32 [[FN]](%foo [[F:%.*]])
+; CHECK-NEXT: ret i32 [[R0]]
+; CHECK: Nonzero:
+; CHECK-NEXT: [[R1:%.*]] = tail call i32 [[FN]](%foo [[F]])
+; CHECK-NEXT: [[TMP1:%.*]] = tail call i32 @putchar(i32 [[R1]])
+; CHECK-NEXT: ret i32 [[R1]]
+;
+ %fn = extractvalue %foo %f, 0
+ %x = extractvalue %foo %f, 1
+ %x0 = icmp eq i32 %x, 0
+ br i1 %x0, label %Zero, label %Nonzero
+
+Zero:
+ %r0 = musttail call i32 %fn(%foo %f)
+ ret i32 %r0
+
+Nonzero:
+ %r1 = tail call i32 %fn(%foo %f)
+ %1 = tail call i32 @putchar(i32 %r1)
+ ret i32 %r1
+}