@@ -43,3 +43,103 @@ exit.2:
43
43
}
44
44
45
45
declare void @llvm.assume (i1 )
46
+
47
+ define i1 @simplify_based_on_switch (i32 %x ) {
48
+ ; CHECK-LABEL: @simplify_based_on_switch(
49
+ ; CHECK-NEXT: entry:
50
+ ; CHECK-NEXT: switch i32 [[X:%.*]], label [[EXIT_1:%.*]] [
51
+ ; CHECK-NEXT: i32 6, label [[EXIT_2:%.*]]
52
+ ; CHECK-NEXT: i32 10, label [[EXIT_3:%.*]]
53
+ ; CHECK-NEXT: ]
54
+ ; CHECK: exit.1:
55
+ ; CHECK-NEXT: [[C_1:%.*]] = icmp ult i32 [[X]], 7
56
+ ; CHECK-NEXT: [[C_2:%.*]] = icmp ult i32 [[X]], 6
57
+ ; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]]
58
+ ; CHECK-NEXT: ret i1 [[RES_1]]
59
+ ; CHECK: exit.2:
60
+ ; CHECK-NEXT: [[T_1:%.*]] = icmp ult i32 [[X]], 7
61
+ ; CHECK-NEXT: [[F_1:%.*]] = icmp ult i32 [[X]], 6
62
+ ; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[T_1]], [[F_1]]
63
+ ; CHECK-NEXT: ret i1 [[RES_2]]
64
+ ; CHECK: exit.3:
65
+ ; CHECK-NEXT: [[T_2:%.*]] = icmp ult i32 [[X]], 11
66
+ ; CHECK-NEXT: [[F_2:%.*]] = icmp ult i32 [[X]], 10
67
+ ; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[T_2]], [[F_2]]
68
+ ; CHECK-NEXT: ret i1 [[RES_3]]
69
+ ;
70
+ entry:
71
+ switch i32 %x , label %exit.1 [
72
+ i32 6 , label %exit.2
73
+ i32 10 , label %exit.3
74
+ ]
75
+
76
+ exit.1 :
77
+ %c.1 = icmp ult i32 %x , 7
78
+ %c.2 = icmp ult i32 %x , 6
79
+ %res.1 = xor i1 %c.1 , %c.2
80
+ ret i1 %res.1
81
+
82
+ exit.2 :
83
+ %t.1 = icmp ult i32 %x , 7
84
+ %f.1 = icmp ult i32 %x , 6
85
+ %res.2 = xor i1 %t.1 , %f.1
86
+ ret i1 %res.2
87
+
88
+ exit.3 :
89
+ %t.2 = icmp ult i32 %x , 11
90
+ %f.2 = icmp ult i32 %x , 10
91
+ %res.3 = xor i1 %t.2 , %f.2
92
+ ret i1 %res.3
93
+ }
94
+
95
+ define i1 @simplify_based_on_switch_successor_branches (i32 %x ) {
96
+ ; CHECK-LABEL: @simplify_based_on_switch_successor_branches(
97
+ ; CHECK-NEXT: entry:
98
+ ; CHECK-NEXT: switch i32 [[X:%.*]], label [[EXIT_1:%.*]] [
99
+ ; CHECK-NEXT: i32 6, label [[EXIT_2:%.*]]
100
+ ; CHECK-NEXT: i32 10, label [[EXIT_3:%.*]]
101
+ ; CHECK-NEXT: ]
102
+ ; CHECK: exit.1:
103
+ ; CHECK-NEXT: [[C_1:%.*]] = icmp ult i32 [[X]], 7
104
+ ; CHECK-NEXT: [[C_2:%.*]] = icmp ult i32 [[X]], 6
105
+ ; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]]
106
+ ; CHECK-NEXT: ret i1 [[RES_1]]
107
+ ; CHECK: exit.2:
108
+ ; CHECK-NEXT: [[T_1:%.*]] = icmp ult i32 [[X]], 7
109
+ ; CHECK-NEXT: [[F_1:%.*]] = icmp ult i32 [[X]], 6
110
+ ; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[T_1]], [[F_1]]
111
+ ; CHECK-NEXT: call void @use(i1 [[RES_2]])
112
+ ; CHECK-NEXT: br label [[EXIT_3]]
113
+ ; CHECK: exit.3:
114
+ ; CHECK-NEXT: [[C_3:%.*]] = icmp ult i32 [[X]], 11
115
+ ; CHECK-NEXT: [[C_4:%.*]] = icmp ult i32 [[X]], 10
116
+ ; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[C_3]], [[C_4]]
117
+ ; CHECK-NEXT: ret i1 [[RES_3]]
118
+ ;
119
+ entry:
120
+ switch i32 %x , label %exit.1 [
121
+ i32 6 , label %exit.2
122
+ i32 10 , label %exit.3
123
+ ]
124
+
125
+ exit.1 :
126
+ %c.1 = icmp ult i32 %x , 7
127
+ %c.2 = icmp ult i32 %x , 6
128
+ %res.1 = xor i1 %c.1 , %c.2
129
+ ret i1 %res.1
130
+
131
+ exit.2 :
132
+ %t.1 = icmp ult i32 %x , 7
133
+ %f.1 = icmp ult i32 %x , 6
134
+ %res.2 = xor i1 %t.1 , %f.1
135
+ call void @use (i1 %res.2 )
136
+ br label %exit.3
137
+
138
+ exit.3 :
139
+ %c.3 = icmp ult i32 %x , 11
140
+ %c.4 = icmp ult i32 %x , 10
141
+ %res.3 = xor i1 %c.3 , %c.4
142
+ ret i1 %res.3
143
+ }
144
+
145
+ declare void @use (i1 )
0 commit comments