mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
Convert shifts to muls to assist reassociation. This implements
Reassociate/shifttest.ll llvm-svn: 21761
This commit is contained in:
parent
e265bf6fe5
commit
3edf09a5eb
@ -22,11 +22,11 @@
|
||||
|
||||
#define DEBUG_TYPE "reassociate"
|
||||
#include "llvm/Transforms/Scalar.h"
|
||||
#include "llvm/Constants.h"
|
||||
#include "llvm/Function.h"
|
||||
#include "llvm/Instructions.h"
|
||||
#include "llvm/Type.h"
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/Constant.h"
|
||||
#include "llvm/Type.h"
|
||||
#include "llvm/Support/CFG.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/ADT/PostOrderIterator.h"
|
||||
@ -243,6 +243,25 @@ static Instruction *BreakUpSubtract(Instruction *Sub) {
|
||||
return New;
|
||||
}
|
||||
|
||||
/// ConvertShiftToMul - If this is a shift of a reassociable multiply or is used
|
||||
/// by one, change this into a multiply by a constant to assist with further
|
||||
/// reassociation.
|
||||
static Instruction *ConvertShiftToMul(Instruction *Shl) {
|
||||
if (!isReassociableOp(Shl->getOperand(0), Instruction::Mul) &&
|
||||
!(Shl->hasOneUse() && isReassociableOp(Shl->use_back(),Instruction::Mul)))
|
||||
return 0;
|
||||
|
||||
Constant *MulCst = ConstantInt::get(Shl->getType(), 1);
|
||||
MulCst = ConstantExpr::getShl(MulCst, cast<Constant>(Shl->getOperand(1)));
|
||||
|
||||
std::string Name = Shl->getName(); Shl->setName("");
|
||||
Instruction *Mul = BinaryOperator::createMul(Shl->getOperand(0), MulCst,
|
||||
Name, Shl);
|
||||
Shl->replaceAllUsesWith(Mul);
|
||||
Shl->eraseFromParent();
|
||||
return Mul;
|
||||
}
|
||||
|
||||
|
||||
/// ReassociateBB - Inspect all of the instructions in this basic block,
|
||||
/// reassociating them as we go.
|
||||
@ -256,6 +275,12 @@ bool Reassociate::ReassociateBB(BasicBlock *BB) {
|
||||
Changed = true;
|
||||
BI = NI;
|
||||
}
|
||||
if (BI->getOpcode() == Instruction::Shl &&
|
||||
isa<ConstantInt>(BI->getOperand(1)))
|
||||
if (Instruction *NI = ConvertShiftToMul(BI)) {
|
||||
Changed = true;
|
||||
BI = NI;
|
||||
}
|
||||
|
||||
// If this instruction is a commutative binary operator, and the ranks of
|
||||
// the two operands are sorted incorrectly, fix it now.
|
||||
|
Loading…
Reference in New Issue
Block a user