mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-16 14:31:59 +00:00
Implement a DAGCombine in MipsISelLowering.cpp which transforms the following
pattern: (add v0, (add v1, abs_lo(tjt))) => (add (add v0, v1), abs_lo(tjt)) "tjt" is a TargetJumpTable node. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@158419 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e193b32583
commit
8782707f50
@ -335,11 +335,11 @@ SelectAddr(SDNode *Parent, SDValue Addr, SDValue &Base, SDValue &Offset) {
|
||||
// lui $2, %hi($CPI1_0)
|
||||
// lwc1 $f0, %lo($CPI1_0)($2)
|
||||
if (Addr.getOperand(1).getOpcode() == MipsISD::Lo) {
|
||||
SDValue LoVal = Addr.getOperand(1);
|
||||
if (isa<ConstantPoolSDNode>(LoVal.getOperand(0)) ||
|
||||
isa<GlobalAddressSDNode>(LoVal.getOperand(0))) {
|
||||
SDValue LoVal = Addr.getOperand(1), Opnd0 = LoVal.getOperand(0);
|
||||
if (isa<ConstantPoolSDNode>(Opnd0) || isa<GlobalAddressSDNode>(Opnd0) ||
|
||||
isa<JumpTableSDNode>(Opnd0)) {
|
||||
Base = Addr.getOperand(0);
|
||||
Offset = LoVal.getOperand(0);
|
||||
Offset = Opnd0;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -295,6 +295,7 @@ MipsTargetLowering(MipsTargetMachine &TM)
|
||||
setTargetDAGCombine(ISD::SELECT);
|
||||
setTargetDAGCombine(ISD::AND);
|
||||
setTargetDAGCombine(ISD::OR);
|
||||
setTargetDAGCombine(ISD::ADD);
|
||||
|
||||
setMinFunctionAlignment(HasMips64 ? 3 : 2);
|
||||
|
||||
@ -733,6 +734,33 @@ static SDValue PerformORCombine(SDNode *N, SelectionDAG& DAG,
|
||||
DAG.getConstant(SMSize0, MVT::i32), And0.getOperand(0));
|
||||
}
|
||||
|
||||
static SDValue PerformADDCombine(SDNode *N, SelectionDAG& DAG,
|
||||
TargetLowering::DAGCombinerInfo &DCI,
|
||||
const MipsSubtarget* Subtarget) {
|
||||
// (add v0, (add v1, abs_lo(tjt))) => (add (add v0, v1), abs_lo(tjt))
|
||||
|
||||
if (DCI.isBeforeLegalizeOps())
|
||||
return SDValue();
|
||||
|
||||
SDValue Add = N->getOperand(1);
|
||||
|
||||
if (Add.getOpcode() != ISD::ADD)
|
||||
return SDValue();
|
||||
|
||||
SDValue Lo = Add.getOperand(1);
|
||||
|
||||
if ((Lo.getOpcode() != MipsISD::Lo) ||
|
||||
(Lo.getOperand(0).getOpcode() != ISD::TargetJumpTable))
|
||||
return SDValue();
|
||||
|
||||
EVT ValTy = N->getValueType(0);
|
||||
DebugLoc DL = N->getDebugLoc();
|
||||
|
||||
SDValue Add1 = DAG.getNode(ISD::ADD, DL, ValTy, N->getOperand(0),
|
||||
Add.getOperand(0));
|
||||
return DAG.getNode(ISD::ADD, DL, ValTy, Add1, Lo);
|
||||
}
|
||||
|
||||
SDValue MipsTargetLowering::PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI)
|
||||
const {
|
||||
SelectionDAG &DAG = DCI.DAG;
|
||||
@ -753,6 +781,8 @@ SDValue MipsTargetLowering::PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI)
|
||||
return PerformANDCombine(N, DAG, DCI, Subtarget);
|
||||
case ISD::OR:
|
||||
return PerformORCombine(N, DAG, DCI, Subtarget);
|
||||
case ISD::ADD:
|
||||
return PerformADDCombine(N, DAG, DCI, Subtarget);
|
||||
}
|
||||
|
||||
return SDValue();
|
||||
|
@ -7,21 +7,20 @@ entry:
|
||||
%x = alloca i32, align 4 ; <i32*> [#uses=2]
|
||||
store volatile i32 2, i32* %x, align 4
|
||||
%0 = load volatile i32* %x, align 4 ; <i32> [#uses=1]
|
||||
; STATIC-O32: lui $[[R0:[0-9]+]], %hi($JTI0_0)
|
||||
; STATIC-O32: addiu ${{[0-9]+}}, $[[R0]], %lo($JTI0_0)
|
||||
; STATIC-O32: sll ${{[0-9]+}}, ${{[0-9]+}}, 2
|
||||
; PIC-O32: lw $[[R0:[0-9]+]], %got($JTI0_0)
|
||||
; PIC-O32: addiu $[[R1:[0-9]+]], $[[R0]], %lo($JTI0_0)
|
||||
; PIC-O32: sll $[[R2:[0-9]+]], ${{[0-9]+}}, 2
|
||||
; PIC-O32: addu $[[R3:[0-9]+]], $[[R2]], $[[R1]]
|
||||
; PIC-O32: lw $[[R4:[0-9]+]], 0($[[R3]])
|
||||
; STATIC-O32: sll $[[R0:[0-9]+]], ${{[0-9]+}}, 2
|
||||
; STATIC-O32: lui $[[R1:[0-9]+]], %hi($JTI0_0)
|
||||
; STATIC-O32: addu $[[R2:[0-9]+]], $[[R0]], $[[R1]]
|
||||
; STATIC-O32: lw $[[R3:[0-9]+]], %lo($JTI0_0)($[[R2]])
|
||||
; PIC-O32: sll $[[R0:[0-9]+]], ${{[0-9]+}}, 2
|
||||
; PIC-O32: lw $[[R1:[0-9]+]], %got($JTI0_0)
|
||||
; PIC-O32: addu $[[R2:[0-9]+]], $[[R0]], $[[R1]]
|
||||
; PIC-O32: lw $[[R4:[0-9]+]], %lo($JTI0_0)($[[R2]])
|
||||
; PIC-O32: addu $[[R5:[0-9]+]], $[[R4:[0-9]+]]
|
||||
; PIC-O32: jr $[[R5]]
|
||||
; PIC-N64: ld $[[R0:[0-9]+]], %got_page($JTI0_0)
|
||||
; PIC-N64: daddiu $[[R1:[0-9]+]], $[[R0]], %got_ofst($JTI0_0)
|
||||
; PIC-N64: dsll $[[R2:[0-9]+]], ${{[0-9]+}}, 3
|
||||
; PIC-N64: daddu $[[R3:[0-9]+]], $[[R2:[0-9]+]], $[[R1]]
|
||||
; PIC-N64: ld $[[R4:[0-9]+]], 0($[[R3]])
|
||||
; PIC-N64: dsll $[[R0:[0-9]+]], ${{[0-9]+}}, 3
|
||||
; PIC-N64: ld $[[R1:[0-9]+]], %got_page($JTI0_0)
|
||||
; PIC-N64: daddu $[[R2:[0-9]+]], $[[R0:[0-9]+]], $[[R1]]
|
||||
; PIC-N64: ld $[[R4:[0-9]+]], %got_ofst($JTI0_0)($[[R2]])
|
||||
; PIC-N64: daddu $[[R5:[0-9]+]], $[[R4:[0-9]+]]
|
||||
; PIC-N64: jr $[[R5]]
|
||||
switch i32 %0, label %bb4 [
|
||||
|
Loading…
x
Reference in New Issue
Block a user