[llvm] r339446 - [InstCombine] revert r339439 - rearrange code for foldSelectBinOpIdentity

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 10 09:12:19 PDT 2018


Author: spatel
Date: Fri Aug 10 09:12:19 2018
New Revision: 339446

URL: http://llvm.org/viewvc/llvm-project?rev=339446&view=rev
Log:
[InstCombine] revert r339439 - rearrange code for foldSelectBinOpIdentity

That was supposed to be NFC, but it exposed a logic hole somewhere that
caused bots to fail.

Modified:
    llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp?rev=339446&r1=339445&r2=339446&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp Fri Aug 10 09:12:19 2018
@@ -54,38 +54,34 @@ static Value *createMinMax(InstCombiner:
   return Builder.CreateSelect(Builder.CreateICmp(Pred, A, B), A, B);
 }
 
-/// Replace a select operand based on an equality comparison with the identity
-/// constant of a binop.
+/// Fold
+///   %A = icmp eq/ne i8 %x, 0
+///   %B = op i8 %x, %z
+///   %C = select i1 %A, i8 %B, i8 %y
+/// To
+///   %C = select i1 %A, i8 %z, i8 %y
+/// OP: binop with an identity constant
+/// TODO: support for non-commutative and FP opcodes
 static Instruction *foldSelectBinOpIdentity(SelectInst &Sel) {
-  // The select condition must be an equality compare with a constant operand.
-  // TODO: Support FP compares.
-  Value *X;
+
+  Value *Cond = Sel.getCondition();
+  Value *X, *Z;
   Constant *C;
   CmpInst::Predicate Pred;
-  if (!match(Sel.getCondition(), m_ICmp(Pred, m_Value(X), m_Constant(C))) ||
+  if (!match(Cond, m_ICmp(Pred, m_Value(X), m_Constant(C))) ||
       !ICmpInst::isEquality(Pred))
     return nullptr;
 
-  // A select operand must be a binop, and the compare constant must be the
-  // identity constant for that binop.
-  // TODO: Support non-commutative binops.
   bool IsEq = Pred == ICmpInst::ICMP_EQ;
-  BinaryOperator *BO;
-  if (!match(Sel.getOperand(IsEq ? 1 : 2), m_BinOp(BO)) ||
-      ConstantExpr::getBinOpIdentity(BO->getOpcode(), X->getType(), false) != C)
-    return nullptr;
-
-  // Last, match the compare variable operand with a binop operand.
-  Value *Y;
-  if (!match(BO, m_c_BinOp(m_Value(Y), m_Specific(X))))
-    return nullptr;
-
-  // BO = binop Y, X
-  // S = { select (cmp eq X, C), BO, ? } or { select (cmp ne X, C), ?, BO }
-  // =>
-  // S = { select (cmp eq X, C),  Y, ? } or { select (cmp ne X, C), ?,  Y }
-  Sel.setOperand(IsEq ? 1 : 2, Y);
-  return &Sel;
+  auto *BO =
+      dyn_cast<BinaryOperator>(IsEq ? Sel.getTrueValue() : Sel.getFalseValue());
+  // TODO: support for undefs
+  if (BO && match(BO, m_c_BinOp(m_Specific(X), m_Value(Z))) &&
+      ConstantExpr::getBinOpIdentity(BO->getOpcode(), X->getType()) == C) {
+    Sel.setOperand(IsEq ? 1 : 2, Z);
+    return &Sel;
+  }
+  return nullptr;
 }
 
 /// This folds:




More information about the llvm-commits mailing list