[PATCH] D58049: [InstCombine] Fix matchRotate bug when one operand is a ConstantExpr shift

Sanjay Patel via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 11 08:00:58 PST 2019


spatel added a comment.

Not sure if we can even succeed to form a funnel shift with a constant expression here? It's safer to give up immediately if we don't have binops:

  diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
  index 7c195daa3e7..aaa883a7037 100644
  --- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
  +++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
  @@ -1819,14 +1819,18 @@ static Instruction *matchRotate(Instruction &Or) {
   
     // First, find an or'd pair of opposite shifts with the same shifted operand:
     // or (lshr ShVal, ShAmt0), (shl ShVal, ShAmt1)
  -  Value *Or0 = Or.getOperand(0), *Or1 = Or.getOperand(1);
  +  BinaryOperator *Or0, *Or1;
  +  if (!match(Or.getOperand(0), m_BinOp(Or0)) ||
  +      !match(Or.getOperand(1), m_BinOp(Or1)))
  +    return nullptr;
  +
     Value *ShVal, *ShAmt0, *ShAmt1;
     if (!match(Or0, m_OneUse(m_LogicalShift(m_Value(ShVal), m_Value(ShAmt0)))) ||
         !match(Or1, m_OneUse(m_LogicalShift(m_Specific(ShVal), m_Value(ShAmt1)))))
       return nullptr;
   
  -  auto ShiftOpcode0 = cast<BinaryOperator>(Or0)->getOpcode();
  -  auto ShiftOpcode1 = cast<BinaryOperator>(Or1)->getOpcode();
  +  BinaryOperator::BinaryOps ShiftOpcode0 = Or0->getOpcode();
  +  BinaryOperator::BinaryOps ShiftOpcode1 = Or1->getOpcode();
     if (ShiftOpcode0 == ShiftOpcode1)
       return nullptr;


Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D58049/new/

https://reviews.llvm.org/D58049





More information about the llvm-commits mailing list