1263320SdimPull r200368 from upstream llvm trunk (by Venkatraman Govindaraju): 2263320Sdim 3263320Sdim [SparcV9] Use correct register class (I64RegClass) to hold the address of _GLOBAL_OFFSET_TABLE_ in sparcv9. 4263320Sdim 5269012SemasteIntroduced here: http://svnweb.freebsd.org/changeset/base/262261 6263320Sdim 7263320SdimIndex: lib/Target/Sparc/SparcInstrInfo.cpp 8263320Sdim=================================================================== 9263320Sdim--- lib/Target/Sparc/SparcInstrInfo.cpp 10263320Sdim+++ lib/Target/Sparc/SparcInstrInfo.cpp 11263320Sdim@@ -431,9 +431,10 @@ unsigned SparcInstrInfo::getGlobalBaseReg(MachineF 12263320Sdim MachineBasicBlock::iterator MBBI = FirstMBB.begin(); 13263320Sdim MachineRegisterInfo &RegInfo = MF->getRegInfo(); 14263320Sdim 15263320Sdim- GlobalBaseReg = RegInfo.createVirtualRegister(&SP::IntRegsRegClass); 16263320Sdim+ const TargetRegisterClass *PtrRC = 17263320Sdim+ Subtarget.is64Bit() ? &SP::I64RegsRegClass : &SP::IntRegsRegClass; 18263320Sdim+ GlobalBaseReg = RegInfo.createVirtualRegister(PtrRC); 19263320Sdim 20263320Sdim- 21263320Sdim DebugLoc dl; 22263320Sdim 23263320Sdim BuildMI(FirstMBB, MBBI, dl, get(SP::GETPCX), GlobalBaseReg); 24263320SdimIndex: lib/Target/Sparc/SparcInstrInfo.td 25263320Sdim=================================================================== 26263320Sdim--- lib/Target/Sparc/SparcInstrInfo.td 27263320Sdim+++ lib/Target/Sparc/SparcInstrInfo.td 28263320Sdim@@ -180,7 +180,7 @@ def tlscall : SDNode<"SPISD::TLS_CALL", SDT_ 29263320Sdim [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue, 30263320Sdim SDNPVariadic]>; 31263320Sdim 32263320Sdim-def getPCX : Operand<i32> { 33263320Sdim+def getPCX : Operand<iPTR> { 34263320Sdim let PrintMethod = "printGetPCX"; 35263320Sdim } 36263320Sdim 37263320SdimIndex: test/CodeGen/SPARC/2009-08-28-PIC.ll 38263320Sdim=================================================================== 39263320Sdim--- test/CodeGen/SPARC/2009-08-28-PIC.ll 40263320Sdim+++ test/CodeGen/SPARC/2009-08-28-PIC.ll 41263320Sdim@@ -1,9 +1,45 @@ 42263320Sdim-; RUN: llc -march=sparc --relocation-model=pic < %s | grep _GLOBAL_OFFSET_TABLE_ 43263320Sdim+; RUN: llc -march=sparc --relocation-model=pic < %s | FileCheck %s --check-prefix=V8 44263320Sdim+; RUN: llc -march=sparcv9 --relocation-model=pic < %s | FileCheck %s --check-prefix=V9 45263320Sdim+; RUN: llc -march=sparc --relocation-model=pic < %s -O0 | FileCheck %s --check-prefix=V8UNOPT 46263320Sdim+; RUN: llc -march=sparcv9 --relocation-model=pic < %s -O0 | FileCheck %s --check-prefix=V9UNOPT 47263320Sdim 48263320Sdim+ 49263320Sdim+; V8-LABEL: func 50263320Sdim+; V8: _GLOBAL_OFFSET_TABLE_ 51263320Sdim+ 52263320Sdim+; V9-LABEL: func 53263320Sdim+; V9: _GLOBAL_OFFSET_TABLE_ 54263320Sdim+ 55263320Sdim @foo = global i32 0 ; <i32*> [#uses=1] 56263320Sdim 57263320Sdim-define i32 @func() nounwind readonly { 58263320Sdim+define i32 @func(i32 %a) nounwind readonly { 59263320Sdim entry: 60263320Sdim %0 = load i32* @foo, align 4 ; <i32> [#uses=1] 61263320Sdim ret i32 %0 62263320Sdim } 63263320Sdim+ 64263320Sdim+; V8UNOPT-LABEL: test_spill 65263320Sdim+; V8UNOPT: sethi %hi(_GLOBAL_OFFSET_TABLE_+{{.+}}), [[R:%[goli][0-7]]] 66263320Sdim+; V8UNOPT: or [[R]], %lo(_GLOBAL_OFFSET_TABLE_+{{.+}}), [[R]] 67263320Sdim+; V8UNOPT: add [[R]], %o7, [[R]] 68263320Sdim+; V8UNOPT: st [[R]], [%fp+{{.+}}] 69263320Sdim+ 70263320Sdim+; V9UNOPT-LABEL: test_spill 71263320Sdim+; V9UNOPT: sethi %hi(_GLOBAL_OFFSET_TABLE_+{{.+}}), [[R:%[goli][0-7]]] 72263320Sdim+; V9UNOPT: or [[R]], %lo(_GLOBAL_OFFSET_TABLE_+{{.+}}), [[R]] 73263320Sdim+; V9UNOPT: add [[R]], %o7, [[R]] 74263320Sdim+; V9UNOPT: stx [[R]], [%fp+{{.+}}] 75263320Sdim+ 76263320Sdim+define i32 @test_spill(i32 %a, i32 %b) { 77263320Sdim+entry: 78263320Sdim+ %cmp = icmp eq i32 %b, 0 79263320Sdim+ br i1 %cmp, label %if.then, label %if.end 80263320Sdim+ 81263320Sdim+if.then: 82263320Sdim+ %ret = load i32* @foo, align 4 83263320Sdim+ ret i32 %ret 84263320Sdim+ 85263320Sdim+if.end: 86263320Sdim+ %add = add nsw i32 %b, %a 87263320Sdim+ ret i32 %add 88263320Sdim+} 89