patch-r262261-llvm-r199187-sparc.diff revision 267654
1Pull in r199187 from upstream llvm trunk (by Jakob Stoklund Olesen):
2
3  Always let value types influence register classes.
4
5  When creating a virtual register for a def, the value type should be
6  used to pick the register class. If we only use the register class
7  constraint on the instruction, we might pick a too large register class.
8
9  Some registers can store values of different sizes. For example, the x86
10  xmm registers can hold f32, f64, and 128-bit vectors. The three
11  different value sizes are represented by register classes with identical
12  register sets: FR32, FR64, and VR128. These register classes have
13  different spill slot sizes, so it is important to use the right one.
14
15  The register class constraint on an instruction doesn't necessarily care
16  about the size of the value its defining. The value type determines
17  that.
18
19  This fixes a problem where InstrEmitter was picking 32-bit register
20  classes for 64-bit values on SPARC.
21
22Introduced here: http://svn.freebsd.org/changeset/base/262261
23
24Index: test/CodeGen/SPARC/spillsize.ll
25===================================================================
26--- test/CodeGen/SPARC/spillsize.ll
27+++ test/CodeGen/SPARC/spillsize.ll
28@@ -0,0 +1,25 @@
29+; RUN: llc < %s -verify-machineinstrs | FileCheck %s
30+target datalayout = "E-m:e-i64:64-n32:64-S128"
31+target triple = "sparcv9"
32+
33+; CHECK-LABEL: spill4
34+; This function spills two values: %p and the materialized large constant.
35+; Both must use 8-byte spill and fill instructions.
36+; CHECK: stx %{{..}}, [%fp+
37+; CHECK: stx %{{..}}, [%fp+
38+; CHECK: ldx [%fp+
39+; CHECK: ldx [%fp+
40+define void @spill4(i64* nocapture %p) {
41+entry:
42+  %val0 = load i64* %p
43+  %cmp0 = icmp ult i64 %val0, 385672958347594845
44+  %cm80 = zext i1 %cmp0 to i64
45+  store i64 %cm80, i64* %p, align 8
46+  tail call void asm sideeffect "", "~{i0},~{i1},~{i2},~{i3},~{i4},~{i5},~{g2},~{g3},~{g4},~{g5},~{l0},~{l1},~{l2},~{l3},~{l4},~{l5},~{l6},~{l7},~{o0},~{o1},~{o2},~{o3},~{o4},~{o5},~{o7}"()
47+  %arrayidx1 = getelementptr inbounds i64* %p, i64 1
48+  %val = load i64* %arrayidx1
49+  %cmp = icmp ult i64 %val, 385672958347594845
50+  %cm8 = select i1 %cmp, i64 10, i64 20
51+  store i64 %cm8, i64* %arrayidx1, align 8
52+  ret void
53+}
54Index: lib/CodeGen/SelectionDAG/InstrEmitter.cpp
55===================================================================
56--- lib/CodeGen/SelectionDAG/InstrEmitter.cpp
57+++ lib/CodeGen/SelectionDAG/InstrEmitter.cpp
58@@ -220,10 +220,19 @@ void InstrEmitter::CreateVirtualRegisters(SDNode *
59     unsigned VRBase = 0;
60     const TargetRegisterClass *RC =
61       TRI->getAllocatableClass(TII->getRegClass(II, i, TRI, *MF));
62-    // If the register class is unknown for the given definition, then try to
63-    // infer one from the value type.
64-    if (!RC && i < NumResults)
65-      RC = TLI->getRegClassFor(Node->getSimpleValueType(i));
66+    // Always let the value type influence the used register class. The
67+    // constraints on the instruction may be too lax to represent the value
68+    // type correctly. For example, a 64-bit float (X86::FR64) can't live in
69+    // the 32-bit float super-class (X86::FR32).
70+    if (i < NumResults && TLI->isTypeLegal(Node->getSimpleValueType(i))) {
71+      const TargetRegisterClass *VTRC =
72+        TLI->getRegClassFor(Node->getSimpleValueType(i));
73+      if (RC)
74+        VTRC = TRI->getCommonSubClass(RC, VTRC);
75+      if (VTRC)
76+        RC = VTRC;
77+    }
78+
79     if (II.OpInfo[i].isOptionalDef()) {
80       // Optional def must be a physical register.
81       unsigned NumResults = CountResults(Node);
82