@@ -303,3 +303,64 @@ define i1 @ugt_assumed_positive_values(i8 %a, i8 %b) {
303303
304304 ret i1 %result
305305}
306+
307+ define i1 @implied_condition_sgt_ugt (i8 %a , i8 %b ) {
308+ ; CHECK-LABEL: @implied_condition_sgt_ugt(
309+ ; CHECK-NEXT: [[CMP_SGT:%.*]] = icmp sgt i8 [[A:%.*]], [[B:%.*]]
310+ ; CHECK-NEXT: br i1 [[CMP_SGT]], label [[GREATER:%.*]], label [[EXIT:%.*]]
311+ ; CHECK: greater:
312+ ; CHECK-NEXT: ret i1 true
313+ ; CHECK: exit:
314+ ; CHECK-NEXT: ret i1 false
315+ ;
316+ %cmp_sgt = icmp sgt i8 %a , %b
317+ br i1 %cmp_sgt , label %greater , label %exit
318+
319+ greater:
320+ %cmp_ugt = icmp samesign ugt i8 %a , %b
321+ ret i1 %cmp_ugt
322+
323+ exit:
324+ ret i1 false
325+ }
326+
327+ define i1 @implied_condition_sle_ule (i8 %a ) {
328+ ; CHECK-LABEL: @implied_condition_sle_ule(
329+ ; CHECK-NEXT: [[CMP_SLE:%.*]] = icmp sle i8 [[A:%.*]], 42
330+ ; CHECK-NEXT: br i1 [[CMP_SLE]], label [[LESS_OR_EQUAL:%.*]], label [[EXIT:%.*]]
331+ ; CHECK: less_or_equal:
332+ ; CHECK-NEXT: ret i1 true
333+ ; CHECK: exit:
334+ ; CHECK-NEXT: ret i1 false
335+ ;
336+ %cmp_sle = icmp sle i8 %a , 42
337+ br i1 %cmp_sle , label %less_or_equal , label %exit
338+
339+ less_or_equal:
340+ %cmp_ule = icmp samesign ule i8 %a , 42
341+ ret i1 %cmp_ule
342+
343+ exit:
344+ ret i1 false
345+ }
346+
347+ define i1 @implied_condition_cannot_simplify (i8 %a , i8 %b ) {
348+ ; CHECK-LABEL: @implied_condition_cannot_simplify(
349+ ; CHECK-NEXT: [[CMP_SGT:%.*]] = icmp ne i8 [[A:%.*]], [[B:%.*]]
350+ ; CHECK-NEXT: br i1 [[CMP_SGT]], label [[GREATER:%.*]], label [[EXIT:%.*]]
351+ ; CHECK: not_equal:
352+ ; CHECK-NEXT: [[CMP_UGT:%.*]] = icmp samesign ugt i8 [[A]], [[B]]
353+ ; CHECK-NEXT: ret i1 [[CMP_UGT]]
354+ ; CHECK: exit:
355+ ; CHECK-NEXT: ret i1 false
356+ ;
357+ %cmp_ne = icmp ne i8 %a , %b
358+ br i1 %cmp_ne , label %not_equal , label %exit
359+
360+ not_equal:
361+ %cmp_ugt = icmp samesign ugt i8 %a , %b
362+ ret i1 %cmp_ugt
363+
364+ exit:
365+ ret i1 false
366+ }
0 commit comments