mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[InstCombine] narrowRotate - canonicalize to OR(SHL,LSHR). NFCI.
Match the canonicalization code that was added to matchFunnelShift at rG02295e6d1a15
This commit is contained in:
parent
55a70d8e91
commit
500c5cb174
@ -531,19 +531,25 @@ Instruction *InstCombinerImpl::narrowRotate(TruncInst &Trunc) {
|
||||
|
||||
// First, find an or'd pair of opposite shifts with the same shifted operand:
|
||||
// trunc (or (lshr ShVal, ShAmt0), (shl ShVal, ShAmt1))
|
||||
Value *Or0, *Or1;
|
||||
if (!match(Trunc.getOperand(0), m_OneUse(m_Or(m_Value(Or0), m_Value(Or1)))))
|
||||
BinaryOperator *Or0, *Or1;
|
||||
if (!match(Trunc.getOperand(0), m_OneUse(m_Or(m_BinOp(Or0), 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)))))
|
||||
!match(Or1,
|
||||
m_OneUse(m_LogicalShift(m_Specific(ShVal), m_Value(ShAmt1)))) ||
|
||||
Or0->getOpcode() == Or1->getOpcode())
|
||||
return nullptr;
|
||||
|
||||
auto ShiftOpcode0 = cast<BinaryOperator>(Or0)->getOpcode();
|
||||
auto ShiftOpcode1 = cast<BinaryOperator>(Or1)->getOpcode();
|
||||
if (ShiftOpcode0 == ShiftOpcode1)
|
||||
return nullptr;
|
||||
// Canonicalize to or(shl(ShVal, ShAmt0), lshr(ShVal, ShAmt1)).
|
||||
if (Or0->getOpcode() == BinaryOperator::LShr) {
|
||||
std::swap(Or0, Or1);
|
||||
std::swap(ShAmt0, ShAmt1);
|
||||
}
|
||||
assert(Or0->getOpcode() == BinaryOperator::Shl &&
|
||||
Or1->getOpcode() == BinaryOperator::LShr &&
|
||||
"Illegal or(shift,shift) pair");
|
||||
|
||||
// Match the shift amount operands for a rotate pattern. This always matches
|
||||
// a subtraction on the R operand.
|
||||
@ -570,10 +576,10 @@ Instruction *InstCombinerImpl::narrowRotate(TruncInst &Trunc) {
|
||||
};
|
||||
|
||||
Value *ShAmt = matchShiftAmount(ShAmt0, ShAmt1, NarrowWidth);
|
||||
bool SubIsOnLHS = false;
|
||||
bool IsFshl = true; // Sub on LSHR.
|
||||
if (!ShAmt) {
|
||||
ShAmt = matchShiftAmount(ShAmt1, ShAmt0, NarrowWidth);
|
||||
SubIsOnLHS = true;
|
||||
IsFshl = false; // Sub on SHL.
|
||||
}
|
||||
if (!ShAmt)
|
||||
return nullptr;
|
||||
@ -591,8 +597,6 @@ Instruction *InstCombinerImpl::narrowRotate(TruncInst &Trunc) {
|
||||
// llvm.fshl.i8(trunc(ShVal), trunc(ShVal), trunc(ShAmt))
|
||||
Value *NarrowShAmt = Builder.CreateTrunc(ShAmt, DestTy);
|
||||
Value *X = Builder.CreateTrunc(ShVal, DestTy);
|
||||
bool IsFshl = (!SubIsOnLHS && ShiftOpcode0 == BinaryOperator::Shl) ||
|
||||
(SubIsOnLHS && ShiftOpcode1 == BinaryOperator::Shl);
|
||||
Intrinsic::ID IID = IsFshl ? Intrinsic::fshl : Intrinsic::fshr;
|
||||
Function *F = Intrinsic::getDeclaration(Trunc.getModule(), IID, DestTy);
|
||||
return IntrinsicInst::Create(F, { X, X, NarrowShAmt });
|
||||
|
Loading…
Reference in New Issue
Block a user