[llvm] [ConstraintElim] Teach checkAndReplaceCondition about samesign (PR #128168)

Marina Taylor via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 24 02:30:58 PST 2025


================
@@ -303,3 +303,43 @@ define i1 @ugt_assumed_positive_values(i8 %a, i8 %b) {
 
   ret i1 %result
 }
+
+define i1 @implied_condition_sgt_ugt(i8 %a, i8 %b)  {
+; CHECK-LABEL: @implied_condition_sgt_ugt(
+; CHECK-NEXT:    [[CMP_SGT:%.*]] = icmp sgt i8 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT:    br i1 [[CMP_SGT]], label [[GREATER:%.*]], label [[EXIT:%.*]]
+; CHECK:       greater:
+; CHECK-NEXT:    ret i1 true
+; CHECK:       exit:
+; CHECK-NEXT:    ret i1 false
+;
+  %cmp_sgt = icmp sgt i8 %a, %b
+  br i1 %cmp_sgt, label %greater, label %exit
+
+greater:
+  %cmp_ugt = icmp samesign ugt i8 %a, %b
+  ret i1 %cmp_ugt
+
+exit:
+  ret i1 false
+}
+
+define i1 @implied_condition_sle_ule(i8 %a) {
+; CHECK-LABEL: @implied_condition_sle_ule(
+; CHECK-NEXT:    [[CMP_SLE:%.*]] = icmp sle i8 [[A:%.*]], 42
+; CHECK-NEXT:    br i1 [[CMP_SLE]], label [[LESS_OR_EQUAL:%.*]], label [[EXIT:%.*]]
+; CHECK:       less_or_equal:
+; CHECK-NEXT:    ret i1 true
+; CHECK:       exit:
+; CHECK-NEXT:    ret i1 false
+;
+  %cmp_sle = icmp sle i8 %a, 42
+  br i1 %cmp_sle, label %less_or_equal, label %exit
+
+less_or_equal:
+  %cmp_ule = icmp samesign ule i8 %a, 42
----------------
citymarina wrote:

> And maybe a variant with samesign on the signed known condition 

Based on comments above, I thought `samesign` mustn't go on signed predicates?

https://github.com/llvm/llvm-project/pull/128168


More information about the llvm-commits mailing list