[llvm] r320270 - [InstCombine] Fix SimplifyDemandedUseBits SHL handling (PR35515)

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Sat Dec 9 15:42:56 PST 2017


Author: rksimon
Date: Sat Dec  9 15:42:56 2017
New Revision: 320270

URL: http://llvm.org/viewvc/llvm-project?rev=320270&view=rev
Log:
[InstCombine] Fix SimplifyDemandedUseBits SHL handling (PR35515)

Don't assume that the pattern matched SRL can be cast to an Instruction (might be ConstExpr etc.)

Added:
    llvm/trunk/test/Transforms/InstCombine/pr35515.ll
Modified:
    llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp?rev=320270&r1=320269&r2=320270&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp Sat Dec  9 15:42:56 2017
@@ -435,12 +435,11 @@ Value *InstCombiner::SimplifyDemandedUse
     const APInt *SA;
     if (match(I->getOperand(1), m_APInt(SA))) {
       const APInt *ShrAmt;
-      if (match(I->getOperand(0), m_Shr(m_Value(), m_APInt(ShrAmt)))) {
-        Instruction *Shr = cast<Instruction>(I->getOperand(0));
-        if (Value *R = simplifyShrShlDemandedBits(
-                Shr, *ShrAmt, I, *SA, DemandedMask, Known))
-          return R;
-      }
+      if (match(I->getOperand(0), m_Shr(m_Value(), m_APInt(ShrAmt))))
+        if (Instruction *Shr = dyn_cast<Instruction>(I->getOperand(0)))
+          if (Value *R = simplifyShrShlDemandedBits(Shr, *ShrAmt, I, *SA,
+                                                    DemandedMask, Known))
+            return R;
 
       uint64_t ShiftAmt = SA->getLimitedValue(BitWidth-1);
       APInt DemandedMaskIn(DemandedMask.lshr(ShiftAmt));

Added: llvm/trunk/test/Transforms/InstCombine/pr35515.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/pr35515.ll?rev=320270&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/pr35515.ll (added)
+++ llvm/trunk/test/Transforms/InstCombine/pr35515.ll Sat Dec  9 15:42:56 2017
@@ -0,0 +1,20 @@
+; RUN: opt -S -instcombine < %s | FileCheck %s
+
+ at g_40 = external global i8, align 2
+ at g_461 = external global [6 x i8], align 2
+ at g_49 = external local_unnamed_addr global { i8, i8, i8, i8, i8 }, align 2
+
+; CHECK-LABEL: @func_24(
+define fastcc void @func_24() {
+entry:
+  %bf.load81 = load i40, i40* bitcast ({ i8, i8, i8, i8, i8 }* @g_49 to i40*), align 2
+  %bf.clear = and i40 %bf.load81, -274869518337
+  %bf.set = or i40 %bf.clear, shl (i40 zext (i1 icmp sgt (i32 zext (i1 icmp eq (i8* getelementptr inbounds ([6 x i8], [6 x i8]* @g_461, i64 0, i64 2), i8* @g_40) to i32), i32 0) to i40), i40 23)
+  %tmp = lshr i40 %bf.set, 23
+  %tmp1 = trunc i40 %tmp to i32
+  %tmp2 = and i32 1, %tmp1
+  %tmp3 = shl nuw nsw i32 %tmp2, 23
+  %bf.shl154 = zext i32 %tmp3 to i40
+  %bf.set156 = or i40 %bf.clear, %bf.shl154
+  unreachable
+}




More information about the llvm-commits mailing list