[llvm] e1de7ac - Revert "[InstCombine] fold mul with decremented "shl -1" factor"

Florian Mayer via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 31 18:26:44 PDT 2022


Author: Florian Mayer
Date: 2022-10-31T17:39:05-07:00
New Revision: e1de7ac20ff35aab00942f8adbc37a35ad67eaa4

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

LOG: Revert "[InstCombine] fold mul with decremented "shl -1" factor"

This reverts commit bc886e9b587b9d009f49b12eaaa9ebc1c71905a1.

Broke MSAN bootstrap buildbots with Assertion `RangeAfterCopy % ExtraScale == 0 && "Extra instruction requires immediate to be aligned"' failed.

Added: 
    

Modified: 
    llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
    llvm/test/Transforms/InstCombine/mul.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
index 45174b752dc64..e4fccda750e6c 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
@@ -140,7 +140,7 @@ static Value *foldMulSelectToNegate(BinaryOperator &I,
   return nullptr;
 }
 
-/// Reduce integer multiplication patterns that contain a (+/-1 << Z) factor.
+/// Reduce integer multiplication patterns that contain a (1 << Z) factor.
 /// Callers are expected to call this twice to handle commuted patterns.
 static Value *foldMulShl1(BinaryOperator &Mul, bool CommuteOperands,
                           InstCombiner::BuilderTy &Builder) {
@@ -171,17 +171,6 @@ static Value *foldMulShl1(BinaryOperator &Mul, bool CommuteOperands,
     return Builder.CreateAdd(Shl, FrX, Mul.getName(), HasNUW, PropagateNSW);
   }
 
-  // Similar to above, but a decrement of the shifted value is disguised as
-  // 'not' and becomes a sub:
-  // X * (~(-1 << Z)) --> X * ((1 << Z) - 1) --> (X << Z) - X
-  // This increases uses of X, so it may require a freeze, but that is still
-  // expected to be an improvement because it removes the multiply.
-  if (match(Y, m_OneUse(m_Not(m_OneUse(m_Shl(m_AllOnes(), m_Value(Z))))))) {
-    Value *FrX = Builder.CreateFreeze(X, X->getName() + ".fr");
-    Value *Shl = Builder.CreateShl(FrX, Z, "mulshl");
-    return Builder.CreateAdd(Shl, FrX, Mul.getName());
-  }
-
   return nullptr;
 }
 

diff  --git a/llvm/test/Transforms/InstCombine/mul.ll b/llvm/test/Transforms/InstCombine/mul.ll
index 7c3a73b7668b5..29508e5e5d2ce 100644
--- a/llvm/test/Transforms/InstCombine/mul.ll
+++ b/llvm/test/Transforms/InstCombine/mul.ll
@@ -229,10 +229,10 @@ define i32 @shl1_increment_use(i32 %x, i32 %y) {
 
 define i8 @shl1_decrement(i8 %x, i8 %y) {
 ; CHECK-LABEL: @shl1_decrement(
-; CHECK-NEXT:    [[Y_FR:%.*]] = freeze i8 [[Y:%.*]]
-; CHECK-NEXT:    [[MULSHL:%.*]] = shl i8 [[Y_FR]], [[X:%.*]]
-; CHECK-NEXT:    [[M1:%.*]] = add i8 [[MULSHL]], [[Y_FR]]
-; CHECK-NEXT:    ret i8 [[M1]]
+; 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
@@ -243,9 +243,10 @@ define i8 @shl1_decrement(i8 %x, i8 %y) {
 define i8 @shl1_decrement_commute(i8 %x, i8 noundef %p) {
 ; CHECK-LABEL: @shl1_decrement_commute(
 ; CHECK-NEXT:    [[Y:%.*]] = ashr i8 [[P:%.*]], 1
-; CHECK-NEXT:    [[MULSHL:%.*]] = shl i8 [[Y]], [[X:%.*]]
-; CHECK-NEXT:    [[M1:%.*]] = add i8 [[MULSHL]], [[Y]]
-; CHECK-NEXT:    ret i8 [[M1]]
+; 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
@@ -256,10 +257,10 @@ define i8 @shl1_decrement_commute(i8 %x, i8 noundef %p) {
 
 define i8 @shl1_nuw_decrement(i8 %x, i8 %y) {
 ; CHECK-LABEL: @shl1_nuw_decrement(
-; CHECK-NEXT:    [[Y_FR:%.*]] = freeze i8 [[Y:%.*]]
-; CHECK-NEXT:    [[MULSHL:%.*]] = shl i8 [[Y_FR]], [[X:%.*]]
-; CHECK-NEXT:    [[M1:%.*]] = add i8 [[MULSHL]], [[Y_FR]]
-; CHECK-NEXT:    ret i8 [[M1]]
+; CHECK-NEXT:    [[POW2X:%.*]] = shl i8 -1, [[X:%.*]]
+; CHECK-NEXT:    [[X1:%.*]] = xor i8 [[POW2X]], -1
+; CHECK-NEXT:    [[M:%.*]] = mul nuw i8 [[X1]], [[Y:%.*]]
+; CHECK-NEXT:    ret i8 [[M]]
 ;
   %pow2x = shl i8 -1, %x
   %x1 = xor i8 %pow2x, -1
@@ -269,10 +270,10 @@ define i8 @shl1_nuw_decrement(i8 %x, i8 %y) {
 
 define i8 @shl1_nsw_decrement(i8 %x, i8 %y) {
 ; CHECK-LABEL: @shl1_nsw_decrement(
-; CHECK-NEXT:    [[Y_FR:%.*]] = freeze i8 [[Y:%.*]]
-; CHECK-NEXT:    [[MULSHL:%.*]] = shl i8 [[Y_FR]], [[X:%.*]]
-; CHECK-NEXT:    [[M1:%.*]] = add i8 [[MULSHL]], [[Y_FR]]
-; CHECK-NEXT:    ret i8 [[M1]]
+; CHECK-NEXT:    [[POW2X:%.*]] = shl nsw i8 -1, [[X:%.*]]
+; CHECK-NEXT:    [[X1:%.*]] = xor i8 [[POW2X]], -1
+; CHECK-NEXT:    [[M:%.*]] = mul nsw i8 [[X1]], [[Y:%.*]]
+; CHECK-NEXT:    ret i8 [[M]]
 ;
   %pow2x = shl nsw i8 -1, %x
   %x1 = xor i8 %pow2x, -1


        


More information about the llvm-commits mailing list