mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-16 14:31:59 +00: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; } git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17175 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ec8430270a
commit
31dfc52b81
@ -3014,6 +3014,19 @@ void PPC32ISel::visitCastInst(CastInst &CI) {
|
|||||||
unsigned DestReg = getReg(CI);
|
unsigned DestReg = getReg(CI);
|
||||||
MachineBasicBlock::iterator MI = BB->end();
|
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
|
// 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
|
// 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
|
// emit them, as the store instruction will implicitly not store the zero or
|
||||||
|
Loading…
x
Reference in New Issue
Block a user