diff options
Diffstat (limited to 'contrib/llvm/patches/patch-r262261-llvm-r200368-sparc.diff')
-rw-r--r-- | contrib/llvm/patches/patch-r262261-llvm-r200368-sparc.diff | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/contrib/llvm/patches/patch-r262261-llvm-r200368-sparc.diff b/contrib/llvm/patches/patch-r262261-llvm-r200368-sparc.diff new file mode 100644 index 0000000..f596b5f --- /dev/null +++ b/contrib/llvm/patches/patch-r262261-llvm-r200368-sparc.diff @@ -0,0 +1,88 @@ +Pull r200368 from upstream llvm trunk (by Venkatraman Govindaraju): + + [SparcV9] Use correct register class (I64RegClass) to hold the address of _GLOBAL_OFFSET_TABLE_ in sparcv9. + +Introduced here: http://svn.freebsd.org/changeset/base/262261 + +Index: lib/Target/Sparc/SparcInstrInfo.cpp +=================================================================== +--- lib/Target/Sparc/SparcInstrInfo.cpp ++++ lib/Target/Sparc/SparcInstrInfo.cpp +@@ -431,9 +431,10 @@ unsigned SparcInstrInfo::getGlobalBaseReg(MachineF + MachineBasicBlock::iterator MBBI = FirstMBB.begin(); + MachineRegisterInfo &RegInfo = MF->getRegInfo(); + +- GlobalBaseReg = RegInfo.createVirtualRegister(&SP::IntRegsRegClass); ++ const TargetRegisterClass *PtrRC = ++ Subtarget.is64Bit() ? &SP::I64RegsRegClass : &SP::IntRegsRegClass; ++ GlobalBaseReg = RegInfo.createVirtualRegister(PtrRC); + +- + DebugLoc dl; + + BuildMI(FirstMBB, MBBI, dl, get(SP::GETPCX), GlobalBaseReg); +Index: lib/Target/Sparc/SparcInstrInfo.td +=================================================================== +--- lib/Target/Sparc/SparcInstrInfo.td ++++ lib/Target/Sparc/SparcInstrInfo.td +@@ -180,7 +180,7 @@ def tlscall : SDNode<"SPISD::TLS_CALL", SDT_ + [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue, + SDNPVariadic]>; + +-def getPCX : Operand<i32> { ++def getPCX : Operand<iPTR> { + let PrintMethod = "printGetPCX"; + } + +Index: test/CodeGen/SPARC/2009-08-28-PIC.ll +=================================================================== +--- test/CodeGen/SPARC/2009-08-28-PIC.ll ++++ test/CodeGen/SPARC/2009-08-28-PIC.ll +@@ -1,9 +1,45 @@ +-; RUN: llc -march=sparc --relocation-model=pic < %s | grep _GLOBAL_OFFSET_TABLE_ ++; RUN: llc -march=sparc --relocation-model=pic < %s | FileCheck %s --check-prefix=V8 ++; RUN: llc -march=sparcv9 --relocation-model=pic < %s | FileCheck %s --check-prefix=V9 ++; RUN: llc -march=sparc --relocation-model=pic < %s -O0 | FileCheck %s --check-prefix=V8UNOPT ++; RUN: llc -march=sparcv9 --relocation-model=pic < %s -O0 | FileCheck %s --check-prefix=V9UNOPT + ++ ++; V8-LABEL: func ++; V8: _GLOBAL_OFFSET_TABLE_ ++ ++; V9-LABEL: func ++; V9: _GLOBAL_OFFSET_TABLE_ ++ + @foo = global i32 0 ; <i32*> [#uses=1] + +-define i32 @func() nounwind readonly { ++define i32 @func(i32 %a) nounwind readonly { + entry: + %0 = load i32* @foo, align 4 ; <i32> [#uses=1] + ret i32 %0 + } ++ ++; V8UNOPT-LABEL: test_spill ++; V8UNOPT: sethi %hi(_GLOBAL_OFFSET_TABLE_+{{.+}}), [[R:%[goli][0-7]]] ++; V8UNOPT: or [[R]], %lo(_GLOBAL_OFFSET_TABLE_+{{.+}}), [[R]] ++; V8UNOPT: add [[R]], %o7, [[R]] ++; V8UNOPT: st [[R]], [%fp+{{.+}}] ++ ++; V9UNOPT-LABEL: test_spill ++; V9UNOPT: sethi %hi(_GLOBAL_OFFSET_TABLE_+{{.+}}), [[R:%[goli][0-7]]] ++; V9UNOPT: or [[R]], %lo(_GLOBAL_OFFSET_TABLE_+{{.+}}), [[R]] ++; V9UNOPT: add [[R]], %o7, [[R]] ++; V9UNOPT: stx [[R]], [%fp+{{.+}}] ++ ++define i32 @test_spill(i32 %a, i32 %b) { ++entry: ++ %cmp = icmp eq i32 %b, 0 ++ br i1 %cmp, label %if.then, label %if.end ++ ++if.then: ++ %ret = load i32* @foo, align 4 ++ ret i32 %ret ++ ++if.end: ++ %add = add nsw i32 %b, %a ++ ret i32 %add ++} |