summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/X86/machine-outliner.ll
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/CodeGen/X86/machine-outliner.ll')
-rw-r--r--llvm/test/CodeGen/X86/machine-outliner.ll110
1 files changed, 110 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/X86/machine-outliner.ll b/llvm/test/CodeGen/X86/machine-outliner.ll
new file mode 100644
index 00000000000..9246348c563
--- /dev/null
+++ b/llvm/test/CodeGen/X86/machine-outliner.ll
@@ -0,0 +1,110 @@
+; RUN: llc -enable-machine-outliner -mtriple=x86_64-apple-darwin < %s | FileCheck %s
+
+@x = global i32 0, align 4
+
+define i32 @check_boundaries() #0 {
+ ; CHECK-LABEL: _check_boundaries:
+ %1 = alloca i32, align 4
+ %2 = alloca i32, align 4
+ %3 = alloca i32, align 4
+ %4 = alloca i32, align 4
+ %5 = alloca i32, align 4
+ store i32 0, i32* %1, align 4
+ store i32 0, i32* %2, align 4
+ %6 = load i32, i32* %2, align 4
+ %7 = icmp ne i32 %6, 0
+ br i1 %7, label %9, label %8
+
+ ; CHECK: callq l_OUTLINED_FUNCTION_1
+ ; CHECK: cmpl $0, -{{[0-9]+}}(%rbp)
+ store i32 1, i32* %2, align 4
+ store i32 2, i32* %3, align 4
+ store i32 3, i32* %4, align 4
+ store i32 4, i32* %5, align 4
+ br label %10
+
+ store i32 1, i32* %4, align 4
+ br label %10
+
+ %11 = load i32, i32* %2, align 4
+ %12 = icmp ne i32 %11, 0
+ br i1 %12, label %14, label %13
+
+ ; CHECK: callq l_OUTLINED_FUNCTION_1
+ store i32 1, i32* %2, align 4
+ store i32 2, i32* %3, align 4
+ store i32 3, i32* %4, align 4
+ store i32 4, i32* %5, align 4
+ br label %15
+
+ store i32 1, i32* %4, align 4
+ br label %15
+
+ ret i32 0
+}
+
+define i32 @empty_1() #0 {
+ ; CHECK-LABEL: _empty_1:
+ ; CHECK-NOT: callq l_OUTLINED_FUNCTION_{{[0-9]+}}
+ ret i32 1
+}
+
+define i32 @empty_2() #0 {
+ ; CHECK-LABEL: _empty_2
+ ; CHECK-NOT: callq l_OUTLINED_FUNCTION_{{[0-9]+}}
+ ret i32 1
+}
+
+define i32 @no_empty_outlining() #0 {
+ ; CHECK-LABEL: _no_empty_outlining:
+ %1 = alloca i32, align 4
+ store i32 0, i32* %1, align 4
+ ; CHECK-NOT: callq l_OUTLINED_FUNCTION_{{[0-9]+}}
+ %2 = call i32 @empty_1() #1
+ %3 = call i32 @empty_2() #1
+ %4 = call i32 @empty_1() #1
+ %5 = call i32 @empty_2() #1
+ %6 = call i32 @empty_1() #1
+ %7 = call i32 @empty_2() #1
+ ret i32 0
+}
+
+define i32 @main() #0 {
+ ; CHECK-LABEL: _main:
+ %1 = alloca i32, align 4
+ %2 = alloca i32, align 4
+ %3 = alloca i32, align 4
+ %4 = alloca i32, align 4
+ %5 = alloca i32, align 4
+
+ store i32 0, i32* %1, align 4
+ store i32 0, i32* @x, align 4
+ ; CHECK: callq l_OUTLINED_FUNCTION_0
+ store i32 1, i32* %2, align 4
+ store i32 2, i32* %3, align 4
+ store i32 3, i32* %4, align 4
+ store i32 4, i32* %5, align 4
+ store i32 1, i32* @x, align 4
+ ; CHECK: callq l_OUTLINED_FUNCTION_0
+ store i32 1, i32* %2, align 4
+ store i32 2, i32* %3, align 4
+ store i32 3, i32* %4, align 4
+ store i32 4, i32* %5, align 4
+ ret i32 0
+}
+
+attributes #0 = { noredzone nounwind ssp uwtable "no-frame-pointer-elim"="true" }
+
+; CHECK-LABEL: l_OUTLINED_FUNCTION_0:
+; CHECK: movl $1, -{{[0-9]+}}(%rbp)
+; CHECK-NEXT: movl $2, -{{[0-9]+}}(%rbp)
+; CHECK-NEXT: movl $3, -{{[0-9]+}}(%rbp)
+; CHECK-NEXT: movl $4, -{{[0-9]+}}(%rbp)
+; CHECK-NEXT: retq
+
+; CHECK-LABEL: l_OUTLINED_FUNCTION_1:
+; CHECK: movl $1, -{{[0-9]+}}(%rbp)
+; CHECK-NEXT: movl $2, -{{[0-9]+}}(%rbp)
+; CHECK-NEXT: movl $3, -{{[0-9]+}}(%rbp)
+; CHECK-NEXT: movl $4, -{{[0-9]+}}(%rbp)
+; CHECK-NEXT: retq
OpenPOWER on IntegriCloud