[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / Transforms / PhaseOrdering / simplifycfg-switch-lowering-vs-correlatedpropagation.ll
blob03df1384ca40e6d0923d9751c336c0728d785c2c
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -passes='default<O1>' -S < %s | FileCheck %s
3 ; RUN: opt -passes='default<O2>' -S < %s | FileCheck %s
4 ; RUN: opt -passes='default<O3>' -S < %s | FileCheck %s
6 ; We are worse at propagating correlation facts when in select form
7 ; as compared to the PHI form, so if we lower switches to early,
8 ; we may make further optimizations problematic.
10 ; propagate value to bb2.
11 define i64 @test1(i64 %x) {
12 ; CHECK-LABEL: @test1(
13 ; CHECK-NEXT:  entry:
14 ; CHECK-NEXT:    [[SWITCH_SELECTCMP:%.*]] = icmp eq i64 [[X:%.*]], 0
15 ; CHECK-NEXT:    [[SWITCH_SELECT:%.*]] = select i1 [[SWITCH_SELECTCMP]], i64 0, i64 10
16 ; CHECK-NEXT:    ret i64 [[SWITCH_SELECT]]
18 entry:
19   switch i64 %x, label %bb3 [
20   i64 0, label %bb1
21   i64 1, label %bb2
22   ]
23 bb1:
24   ret i64 0
25 bb2:
26   %0 = icmp eq i64 %x, 100
27   br i1 %0, label %bb4, label %bb5
28 bb3:
29   unreachable
30 bb4:
31   ret i64 200
32 bb5:
33   ret i64 10
36 ; propagate value both to bb1 and bb2.
37 define i64 @test2(i64 %x) {
38 ; CHECK-LABEL: @test2(
39 ; CHECK-NEXT:  entry:
40 ; CHECK-NEXT:    [[SWITCH_SELECTCMP:%.*]] = icmp eq i64 [[X:%.*]], 1
41 ; CHECK-NEXT:    [[SWITCH_SELECT:%.*]] = select i1 [[SWITCH_SELECTCMP]], i64 0, i64 10
42 ; CHECK-NEXT:    ret i64 [[SWITCH_SELECT]]
44 entry:
45   switch i64 %x, label %bb3 [
46   i64 1, label %bb1
47   i64 2, label %bb2
48   ]
49 bb1:
50   %0 = icmp eq i64 %x, 100
51   br i1 %0, label %bb4, label %return
52 return:
53   ret i64 0
54 bb2:
55   %1 = icmp eq i64 %x, 101
56   br i1 %1, label %bb4, label %bb5
57 bb3:
58   unreachable
59 bb4:
60   ret i64 200
61 bb5:
62   ret i64 10
65 define i64 @test3(i64 %x) {
66 ; CHECK-LABEL: @test3(
67 ; CHECK-NEXT:  entry:
68 ; CHECK-NEXT:    [[COND:%.*]] = icmp eq i64 [[X:%.*]], 1
69 ; CHECK-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[COND]], i64 10, i64 0
70 ; CHECK-NEXT:    ret i64 [[SPEC_SELECT]]
72 entry:
73   switch i64 %x, label %bb1 [
74   i64 1, label %bb2
75   ]
76 bb1:
77   ret i64 0
78 bb2:
79   %0 = icmp eq i64 %x, 100
80   br i1 %0, label %bb4, label %bb5
81 bb4:
82   ret i64 200
83 bb5:
84   ret i64 10
87 ; bb2 has two predecessors with case value 1 and 2.
88 define i64 @test_fail1(i64 %x) {
89 ; CHECK-LABEL: @test_fail1(
90 ; CHECK-NEXT:  entry:
91 ; CHECK-NEXT:    [[SWITCH:%.*]] = icmp eq i64 [[X:%.*]], 0
92 ; CHECK-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[SWITCH]], i64 0, i64 10
93 ; CHECK-NEXT:    ret i64 [[SPEC_SELECT]]
95 entry:
96   switch i64 %x, label %bb3 [
97   i64 0, label %bb1
98   i64 1, label %bb2
99   i64 2, label %bb2
100   ]
101 bb1:
102   ret i64 0
103 bb2:
104   %0 = icmp eq i64 %x, 100
105   br i1 %0, label %bb4, label %bb5
106 bb3:
107   unreachable
108 bb4:
109   ret i64 200
110 bb5:
111   ret i64 10
114 ; return block has two predecessors.
115 define i64 @test_fail2(i64 %x) {
116 ; CHECK-LABEL: @test_fail2(
117 ; CHECK-NEXT:  entry:
118 ; CHECK-NEXT:    [[SWITCH_SELECTCMP:%.*]] = icmp eq i64 [[X:%.*]], 0
119 ; CHECK-NEXT:    [[SWITCH_SELECT:%.*]] = select i1 [[SWITCH_SELECTCMP]], i64 2, i64 1
120 ; CHECK-NEXT:    ret i64 [[SWITCH_SELECT]]
122 entry:
123   switch i64 %x, label %bb2 [
124   i64 0, label %bb1
125   i64 1, label %return
126   ]
127 bb1:
128   br label %return
129 return:
130   %retval.0 = phi i64 [ %x, %entry ], [ 2, %bb1 ]
131   ret i64 %retval.0
132 bb2:
133   unreachable