- Fix X86-64 JIT by temporarily disabling code that treats GV address as 32-bit
immediate in small code model. The JIT cannot ensure GV's are placed in the
lower 4G.
- Some preliminary support for large code model.
llvm-svn: 32215
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 9358c8b..a9d2178 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -3832,14 +3832,7 @@
SDOperand Result = DAG.getTargetConstantPool(CP->getConstVal(),
getPointerTy(),
CP->getAlignment());
- // Use X86ISD::WrapperRIP if we are in X86-64 small / medium PIC mode.
- TargetMachine &tm = getTargetMachine();
- unsigned WrapperOpcode = (Subtarget->is64Bit() &&
- (tm.getCodeModel() == CodeModel::Small ||
- tm.getCodeModel() == CodeModel::Medium) &&
- tm.getRelocationModel() == Reloc::PIC_)
- ? X86ISD::WrapperRIP : X86ISD::Wrapper;
- Result = DAG.getNode(WrapperOpcode, getPointerTy(), Result);
+ Result = DAG.getNode(X86ISD::Wrapper, getPointerTy(), Result);
if (Subtarget->isTargetDarwin()) {
// With PIC, the address is actually $g + Offset.
if (!Subtarget->is64Bit() &&
@@ -3855,14 +3848,7 @@
X86TargetLowering::LowerGlobalAddress(SDOperand Op, SelectionDAG &DAG) {
GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
SDOperand Result = DAG.getTargetGlobalAddress(GV, getPointerTy());
- // Use X86ISD::WrapperRIP if we are in X86-64 small / medium PIC mode.
- TargetMachine &tm = getTargetMachine();
- unsigned WrapperOpcode = (Subtarget->is64Bit() &&
- (tm.getCodeModel() == CodeModel::Small ||
- tm.getCodeModel() == CodeModel::Medium) &&
- tm.getRelocationModel() == Reloc::PIC_)
- ? X86ISD::WrapperRIP : X86ISD::Wrapper;
- Result = DAG.getNode(WrapperOpcode, getPointerTy(), Result);
+ Result = DAG.getNode(X86ISD::Wrapper, getPointerTy(), Result);
if (Subtarget->isTargetDarwin()) {
// With PIC, the address is actually $g + Offset.
if (!Subtarget->is64Bit() &&
@@ -3889,14 +3875,7 @@
X86TargetLowering::LowerExternalSymbol(SDOperand Op, SelectionDAG &DAG) {
const char *Sym = cast<ExternalSymbolSDNode>(Op)->getSymbol();
SDOperand Result = DAG.getTargetExternalSymbol(Sym, getPointerTy());
- // Use X86ISD::WrapperRIP if we are in X86-64 small / medium PIC mode.
- TargetMachine &tm = getTargetMachine();
- unsigned WrapperOpcode = (Subtarget->is64Bit() &&
- (tm.getCodeModel() == CodeModel::Small ||
- tm.getCodeModel() == CodeModel::Medium) &&
- tm.getRelocationModel() == Reloc::PIC_)
- ? X86ISD::WrapperRIP : X86ISD::Wrapper;
- Result = DAG.getNode(WrapperOpcode, getPointerTy(), Result);
+ Result = DAG.getNode(X86ISD::Wrapper, getPointerTy(), Result);
if (Subtarget->isTargetDarwin()) {
// With PIC, the address is actually $g + Offset.
if (!Subtarget->is64Bit() &&
@@ -4264,14 +4243,7 @@
SDOperand X86TargetLowering::LowerJumpTable(SDOperand Op, SelectionDAG &DAG) {
JumpTableSDNode *JT = cast<JumpTableSDNode>(Op);
SDOperand Result = DAG.getTargetJumpTable(JT->getIndex(), getPointerTy());
- // Use X86ISD::WrapperRIP if we are in X86-64 small / medium PIC mode.
- TargetMachine &tm = getTargetMachine();
- unsigned WrapperOpcode = (Subtarget->is64Bit() &&
- (tm.getCodeModel() == CodeModel::Small ||
- tm.getCodeModel() == CodeModel::Medium) &&
- tm.getRelocationModel() == Reloc::PIC_)
- ? X86ISD::WrapperRIP : X86ISD::Wrapper;
- Result = DAG.getNode(WrapperOpcode, getPointerTy(), Result);
+ Result = DAG.getNode(X86ISD::Wrapper, getPointerTy(), Result);
if (Subtarget->isTargetDarwin()) {
// With PIC, the address is actually $g + Offset.
if (!Subtarget->is64Bit() &&
@@ -5005,7 +4977,6 @@
case X86ISD::LOAD_UA: return "X86ISD::LOAD_UA";
case X86ISD::GlobalBaseReg: return "X86ISD::GlobalBaseReg";
case X86ISD::Wrapper: return "X86ISD::Wrapper";
- case X86ISD::WrapperRIP: return "X86ISD::WrapperRIP";
case X86ISD::S2VEC: return "X86ISD::S2VEC";
case X86ISD::PEXTRW: return "X86ISD::PEXTRW";
case X86ISD::PINSRW: return "X86ISD::PINSRW";
@@ -5249,7 +5220,7 @@
/// node is a GlobalAddress + an offset.
static bool isGAPlusOffset(SDNode *N, GlobalValue* &GA, int64_t &Offset) {
unsigned Opc = N->getOpcode();
- if (Opc == X86ISD::Wrapper || Opc == X86ISD::WrapperRIP) {
+ if (Opc == X86ISD::Wrapper) {
if (dyn_cast<GlobalAddressSDNode>(N->getOperand(0))) {
GA = cast<GlobalAddressSDNode>(N->getOperand(0))->getGlobal();
return true;