mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-30 15:22:41 +00:00
To go along with sabre's improved InstCombining, improve recognition of
integers that we can use as immediate values in instructions. Example from yacr2: - lis r10, -1 - ori r10, r10, 65535 - add r28, r28, r10 + addi r28, r28, -1 addi r7, r7, 1 addi r9, r9, 1 b .LBB_main_9 ; loopentry.1.i214 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@16566 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6a0ec6fcf6
commit
a41fc77ae4
@ -32,9 +32,6 @@
|
||||
using namespace llvm;
|
||||
|
||||
namespace {
|
||||
Statistic<>
|
||||
MultiUseGEP("ppc-codegen", "Number of GEPs folded with more than one use");
|
||||
|
||||
/// TypeClass - Used by the PowerPC backend to group LLVM types by their basic
|
||||
/// PPC Representation.
|
||||
///
|
||||
@ -492,33 +489,26 @@ bool PPC32ISel::canUseAsImmediateForOpcode(ConstantInt *CI, unsigned Operator) {
|
||||
|
||||
// ADDI, Compare, and non-indexed Load take SIMM
|
||||
bool cond1 = (Operator == 0)
|
||||
&& (Op1Cs = dyn_cast<ConstantSInt>(CI))
|
||||
&& (Op1Cs->getValue() <= 32767)
|
||||
&& (Op1Cs->getValue() >= -32768);
|
||||
&& ((int32_t)CI->getRawValue() <= 32767)
|
||||
&& ((int32_t)CI->getRawValue() >= -32768);
|
||||
|
||||
// SUBI takes -SIMM since it is a mnemonic for ADDI
|
||||
bool cond2 = (Operator == 1)
|
||||
&& (Op1Cs = dyn_cast<ConstantSInt>(CI))
|
||||
&& (Op1Cs->getValue() <= 32768)
|
||||
&& (Op1Cs->getValue() >= -32767);
|
||||
&& ((int32_t)CI->getRawValue() <= 32768)
|
||||
&& ((int32_t)CI->getRawValue() >= -32767);
|
||||
|
||||
// ANDIo, ORI, and XORI take unsigned values
|
||||
bool cond3 = (Operator >= 2)
|
||||
&& (Op1Cs = dyn_cast<ConstantSInt>(CI))
|
||||
&& (Op1Cs->getValue() >= 0)
|
||||
&& (Op1Cs->getValue() <= 32767);
|
||||
|
||||
// ADDI and SUBI take SIMMs, so we have to make sure the UInt would fit
|
||||
bool cond4 = (Operator < 2)
|
||||
&& (Op1Cu = dyn_cast<ConstantUInt>(CI))
|
||||
&& (Op1Cu->getValue() <= 32767);
|
||||
&& (Op1Cs->getValue() <= 65535);
|
||||
|
||||
// ANDIo, ORI, and XORI take UIMMs, so they can be larger
|
||||
bool cond5 = (Operator >= 2)
|
||||
bool cond4 = (Operator >= 2)
|
||||
&& (Op1Cu = dyn_cast<ConstantUInt>(CI))
|
||||
&& (Op1Cu->getValue() <= 65535);
|
||||
|
||||
if (cond1 || cond2 || cond3 || cond4 || cond5)
|
||||
if (cond1 || cond2 || cond3 || cond4)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
@ -3321,10 +3311,8 @@ void PPC32ISel::emitGEPOperation(MachineBasicBlock *MBB,
|
||||
GetElementPtrInst *GEPI, bool GEPIsFolded) {
|
||||
// If we've already emitted this particular GEP, just return to avoid
|
||||
// multiple definitions of the base register.
|
||||
if (GEPIsFolded && (GEPMap[GEPI].base != 0)) {
|
||||
MultiUseGEP++;
|
||||
if (GEPIsFolded && (GEPMap[GEPI].base != 0))
|
||||
return;
|
||||
}
|
||||
|
||||
Value *Src = GEPI->getOperand(0);
|
||||
User::op_iterator IdxBegin = GEPI->op_begin()+1;
|
||||
|
Loading…
x
Reference in New Issue
Block a user