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