[llvm] f0071d4 - [InstCombine] add use check to fold of bitwise logic with cast ops

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Fri May 20 06:12:43 PDT 2022


Author: Sanjay Patel
Date: 2022-05-20T09:08:53-04:00
New Revision: f0071d43e4d30a0bc224020abb52fa77054d2520

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

LOG: [InstCombine] add use check to fold of bitwise logic with cast ops

This was shown as a potential regression in D126040.

Added: 
    

Modified: 
    llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
    llvm/test/Transforms/InstCombine/and-xor-or.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
index 8e3956dd05fd..6068a4e39224 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -1431,9 +1431,10 @@ Instruction *InstCombinerImpl::foldCastedBitwiseLogic(BinaryOperator &I) {
   Value *Cast1Src = Cast1->getOperand(0);
 
   // fold logic(cast(A), cast(B)) -> cast(logic(A, B))
-  if (shouldOptimizeCast(Cast0) && shouldOptimizeCast(Cast1)) {
+  if ((Cast0->hasOneUse() || Cast1->hasOneUse()) &&
+      shouldOptimizeCast(Cast0) && shouldOptimizeCast(Cast1)) {
     Value *NewOp = Builder.CreateBinOp(LogicOpc, Cast0Src, Cast1Src,
-                                        I.getName());
+                                       I.getName());
     return CastInst::Create(CastOpcode, NewOp, DestTy);
   }
 

diff  --git a/llvm/test/Transforms/InstCombine/and-xor-or.ll b/llvm/test/Transforms/InstCombine/and-xor-or.ll
index 13ad55d83db4..6e31dbe16f62 100644
--- a/llvm/test/Transforms/InstCombine/and-xor-or.ll
+++ b/llvm/test/Transforms/InstCombine/and-xor-or.ll
@@ -4159,8 +4159,7 @@ define i32 @zext_zext_and_uses(i8 %x, i8 %y) {
 ; CHECK-NEXT:    call void @use(i32 [[ZX]])
 ; CHECK-NEXT:    [[ZY:%.*]] = zext i8 [[Y]] to i32
 ; CHECK-NEXT:    call void @use(i32 [[ZY]])
-; CHECK-NEXT:    [[R1:%.*]] = and i8 [[X]], [[Y]]
-; CHECK-NEXT:    [[R:%.*]] = zext i8 [[R1]] to i32
+; CHECK-NEXT:    [[R:%.*]] = and i32 [[ZX]], [[ZY]]
 ; CHECK-NEXT:    ret i32 [[R]]
 ;
   %zx = zext i8 %x to i32
@@ -4178,8 +4177,7 @@ define i32 @sext_sext_or_uses(i8 %x, i8 %y) {
 ; CHECK-NEXT:    call void @use(i32 [[SX]])
 ; CHECK-NEXT:    [[SY:%.*]] = sext i8 [[Y]] to i32
 ; CHECK-NEXT:    call void @use(i32 [[SY]])
-; CHECK-NEXT:    [[R1:%.*]] = or i8 [[X]], [[Y]]
-; CHECK-NEXT:    [[R:%.*]] = sext i8 [[R1]] to i32
+; CHECK-NEXT:    [[R:%.*]] = or i32 [[SX]], [[SY]]
 ; CHECK-NEXT:    ret i32 [[R]]
 ;
   %sx = sext i8 %x to i32
@@ -4197,8 +4195,7 @@ define i32 @trunc_trunc_xor_uses(i65 %x, i65 %y) {
 ; CHECK-NEXT:    call void @use(i32 [[SX]])
 ; CHECK-NEXT:    [[SY:%.*]] = trunc i65 [[Y]] to i32
 ; CHECK-NEXT:    call void @use(i32 [[SY]])
-; CHECK-NEXT:    [[R1:%.*]] = xor i65 [[X]], [[Y]]
-; CHECK-NEXT:    [[R:%.*]] = trunc i65 [[R1]] to i32
+; CHECK-NEXT:    [[R:%.*]] = xor i32 [[SX]], [[SY]]
 ; CHECK-NEXT:    ret i32 [[R]]
 ;
   %sx = trunc i65 %x to i32


        


More information about the llvm-commits mailing list