[llvm] 0271288 - [InstCombine] add tests for mul with shl operand; NFC

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Sat Oct 29 06:27:35 PDT 2022


Author: Sanjay Patel
Date: 2022-10-29T09:26:02-04:00
New Revision: 0271288874989e9a146791c81729bc5906563cc8

URL: https://github.com/llvm/llvm-project/commit/0271288874989e9a146791c81729bc5906563cc8
DIFF: https://github.com/llvm/llvm-project/commit/0271288874989e9a146791c81729bc5906563cc8.diff

LOG: [InstCombine] add tests for mul with shl operand; NFC

Added: 
    

Modified: 
    llvm/test/Transforms/InstCombine/mul.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/InstCombine/mul.ll b/llvm/test/Transforms/InstCombine/mul.ll
index d2389c9ea2b2d..acc01c2ad31c0 100644
--- a/llvm/test/Transforms/InstCombine/mul.ll
+++ b/llvm/test/Transforms/InstCombine/mul.ll
@@ -85,13 +85,189 @@ define i32 @test12(i32 %a, i32 %b) {
 }
 
 ; rdar://7293527
-define i32 @test15(i32 %A, i32 %B) {
-; CHECK-LABEL: @test15(
+define i32 @shl1(i32 %a, i32 %b) {
+; CHECK-LABEL: @shl1(
 ; CHECK-NEXT:    [[M:%.*]] = shl i32 [[A:%.*]], [[B:%.*]]
 ; CHECK-NEXT:    ret i32 [[M]]
+;
+  %shl = shl i32 1, %b
+  %m = mul i32 %shl, %a
+  ret i32 %m
+}
+
+define i32 @shl1_nsw_nsw(i32 %A, i32 %B) {
+; CHECK-LABEL: @shl1_nsw_nsw(
+; CHECK-NEXT:    [[D:%.*]] = shl nsw i32 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT:    ret i32 [[D]]
+;
+  %shl = shl nsw i32 1, %B
+  %D = mul nsw i32 %A, %shl
+  ret i32 %D
+}
+
+define <2 x i32> @shl1_nsw_nsw_commute(<2 x i32> %A, <2 x i32> %B) {
+; CHECK-LABEL: @shl1_nsw_nsw_commute(
+; CHECK-NEXT:    [[D:%.*]] = shl nsw <2 x i32> [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT:    ret <2 x i32> [[D]]
+;
+  %shl = shl nsw <2 x i32> <i32 1, i32 poison>, %B
+  %D = mul nsw <2 x i32> %shl, %A
+  ret <2 x i32> %D
+}
+
+define i32 @shl1_nuw(i32 %A, i32 %B) {
+; CHECK-LABEL: @shl1_nuw(
+; CHECK-NEXT:    [[D:%.*]] = shl nuw i32 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT:    ret i32 [[D]]
 ;
   %shl = shl i32 1, %B
-  %m = mul i32 %shl, %A
+  %D = mul nuw i32 %A, %shl
+  ret i32 %D
+}
+
+define i32 @shl1_nuw_commute(i32 %A, i32 %B) {
+; CHECK-LABEL: @shl1_nuw_commute(
+; CHECK-NEXT:    [[D:%.*]] = shl i32 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT:    ret i32 [[D]]
+;
+  %shl = shl nuw i32 1, %B
+  %D = mul i32 %shl, %A
+  ret i32 %D
+}
+
+define i32 @shl1_nsw(i32 %A) {
+; CHECK-LABEL: @shl1_nsw(
+; CHECK-NEXT:    [[SHL:%.*]] = shl i32 1, [[A:%.*]]
+; CHECK-NEXT:    [[C:%.*]] = shl i32 [[SHL]], [[A]]
+; CHECK-NEXT:    ret i32 [[C]]
+;
+  %shl = shl i32 1, %A
+  %C = mul nsw i32 %shl, %shl
+  ret i32 %C
+}
+
+define i5 @shl1_increment(i5 %x, i5 %y) {
+; CHECK-LABEL: @shl1_increment(
+; CHECK-NEXT:    [[POW2X:%.*]] = shl i5 1, [[X:%.*]]
+; CHECK-NEXT:    [[X1:%.*]] = add i5 [[POW2X]], 1
+; CHECK-NEXT:    [[M:%.*]] = mul i5 [[X1]], [[Y:%.*]]
+; CHECK-NEXT:    ret i5 [[M]]
+;
+  %pow2x = shl i5 1, %x
+  %x1 = add i5 %pow2x, 1
+  %m = mul i5 %x1, %y
+  ret i5 %m
+}
+
+define <3 x i5> @shl1_nuw_increment_commute(<3 x i5> %x, <3 x i5> noundef %p) {
+; CHECK-LABEL: @shl1_nuw_increment_commute(
+; CHECK-NEXT:    [[Y:%.*]] = ashr <3 x i5> [[P:%.*]], <i5 1, i5 1, i5 1>
+; CHECK-NEXT:    [[POW2X:%.*]] = shl <3 x i5> <i5 1, i5 poison, i5 1>, [[X:%.*]]
+; CHECK-NEXT:    [[X1:%.*]] = add <3 x i5> [[POW2X]], <i5 1, i5 poison, i5 1>
+; CHECK-NEXT:    [[M:%.*]] = mul nuw <3 x i5> [[Y]], [[X1]]
+; CHECK-NEXT:    ret <3 x i5> [[M]]
+;
+  %y = ashr <3 x i5> %p, <i5 1, i5 1, i5 1> ; thwart complexity-based canonicalization
+  %pow2x = shl <3 x i5> <i5 1, i5 poison, i5 1>, %x
+  %x1 = add <3 x i5> %pow2x, <i5 1, i5 poison, i5 1>
+  %m = mul nuw <3 x i5> %y, %x1
+  ret <3 x i5> %m
+}
+
+define i5 @shl1_nsw_increment(i5 %x, i5 %y) {
+; CHECK-LABEL: @shl1_nsw_increment(
+; CHECK-NEXT:    [[POW2X:%.*]] = shl i5 1, [[X:%.*]]
+; CHECK-NEXT:    [[X1:%.*]] = add i5 [[POW2X]], 1
+; CHECK-NEXT:    [[M:%.*]] = mul nsw i5 [[X1]], [[Y:%.*]]
+; CHECK-NEXT:    ret i5 [[M]]
+;
+  %pow2x = shl i5 1, %x
+  %x1 = add i5 %pow2x, 1
+  %m = mul nsw i5 %x1, %y
+  ret i5 %m
+}
+
+define i5 @shl1_nsw_nsw_increment(i5 %x, i5 %y) {
+; CHECK-LABEL: @shl1_nsw_nsw_increment(
+; CHECK-NEXT:    [[POW2X:%.*]] = shl nsw i5 1, [[X:%.*]]
+; CHECK-NEXT:    [[X1:%.*]] = add nuw nsw i5 [[POW2X]], 1
+; CHECK-NEXT:    [[M:%.*]] = mul nsw i5 [[X1]], [[Y:%.*]]
+; CHECK-NEXT:    ret i5 [[M]]
+;
+  %pow2x = shl nsw i5 1, %x
+  %x1 = add i5 %pow2x, 1
+  %m = mul nsw i5 %y, %x1
+  ret i5 %m
+}
+
+define i5 @shl1_nsw_nsw_increment_commute(i5 %x, i5 %y) {
+; CHECK-LABEL: @shl1_nsw_nsw_increment_commute(
+; CHECK-NEXT:    [[POW2X:%.*]] = shl nsw i5 1, [[X:%.*]]
+; CHECK-NEXT:    [[X1:%.*]] = add nuw nsw i5 [[POW2X]], 1
+; CHECK-NEXT:    [[M:%.*]] = mul i5 [[X1]], [[Y:%.*]]
+; CHECK-NEXT:    ret i5 [[M]]
+;
+  %pow2x = shl nsw i5 1, %x
+  %x1 = add nsw i5 %pow2x, 1
+  %m = mul i5 %x1, %y
+  ret i5 %m
+}
+
+define i32 @shl1_increment_use(i32 %x, i32 %y) {
+; CHECK-LABEL: @shl1_increment_use(
+; CHECK-NEXT:    [[POW2X:%.*]] = shl i32 1, [[X:%.*]]
+; CHECK-NEXT:    call void @use32(i32 [[POW2X]])
+; CHECK-NEXT:    [[X1:%.*]] = add i32 [[POW2X]], 1
+; CHECK-NEXT:    [[M:%.*]] = mul i32 [[X1]], [[Y:%.*]]
+; CHECK-NEXT:    ret i32 [[M]]
+;
+  %pow2x = shl i32 1, %x
+  call void @use32(i32 %pow2x)
+  %x1 = add i32 %pow2x, 1
+  %m = mul i32 %x1, %y
+  ret i32 %m
+}
+
+define i8 @shl1_decrement(i8 %x, i8 %y) {
+; CHECK-LABEL: @shl1_decrement(
+; CHECK-NEXT:    [[POW2X:%.*]] = shl i8 -1, [[X:%.*]]
+; CHECK-NEXT:    [[X1:%.*]] = xor i8 [[POW2X]], -1
+; CHECK-NEXT:    [[M:%.*]] = mul i8 [[X1]], [[Y:%.*]]
+; CHECK-NEXT:    ret i8 [[M]]
+;
+  %pow2x = shl i8 -1, %x
+  %x1 = xor i8 %pow2x, -1
+  %m = mul i8 %x1, %y
+  ret i8 %m
+}
+
+define i8 @shl1_decrement_commute(i8 %x, i8 %p) {
+; CHECK-LABEL: @shl1_decrement_commute(
+; CHECK-NEXT:    [[Y:%.*]] = ashr i8 [[P:%.*]], 1
+; CHECK-NEXT:    [[NOTMASK:%.*]] = shl nsw i8 -1, [[X:%.*]]
+; CHECK-NEXT:    [[X1:%.*]] = xor i8 [[NOTMASK]], -1
+; CHECK-NEXT:    [[M:%.*]] = mul i8 [[Y]], [[X1]]
+; CHECK-NEXT:    ret i8 [[M]]
+;
+  %y = ashr i8 %p, 1 ; thwart complexity-based canonicalization
+  %pow2x = shl i8 1, %x
+  %x1 = add i8 %pow2x, -1
+  %m = mul i8 %y, %x1
+  ret i8 %m
+}
+
+define i32 @shl1_decrement_use(i32 %x, i32 %y) {
+; CHECK-LABEL: @shl1_decrement_use(
+; CHECK-NEXT:    [[NOTMASK:%.*]] = shl nsw i32 -1, [[X:%.*]]
+; CHECK-NEXT:    [[X1:%.*]] = xor i32 [[NOTMASK]], -1
+; CHECK-NEXT:    call void @use32(i32 [[X1]])
+; CHECK-NEXT:    [[M:%.*]] = mul i32 [[X1]], [[Y:%.*]]
+; CHECK-NEXT:    ret i32 [[M]]
+;
+  %pow2x = shl i32 1, %x
+  %x1 = add i32 %pow2x, -1
+  call void @use32(i32 %x1)
+  %m = mul i32 %x1, %y
   ret i32 %m
 }
 
@@ -884,37 +1060,6 @@ define <3 x i4> @neg_mul_constant_vec_weird(<3 x i4> %a) {
   ret <3 x i4> %B
 }
 
-define i32 @test26(i32 %A, i32 %B) {
-; CHECK-LABEL: @test26(
-; CHECK-NEXT:    [[D:%.*]] = shl nsw i32 [[A:%.*]], [[B:%.*]]
-; CHECK-NEXT:    ret i32 [[D]]
-;
-  %C = shl nsw i32 1, %B
-  %D = mul nsw i32 %A, %C
-  ret i32 %D
-}
-
-define i32 @test27(i32 %A, i32 %B) {
-; CHECK-LABEL: @test27(
-; CHECK-NEXT:    [[D:%.*]] = shl nuw i32 [[A:%.*]], [[B:%.*]]
-; CHECK-NEXT:    ret i32 [[D]]
-;
-  %C = shl i32 1, %B
-  %D = mul nuw i32 %A, %C
-  ret i32 %D
-}
-
-define i32 @test28(i32 %A) {
-; CHECK-LABEL: @test28(
-; CHECK-NEXT:    [[B:%.*]] = shl i32 1, [[A:%.*]]
-; CHECK-NEXT:    [[C:%.*]] = shl i32 [[B]], [[A]]
-; CHECK-NEXT:    ret i32 [[C]]
-;
-  %B = shl i32 1, %A
-  %C = mul nsw i32 %B, %B
-  ret i32 %C
-}
-
 define i64 @test29(i31 %A, i31 %B) {
 ; CHECK-LABEL: @test29(
 ; CHECK-NEXT:    [[C:%.*]] = sext i31 [[A:%.*]] to i64


        


More information about the llvm-commits mailing list