MemCpyOpt: When forming a memset from stores also take GEP constexprs into account.
[oota-llvm.git] / test / Transforms / SimplifyCFG / preserve-branchweights.ll
1 ; RUN: opt -simplifycfg -S -o - < %s | FileCheck %s
2
3 declare void @helper(i32)
4
5 define void @test1(i1 %a, i1 %b) {
6 ; CHECK: @test1
7 entry:
8   br i1 %a, label %Y, label %X, !prof !0
9 ; CHECK: br i1 %or.cond, label %Z, label %Y, !prof !0
10
11 X:
12   %c = or i1 %b, false
13   br i1 %c, label %Z, label %Y, !prof !1
14
15 Y:
16   call void @helper(i32 0)
17   ret void
18
19 Z:
20   call void @helper(i32 1)
21   ret void
22 }
23
24 define void @test2(i1 %a, i1 %b) {
25 ; CHECK: @test2
26 entry:
27   br i1 %a, label %X, label %Y, !prof !1
28 ; CHECK: br i1 %or.cond, label %Z, label %Y, !prof !1
29 ; CHECK-NOT: !prof
30
31 X:
32   %c = or i1 %b, false
33   br i1 %c, label %Z, label %Y, !prof !2
34
35 Y:
36   call void @helper(i32 0)
37   ret void
38
39 Z:
40   call void @helper(i32 1)
41   ret void
42 }
43
44 define void @test3(i1 %a, i1 %b) {
45 ; CHECK: @test3
46 ; CHECK-NOT: !prof
47 entry:
48   br i1 %a, label %X, label %Y, !prof !1
49
50 X:
51   %c = or i1 %b, false
52   br i1 %c, label %Z, label %Y
53
54 Y:
55   call void @helper(i32 0)
56   ret void
57
58 Z:
59   call void @helper(i32 1)
60   ret void
61 }
62
63 define void @test4(i1 %a, i1 %b) {
64 ; CHECK: @test4
65 ; CHECK-NOT: !prof
66 entry:
67   br i1 %a, label %X, label %Y
68
69 X:
70   %c = or i1 %b, false
71   br i1 %c, label %Z, label %Y, !prof !1
72
73 Y:
74   call void @helper(i32 0)
75   ret void
76
77 Z:
78   call void @helper(i32 1)
79   ret void
80 }
81
82 ;; test5 - The case where it jumps to the default target will be removed.
83 define void @test5(i32 %M, i32 %N) nounwind uwtable {
84 entry:
85   switch i32 %N, label %sw2 [
86     i32 1, label %sw2
87     i32 2, label %sw.bb
88     i32 3, label %sw.bb1
89   ], !prof !3
90 ; CHECK: test5
91 ; CHECK: switch i32 %N, label %sw2 [
92 ; CHECK: i32 3, label %sw.bb1
93 ; CHECK: i32 2, label %sw.bb
94 ; CHECK: ], !prof !2
95
96 sw.bb:
97   call void @helper(i32 0)
98   br label %sw.epilog
99
100 sw.bb1:
101   call void @helper(i32 1)
102   br label %sw.epilog
103
104 sw2:
105   call void @helper(i32 2)
106   br label %sw.epilog
107
108 sw.epilog:
109   ret void
110 }
111
112 !0 = metadata !{metadata !"branch_weights", i32 3, i32 5}
113 !1 = metadata !{metadata !"branch_weights", i32 1, i32 1}
114 !2 = metadata !{metadata !"branch_weights", i32 1, i32 2}
115 !3 = metadata !{metadata !"branch_weights", i32 4, i32 3, i32 2, i32 1}
116
117 ; CHECK: !0 = metadata !{metadata !"branch_weights", i32 5, i32 11}
118 ; CHECK: !1 = metadata !{metadata !"branch_weights", i32 1, i32 5}
119 ; CHECK: !2 = metadata !{metadata !"branch_weights", i32 7, i32 1, i32 2}
120 ; CHECK-NOT: !3