Handle constant addresses more efficiently, folding the low bits into the

disp field of the load/store if possible.  This compiles
CodeGen/PowerPC/load-constant-addr.ll to:

_test:
        lis r2, 2838
        lfs f1, 26848(r2)
        blr

instead of:

_test:
        lis r2, 2838
        ori r2, r2, 26848
        lfs f1, 0(r2)
        blr

llvm-svn: 26908
This commit is contained in:
Chris Lattner 2006-03-20 22:38:22 +00:00
parent 6d74b09da7
commit c8b16d00b9
1 changed files with 17 additions and 0 deletions

View File

@ -535,7 +535,24 @@ bool PPCDAGToDAGISel::SelectAddrImm(SDOperand N, SDOperand &Disp,
return true;
}
}
} else if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N)) {
// Loading from a constant address.
int Addr = (int)CN->getValue();
// If this address fits entirely in a 16-bit sext immediate field, codegen
// this as "d, 0"
if (Addr == (short)Addr) {
Disp = getI32Imm(Addr);
Base = CurDAG->getRegister(PPC::R0, MVT::i32);
return true;
}
// Otherwise, break this down into an LIS + disp.
Disp = getI32Imm((short)Addr);
Base = CurDAG->getConstant(Addr - (signed short)Addr, MVT::i32);
return true;
}
Disp = getI32Imm(0);
if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(N))
Base = CurDAG->getTargetFrameIndex(FI->getIndex(), MVT::i32);