@@ -126,6 +126,20 @@ define i1 @sgt_implies_ge_via_assume(i32 %i, i32 %j) {
126
126
ret i1 %i.ge.j
127
127
}
128
128
129
+ define i1 @sgt_implies_false_le_via_assume (i32 %i , i32 %j ) {
130
+ ; CHECK-LABEL: define i1 @sgt_implies_false_le_via_assume(
131
+ ; CHECK-SAME: i32 [[I:%.*]], i32 [[J:%.*]]) {
132
+ ; CHECK-NEXT: [[I_SGT_J:%.*]] = icmp sgt i32 [[I]], [[J]]
133
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[I_SGT_J]])
134
+ ; CHECK-NEXT: [[I_LE_J:%.*]] = icmp samesign ule i32 [[I]], [[J]]
135
+ ; CHECK-NEXT: ret i1 [[I_LE_J]]
136
+ ;
137
+ %i.sgt.j = icmp sgt i32 %i , %j
138
+ call void @llvm.assume (i1 %i.sgt.j )
139
+ %i.le.j = icmp samesign ule i32 %i , %j
140
+ ret i1 %i.le.j
141
+ }
142
+
129
143
define i32 @gt_implies_sge_dominating (i32 %a , i32 %len ) {
130
144
; CHECK-LABEL: define i32 @gt_implies_sge_dominating(
131
145
; CHECK-SAME: i32 [[A:%.*]], i32 [[LEN:%.*]]) {
@@ -150,6 +164,30 @@ end:
150
164
ret i32 -1
151
165
}
152
166
167
+ define i32 @gt_implies_false_sle_dominating (i32 %a , i32 %len ) {
168
+ ; CHECK-LABEL: define i32 @gt_implies_false_sle_dominating(
169
+ ; CHECK-SAME: i32 [[A:%.*]], i32 [[LEN:%.*]]) {
170
+ ; CHECK-NEXT: [[ENTRY:.*:]]
171
+ ; CHECK-NEXT: [[A_GT_LEN:%.*]] = icmp samesign ugt i32 [[A]], [[LEN]]
172
+ ; CHECK-NEXT: br i1 [[A_GT_LEN]], label %[[TAKEN:.*]], label %[[END:.*]]
173
+ ; CHECK: [[TAKEN]]:
174
+ ; CHECK-NEXT: ret i32 0
175
+ ; CHECK: [[END]]:
176
+ ; CHECK-NEXT: ret i32 -1
177
+ ;
178
+ entry:
179
+ %a.gt.len = icmp samesign ugt i32 %a , %len
180
+ br i1 %a.gt.len , label %taken , label %end
181
+
182
+ taken:
183
+ %a.sle.len = icmp sle i32 %a , %len
184
+ %res = select i1 %a.sle.len , i32 30 , i32 0
185
+ ret i32 %res
186
+
187
+ end:
188
+ ret i32 -1
189
+ }
190
+
153
191
define i32 @gt_implies_sge_dominating_cr (i32 %a , i32 %len ) {
154
192
; CHECK-LABEL: define i32 @gt_implies_sge_dominating_cr(
155
193
; CHECK-SAME: i32 [[A:%.*]], i32 [[LEN:%.*]]) {
0 commit comments