Author: Nikita Popov Date: 2020-12-25T16:28:30+01:00 New Revision: b0e6007c8254811a5828c1a253a615e45359c653
URL: https://github.com/llvm/llvm-project/commit/b0e6007c8254811a5828c1a253a615e45359c653 DIFF: https://github.com/llvm/llvm-project/commit/b0e6007c8254811a5828c1a253a615e45359c653.diff LOG: [InstCombine] Add additional tests for known non zero (NFC) Check conditions that imply non-zero, even if they are not literally "x != 0". Using ctlz for testing, as explicit comparison might get folded by other reasoning. Added: Modified: llvm/test/Transforms/InstCombine/known-non-zero.ll Removed: ################################################################################ diff --git a/llvm/test/Transforms/InstCombine/known-non-zero.ll b/llvm/test/Transforms/InstCombine/known-non-zero.ll index 5467db556632..e2049b22690d 100644 --- a/llvm/test/Transforms/InstCombine/known-non-zero.ll +++ b/llvm/test/Transforms/InstCombine/known-non-zero.ll @@ -13,7 +13,7 @@ define i32 @test0(i64 %x) { ; CHECK-NEXT: [[C:%.*]] = icmp eq i64 [[X:%.*]], 0 ; CHECK-NEXT: br i1 [[C]], label [[EXIT:%.*]], label [[NON_ZERO:%.*]] ; CHECK: non_zero: -; CHECK-NEXT: [[CTZ:%.*]] = call i64 @llvm.cttz.i64(i64 [[X]], i1 true), !range !0 +; CHECK-NEXT: [[CTZ:%.*]] = call i64 @llvm.cttz.i64(i64 [[X]], i1 true), [[RNG0:!range !.*]] ; CHECK-NEXT: [[CTZ32:%.*]] = trunc i64 [[CTZ]] to i32 ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: @@ -40,7 +40,7 @@ define i32 @test1(i64 %x) { ; CHECK-NEXT: [[C:%.*]] = icmp eq i64 [[X:%.*]], 0 ; CHECK-NEXT: br i1 [[C]], label [[EXIT:%.*]], label [[NON_ZERO:%.*]] ; CHECK: non_zero: -; CHECK-NEXT: [[CTZ:%.*]] = call i64 @llvm.ctlz.i64(i64 [[X]], i1 true), !range !0 +; CHECK-NEXT: [[CTZ:%.*]] = call i64 @llvm.ctlz.i64(i64 [[X]], i1 true), [[RNG0]] ; CHECK-NEXT: [[CTZ32:%.*]] = trunc i64 [[CTZ]] to i32 ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: @@ -93,8 +93,8 @@ exit: } ; Test that exposed a bug in the PHI handling after D60846. No folding should happen here! -define void @D60846_misompile(i1* %p) { -; CHECK-LABEL: @D60846_misompile( +define void @D60846_miscompile(i1* %p) { +; CHECK-LABEL: @D60846_miscompile( ; CHECK-NEXT: entry: ; CHECK-NEXT: br label [[LOOP:%.*]] ; CHECK: loop: @@ -133,3 +133,95 @@ common: ; preds = %non_zero, %loop exit: ; preds = %common ret void } + +define i64 @test_sgt_zero(i64 %x) { +; CHECK-LABEL: @test_sgt_zero( +; CHECK-NEXT: start: +; CHECK-NEXT: [[C:%.*]] = icmp sgt i64 [[X:%.*]], 0 +; CHECK-NEXT: br i1 [[C]], label [[NON_ZERO:%.*]], label [[EXIT:%.*]] +; CHECK: non_zero: +; CHECK-NEXT: [[CTZ:%.*]] = call i64 @llvm.ctlz.i64(i64 [[X]], i1 false), [[RNG0]] +; CHECK-NEXT: ret i64 [[CTZ]] +; CHECK: exit: +; CHECK-NEXT: ret i64 -1 +; +start: + %c = icmp sgt i64 %x, 0 + br i1 %c, label %non_zero, label %exit + +non_zero: + %ctz = call i64 @llvm.ctlz.i64(i64 %x, i1 false) + ret i64 %ctz + +exit: + ret i64 -1 +} + +define i64 @test_slt_neg_ten(i64 %x) { +; CHECK-LABEL: @test_slt_neg_ten( +; CHECK-NEXT: start: +; CHECK-NEXT: [[C:%.*]] = icmp slt i64 [[X:%.*]], -10 +; CHECK-NEXT: br i1 [[C]], label [[NON_ZERO:%.*]], label [[EXIT:%.*]] +; CHECK: non_zero: +; CHECK-NEXT: [[CTZ:%.*]] = call i64 @llvm.ctlz.i64(i64 [[X]], i1 false), [[RNG0]] +; CHECK-NEXT: ret i64 [[CTZ]] +; CHECK: exit: +; CHECK-NEXT: ret i64 -1 +; +start: + %c = icmp slt i64 %x, -10 + br i1 %c, label %non_zero, label %exit + +non_zero: + %ctz = call i64 @llvm.ctlz.i64(i64 %x, i1 false) + ret i64 %ctz + +exit: + ret i64 -1 +} + +define i64 @test_slt_ten(i64 %x) { +; CHECK-LABEL: @test_slt_ten( +; CHECK-NEXT: start: +; CHECK-NEXT: [[C:%.*]] = icmp slt i64 [[X:%.*]], 10 +; CHECK-NEXT: br i1 [[C]], label [[MAYBE_ZERO:%.*]], label [[EXIT:%.*]] +; CHECK: maybe_zero: +; CHECK-NEXT: [[CTZ:%.*]] = call i64 @llvm.ctlz.i64(i64 [[X]], i1 false), [[RNG0]] +; CHECK-NEXT: ret i64 [[CTZ]] +; CHECK: exit: +; CHECK-NEXT: ret i64 -1 +; +start: + %c = icmp slt i64 %x, 10 + br i1 %c, label %maybe_zero, label %exit + +maybe_zero: + %ctz = call i64 @llvm.ctlz.i64(i64 %x, i1 false) + ret i64 %ctz + +exit: + ret i64 -1 +} + +define i64 @test_ugt_unknown(i64 %x, i64 %y) { +; CHECK-LABEL: @test_ugt_unknown( +; CHECK-NEXT: start: +; CHECK-NEXT: [[C:%.*]] = icmp ugt i64 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[NON_ZERO:%.*]], label [[EXIT:%.*]] +; CHECK: non_zero: +; CHECK-NEXT: [[CTZ:%.*]] = call i64 @llvm.ctlz.i64(i64 [[X]], i1 false), [[RNG0]] +; CHECK-NEXT: ret i64 [[CTZ]] +; CHECK: exit: +; CHECK-NEXT: ret i64 -1 +; +start: + %c = icmp ugt i64 %x, %y + br i1 %c, label %non_zero, label %exit + +non_zero: + %ctz = call i64 @llvm.ctlz.i64(i64 %x, i1 false) + ret i64 %ctz + +exit: + ret i64 -1 +} _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits