[PATCH] D97360: [TTI] Consider select form of and/or i1 as having arithmetic cost
Juneyoung Lee via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 23 23:11:46 PST 2021
aqjune created this revision.
aqjune added reviewers: fhahn, nikic, spatel, dmgreen.
aqjune requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
This is a patch that updates the cost of `select i1 a, b, false` to be equivalent to that of `and i1 a, b`
as well as the cost of `select i1 a, true, b` equivalent to `or i1 a, b`.
Until now, these selects were folded into and/or i1 by InstCombine, but the transformation is poison-unsafe.
This is a step towards removing the unsafe transformation. D93065 <https://reviews.llvm.org/D93065> has relevant transformations linked.
These selects should be translated into the assemblies as and/or i1 do in the same manner. The cost should be equivalent.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D97360
Files:
llvm/include/llvm/Analysis/TargetTransformInfoImpl.h
Index: llvm/include/llvm/Analysis/TargetTransformInfoImpl.h
===================================================================
--- llvm/include/llvm/Analysis/TargetTransformInfoImpl.h
+++ llvm/include/llvm/Analysis/TargetTransformInfoImpl.h
@@ -22,8 +22,11 @@
#include "llvm/IR/GetElementPtrTypeIterator.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Operator.h"
+#include "llvm/IR/PatternMatch.h"
#include "llvm/IR/Type.h"
+using namespace llvm::PatternMatch;
+
namespace llvm {
/// Base class for use as a mix-in that aids implementing
@@ -990,6 +993,18 @@
CostKind, I);
}
case Instruction::Select: {
+ const Value *Op0, *Op1;
+ if (match(U, m_LogicalAnd(m_Value(Op0), m_Value(Op1))) ||
+ match(U, m_LogicalOr(m_Value(Op0), m_Value(Op1)))) {
+ TTI::OperandValueProperties Op1VP = TTI::OP_None;
+ TTI::OperandValueProperties Op2VP = TTI::OP_None;
+ TTI::OperandValueKind Op1VK = TTI::getOperandInfo(Op0, Op1VP);
+ TTI::OperandValueKind Op2VK = TTI::getOperandInfo(Op1, Op2VP);
+ SmallVector<const Value *, 2> Operands{Op0, Op1};
+ return TargetTTI->getArithmeticInstrCost(
+ match(U, m_LogicalOr()) ? Instruction::Or : Instruction::And,
+ Ty, CostKind, Op1VK, Op2VK, Op1VP, Op2VP, Operands, I);
+ }
Type *CondTy = U->getOperand(0)->getType();
return TargetTTI->getCmpSelInstrCost(Opcode, U->getType(), CondTy,
CmpInst::BAD_ICMP_PREDICATE,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D97360.325992.patch
Type: text/x-patch
Size: 1557 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210224/9a96fa27/attachment.bin>
More information about the llvm-commits
mailing list