forked from OSchip/llvm-project
Extend r148086 to check for [r +/- reg] address mode. This fixes queens performance regression (due to increased register pressure from overly aggressive pre-inc formation).
llvm-svn: 152162
This commit is contained in:
parent
297e69f15e
commit
80893ce5f5
|
@ -6142,8 +6142,7 @@ SDValue DAGCombiner::visitBR_CC(SDNode *N) {
|
|||
|
||||
/// canFoldInAddressingMode - Return true if 'Use' is a load or a store that
|
||||
/// uses N as its base pointer and that N may be folded in the load / store
|
||||
/// addressing mode. FIXME: This currently only looks for folding of
|
||||
/// [reg +/- imm] addressing modes.
|
||||
/// addressing mode.
|
||||
static bool canFoldInAddressingMode(SDNode *N, SDNode *Use,
|
||||
SelectionDAG &DAG,
|
||||
const TargetLowering &TLI) {
|
||||
|
@ -6163,15 +6162,19 @@ static bool canFoldInAddressingMode(SDNode *N, SDNode *Use,
|
|||
if (N->getOpcode() == ISD::ADD) {
|
||||
ConstantSDNode *Offset = dyn_cast<ConstantSDNode>(N->getOperand(1));
|
||||
if (Offset)
|
||||
// [reg +/- imm]
|
||||
AM.BaseOffs = Offset->getSExtValue();
|
||||
else
|
||||
return false;
|
||||
// [reg +/- reg]
|
||||
AM.Scale = 1;
|
||||
} else if (N->getOpcode() == ISD::SUB) {
|
||||
ConstantSDNode *Offset = dyn_cast<ConstantSDNode>(N->getOperand(1));
|
||||
if (Offset)
|
||||
// [reg +/- imm]
|
||||
AM.BaseOffs = -Offset->getSExtValue();
|
||||
else
|
||||
return false;
|
||||
// [reg +/- reg]
|
||||
AM.Scale = 1;
|
||||
} else
|
||||
return false;
|
||||
|
||||
|
|
|
@ -54,12 +54,16 @@ declare i8* @malloc(...)
|
|||
define fastcc void @test4(i16 %addr) nounwind {
|
||||
entry:
|
||||
; A8: test4:
|
||||
; A8: ldr [[REG:r[0-9]+]], [r0, r1, lsl #2]!
|
||||
; A8: str [[REG]], [r0]
|
||||
; A8: ldr [[REG:r[0-9]+]], [r0, r1, lsl #2]
|
||||
; A8-NOT: ldr [[REG:r[0-9]+]], [r0, r1, lsl #2]!
|
||||
; A8: str [[REG]], [r0, r1, lsl #2]
|
||||
; A8-NOT: str [[REG]], [r0]
|
||||
|
||||
; A9: test4:
|
||||
; A9: ldr [[REG:r[0-9]+]], [r0, r1, lsl #2]!
|
||||
; A9: str [[REG]], [r0]
|
||||
; A9: ldr [[REG:r[0-9]+]], [r0, r1, lsl #2]
|
||||
; A9-NOT: ldr [[REG:r[0-9]+]], [r0, r1, lsl #2]!
|
||||
; A9: str [[REG]], [r0, r1, lsl #2]
|
||||
; A9-NOT: str [[REG]], [r0]
|
||||
%0 = tail call i8* (...)* @malloc(i32 undef) nounwind
|
||||
%1 = bitcast i8* %0 to i32*
|
||||
%2 = sext i16 %addr to i32
|
||||
|
|
Loading…
Reference in New Issue