summaryrefslogtreecommitdiffstats
path: root/contrib/llvm/patches/patch-r262261-llvm-r200368-sparc.diff
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm/patches/patch-r262261-llvm-r200368-sparc.diff')
-rw-r--r--contrib/llvm/patches/patch-r262261-llvm-r200368-sparc.diff88
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
++}
OpenPOWER on IntegriCloud