summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/SimpleLoopUnswitch
diff options
context:
space:
mode:
authorYevgeny Rouban <yevgeny.rouban@azul.com>2019-07-01 08:43:53 +0000
committerYevgeny Rouban <yevgeny.rouban@azul.com>2019-07-01 08:43:53 +0000
commitd4097b4a93a2bb303b9131d8293992bc6b63b2f9 (patch)
treedf3b6b118a3f928ce0404765ec3182cc379289c1 /llvm/test/Transforms/SimpleLoopUnswitch
parent98722691b0b5e375fdd02c9a464476752a3c598e (diff)
downloadbcm5719-llvm-d4097b4a93a2bb303b9131d8293992bc6b63b2f9.tar.gz
bcm5719-llvm-d4097b4a93a2bb303b9131d8293992bc6b63b2f9.zip
[SimpleLoopUnswitch] Implement handling of prof branch_weights metadata for SwitchInst
Differential Revision: https://reviews.llvm.org/D60606 llvm-svn: 364734
Diffstat (limited to 'llvm/test/Transforms/SimpleLoopUnswitch')
-rw-r--r--llvm/test/Transforms/SimpleLoopUnswitch/basictest-profmd.ll34
-rw-r--r--llvm/test/Transforms/SimpleLoopUnswitch/trivial-unswitch-profmd.ll228
2 files changed, 262 insertions, 0 deletions
diff --git a/llvm/test/Transforms/SimpleLoopUnswitch/basictest-profmd.ll b/llvm/test/Transforms/SimpleLoopUnswitch/basictest-profmd.ll
new file mode 100644
index 00000000000..416fd46558c
--- /dev/null
+++ b/llvm/test/Transforms/SimpleLoopUnswitch/basictest-profmd.ll
@@ -0,0 +1,34 @@
+; RUN: opt -passes='loop(unswitch),verify<loops>' -S < %s | FileCheck %s
+; RUN: opt -enable-mssa-loop-dependency=true -verify-memoryssa -passes='loop(unswitch),verify<loops>' -S < %s | FileCheck %s
+
+declare void @incf()
+declare void @decf()
+
+define i32 @test2(i32 %c) {
+; CHECK-LABEL: @test2(
+ br label %loop_begin
+
+; CHECK: !prof ![[MD0:[0-9]+]]
+; CHECK: loop_begin:
+; CHECK: !prof ![[MD1:[0-9]+]]
+loop_begin:
+
+ switch i32 %c, label %default [
+ i32 1, label %inc
+ i32 2, label %dec
+ ], !prof !{!"branch_weights", i32 99, i32 1, i32 2}
+
+inc:
+ call void @incf()
+ br label %loop_begin
+
+dec:
+ call void @decf()
+ br label %loop_begin
+
+default:
+ ret i32 0
+}
+
+; CHECK: ![[MD0]] = !{!"branch_weights", i32 99, i32 1, i32 2}
+; CHECK: ![[MD1]] = !{!"branch_weights", i32 2, i32 1}
diff --git a/llvm/test/Transforms/SimpleLoopUnswitch/trivial-unswitch-profmd.ll b/llvm/test/Transforms/SimpleLoopUnswitch/trivial-unswitch-profmd.ll
new file mode 100644
index 00000000000..735caf37bf9
--- /dev/null
+++ b/llvm/test/Transforms/SimpleLoopUnswitch/trivial-unswitch-profmd.ll
@@ -0,0 +1,228 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; then metadata checks MDn were added manually.
+; RUN: opt -passes='loop(unswitch),verify<loops>' -S < %s | FileCheck %s
+; RUN: opt -enable-mssa-loop-dependency=true -verify-memoryssa -passes='loop(unswitch),verify<loops>' -S < %s | FileCheck %s
+
+declare void @some_func()
+
+; Test for a trivially unswitchable switch with non-default case exiting.
+define i32 @test2(i32* %var, i32 %cond1, i32 %cond2) {
+; CHECK-LABEL: @test2(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: switch i32 [[COND2:%.*]], label [[ENTRY_SPLIT:%.*]] [
+; CHECK-NEXT: i32 2, label [[LOOP_EXIT2:%.*]]
+; CHECK-NEXT: ], !prof ![[MD0:[0-9]+]]
+; CHECK: entry.split:
+; CHECK-NEXT: br label [[LOOP_BEGIN:%.*]]
+; CHECK: loop_begin:
+; CHECK-NEXT: [[VAR_VAL:%.*]] = load i32, i32* [[VAR:%.*]]
+; CHECK-NEXT: switch i32 [[COND2]], label [[LOOP2:%.*]] [
+; CHECK-NEXT: i32 0, label [[LOOP0:%.*]]
+; CHECK-NEXT: i32 1, label [[LOOP1:%.*]]
+; CHECK-NEXT: ], !prof ![[MD1:[0-9]+]]
+; CHECK: loop0:
+; CHECK-NEXT: call void @some_func()
+; CHECK-NEXT: br label [[LOOP_LATCH:%.*]]
+; CHECK: loop1:
+; CHECK-NEXT: call void @some_func()
+; CHECK-NEXT: br label [[LOOP_LATCH]]
+; CHECK: loop2:
+; CHECK-NEXT: call void @some_func()
+; CHECK-NEXT: br label [[LOOP_LATCH]]
+; CHECK: loop_latch:
+; CHECK-NEXT: br label [[LOOP_BEGIN]]
+; CHECK: loop_exit1:
+; CHECK-NEXT: ret i32 0
+; CHECK: loop_exit2:
+; CHECK-NEXT: ret i32 0
+; CHECK: loop_exit3:
+; CHECK-NEXT: ret i32 0
+;
+entry:
+ br label %loop_begin
+
+loop_begin:
+ %var_val = load i32, i32* %var
+ switch i32 %cond2, label %loop2 [
+ i32 0, label %loop0
+ i32 1, label %loop1
+ i32 2, label %loop_exit2
+ ], !prof !{!"branch_weights", i32 99, i32 100, i32 101, i32 102}
+
+loop0:
+ call void @some_func()
+ br label %loop_latch
+
+loop1:
+ call void @some_func()
+ br label %loop_latch
+
+loop2:
+ call void @some_func()
+ br label %loop_latch
+
+loop_latch:
+ br label %loop_begin
+
+loop_exit1:
+ ret i32 0
+
+loop_exit2:
+ ret i32 0
+
+loop_exit3:
+ ret i32 0
+}
+
+; Test for a trivially unswitchable switch with only the default case exiting.
+define i32 @test3(i32* %var, i32 %cond1, i32 %cond2) {
+; CHECK-LABEL: @test3(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: switch i32 [[COND2:%.*]], label [[LOOP_EXIT2:%.*]] [
+; CHECK-NEXT: i32 0, label [[ENTRY_SPLIT:%.*]]
+; CHECK-NEXT: i32 1, label [[ENTRY_SPLIT]]
+; CHECK-NEXT: i32 2, label [[ENTRY_SPLIT]]
+; CHECK-NEXT: ], !prof ![[MD2:[0-9]+]]
+; CHECK: entry.split:
+; CHECK-NEXT: br label [[LOOP_BEGIN:%.*]]
+; CHECK: loop_begin:
+; CHECK-NEXT: [[VAR_VAL:%.*]] = load i32, i32* [[VAR:%.*]]
+; CHECK-NEXT: switch i32 [[COND2]], label [[LOOP2:%.*]] [
+; CHECK-NEXT: i32 0, label [[LOOP0:%.*]]
+; CHECK-NEXT: i32 1, label [[LOOP1:%.*]]
+; CHECK-NEXT: ], !prof ![[MD3:[0-9]+]]
+; CHECK: loop0:
+; CHECK-NEXT: call void @some_func()
+; CHECK-NEXT: br label [[LOOP_LATCH:%.*]]
+; CHECK: loop1:
+; CHECK-NEXT: call void @some_func()
+; CHECK-NEXT: br label [[LOOP_LATCH]]
+; CHECK: loop2:
+; CHECK-NEXT: call void @some_func()
+; CHECK-NEXT: br label [[LOOP_LATCH]]
+; CHECK: loop_latch:
+; CHECK-NEXT: br label [[LOOP_BEGIN]]
+; CHECK: loop_exit1:
+; CHECK-NEXT: ret i32 0
+; CHECK: loop_exit2:
+; CHECK-NEXT: ret i32 0
+; CHECK: loop_exit3:
+; CHECK-NEXT: ret i32 0
+;
+entry:
+ br label %loop_begin
+
+loop_begin:
+ %var_val = load i32, i32* %var
+ switch i32 %cond2, label %loop_exit2 [
+ i32 0, label %loop0
+ i32 1, label %loop1
+ i32 2, label %loop2
+ ], !prof !{!"branch_weights", i32 99, i32 100, i32 101, i32 102}
+
+loop0:
+ call void @some_func()
+ br label %loop_latch
+
+loop1:
+ call void @some_func()
+ br label %loop_latch
+
+loop2:
+ call void @some_func()
+ br label %loop_latch
+
+loop_latch:
+ br label %loop_begin
+
+loop_exit1:
+ ret i32 0
+
+loop_exit2:
+ ret i32 0
+
+loop_exit3:
+ ret i32 0
+}
+
+; Test for a trivially unswitchable switch with multiple exiting cases and
+; multiple looping cases.
+define i32 @test4(i32* %var, i32 %cond1, i32 %cond2) {
+; CHECK-LABEL: @test4(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: switch i32 [[COND2:%.*]], label [[LOOP_EXIT2:%.*]] [
+; CHECK-NEXT: i32 13, label [[LOOP_EXIT1:%.*]]
+; CHECK-NEXT: i32 42, label [[LOOP_EXIT3:%.*]]
+; CHECK-NEXT: i32 0, label [[ENTRY_SPLIT:%.*]]
+; CHECK-NEXT: i32 1, label [[ENTRY_SPLIT]]
+; CHECK-NEXT: i32 2, label [[ENTRY_SPLIT]]
+; CHECK-NEXT: ], !prof ![[MD4:[0-9]+]]
+; CHECK: entry.split:
+; CHECK-NEXT: br label [[LOOP_BEGIN:%.*]]
+; CHECK: loop_begin:
+; CHECK-NEXT: [[VAR_VAL:%.*]] = load i32, i32* [[VAR:%.*]]
+; CHECK-NEXT: switch i32 [[COND2]], label [[LOOP2:%.*]] [
+; CHECK-NEXT: i32 0, label [[LOOP0:%.*]]
+; CHECK-NEXT: i32 1, label [[LOOP1:%.*]]
+; CHECK-NEXT: ], !prof ![[MD3:[0-9]+]]
+; CHECK: loop0:
+; CHECK-NEXT: call void @some_func()
+; CHECK-NEXT: br label [[LOOP_LATCH:%.*]]
+; CHECK: loop1:
+; CHECK-NEXT: call void @some_func()
+; CHECK-NEXT: br label [[LOOP_LATCH]]
+; CHECK: loop2:
+; CHECK-NEXT: call void @some_func()
+; CHECK-NEXT: br label [[LOOP_LATCH]]
+; CHECK: loop_latch:
+; CHECK-NEXT: br label [[LOOP_BEGIN]]
+; CHECK: loop_exit1:
+; CHECK-NEXT: ret i32 0
+; CHECK: loop_exit2:
+; CHECK-NEXT: ret i32 0
+; CHECK: loop_exit3:
+; CHECK-NEXT: ret i32 0
+;
+entry:
+ br label %loop_begin
+
+loop_begin:
+ %var_val = load i32, i32* %var
+ switch i32 %cond2, label %loop_exit2 [
+ i32 0, label %loop0
+ i32 1, label %loop1
+ i32 13, label %loop_exit1
+ i32 2, label %loop2
+ i32 42, label %loop_exit3
+ ], !prof !{!"branch_weights", i32 99, i32 100, i32 101, i32 113, i32 102, i32 142}
+
+loop0:
+ call void @some_func()
+ br label %loop_latch
+
+loop1:
+ call void @some_func()
+ br label %loop_latch
+
+loop2:
+ call void @some_func()
+ br label %loop_latch
+
+loop_latch:
+ br label %loop_begin
+
+loop_exit1:
+ ret i32 0
+
+loop_exit2:
+ ret i32 0
+
+loop_exit3:
+ ret i32 0
+}
+
+; CHECK: ![[MD0]] = !{!"branch_weights", i32 300, i32 102}
+; CHECK: ![[MD1]] = !{!"branch_weights", i32 99, i32 100, i32 101}
+; CHECK: ![[MD2]] = !{!"branch_weights", i32 99, i32 100, i32 101, i32 102}
+; CHECK: ![[MD3]] = !{!"branch_weights", i32 102, i32 100, i32 101}
+; CHECK: ![[MD4]] = !{!"branch_weights", i32 99, i32 113, i32 142, i32 100, i32 101, i32 102}
OpenPOWER on IntegriCloud