[llvm] 62c1928 - [ConstraintElimination] Add tests for chained adds.
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 14 01:28:06 PDT 2022
Author: Florian Hahn
Date: 2022-09-14T09:27:18+01:00
New Revision: 62c19284371c3b90fc818b883ab4ef771e6aa362
URL: https://github.com/llvm/llvm-project/commit/62c19284371c3b90fc818b883ab4ef771e6aa362
DIFF: https://github.com/llvm/llvm-project/commit/62c19284371c3b90fc818b883ab4ef771e6aa362.diff
LOG: [ConstraintElimination] Add tests for chained adds.
Add test coverage for reasoning about chains of adds.
Added:
Modified:
llvm/test/Transforms/ConstraintElimination/add-nuw.ll
llvm/test/Transforms/ConstraintElimination/wrapping-math.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/ConstraintElimination/add-nuw.ll b/llvm/test/Transforms/ConstraintElimination/add-nuw.ll
index bf79a5290d717..c823d09cf1577 100644
--- a/llvm/test/Transforms/ConstraintElimination/add-nuw.ll
+++ b/llvm/test/Transforms/ConstraintElimination/add-nuw.ll
@@ -578,3 +578,206 @@ exit.2:
%res.2 = xor i1 %c.3, %f.1
ret i1 %res.2
}
+
+define i1 @test_chained_adds_nuw_1(i8 %a, i8 %b) {
+; CHECK-LABEL: @test_chained_adds_nuw_1(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[C_A:%.*]] = icmp uge i8 [[A:%.*]], 5
+; CHECK-NEXT: call void @llvm.assume(i1 [[C_A]])
+; CHECK-NEXT: [[C_B:%.*]] = icmp uge i8 [[B:%.*]], 6
+; CHECK-NEXT: call void @llvm.assume(i1 [[C_B]])
+; CHECK-NEXT: [[ADD_1:%.*]] = add nuw i8 [[A]], [[B]]
+; CHECK-NEXT: [[ADD_2:%.*]] = add nuw i8 [[ADD_1]], 2
+; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[ADD_2]], 13
+; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[ADD_2]], 14
+; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[C_1]]
+; CHECK-NEXT: ret i1 [[RES_1]]
+;
+entry:
+ %c.a = icmp uge i8 %a, 5
+ call void @llvm.assume(i1 %c.a)
+ %c.b = icmp uge i8 %b, 6
+ call void @llvm.assume(i1 %c.b)
+ %add.1 = add nuw i8 %a, %b
+ %add.2 = add nuw i8 %add.1, 2
+ %t.1 = icmp uge i8 %add.2, 13
+ %c.1 = icmp uge i8 %add.2, 14
+ %res.1 = xor i1 %t.1, %c.1
+ ret i1 %res.1
+}
+
+define i1 @test_chained_adds_nuw_2(i8 %a, i8 %b) {
+; CHECK-LABEL: @test_chained_adds_nuw_2(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[C_A:%.*]] = icmp uge i8 [[A:%.*]], 5
+; CHECK-NEXT: call void @llvm.assume(i1 [[C_A]])
+; CHECK-NEXT: [[C_B:%.*]] = icmp uge i8 [[B:%.*]], 6
+; CHECK-NEXT: call void @llvm.assume(i1 [[C_B]])
+; CHECK-NEXT: [[ADD_1:%.*]] = add nuw i8 [[A]], [[B]]
+; CHECK-NEXT: [[ADD_2:%.*]] = add nuw i8 [[ADD_1]], 2
+; CHECK-NEXT: [[ADD_3:%.*]] = add nuw i8 [[ADD_2]], [[A]]
+; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[ADD_3]], 18
+; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[ADD_3]], 19
+; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[C_1]]
+; CHECK-NEXT: ret i1 [[RES_1]]
+;
+entry:
+ %c.a = icmp uge i8 %a, 5
+ call void @llvm.assume(i1 %c.a)
+ %c.b = icmp uge i8 %b, 6
+ call void @llvm.assume(i1 %c.b)
+ %add.1 = add nuw i8 %a, %b
+ %add.2 = add nuw i8 %add.1, 2
+ %add.3 = add nuw i8 %add.2, %a
+ %t.1 = icmp uge i8 %add.3, 18
+ %c.1 = icmp uge i8 %add.3, 19
+ %res.1 = xor i1 %t.1, %c.1
+ ret i1 %res.1
+}
+
+define i1 @test_chained_adds_nuw_3(i8 %a, i8 %b) {
+; CHECK-LABEL: @test_chained_adds_nuw_3(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[C_A:%.*]] = icmp uge i8 [[A:%.*]], 5
+; CHECK-NEXT: call void @llvm.assume(i1 [[C_A]])
+; CHECK-NEXT: [[C_B:%.*]] = icmp uge i8 [[B:%.*]], 6
+; CHECK-NEXT: call void @llvm.assume(i1 [[C_B]])
+; CHECK-NEXT: [[ADD_1:%.*]] = add nuw i8 [[A]], 2
+; CHECK-NEXT: [[ADD_2:%.*]] = add nuw i8 [[ADD_1]], [[B]]
+; CHECK-NEXT: [[ADD_3:%.*]] = add nuw i8 [[ADD_2]], [[A]]
+; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[ADD_3]], 18
+; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[ADD_3]], 19
+; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[C_1]]
+; CHECK-NEXT: ret i1 [[RES_1]]
+;
+entry:
+ %c.a = icmp uge i8 %a, 5
+ call void @llvm.assume(i1 %c.a)
+ %c.b = icmp uge i8 %b, 6
+ call void @llvm.assume(i1 %c.b)
+ %add.1 = add nuw i8 %a, 2
+ %add.2 = add nuw i8 %add.1, %b
+ %add.3 = add nuw i8 %add.2, %a
+ %t.1 = icmp uge i8 %add.3, 18
+ %c.1 = icmp uge i8 %add.3, 19
+ %res.1 = xor i1 %t.1, %c.1
+ ret i1 %res.1
+}
+
+define i1 @test_chained_adds_nuw_4(i8 %a, i8 %b) {
+; CHECK-LABEL: @test_chained_adds_nuw_4(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[C_A:%.*]] = icmp uge i8 [[A:%.*]], 5
+; CHECK-NEXT: call void @llvm.assume(i1 [[C_A]])
+; CHECK-NEXT: [[C_B:%.*]] = icmp uge i8 [[B:%.*]], 6
+; CHECK-NEXT: call void @llvm.assume(i1 [[C_B]])
+; CHECK-NEXT: [[ADD_1:%.*]] = add nuw i8 [[A]], 2
+; CHECK-NEXT: [[ADD_2:%.*]] = add nuw i8 [[ADD_1]], [[B]]
+; CHECK-NEXT: [[ADD_3:%.*]] = add nuw i8 [[ADD_2]], 10
+; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[ADD_3]], 23
+; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[ADD_3]], 24
+; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[C_1]]
+; CHECK-NEXT: ret i1 [[RES_1]]
+;
+entry:
+ %c.a = icmp uge i8 %a, 5
+ call void @llvm.assume(i1 %c.a)
+ %c.b = icmp uge i8 %b, 6
+ call void @llvm.assume(i1 %c.b)
+ %add.1 = add nuw i8 %a, 2
+ %add.2 = add nuw i8 %add.1, %b
+ %add.3 = add nuw i8 %add.2, 10
+ %t.1 = icmp uge i8 %add.3, 23
+ %c.1 = icmp uge i8 %add.3, 24
+ %res.1 = xor i1 %t.1, %c.1
+ ret i1 %res.1
+}
+
+define i1 @test_chained_adds_missing_nuw_1(i8 %a, i8 %b) {
+; CHECK-LABEL: @test_chained_adds_missing_nuw_1(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[C_A:%.*]] = icmp uge i8 [[A:%.*]], 5
+; CHECK-NEXT: call void @llvm.assume(i1 [[C_A]])
+; CHECK-NEXT: [[C_B:%.*]] = icmp uge i8 [[B:%.*]], 6
+; CHECK-NEXT: call void @llvm.assume(i1 [[C_B]])
+; CHECK-NEXT: [[ADD_1:%.*]] = add i8 [[A]], 2
+; CHECK-NEXT: [[ADD_2:%.*]] = add nuw i8 [[ADD_1]], [[B]]
+; CHECK-NEXT: [[ADD_3:%.*]] = add nuw i8 [[ADD_2]], [[A]]
+; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[ADD_3]], 18
+; CHECK-NEXT: [[C_2:%.*]] = icmp uge i8 [[ADD_3]], 19
+; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]]
+; CHECK-NEXT: ret i1 [[RES_1]]
+;
+entry:
+ %c.a = icmp uge i8 %a, 5
+ call void @llvm.assume(i1 %c.a)
+ %c.b = icmp uge i8 %b, 6
+ call void @llvm.assume(i1 %c.b)
+ %add.1 = add i8 %a, 2
+ %add.2 = add nuw i8 %add.1, %b
+ %add.3 = add nuw i8 %add.2, %a
+ %c.1 = icmp uge i8 %add.3, 18
+ %c.2 = icmp uge i8 %add.3, 19
+ %res.1 = xor i1 %c.1, %c.2
+ ret i1 %res.1
+}
+
+define i1 @test_chained_adds_missing_nuw_2(i8 %a, i8 %b) {
+; CHECK-LABEL: @test_chained_adds_missing_nuw_2(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[C_A:%.*]] = icmp uge i8 [[A:%.*]], 5
+; CHECK-NEXT: call void @llvm.assume(i1 [[C_A]])
+; CHECK-NEXT: [[C_B:%.*]] = icmp uge i8 [[B:%.*]], 6
+; CHECK-NEXT: call void @llvm.assume(i1 [[C_B]])
+; CHECK-NEXT: [[ADD_1:%.*]] = add nuw i8 [[A]], 2
+; CHECK-NEXT: [[ADD_2:%.*]] = add i8 [[ADD_1]], [[B]]
+; CHECK-NEXT: [[ADD_3:%.*]] = add nuw i8 [[ADD_2]], [[A]]
+; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[ADD_3]], 18
+; CHECK-NEXT: [[C_2:%.*]] = icmp uge i8 [[ADD_3]], 19
+; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]]
+; CHECK-NEXT: ret i1 [[RES_1]]
+;
+entry:
+ %c.a = icmp uge i8 %a, 5
+ call void @llvm.assume(i1 %c.a)
+ %c.b = icmp uge i8 %b, 6
+ call void @llvm.assume(i1 %c.b)
+ %add.1 = add nuw i8 %a, 2
+ %add.2 = add i8 %add.1, %b
+ %add.3 = add nuw i8 %add.2, %a
+ %c.1 = icmp uge i8 %add.3, 18
+ %c.2 = icmp uge i8 %add.3, 19
+ %res.1 = xor i1 %c.1, %c.2
+ ret i1 %res.1
+}
+
+define i1 @test_chained_adds_missing_nuw_3(i8 %a, i8 %b) {
+; CHECK-LABEL: @test_chained_adds_missing_nuw_3(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[C_A:%.*]] = icmp uge i8 [[A:%.*]], 5
+; CHECK-NEXT: call void @llvm.assume(i1 [[C_A]])
+; CHECK-NEXT: [[C_B:%.*]] = icmp uge i8 [[B:%.*]], 6
+; CHECK-NEXT: call void @llvm.assume(i1 [[C_B]])
+; CHECK-NEXT: [[ADD_1:%.*]] = add nuw i8 [[A]], 2
+; CHECK-NEXT: [[ADD_2:%.*]] = add nuw i8 [[ADD_1]], [[B]]
+; CHECK-NEXT: [[ADD_3:%.*]] = add i8 [[ADD_2]], [[A]]
+; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[ADD_3]], 18
+; CHECK-NEXT: [[C_2:%.*]] = icmp uge i8 [[ADD_3]], 19
+; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]]
+; CHECK-NEXT: ret i1 [[RES_1]]
+;
+entry:
+ %c.a = icmp uge i8 %a, 5
+ call void @llvm.assume(i1 %c.a)
+ %c.b = icmp uge i8 %b, 6
+ call void @llvm.assume(i1 %c.b)
+ %add.1 = add nuw i8 %a, 2
+ %add.2 = add nuw i8 %add.1, %b
+ %add.3 = add i8 %add.2, %a
+ %c.1 = icmp uge i8 %add.3, 18
+ %c.2 = icmp uge i8 %add.3, 19
+ %res.1 = xor i1 %c.1, %c.2
+ ret i1 %res.1
+}
+
+declare void @llvm.assume(i1)
diff --git a/llvm/test/Transforms/ConstraintElimination/wrapping-math.ll b/llvm/test/Transforms/ConstraintElimination/wrapping-math.ll
index 9e745a8f67b6b..91708e1ddeee8 100644
--- a/llvm/test/Transforms/ConstraintElimination/wrapping-math.ll
+++ b/llvm/test/Transforms/ConstraintElimination/wrapping-math.ll
@@ -271,3 +271,86 @@ exit.1:
%xor.8 = xor i1 %xor.7, %c.7
ret i1 %xor.8
}
+
+define i1 @wrapping_add_known_1_add_nuw(i8 %a) {
+; CHECK-LABEL: @wrapping_add_known_1_add_nuw(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[PRE:%.*]] = icmp eq i8 [[A:%.*]], 1
+; CHECK-NEXT: call void @llvm.assume(i1 [[PRE]])
+; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[A]], -1
+; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[SUB_1]], 10
+; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[ADD]], 10
+; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[ADD]], 10
+; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[T_2]]
+; CHECK-NEXT: [[F_1:%.*]] = icmp ult i8 [[ADD]], 10
+; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[F_1]]
+; CHECK-NEXT: ret i1 [[RES_2]]
+;
+entry:
+ %pre = icmp eq i8 %a, 1
+ call void @llvm.assume(i1 %pre)
+ %sub.1 = add i8 %a, -1
+ %add = add nuw i8 %sub.1, 10
+ %t.1 = icmp uge i8 %add, 10
+ %t.2 = icmp ule i8 %add, 10
+ %res.1 = xor i1 %t.1, %t.2
+ %f.1 = icmp ult i8 %add, 10
+ %res.2 = xor i1 %res.1, %f.1
+ ret i1 %res.2
+}
+
+define i1 @add_nuw_wrapping_add_known_1(i8 %a) {
+; CHECK-LABEL: @add_nuw_wrapping_add_known_1(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[PRE:%.*]] = icmp eq i8 [[A:%.*]], 1
+; CHECK-NEXT: call void @llvm.assume(i1 [[PRE]])
+; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[A]], 10
+; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[ADD]], -1
+; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[SUB_1]], 10
+; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[SUB_1]], 10
+; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[T_2]]
+; CHECK-NEXT: [[F_1:%.*]] = icmp ult i8 [[SUB_1]], 10
+; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[F_1]]
+; CHECK-NEXT: ret i1 [[RES_2]]
+;
+entry:
+ %pre = icmp eq i8 %a, 1
+ call void @llvm.assume(i1 %pre)
+ %add = add nuw i8 %a, 10
+ %sub.1 = add i8 %add, -1
+ %t.1 = icmp uge i8 %sub.1, 10
+ %t.2 = icmp ule i8 %sub.1, 10
+ %res.1 = xor i1 %t.1, %t.2
+ %f.1 = icmp ult i8 %sub.1, 10
+ %res.2 = xor i1 %res.1, %f.1
+ ret i1 %res.2
+}
+
+define i1 @add_nuw_wrapping_add_not_known_1(i8 %a) {
+; CHECK-LABEL: @add_nuw_wrapping_add_not_known_1(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[PRE:%.*]] = icmp sge i8 [[A:%.*]], -1
+; CHECK-NEXT: call void @llvm.assume(i1 [[PRE]])
+; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[A]], 10
+; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[ADD]], -1
+; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[SUB_1]], 10
+; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[SUB_1]], 10
+; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[T_2]]
+; CHECK-NEXT: [[F_1:%.*]] = icmp ult i8 [[SUB_1]], 10
+; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[F_1]]
+; CHECK-NEXT: ret i1 [[RES_2]]
+;
+entry:
+ %pre = icmp sge i8 %a, -1
+ call void @llvm.assume(i1 %pre)
+ %add = add nuw i8 %a, 10
+ %sub.1 = add i8 %add, -1
+ %t.1 = icmp uge i8 %sub.1, 10
+ %t.2 = icmp ule i8 %sub.1, 10
+ %res.1 = xor i1 %t.1, %t.2
+ %f.1 = icmp ult i8 %sub.1, 10
+ %res.2 = xor i1 %res.1, %f.1
+ ret i1 %res.2
+}
+
+declare void @llvm.assume(i1)
More information about the llvm-commits
mailing list