1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-24 05:23:45 +02:00

Kill casts from integer types to unsigned byte, when the cast was only used

as the shift amount operand to a shift instruction.  This was causing us to
emit unnecessary clear operations for code such as:
int foo(int x) { return 1 << x; }

llvm-svn: 17175
This commit is contained in:
Nate Begeman 2004-10-23 00:50:23 +00:00
parent cfd8a7eb53
commit 91ef127999

View File

@ -3014,6 +3014,19 @@ void PPC32ISel::visitCastInst(CastInst &CI) {
unsigned DestReg = getReg(CI);
MachineBasicBlock::iterator MI = BB->end();
// If this is a cast from an integer type to a ubyte, with one use where the
// use is the shift amount argument of a shift instruction, just emit a move
// instead (since the shift instruction will only look at the low 5 bits
// regardless of how it is sign extended)
if (CI.getType() == Type::UByteTy && SrcClass <= cInt && CI.hasOneUse()) {
ShiftInst *SI = dyn_cast<ShiftInst>(*(CI.use_begin()));
if (SI && (SI->getOperand(1) == &CI)) {
unsigned SrcReg = getReg(Op, BB, MI);
BuildMI(*BB, MI, PPC::OR, 2, DestReg).addReg(SrcReg).addReg(SrcReg);
return;
}
}
// If this is a cast from an byte, short, or int to an integer type of equal
// or lesser width, and all uses of the cast are store instructions then dont
// emit them, as the store instruction will implicitly not store the zero or