[llvm] [RISCV] Reverse (add x, (zext c)) back to (select c, (add x, 1), x) (PR #87236)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 1 06:27:27 PDT 2024
================
@@ -52,12 +52,59 @@ class RISCVCodeGenPrepare : public FunctionPass,
}
bool visitInstruction(Instruction &I) { return false; }
+ bool visitAdd(BinaryOperator &BO);
bool visitAnd(BinaryOperator &BO);
bool visitIntrinsicInst(IntrinsicInst &I);
};
} // end anonymous namespace
+/// InstCombine will canonicalize selects of binary ops where the identity is
+/// zero to zexts:
+///
+/// select c, (add x, 1), x -> add x, (zext c)
+///
+/// On RISC-V though, a zext of an i1 vector will be lowered as a vmv.v.i and a
+/// vmerge.vim:
+///
+/// vmv.v.i v12, 0
+/// vmerge.vim v9, v12, 1, v0
+/// vadd.vv v8, v8, v9
+///
+/// Reverse this transform so that we pull the select outside of the binary op,
+/// which allows us to fold it into a masked op:
+///
+/// vadd.vi v8, v8, 1, v0.t
+bool RISCVCodeGenPrepare::visitAdd(BinaryOperator &BO) {
+ VectorType *Ty = dyn_cast<VectorType>(BO.getType());
+ if (!Ty)
+ return false;
+
+ Constant *Identity = ConstantExpr::getIdentity(&BO, BO.getType());
+ if (!Identity->isZeroValue())
+ return false;
+
+ using namespace PatternMatch;
+
+ Value *Mask, *RHS;
+ if (!match(&BO, m_c_BinOp(m_OneUse(m_ZExt(m_Value(Mask))), m_Value(RHS))))
----------------
dtcxzyw wrote:
Please add a test that commutes operands and a negative test with multi-use zext.
https://github.com/llvm/llvm-project/pull/87236
More information about the llvm-commits
mailing list