[llvm] 7806f86 - Revert "[SPARC] Mark the %g0 register as constant & use it to materialize zeros"

Brad Smith via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 7 12:28:21 PST 2022


Author: Brad Smith
Date: 2022-12-07T15:27:57-05:00
New Revision: 7806f86a5eed6b858e47ab6c4aac5c3618d2af5f

URL: https://github.com/llvm/llvm-project/commit/7806f86a5eed6b858e47ab6c4aac5c3618d2af5f
DIFF: https://github.com/llvm/llvm-project/commit/7806f86a5eed6b858e47ab6c4aac5c3618d2af5f.diff

LOG: Revert "[SPARC] Mark the %g0 register as constant & use it to materialize zeros"

2 of the Sparc tests are now failing.

This reverts commit 2c41310fc146a1f609147c65ac5f30e5a57e84a8.

Added: 
    

Modified: 
    llvm/lib/Target/Sparc/SparcInstr64Bit.td
    llvm/lib/Target/Sparc/SparcInstrInfo.td
    llvm/lib/Target/Sparc/SparcRegisterInfo.td
    llvm/test/CodeGen/SPARC/64bit.ll
    llvm/test/CodeGen/SPARC/64cond.ll
    llvm/test/CodeGen/SPARC/atomics.ll
    llvm/test/CodeGen/SPARC/bigreturn.ll
    llvm/test/CodeGen/SPARC/cttz.ll
    llvm/test/CodeGen/SPARC/float-constants.ll
    llvm/test/CodeGen/SPARC/fshl.ll
    llvm/test/CodeGen/SPARC/inlineasm.ll
    llvm/test/CodeGen/SPARC/missinglabel.ll
    llvm/test/CodeGen/SPARC/smulo-128-legalisation-lowering.ll
    llvm/test/CodeGen/SPARC/tailcall.ll
    llvm/test/CodeGen/SPARC/umulo-128-legalisation-lowering.ll
    llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/sparc_generated_funcs.ll.generated.expected
    llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/sparc_generated_funcs.ll.nogenerated.expected

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/Sparc/SparcInstr64Bit.td b/llvm/lib/Target/Sparc/SparcInstr64Bit.td
index dc5400efa2251..b334d533083f2 100644
--- a/llvm/lib/Target/Sparc/SparcInstr64Bit.td
+++ b/llvm/lib/Target/Sparc/SparcInstr64Bit.td
@@ -60,10 +60,6 @@ defm SRAX : F3_S<"srax", 0b100111, 1, sra, i64, shift_imm6, I64Regs>;
 
 // Single-instruction patterns.
 
-// Zero immediate.
-def : Pat<(i64 0), (COPY (i64 G0))>,
-  Requires<[Is64Bit]>;
-
 // The ALU instructions want their simm13 operands as i32 immediates.
 def as_i32imm : SDNodeXForm<imm, [{
   return CurDAG->getTargetConstant(N->getSExtValue(), SDLoc(N), MVT::i32);

diff  --git a/llvm/lib/Target/Sparc/SparcInstrInfo.td b/llvm/lib/Target/Sparc/SparcInstrInfo.td
index 561de9bab2984..ca8c4889c8abe 100644
--- a/llvm/lib/Target/Sparc/SparcInstrInfo.td
+++ b/llvm/lib/Target/Sparc/SparcInstrInfo.td
@@ -1767,7 +1767,8 @@ let Predicates = [HasV9] in {
 //===----------------------------------------------------------------------===//
 
 // Zero immediate.
-def : Pat<(i32 0), (COPY (i32 G0))>;
+def : Pat<(i32 0),
+          (ORrr (i32 G0), (i32 G0))>;
 // Small immediates.
 def : Pat<(i32 simm13:$val),
           (ORri (i32 G0), imm:$val)>;
@@ -1848,15 +1849,6 @@ def : Pat<(atomic_store_16 ADDRri:$dst, i32:$val), (STHri ADDRri:$dst, $val)>;
 def : Pat<(atomic_store_32 ADDRrr:$dst, i32:$val), (STrr ADDRrr:$dst, $val)>;
 def : Pat<(atomic_store_32 ADDRri:$dst, i32:$val), (STri ADDRri:$dst, $val)>;
 
-// Zero register pair.
-// This forces zeroing of the upper half to be done with ORrr instead of COPY,
-// since there `COPY G0` will be converted into `COPY G0_G1` later on, which
-// is not what we want in this case.
-def : Pat<(build_vector (i32 0), (i32 0)),
-          (INSERT_SUBREG (INSERT_SUBREG (v2i32 (IMPLICIT_DEF)),
-            (ORrr (i32 G0), (i32 G0)), sub_even),
-            (i32 G0), sub_odd)>;
-
 // extract_vector
 def : Pat<(extractelt (v2i32 IntPair:$Rn), 0),
           (i32 (EXTRACT_SUBREG IntPair:$Rn, sub_even))>;

diff  --git a/llvm/lib/Target/Sparc/SparcRegisterInfo.td b/llvm/lib/Target/Sparc/SparcRegisterInfo.td
index 947bbaed8c70c..9453efb6fbb41 100644
--- a/llvm/lib/Target/Sparc/SparcRegisterInfo.td
+++ b/llvm/lib/Target/Sparc/SparcRegisterInfo.td
@@ -126,9 +126,7 @@ def OTHERWIN : SparcCtrlReg<13, "OTHERWIN">;
 def WSTATE : SparcCtrlReg<14, "WSTATE">;
 
 // Integer registers
-def G0 : Ri< 0, "G0">, DwarfRegNum<[0]> {
-  let isConstant = true;
-}
+def G0 : Ri< 0, "G0">, DwarfRegNum<[0]>;
 def G1 : Ri< 1, "G1">, DwarfRegNum<[1]>;
 def G2 : Ri< 2, "G2">, DwarfRegNum<[2]>;
 def G3 : Ri< 3, "G3">, DwarfRegNum<[3]>;
@@ -380,4 +378,3 @@ let isAllocatable = 0 in {
 def PRRegs : RegisterClass<"SP", [i64], 64,
     (add TPC, TNPC, TSTATE, TT, TICK, TBA, PSTATE, TL, PIL, CWP,
          CANSAVE, CANRESTORE, CLEANWIN, OTHERWIN, WSTATE)>;
-

diff  --git a/llvm/test/CodeGen/SPARC/64bit.ll b/llvm/test/CodeGen/SPARC/64bit.ll
index 88d8851ecdf45..c079d901a03d1 100644
--- a/llvm/test/CodeGen/SPARC/64bit.ll
+++ b/llvm/test/CodeGen/SPARC/64bit.ll
@@ -40,11 +40,11 @@ define i64 @sra_reg(i64 %a, i64 %b) {
 ;     restore %g0, %g0, %o0
 ;
 ; CHECK: ret_imm0
-; CHECK: mov %g0, %i0
+; CHECK: mov 0, %i0
 
 ; OPT: ret_imm0
 ; OPT: retl
-; OPT: mov %g0, %o0
+; OPT: mov 0, %o0
 define i64 @ret_imm0() {
   ret i64 0
 }

diff  --git a/llvm/test/CodeGen/SPARC/64cond.ll b/llvm/test/CodeGen/SPARC/64cond.ll
index 7dbc944a3cee5..ffdb10a814899 100644
--- a/llvm/test/CodeGen/SPARC/64cond.ll
+++ b/llvm/test/CodeGen/SPARC/64cond.ll
@@ -112,9 +112,9 @@ entry:
 }
 
 ; CHECK-LABEL: setcc_resultty
-; CHECK-DAG:       mov %g0, %o0
+; CHECK-DAG:       mov 0, %o0
 ; CHECK-DAG:       mov %i0, %o1
-; CHECK-DAG:       mov %g0, %o2
+; CHECK-DAG:       mov %o0, %o2
 ; CHECK-DAG:       mov 32, %o3
 ; CHECK-DAG:       call __multi3
 ; CHECK:       cmp

diff  --git a/llvm/test/CodeGen/SPARC/atomics.ll b/llvm/test/CodeGen/SPARC/atomics.ll
index 715202f5977db..61cd5258b0f72 100644
--- a/llvm/test/CodeGen/SPARC/atomics.ll
+++ b/llvm/test/CodeGen/SPARC/atomics.ll
@@ -87,24 +87,25 @@ entry:
 ; SPARC:       sll %o4, %o1, %o4
 ; SPARC:       and %o0, 255, %o0
 ; SPARC:       sll %o0, %o1, %o0
-; SPARC:       andn %g2, %o5, %o5
+; SPARC:       andn %g2, %o5, %g2
+; SPARC:       mov %g0, %o5
 ; SPARC:      [[LABEL1:\.L.*]]:
-; SPARC:       or %o5, %o4, %g2
-; SPARC:       or %o5, %o0, %g3
-; SPARC:       cas [%o2], %g3, %g2
-; SPARC:       mov %g0, %g4
-; SPARC:       cmp %g2, %g3
+; SPARC:       or %g2, %o4, %g3
+; SPARC:       or %g2, %o0, %g4
+; SPARC:       cas [%o2], %g4, %g3
+; SPARC:       cmp %g3, %g4
+; SPARC:       mov  %o5, %g4
 ; SPARC:       move %icc, 1, %g4
 ; SPARC:       cmp %g4, 0
 ; SPARC:       bne %icc, [[LABEL2:\.L.*]]
 ; SPARC:       nop
-; SPARC:       and %g2, %o3, %g3
-; SPARC:       cmp %o5, %g3
+; SPARC:       and %g3, %o3, %g4
+; SPARC:       cmp %g2, %g4
 ; SPARC:       bne %icc, [[LABEL1]]
-; SPARC:       mov  %g3, %o5
+; SPARC:       mov  %g4, %g2
 ; SPARC:      [[LABEL2]]:
 ; SPARC:       retl
-; SPARC:       srl %g2, %o1, %o0
+; SPARC:       srl %g3, %o1, %o0
 ; SPARC64-LABEL: test_cmpxchg_i8
 ; SPARC64:       and %o1, -4, %o2
 ; SPARC64:       mov  3, %o3
@@ -118,24 +119,25 @@ entry:
 ; SPARC64:       sll %o4, %o1, %o4
 ; SPARC64:       and %o0, 255, %o0
 ; SPARC64:       sll %o0, %o1, %o0
-; SPARC64:       andn %g2, %o5, %o5
+; SPARC64:       andn %g2, %o5, %g2
+; SPARC64:       mov %g0, %o5
 ; SPARC64:      [[LABEL1:\.L.*]]:
-; SPARC64:       or %o5, %o4, %g2
-; SPARC64:       or %o5, %o0, %g3
-; SPARC64:       cas [%o2], %g3, %g2
-; SPARC64:       mov %g0, %g4
-; SPARC64:       cmp %g2, %g3
+; SPARC64:       or %g2, %o4, %g3
+; SPARC64:       or %g2, %o0, %g4
+; SPARC64:       cas [%o2], %g4, %g3
+; SPARC64:       cmp %g3, %g4
+; SPARC64:       mov  %o5, %g4
 ; SPARC64:       move %icc, 1, %g4
 ; SPARC64:       cmp %g4, 0
 ; SPARC64:       bne %icc, [[LABEL2:\.L.*]]
 ; SPARC64:       nop
-; SPARC64:       and %g2, %o3, %g3
-; SPARC64:       cmp %o5, %g3
+; SPARC64:       and %g3, %o3, %g4
+; SPARC64:       cmp %g2, %g4
 ; SPARC64:       bne %icc, [[LABEL1]]
-; SPARC64:       mov  %g3, %o5
+; SPARC64:       mov  %g4, %g2
 ; SPARC64:      [[LABEL2]]:
 ; SPARC64:       retl
-; SPARC64:       srl %g2, %o1, %o0
+; SPARC64:       srl %g3, %o1, %o0
 define i8 @test_cmpxchg_i8(i8 %a, i8* %ptr) {
 entry:
   %pair = cmpxchg i8* %ptr, i8 %a, i8 123 monotonic monotonic
@@ -158,24 +160,25 @@ entry:
 ; SPARC:       mov  123, %o0
 ; SPARC:       sll %o0, %o1, %o0
 ; SPARC:       sll %o4, %o1, %o4
-; SPARC:       andn %g2, %o5, %o5
+; SPARC:       andn %g2, %o5, %g2
+; SPARC:       mov %g0, %o5
 ; SPARC:      [[LABEL1:\.L.*]]:
-; SPARC:       or %o5, %o0, %g2
-; SPARC:       or %o5, %o4, %g3
-; SPARC:       cas [%o2], %g3, %g2
-; SPARC:       mov %g0, %g4
-; SPARC:       cmp %g2, %g3
+; SPARC:       or %g2, %o0, %g3
+; SPARC:       or %g2, %o4, %g4
+; SPARC:       cas [%o2], %g4, %g3
+; SPARC:       cmp %g3, %g4
+; SPARC:       mov  %o5, %g4
 ; SPARC:       move %icc, 1, %g4
 ; SPARC:       cmp %g4, 0
 ; SPARC:       bne %icc, [[LABEL2:\.L.*]]
 ; SPARC:       nop
-; SPARC:       and %g2, %o3, %g3
-; SPARC:       cmp %o5, %g3
+; SPARC:       and %g3, %o3, %g4
+; SPARC:       cmp %g2, %g4
 ; SPARC:       bne %icc, [[LABEL1]]
-; SPARC:       mov  %g3, %o5
+; SPARC:       mov  %g4, %g2
 ; SPARC:      [[LABEL2]]:
 ; SPARC:       retl
-; SPARC:       srl %g2, %o1, %o0
+; SPARC:       srl %g3, %o1, %o0
 ; SPARC64:       and %o1, -4, %o2
 ; SPARC64:       and %o1, 3, %o1
 ; SPARC64:       xor %o1, 2, %o1
@@ -189,24 +192,25 @@ entry:
 ; SPARC64:       mov  123, %o0
 ; SPARC64:       sll %o0, %o1, %o0
 ; SPARC64:       sll %o4, %o1, %o4
-; SPARC64:       andn %g2, %o5, %o5
+; SPARC64:       andn %g2, %o5, %g2
+; SPARC64:       mov %g0, %o5
 ; SPARC64:      [[LABEL1:\.L.*]]:
-; SPARC64:       or %o5, %o0, %g2
-; SPARC64:       or %o5, %o4, %g3
-; SPARC64:       cas [%o2], %g3, %g2
-; SPARC64:       mov %g0, %g4
-; SPARC64:       cmp %g2, %g3
+; SPARC64:       or %g2, %o0, %g3
+; SPARC64:       or %g2, %o4, %g4
+; SPARC64:       cas [%o2], %g4, %g3
+; SPARC64:       cmp %g3, %g4
+; SPARC64:       mov  %o5, %g4
 ; SPARC64:       move %icc, 1, %g4
 ; SPARC64:       cmp %g4, 0
 ; SPARC64:       bne %icc, [[LABEL2:\.L.*]]
 ; SPARC64:       nop
-; SPARC64:       and %g2, %o3, %g3
-; SPARC64:       cmp %o5, %g3
+; SPARC64:       and %g3, %o3, %g4
+; SPARC64:       cmp %g2, %g4
 ; SPARC64:       bne %icc, [[LABEL1]]
-; SPARC64:       mov  %g3, %o5
+; SPARC64:       mov  %g4, %g2
 ; SPARC64:      [[LABEL2]]:
 ; SPARC64:       retl
-; SPARC64:       srl %g2, %o1, %o0
+; SPARC64:       srl %g3, %o1, %o0
 define i16 @test_cmpxchg_i16(i16 %a, i16* %ptr) {
 entry:
   %pair = cmpxchg i16* %ptr, i16 %a, i16 123 monotonic monotonic
@@ -301,12 +305,14 @@ entry:
 
 ; SPARC-LABEL: test_load_add_i32
 ; SPARC: membar
+; SPARC: mov %g0
 ; SPARC: mov [[U:%[gilo][0-7]]], [[V:%[gilo][0-7]]]
 ; SPARC: add [[U:%[gilo][0-7]]], %o1, [[V2:%[gilo][0-7]]]
 ; SPARC: cas [%o0], [[V]], [[V2]]
 ; SPARC: membar
 ; SPARC64-LABEL: test_load_add_i32
 ; SPARC64: membar
+; SPARC64: mov %g0
 ; SPARC64: mov [[U:%[gilo][0-7]]], [[V:%[gilo][0-7]]]
 ; SPARC64: add [[U:%[gilo][0-7]]], %o1, [[V2:%[gilo][0-7]]]
 ; SPARC64: cas [%o0], [[V]], [[V2]]

diff  --git a/llvm/test/CodeGen/SPARC/bigreturn.ll b/llvm/test/CodeGen/SPARC/bigreturn.ll
index 9dd7fad78567d..25b4eeecadc0f 100644
--- a/llvm/test/CodeGen/SPARC/bigreturn.ll
+++ b/llvm/test/CodeGen/SPARC/bigreturn.ll
@@ -137,7 +137,7 @@ define { i64, i64 } @ret_i64_pair(i32 %a0, i32 %a1, i64* %p, i64* %q) {
 ; SPARC-NEXT:    .cfi_register %o7, %i7
 ; SPARC-NEXT:    mov %g0, %i4
 ; SPARC-NEXT:    ldd [%i2], %i0
-; SPARC-NEXT:    mov %g0, %i5
+; SPARC-NEXT:    mov %i4, %i5
 ; SPARC-NEXT:    std %i4, [%i2]
 ; SPARC-NEXT:    ldd [%i3], %i2
 ; SPARC-NEXT:    restore

diff  --git a/llvm/test/CodeGen/SPARC/cttz.ll b/llvm/test/CodeGen/SPARC/cttz.ll
index a5d0b1be859ec..f4a033a49813d 100644
--- a/llvm/test/CodeGen/SPARC/cttz.ll
+++ b/llvm/test/CodeGen/SPARC/cttz.ll
@@ -5,7 +5,8 @@ define i32 @f(i32 %x) {
 ; CHECK-LABEL: f:
 ; CHECK:         .cfi_startproc
 ; CHECK-NEXT:  ! %bb.0: ! %entry
-; CHECK-NEXT:    sub %g0, %o0, %o1
+; CHECK-NEXT:    mov %g0, %o1
+; CHECK-NEXT:    sub %o1, %o0, %o1
 ; CHECK-NEXT:    and %o0, %o1, %o1
 ; CHECK-NEXT:    sethi 122669, %o2
 ; CHECK-NEXT:    or %o2, 305, %o2
@@ -31,29 +32,30 @@ define i64 @g(i64 %x) {
 ; CHECK-LABEL: g:
 ; CHECK:         .cfi_startproc
 ; CHECK-NEXT:  ! %bb.0: ! %entry
-; CHECK-NEXT:    sub %g0, %o1, %o2
-; CHECK-NEXT:    and %o1, %o2, %o2
-; CHECK-NEXT:    sethi 122669, %o3
-; CHECK-NEXT:    or %o3, 305, %o3
-; CHECK-NEXT:    smul %o2, %o3, %o2
-; CHECK-NEXT:    sethi %hi(.LCPI1_0), %o4
-; CHECK-NEXT:    add %o4, %lo(.LCPI1_0), %o4
-; CHECK-NEXT:    sub %g0, %o0, %o5
-; CHECK-NEXT:    and %o0, %o5, %o5
-; CHECK-NEXT:    smul %o5, %o3, %o3
+; CHECK-NEXT:    mov %g0, %o2
+; CHECK-NEXT:    sub %o2, %o1, %o3
+; CHECK-NEXT:    and %o1, %o3, %o3
+; CHECK-NEXT:    sethi 122669, %o4
+; CHECK-NEXT:    or %o4, 305, %o4
+; CHECK-NEXT:    smul %o3, %o4, %o3
+; CHECK-NEXT:    sethi %hi(.LCPI1_0), %o5
+; CHECK-NEXT:    add %o5, %lo(.LCPI1_0), %o5
+; CHECK-NEXT:    sub %o2, %o0, %g2
+; CHECK-NEXT:    and %o0, %g2, %g2
+; CHECK-NEXT:    smul %g2, %o4, %o4
+; CHECK-NEXT:    srl %o4, 27, %o4
+; CHECK-NEXT:    ldub [%o5+%o4], %o4
 ; CHECK-NEXT:    srl %o3, 27, %o3
-; CHECK-NEXT:    ldub [%o4+%o3], %o3
-; CHECK-NEXT:    srl %o2, 27, %o2
-; CHECK-NEXT:    ldub [%o4+%o2], %o4
-; CHECK-NEXT:    add %o3, 32, %o2
+; CHECK-NEXT:    ldub [%o5+%o3], %o5
+; CHECK-NEXT:    add %o4, 32, %o3
 ; CHECK-NEXT:    cmp %o1, 0
-; CHECK-NEXT:    movne %icc, %o4, %o2
+; CHECK-NEXT:    movne %icc, %o5, %o3
 ; CHECK-NEXT:    or %o1, %o0, %o0
 ; CHECK-NEXT:    cmp %o0, 0
-; CHECK-NEXT:    move %icc, 0, %o2
-; CHECK-NEXT:    mov %g0, %o0
+; CHECK-NEXT:    move %icc, 0, %o3
+; CHECK-NEXT:    mov %o2, %o0
 ; CHECK-NEXT:    retl
-; CHECK-NEXT:    mov %o2, %o1
+; CHECK-NEXT:    mov %o3, %o1
 entry:
   %0 = call i64 @llvm.cttz.i64(i64 %x, i1 true)
   %1 = icmp eq i64 %x, 0

diff  --git a/llvm/test/CodeGen/SPARC/float-constants.ll b/llvm/test/CodeGen/SPARC/float-constants.ll
index cf2a576bf832b..8b38eee700197 100644
--- a/llvm/test/CodeGen/SPARC/float-constants.ll
+++ b/llvm/test/CodeGen/SPARC/float-constants.ll
@@ -8,7 +8,7 @@
 ; CHECK: sethi 1049856, %o0
 ; CHECK: mov %g0, %o1
 ; CHECK-LE: mov %g0, %o0
-; CHECK-LE: sethi 1049856, %o2
+; CHECK-LE: sethi 1049856, %o1
 define <2 x i32> @bitcast() {
   %1 = bitcast double 5.0 to <2 x i32>
   ret <2 x i32> %1
@@ -20,8 +20,8 @@ define <2 x i32> @bitcast() {
 ; CHECK-LABEL: test_call
 ; CHECK: sethi 1049856, %o0
 ; CHECK: mov %g0, %o1
-; CHECK-LE: sethi 1049856, %o1
 ; CHECK-LE: mov %g0, %o0
+; CHECK-LE: sethi 1049856, %o1
 declare void @a(double)
 define void @test_call() {
   call void @a(double 5.0)
@@ -37,9 +37,9 @@ define void @test_call() {
 ; CHECK: sethi 1048576, %o0
 ; CHECK: mov %g0, %o1
 ; CHECK: mov %o0, %o2
-; CHECK: mov %g0, %o3
-; CHECK-LE: sethi 1048576, %o1
+; CHECK: mov %o1, %o3
 ; CHECK-LE: mov %g0, %o0
+; CHECK-LE: sethi 1048576, %o1
 declare double @llvm.pow.f64(double, double)
 define double @test_intrins_call() {
   %1 = call double @llvm.pow.f64(double 2.0, double 2.0)

diff  --git a/llvm/test/CodeGen/SPARC/fshl.ll b/llvm/test/CodeGen/SPARC/fshl.ll
index 34c10a62054b3..d841619457249 100644
--- a/llvm/test/CodeGen/SPARC/fshl.ll
+++ b/llvm/test/CodeGen/SPARC/fshl.ll
@@ -31,7 +31,7 @@ define i32 @PR47303() {
 ; CHECK:         .cfi_startproc
 ; CHECK-NEXT:  ! %bb.0: ! %bb
 ; CHECK-NEXT:    retl
-; CHECK-NEXT:    mov %g0, %o0
+; CHECK-NEXT:    mov 0, %o0
 bb:
   %i = call <4 x i64> @llvm.fshl.v4i64(<4 x i64> undef, <4 x i64> undef, <4 x i64> <i64 57, i64 27, i64 12, i64 33>)
   %i1 = add <4 x i64> %i, zeroinitializer

diff  --git a/llvm/test/CodeGen/SPARC/inlineasm.ll b/llvm/test/CodeGen/SPARC/inlineasm.ll
index 8bf34bf1609c1..38e8751bb3a42 100644
--- a/llvm/test/CodeGen/SPARC/inlineasm.ll
+++ b/llvm/test/CodeGen/SPARC/inlineasm.ll
@@ -84,8 +84,8 @@ attributes #0 = { "frame-pointer"="all" }
 
 ;; Ensures that tied in and out gets allocated properly.
 ; CHECK-LABEL: test_i64_inout:
-; CHECK: mov 5, %i3
 ; CHECK: mov %g0, %i2
+; CHECK: mov 5, %i3
 ; CHECK: xor %i2, %g0, %i2
 ; CHECK: mov %i2, %i0
 ; CHECK: ret

diff  --git a/llvm/test/CodeGen/SPARC/missinglabel.ll b/llvm/test/CodeGen/SPARC/missinglabel.ll
index 88b09a8592634..75bbe976152fd 100644
--- a/llvm/test/CodeGen/SPARC/missinglabel.ll
+++ b/llvm/test/CodeGen/SPARC/missinglabel.ll
@@ -13,7 +13,8 @@ define void @f(i64 %a0) align 2 {
 ; CHECK-NEXT:    nop
 ; CHECK-NEXT:  ! %bb.1: ! %cond.false
 ; CHECK-NEXT:  .LBB0_2: ! %targetblock
-; CHECK-NEXT:    cmp %g0, 0
+; CHECK-NEXT:    mov %g0, %o0
+; CHECK-NEXT:    cmp %o0, 0
 ; CHECK-NEXT:    bne %icc, .LBB0_4
 ; CHECK-NEXT:    nop
 ; CHECK-NEXT:  ! %bb.3: ! %cond.false.i83

diff  --git a/llvm/test/CodeGen/SPARC/smulo-128-legalisation-lowering.ll b/llvm/test/CodeGen/SPARC/smulo-128-legalisation-lowering.ll
index 04d854329f8a7..466668f2196a5 100644
--- a/llvm/test/CodeGen/SPARC/smulo-128-legalisation-lowering.ll
+++ b/llvm/test/CodeGen/SPARC/smulo-128-legalisation-lowering.ll
@@ -10,19 +10,19 @@ define { i128, i8 } @muloti_test(i128 %l, i128 %r) unnamed_addr #0 {
 ; SPARC-NEXT:    .cfi_def_cfa_register %fp
 ; SPARC-NEXT:    .cfi_window_save
 ; SPARC-NEXT:    .cfi_register %o7, %i7
-; SPARC-NEXT:    ld [%fp+92], %l1
-; SPARC-NEXT:    ld [%fp+96], %l2
-; SPARC-NEXT:    mov %i3, %l6
-; SPARC-NEXT:    mov %i2, %l4
-; SPARC-NEXT:    mov %i1, %i3
-; SPARC-NEXT:    mov %i0, %l3
+; SPARC-NEXT:    ld [%fp+92], %l2
+; SPARC-NEXT:    ld [%fp+96], %l3
+; SPARC-NEXT:    mov %i3, %l7
+; SPARC-NEXT:    mov %i2, %l5
+; SPARC-NEXT:    mov %i1, %l4
+; SPARC-NEXT:    mov %i0, %l6
 ; SPARC-NEXT:    sra %i0, 31, %o4
 ; SPARC-NEXT:    st %o4, [%sp+96]
 ; SPARC-NEXT:    st %o4, [%sp+92]
 ; SPARC-NEXT:    mov %i4, %o0
 ; SPARC-NEXT:    mov %i5, %o1
-; SPARC-NEXT:    mov %l1, %o2
-; SPARC-NEXT:    mov %l2, %o3
+; SPARC-NEXT:    mov %l2, %o2
+; SPARC-NEXT:    mov %l3, %o3
 ; SPARC-NEXT:    call __multi3
 ; SPARC-NEXT:    mov %o4, %o5
 ; SPARC-NEXT:    st %o0, [%fp+-12] ! 4-byte Folded Spill
@@ -30,53 +30,54 @@ define { i128, i8 } @muloti_test(i128 %l, i128 %r) unnamed_addr #0 {
 ; SPARC-NEXT:    st %o2, [%fp+-20] ! 4-byte Folded Spill
 ; SPARC-NEXT:    st %o3, [%fp+-24] ! 4-byte Folded Spill
 ; SPARC-NEXT:    st %i5, [%sp+96]
+; SPARC-NEXT:    mov %g0, %l0
 ; SPARC-NEXT:    st %i4, [%sp+92]
-; SPARC-NEXT:    mov %g0, %o0
-; SPARC-NEXT:    mov %g0, %o1
+; SPARC-NEXT:    mov %l0, %o0
+; SPARC-NEXT:    mov %l0, %o1
 ; SPARC-NEXT:    mov %i2, %o2
-; SPARC-NEXT:    mov %l6, %o3
-; SPARC-NEXT:    mov %g0, %o4
+; SPARC-NEXT:    mov %i3, %o3
+; SPARC-NEXT:    mov %l0, %o4
 ; SPARC-NEXT:    call __multi3
-; SPARC-NEXT:    mov %g0, %o5
+; SPARC-NEXT:    mov %l0, %o5
 ; SPARC-NEXT:    st %o0, [%fp+-28] ! 4-byte Folded Spill
 ; SPARC-NEXT:    st %o1, [%fp+-32] ! 4-byte Folded Spill
-; SPARC-NEXT:    mov %o2, %l0
-; SPARC-NEXT:    mov %o3, %i2
-; SPARC-NEXT:    st %l2, [%sp+96]
-; SPARC-NEXT:    st %l1, [%sp+92]
-; SPARC-NEXT:    mov %g0, %o0
-; SPARC-NEXT:    mov %g0, %o1
-; SPARC-NEXT:    mov %l4, %o2
-; SPARC-NEXT:    mov %l6, %o3
-; SPARC-NEXT:    mov %g0, %o4
+; SPARC-NEXT:    st %o2, [%fp+-36] ! 4-byte Folded Spill
+; SPARC-NEXT:    mov %o3, %i3
+; SPARC-NEXT:    st %l3, [%sp+96]
+; SPARC-NEXT:    st %l2, [%sp+92]
+; SPARC-NEXT:    mov %l0, %o0
+; SPARC-NEXT:    mov %l0, %o1
+; SPARC-NEXT:    mov %i2, %o2
+; SPARC-NEXT:    mov %l7, %o3
+; SPARC-NEXT:    mov %l0, %o4
 ; SPARC-NEXT:    call __multi3
-; SPARC-NEXT:    mov %g0, %o5
-; SPARC-NEXT:    mov %o0, %i1
-; SPARC-NEXT:    mov %o1, %i0
+; SPARC-NEXT:    mov %l0, %o5
+; SPARC-NEXT:    mov %o0, %i0
+; SPARC-NEXT:    mov %o1, %i1
 ; SPARC-NEXT:    st %o2, [%fp+-4] ! 4-byte Folded Spill
 ; SPARC-NEXT:    st %o3, [%fp+-8] ! 4-byte Folded Spill
-; SPARC-NEXT:    st %l2, [%sp+96]
-; SPARC-NEXT:    st %l1, [%sp+92]
-; SPARC-NEXT:    mov %g0, %o0
-; SPARC-NEXT:    mov %g0, %o1
-; SPARC-NEXT:    mov %l3, %o2
-; SPARC-NEXT:    mov %i3, %o3
-; SPARC-NEXT:    mov %g0, %o4
+; SPARC-NEXT:    st %l3, [%sp+96]
+; SPARC-NEXT:    st %l2, [%sp+92]
+; SPARC-NEXT:    mov %l0, %o0
+; SPARC-NEXT:    mov %l0, %o1
+; SPARC-NEXT:    mov %l6, %o2
+; SPARC-NEXT:    mov %l4, %o3
+; SPARC-NEXT:    mov %l0, %o4
 ; SPARC-NEXT:    call __multi3
-; SPARC-NEXT:    mov %g0, %o5
-; SPARC-NEXT:    mov %o0, %l1
-; SPARC-NEXT:    mov %o1, %l2
-; SPARC-NEXT:    mov %o2, %l5
-; SPARC-NEXT:    mov %o3, %l7
-; SPARC-NEXT:    st %l6, [%sp+96]
+; SPARC-NEXT:    mov %l0, %o5
+; SPARC-NEXT:    mov %o0, %l2
+; SPARC-NEXT:    mov %o1, %l3
+; SPARC-NEXT:    mov %o2, %l1
+; SPARC-NEXT:    mov %o3, %i2
+; SPARC-NEXT:    st %l7, [%sp+96]
 ; SPARC-NEXT:    sra %i4, 31, %o0
-; SPARC-NEXT:    st %l4, [%sp+92]
+; SPARC-NEXT:    st %l5, [%sp+92]
 ; SPARC-NEXT:    mov %o0, %o1
 ; SPARC-NEXT:    mov %o0, %o2
 ; SPARC-NEXT:    mov %o0, %o3
-; SPARC-NEXT:    mov %l3, %o4
+; SPARC-NEXT:    mov %l6, %o4
 ; SPARC-NEXT:    call __multi3
-; SPARC-NEXT:    mov %i3, %o5
+; SPARC-NEXT:    mov %l4, %o5
 ; SPARC-NEXT:    st %i5, [%sp+96]
 ; SPARC-NEXT:    st %i4, [%sp+92]
 ; SPARC-NEXT:    ld [%fp+-24], %i4 ! 4-byte Folded Reload
@@ -84,38 +85,39 @@ define { i128, i8 } @muloti_test(i128 %l, i128 %r) unnamed_addr #0 {
 ; SPARC-NEXT:    ld [%fp+-20], %i5 ! 4-byte Folded Reload
 ; SPARC-NEXT:    addxcc %o2, %i5, %i5
 ; SPARC-NEXT:    ld [%fp+-16], %g2 ! 4-byte Folded Reload
-; SPARC-NEXT:    addxcc %o1, %g2, %l4
+; SPARC-NEXT:    addxcc %o1, %g2, %l5
 ; SPARC-NEXT:    ld [%fp+-12], %g2 ! 4-byte Folded Reload
-; SPARC-NEXT:    addxcc %o0, %g2, %l6
-; SPARC-NEXT:    addcc %l7, %i0, %i0
-; SPARC-NEXT:    addxcc %l5, %i1, %g2
-; SPARC-NEXT:    addxcc %l2, 0, %g3
-; SPARC-NEXT:    addxcc %l1, 0, %g4
-; SPARC-NEXT:    addcc %i2, %i0, %i1
-; SPARC-NEXT:    addxcc %l0, %g2, %i0
-; SPARC-NEXT:    ld [%fp+-32], %i2 ! 4-byte Folded Reload
-; SPARC-NEXT:    addxcc %i2, 0, %i2
-; SPARC-NEXT:    ld [%fp+-28], %g2 ! 4-byte Folded Reload
-; SPARC-NEXT:    addxcc %g2, 0, %g2
-; SPARC-NEXT:    addcc %g3, %i2, %i2
-; SPARC-NEXT:    addxcc %g4, %g2, %l0
-; SPARC-NEXT:    addxcc %g0, 0, %l1
-; SPARC-NEXT:    addxcc %g0, 0, %l2
-; SPARC-NEXT:    mov %g0, %o0
-; SPARC-NEXT:    mov %g0, %o1
-; SPARC-NEXT:    mov %l3, %o2
-; SPARC-NEXT:    mov %i3, %o3
-; SPARC-NEXT:    mov %g0, %o4
+; SPARC-NEXT:    addxcc %o0, %g2, %l7
+; SPARC-NEXT:    addcc %i2, %i1, %i1
+; SPARC-NEXT:    addxcc %l1, %i0, %i0
+; SPARC-NEXT:    addxcc %l3, 0, %i2
+; SPARC-NEXT:    addxcc %l2, 0, %g2
+; SPARC-NEXT:    addcc %i3, %i1, %i1
+; SPARC-NEXT:    ld [%fp+-36], %i3 ! 4-byte Folded Reload
+; SPARC-NEXT:    addxcc %i3, %i0, %i0
+; SPARC-NEXT:    ld [%fp+-32], %i3 ! 4-byte Folded Reload
+; SPARC-NEXT:    addxcc %i3, 0, %i3
+; SPARC-NEXT:    ld [%fp+-28], %g3 ! 4-byte Folded Reload
+; SPARC-NEXT:    addxcc %g3, 0, %g3
+; SPARC-NEXT:    addcc %i2, %i3, %i2
+; SPARC-NEXT:    addxcc %g2, %g3, %i3
+; SPARC-NEXT:    addxcc %l0, 0, %l1
+; SPARC-NEXT:    addxcc %l0, 0, %l2
+; SPARC-NEXT:    mov %l0, %o0
+; SPARC-NEXT:    mov %l0, %o1
+; SPARC-NEXT:    mov %l6, %o2
+; SPARC-NEXT:    mov %l4, %o3
+; SPARC-NEXT:    mov %l0, %o4
 ; SPARC-NEXT:    call __multi3
-; SPARC-NEXT:    mov %g0, %o5
+; SPARC-NEXT:    mov %l0, %o5
 ; SPARC-NEXT:    addcc %o3, %i2, %i2
-; SPARC-NEXT:    addxcc %o2, %l0, %i3
+; SPARC-NEXT:    addxcc %o2, %i3, %i3
 ; SPARC-NEXT:    addxcc %o1, %l1, %g2
 ; SPARC-NEXT:    addxcc %o0, %l2, %g3
 ; SPARC-NEXT:    addcc %i2, %i4, %i2
 ; SPARC-NEXT:    addxcc %i3, %i5, %i3
-; SPARC-NEXT:    addxcc %g2, %l4, %i4
-; SPARC-NEXT:    addxcc %g3, %l6, %i5
+; SPARC-NEXT:    addxcc %g2, %l5, %i4
+; SPARC-NEXT:    addxcc %g3, %l7, %i5
 ; SPARC-NEXT:    sra %i0, 31, %g2
 ; SPARC-NEXT:    xor %i5, %g2, %i5
 ; SPARC-NEXT:    xor %i3, %g2, %i3
@@ -125,25 +127,22 @@ define { i128, i8 } @muloti_test(i128 %l, i128 %r) unnamed_addr #0 {
 ; SPARC-NEXT:    or %i2, %i4, %i2
 ; SPARC-NEXT:    or %i2, %i3, %i2
 ; SPARC-NEXT:    cmp %i2, 0
-; SPARC-NEXT:    bne .LBB0_1
+; SPARC-NEXT:    be .LBB0_2
 ; SPARC-NEXT:    nop
-; SPARC-NEXT:  ! %bb.2: ! %start
-; SPARC-NEXT:    ba .LBB0_3
-; SPARC-NEXT:    mov %g0, %i4
-; SPARC-NEXT:  .LBB0_1:
-; SPARC-NEXT:    mov 1, %i4
-; SPARC-NEXT:  .LBB0_3: ! %start
+; SPARC-NEXT:  ! %bb.1:
+; SPARC-NEXT:    mov 1, %l0
+; SPARC-NEXT:  .LBB0_2: ! %start
 ; SPARC-NEXT:    ld [%fp+-4], %i2 ! 4-byte Folded Reload
 ; SPARC-NEXT:    ld [%fp+-8], %i3 ! 4-byte Folded Reload
 ; SPARC-NEXT:    ret
-; SPARC-NEXT:    restore
+; SPARC-NEXT:    restore %g0, %l0, %o4
 ;
 ; SPARC64-LABEL: muloti_test:
 ; SPARC64:         .cfi_startproc
 ; SPARC64-NEXT:    .register %g2, #scratch
 ; SPARC64-NEXT:    .register %g3, #scratch
 ; SPARC64-NEXT:  ! %bb.0: ! %start
-; SPARC64-NEXT:    save %sp, -176, %sp
+; SPARC64-NEXT:    save %sp, -192, %sp
 ; SPARC64-NEXT:    .cfi_def_cfa_register %fp
 ; SPARC64-NEXT:    .cfi_window_save
 ; SPARC64-NEXT:    .cfi_register %o7, %i7
@@ -165,76 +164,79 @@ define { i128, i8 } @muloti_test(i128 %l, i128 %r) unnamed_addr #0 {
 ; SPARC64-NEXT:    srlx %o1, 32, %g3
 ; SPARC64-NEXT:    srlx %i1, 32, %g4
 ; SPARC64-NEXT:    srlx %o0, 32, %g5
-; SPARC64-NEXT:    addcc %o1, %i5, %l0
-; SPARC64-NEXT:    addxcc %g3, %g2, %l1
-; SPARC64-NEXT:    addxcc %o0, %i1, %l2
-; SPARC64-NEXT:    addxcc %g5, %g4, %l3
-; SPARC64-NEXT:    mov %g0, %o0
+; SPARC64-NEXT:    addcc %o1, %i5, %i5
+; SPARC64-NEXT:    st %i5, [%fp+2043] ! 4-byte Folded Spill
+; SPARC64-NEXT:    addxcc %g3, %g2, %l2
+; SPARC64-NEXT:    addxcc %o0, %i1, %l3
+; SPARC64-NEXT:    addxcc %g5, %g4, %l4
+; SPARC64-NEXT:    mov 0, %i5
+; SPARC64-NEXT:    mov %i5, %o0
 ; SPARC64-NEXT:    mov %i3, %o1
-; SPARC64-NEXT:    mov %g0, %o2
+; SPARC64-NEXT:    mov %i5, %o2
 ; SPARC64-NEXT:    call __multi3
 ; SPARC64-NEXT:    mov %i4, %o3
-; SPARC64-NEXT:    mov %o0, %i5
+; SPARC64-NEXT:    mov %o0, %l0
 ; SPARC64-NEXT:    mov %o1, %i1
-; SPARC64-NEXT:    mov %g0, %o0
+; SPARC64-NEXT:    mov %i5, %o0
 ; SPARC64-NEXT:    mov %i0, %o1
-; SPARC64-NEXT:    mov %g0, %o2
+; SPARC64-NEXT:    mov %i5, %o2
 ; SPARC64-NEXT:    call __multi3
 ; SPARC64-NEXT:    mov %i4, %o3
-; SPARC64-NEXT:    srlx %i5, 32, %i4
+; SPARC64-NEXT:    srlx %l0, 32, %i4
 ; SPARC64-NEXT:    srlx %o1, 32, %g2
 ; SPARC64-NEXT:    srlx %o0, 32, %g3
-; SPARC64-NEXT:    addcc %o1, %i5, %i5
+; SPARC64-NEXT:    addcc %o1, %l0, %l0
 ; SPARC64-NEXT:    addxcc %g2, %i4, %i4
-; SPARC64-NEXT:    addxcc %o0, 0, %l4
-; SPARC64-NEXT:    addxcc %g3, 0, %l5
-; SPARC64-NEXT:    mov %g0, %o0
+; SPARC64-NEXT:    addxcc %o0, 0, %l5
+; SPARC64-NEXT:    addxcc %g3, 0, %l6
+; SPARC64-NEXT:    mov %i5, %o0
 ; SPARC64-NEXT:    mov %i3, %o1
-; SPARC64-NEXT:    mov %g0, %o2
+; SPARC64-NEXT:    mov %i5, %o2
 ; SPARC64-NEXT:    call __multi3
 ; SPARC64-NEXT:    mov %i2, %o3
-; SPARC64-NEXT:    srlx %o1, 32, %g2
-; SPARC64-NEXT:    srlx %o0, 32, %g3
-; SPARC64-NEXT:    addcc %o1, %i5, %i3
-; SPARC64-NEXT:    addxcc %g2, %i4, %i4
-; SPARC64-NEXT:    addxcc %o0, 0, %i5
-; SPARC64-NEXT:    addxcc %g3, 0, %g2
-; SPARC64-NEXT:    addcc %l4, %i5, %i5
-; SPARC64-NEXT:    addxcc %l5, %g2, %l4
-; SPARC64-NEXT:    addxcc %g0, 0, %l5
-; SPARC64-NEXT:    addxcc %g0, 0, %l6
-; SPARC64-NEXT:    mov %g0, %o0
+; SPARC64-NEXT:    srlx %o1, 32, %i3
+; SPARC64-NEXT:    srlx %o0, 32, %g2
+; SPARC64-NEXT:    addcc %o1, %l0, %l0
+; SPARC64-NEXT:    addxcc %i3, %i4, %i3
+; SPARC64-NEXT:    addxcc %o0, 0, %i4
+; SPARC64-NEXT:    addxcc %g2, 0, %g2
+; SPARC64-NEXT:    mov %g0, %l7
+; SPARC64-NEXT:    addcc %l5, %i4, %i4
+; SPARC64-NEXT:    addxcc %l6, %g2, %l5
+; SPARC64-NEXT:    addxcc %l7, 0, %l6
+; SPARC64-NEXT:    addxcc %l7, 0, %l1
+; SPARC64-NEXT:    mov %i5, %o0
 ; SPARC64-NEXT:    mov %i0, %o1
-; SPARC64-NEXT:    mov %g0, %o2
+; SPARC64-NEXT:    mov %i5, %o2
 ; SPARC64-NEXT:    call __multi3
 ; SPARC64-NEXT:    mov %i2, %o3
-; SPARC64-NEXT:    mov %g0, %i2
 ; SPARC64-NEXT:    srlx %o1, 32, %i0
-; SPARC64-NEXT:    addcc %o1, %i5, %i5
-; SPARC64-NEXT:    srlx %o0, 32, %g2
-; SPARC64-NEXT:    addxcc %i0, %l4, %i0
-; SPARC64-NEXT:    addxcc %o0, %l5, %g3
-; SPARC64-NEXT:    addxcc %g2, %l6, %g2
-; SPARC64-NEXT:    addcc %i5, %l0, %i5
-; SPARC64-NEXT:    addxcc %i0, %l1, %i0
-; SPARC64-NEXT:    addxcc %g3, %l2, %g3
-; SPARC64-NEXT:    addxcc %g2, %l3, %g2
-; SPARC64-NEXT:    srl %g3, 0, %g3
-; SPARC64-NEXT:    sllx %g2, 32, %g2
-; SPARC64-NEXT:    or %g2, %g3, %g2
-; SPARC64-NEXT:    sllx %i4, 32, %i4
-; SPARC64-NEXT:    srax %i4, 63, %g3
-; SPARC64-NEXT:    xor %g2, %g3, %g2
+; SPARC64-NEXT:    srlx %o0, 32, %i2
+; SPARC64-NEXT:    addcc %o1, %i4, %i4
+; SPARC64-NEXT:    addxcc %i0, %l5, %i0
+; SPARC64-NEXT:    addxcc %o0, %l6, %i5
+; SPARC64-NEXT:    addxcc %i2, %l1, %i2
+; SPARC64-NEXT:    ld [%fp+2043], %g2 ! 4-byte Folded Reload
+; SPARC64-NEXT:    addcc %i4, %g2, %i4
+; SPARC64-NEXT:    addxcc %i0, %l2, %i0
+; SPARC64-NEXT:    addxcc %i5, %l3, %i5
+; SPARC64-NEXT:    addxcc %i2, %l4, %i2
 ; SPARC64-NEXT:    srl %i5, 0, %i5
+; SPARC64-NEXT:    sllx %i2, 32, %i2
+; SPARC64-NEXT:    or %i2, %i5, %i2
+; SPARC64-NEXT:    sllx %i3, 32, %i3
+; SPARC64-NEXT:    srax %i3, 63, %i5
+; SPARC64-NEXT:    xor %i2, %i5, %i2
+; SPARC64-NEXT:    srl %i4, 0, %i4
 ; SPARC64-NEXT:    sllx %i0, 32, %i0
-; SPARC64-NEXT:    or %i0, %i5, %i0
-; SPARC64-NEXT:    xor %i0, %g3, %i0
-; SPARC64-NEXT:    or %i0, %g2, %i0
+; SPARC64-NEXT:    or %i0, %i4, %i0
+; SPARC64-NEXT:    xor %i0, %i5, %i0
+; SPARC64-NEXT:    or %i0, %i2, %i0
 ; SPARC64-NEXT:    cmp %i0, 0
-; SPARC64-NEXT:    movne %xcc, 1, %i2
-; SPARC64-NEXT:    srl %i3, 0, %i0
-; SPARC64-NEXT:    or %i4, %i0, %i0
-; SPARC64-NEXT:    srl %i2, 0, %i2
+; SPARC64-NEXT:    movne %xcc, 1, %l7
+; SPARC64-NEXT:    srl %l0, 0, %i0
+; SPARC64-NEXT:    or %i3, %i0, %i0
+; SPARC64-NEXT:    srl %l7, 0, %i2
 ; SPARC64-NEXT:    ret
 ; SPARC64-NEXT:    restore
 start:

diff  --git a/llvm/test/CodeGen/SPARC/tailcall.ll b/llvm/test/CodeGen/SPARC/tailcall.ll
index 9a0e7bc5c7923..5ca621b27a2f3 100644
--- a/llvm/test/CodeGen/SPARC/tailcall.ll
+++ b/llvm/test/CodeGen/SPARC/tailcall.ll
@@ -157,14 +157,14 @@ define i32 @caller_args() #0 {
 ; V8:       ! %bb.0: ! %entry
 ; V8-NEXT:    save %sp, -104, %sp
 ; V8-NEXT:    mov 6, %i0
+; V8-NEXT:    mov %g0, %o0
 ; V8-NEXT:    mov 1, %o1
 ; V8-NEXT:    mov 2, %o2
 ; V8-NEXT:    mov 3, %o3
 ; V8-NEXT:    mov 4, %o4
 ; V8-NEXT:    mov 5, %o5
-; V8-NEXT:    st %i0, [%sp+92]
 ; V8-NEXT:    call foo7
-; V8-NEXT:    mov %g0, %o0
+; V8-NEXT:    st %i0, [%sp+92]
 ; V8-NEXT:    ret
 ; V8-NEXT:    restore %g0, %o0, %o0
 ;
@@ -172,14 +172,14 @@ define i32 @caller_args() #0 {
 ; V9:       ! %bb.0: ! %entry
 ; V9-NEXT:    save %sp, -192, %sp
 ; V9-NEXT:    mov 6, %i0
+; V9-NEXT:    mov 0, %o0
 ; V9-NEXT:    mov 1, %o1
 ; V9-NEXT:    mov 2, %o2
 ; V9-NEXT:    mov 3, %o3
 ; V9-NEXT:    mov 4, %o4
 ; V9-NEXT:    mov 5, %o5
-; V9-NEXT:    stx %i0, [%sp+2223]
 ; V9-NEXT:    call foo7
-; V9-NEXT:    mov %g0, %o0
+; V9-NEXT:    stx %i0, [%sp+2223]
 ; V9-NEXT:    ret
 ; V9-NEXT:    restore %g0, %o0, %o0
 entry:

diff  --git a/llvm/test/CodeGen/SPARC/umulo-128-legalisation-lowering.ll b/llvm/test/CodeGen/SPARC/umulo-128-legalisation-lowering.ll
index 5f67fd4e16fc4..e870ad2f0bd93 100644
--- a/llvm/test/CodeGen/SPARC/umulo-128-legalisation-lowering.ll
+++ b/llvm/test/CodeGen/SPARC/umulo-128-legalisation-lowering.ll
@@ -6,7 +6,7 @@ define { i128, i8 } @muloti_test(i128 %l, i128 %r) unnamed_addr #0 {
 ; SPARC-LABEL: muloti_test:
 ; SPARC:         .cfi_startproc
 ; SPARC-NEXT:  ! %bb.0: ! %start
-; SPARC-NEXT:    save %sp, -112, %sp
+; SPARC-NEXT:    save %sp, -120, %sp
 ; SPARC-NEXT:    .cfi_def_cfa_register %fp
 ; SPARC-NEXT:    .cfi_window_save
 ; SPARC-NEXT:    .cfi_register %o7, %i7
@@ -16,196 +16,199 @@ define { i128, i8 } @muloti_test(i128 %l, i128 %r) unnamed_addr #0 {
 ; SPARC-NEXT:    rd %y, %g4
 ; SPARC-NEXT:    st %g4, [%fp+-12] ! 4-byte Folded Spill
 ; SPARC-NEXT:    umul %i4, %i3, %g4
-; SPARC-NEXT:    rd %y, %l5
+; SPARC-NEXT:    rd %y, %l0
+; SPARC-NEXT:    st %l0, [%fp+-16] ! 4-byte Folded Spill
 ; SPARC-NEXT:    st %g2, [%sp+96]
-; SPARC-NEXT:    umul %i5, %i3, %l1
+; SPARC-NEXT:    umul %i5, %i3, %l0
 ; SPARC-NEXT:    rd %y, %l6
 ; SPARC-NEXT:    st %l4, [%sp+92]
 ; SPARC-NEXT:    umul %l4, %i1, %l2
-; SPARC-NEXT:    rd %y, %l0
-; SPARC-NEXT:    st %l0, [%fp+-4] ! 4-byte Folded Spill
+; SPARC-NEXT:    rd %y, %l1
+; SPARC-NEXT:    st %l1, [%fp+-4] ! 4-byte Folded Spill
 ; SPARC-NEXT:    add %g4, %g3, %g3
 ; SPARC-NEXT:    umul %i0, %g2, %g4
-; SPARC-NEXT:    rd %y, %l0
-; SPARC-NEXT:    st %l0, [%fp+-8] ! 4-byte Folded Spill
+; SPARC-NEXT:    rd %y, %l1
+; SPARC-NEXT:    st %l1, [%fp+-8] ! 4-byte Folded Spill
 ; SPARC-NEXT:    add %l6, %g3, %l3
 ; SPARC-NEXT:    umul %i1, %g2, %g2
-; SPARC-NEXT:    rd %y, %l0
+; SPARC-NEXT:    rd %y, %l1
 ; SPARC-NEXT:    add %g4, %l2, %g3
-; SPARC-NEXT:    add %l0, %g3, %l2
-; SPARC-NEXT:    addcc %g2, %l1, %l1
-; SPARC-NEXT:    addxcc %l2, %l3, %l7
-; SPARC-NEXT:    mov %g0, %o0
-; SPARC-NEXT:    mov %g0, %o1
+; SPARC-NEXT:    add %l1, %g3, %l2
+; SPARC-NEXT:    addcc %g2, %l0, %l7
+; SPARC-NEXT:    mov %g0, %l0
+; SPARC-NEXT:    addxcc %l2, %l3, %l5
+; SPARC-NEXT:    mov %l0, %o0
+; SPARC-NEXT:    mov %l0, %o1
 ; SPARC-NEXT:    mov %i2, %o2
 ; SPARC-NEXT:    mov %i3, %o3
-; SPARC-NEXT:    mov %g0, %o4
+; SPARC-NEXT:    mov %l0, %o4
 ; SPARC-NEXT:    call __multi3
-; SPARC-NEXT:    mov %g0, %o5
-; SPARC-NEXT:    addcc %o1, %l1, %g3
-; SPARC-NEXT:    addxcc %o0, %l7, %g2
-; SPARC-NEXT:    mov 1, %g4
+; SPARC-NEXT:    mov %l0, %o5
+; SPARC-NEXT:    addcc %o1, %l7, %i3
+; SPARC-NEXT:    addxcc %o0, %l5, %g2
+; SPARC-NEXT:    mov 1, %g3
 ; SPARC-NEXT:    cmp %g2, %o0
-; SPARC-NEXT:    mov %o3, %i3
 ; SPARC-NEXT:    bcs .LBB0_2
-; SPARC-NEXT:    mov %g4, %o3
+; SPARC-NEXT:    mov %g3, %o4
 ; SPARC-NEXT:  ! %bb.1: ! %start
-; SPARC-NEXT:    mov %g0, %o3
+; SPARC-NEXT:    mov %l0, %o4
 ; SPARC-NEXT:  .LBB0_2: ! %start
-; SPARC-NEXT:    cmp %g3, %o1
+; SPARC-NEXT:    cmp %i3, %o1
 ; SPARC-NEXT:    bcs .LBB0_4
-; SPARC-NEXT:    mov %g4, %l1
+; SPARC-NEXT:    mov %g3, %g4
 ; SPARC-NEXT:  ! %bb.3: ! %start
-; SPARC-NEXT:    mov %g0, %l1
+; SPARC-NEXT:    mov %l0, %g4
 ; SPARC-NEXT:  .LBB0_4: ! %start
 ; SPARC-NEXT:    cmp %g2, %o0
 ; SPARC-NEXT:    be .LBB0_6
 ; SPARC-NEXT:    nop
 ; SPARC-NEXT:  ! %bb.5: ! %start
-; SPARC-NEXT:    mov %o3, %l1
+; SPARC-NEXT:    mov %o4, %g4
 ; SPARC-NEXT:  .LBB0_6: ! %start
 ; SPARC-NEXT:    cmp %i2, 0
 ; SPARC-NEXT:    bne .LBB0_8
-; SPARC-NEXT:    mov %g4, %i2
+; SPARC-NEXT:    mov %g3, %i2
 ; SPARC-NEXT:  ! %bb.7: ! %start
-; SPARC-NEXT:    mov %g0, %i2
+; SPARC-NEXT:    mov %l0, %i2
 ; SPARC-NEXT:  .LBB0_8: ! %start
 ; SPARC-NEXT:    cmp %i4, 0
 ; SPARC-NEXT:    bne .LBB0_10
-; SPARC-NEXT:    mov %g4, %o1
+; SPARC-NEXT:    mov %g3, %o1
 ; SPARC-NEXT:  ! %bb.9: ! %start
-; SPARC-NEXT:    mov %g0, %o1
+; SPARC-NEXT:    mov %l0, %o1
 ; SPARC-NEXT:  .LBB0_10: ! %start
+; SPARC-NEXT:    ld [%fp+-16], %l5 ! 4-byte Folded Reload
 ; SPARC-NEXT:    cmp %l5, 0
 ; SPARC-NEXT:    bne .LBB0_12
-; SPARC-NEXT:    mov %g4, %o0
+; SPARC-NEXT:    mov %g3, %o0
 ; SPARC-NEXT:  ! %bb.11: ! %start
-; SPARC-NEXT:    mov %g0, %o0
+; SPARC-NEXT:    mov %l0, %o0
 ; SPARC-NEXT:  .LBB0_12: ! %start
 ; SPARC-NEXT:    ld [%fp+-12], %l5 ! 4-byte Folded Reload
 ; SPARC-NEXT:    cmp %l5, 0
 ; SPARC-NEXT:    bne .LBB0_14
-; SPARC-NEXT:    mov %g4, %l5
+; SPARC-NEXT:    mov %g3, %l5
 ; SPARC-NEXT:  ! %bb.13: ! %start
-; SPARC-NEXT:    mov %g0, %l5
+; SPARC-NEXT:    mov %l0, %l5
 ; SPARC-NEXT:  .LBB0_14: ! %start
 ; SPARC-NEXT:    cmp %l3, %l6
 ; SPARC-NEXT:    bcs .LBB0_16
-; SPARC-NEXT:    mov %g4, %l3
+; SPARC-NEXT:    mov %g3, %l3
 ; SPARC-NEXT:  ! %bb.15: ! %start
-; SPARC-NEXT:    mov %g0, %l3
+; SPARC-NEXT:    mov %l0, %l3
 ; SPARC-NEXT:  .LBB0_16: ! %start
 ; SPARC-NEXT:    cmp %l4, 0
 ; SPARC-NEXT:    bne .LBB0_18
-; SPARC-NEXT:    mov %g4, %l4
+; SPARC-NEXT:    mov %g3, %l4
 ; SPARC-NEXT:  ! %bb.17: ! %start
-; SPARC-NEXT:    mov %g0, %l4
+; SPARC-NEXT:    mov %l0, %l4
 ; SPARC-NEXT:  .LBB0_18: ! %start
 ; SPARC-NEXT:    cmp %i0, 0
 ; SPARC-NEXT:    bne .LBB0_20
-; SPARC-NEXT:    mov %g4, %l7
+; SPARC-NEXT:    mov %g3, %l7
 ; SPARC-NEXT:  ! %bb.19: ! %start
-; SPARC-NEXT:    mov %g0, %l7
+; SPARC-NEXT:    mov %l0, %l7
 ; SPARC-NEXT:  .LBB0_20: ! %start
 ; SPARC-NEXT:    ld [%fp+-8], %l6 ! 4-byte Folded Reload
 ; SPARC-NEXT:    cmp %l6, 0
 ; SPARC-NEXT:    bne .LBB0_22
-; SPARC-NEXT:    mov %g4, %l6
+; SPARC-NEXT:    mov %g3, %l6
 ; SPARC-NEXT:  ! %bb.21: ! %start
-; SPARC-NEXT:    mov %g0, %l6
+; SPARC-NEXT:    mov %l0, %l6
 ; SPARC-NEXT:  .LBB0_22: ! %start
 ; SPARC-NEXT:    and %o1, %i2, %i2
 ; SPARC-NEXT:    ld [%fp+-4], %o1 ! 4-byte Folded Reload
 ; SPARC-NEXT:    cmp %o1, 0
 ; SPARC-NEXT:    and %l7, %l4, %o1
 ; SPARC-NEXT:    bne .LBB0_24
-; SPARC-NEXT:    mov %g4, %l4
+; SPARC-NEXT:    mov %g3, %l4
 ; SPARC-NEXT:  ! %bb.23: ! %start
-; SPARC-NEXT:    mov %g0, %l4
+; SPARC-NEXT:    mov %l0, %l4
 ; SPARC-NEXT:  .LBB0_24: ! %start
 ; SPARC-NEXT:    or %i2, %o0, %l7
-; SPARC-NEXT:    cmp %l2, %l0
+; SPARC-NEXT:    cmp %l2, %l1
 ; SPARC-NEXT:    or %o1, %l6, %l2
 ; SPARC-NEXT:    bcs .LBB0_26
-; SPARC-NEXT:    mov %g4, %i2
+; SPARC-NEXT:    mov %g3, %i2
 ; SPARC-NEXT:  ! %bb.25: ! %start
-; SPARC-NEXT:    mov %g0, %i2
+; SPARC-NEXT:    mov %l0, %i2
 ; SPARC-NEXT:  .LBB0_26: ! %start
-; SPARC-NEXT:    or %l7, %l5, %l0
+; SPARC-NEXT:    or %l7, %l5, %l1
 ; SPARC-NEXT:    or %i5, %i4, %i4
 ; SPARC-NEXT:    cmp %i4, 0
 ; SPARC-NEXT:    or %l2, %l4, %l2
 ; SPARC-NEXT:    bne .LBB0_28
-; SPARC-NEXT:    mov %g4, %i4
+; SPARC-NEXT:    mov %g3, %i4
 ; SPARC-NEXT:  ! %bb.27: ! %start
-; SPARC-NEXT:    mov %g0, %i4
+; SPARC-NEXT:    mov %l0, %i4
 ; SPARC-NEXT:  .LBB0_28: ! %start
-; SPARC-NEXT:    or %l0, %l3, %i5
+; SPARC-NEXT:    or %l1, %l3, %i5
 ; SPARC-NEXT:    or %i1, %i0, %i0
 ; SPARC-NEXT:    cmp %i0, 0
 ; SPARC-NEXT:    bne .LBB0_30
 ; SPARC-NEXT:    or %l2, %i2, %i0
 ; SPARC-NEXT:  ! %bb.29: ! %start
-; SPARC-NEXT:    mov %g0, %g4
+; SPARC-NEXT:    mov %l0, %g3
 ; SPARC-NEXT:  .LBB0_30: ! %start
-; SPARC-NEXT:    and %g4, %i4, %i1
+; SPARC-NEXT:    and %g3, %i4, %i1
 ; SPARC-NEXT:    or %i1, %i0, %i0
 ; SPARC-NEXT:    or %i0, %i5, %i0
-; SPARC-NEXT:    or %i0, %l1, %i0
+; SPARC-NEXT:    or %i0, %g4, %i0
 ; SPARC-NEXT:    and %i0, 1, %i4
 ; SPARC-NEXT:    mov %g2, %i0
-; SPARC-NEXT:    mov %g3, %i1
+; SPARC-NEXT:    mov %i3, %i1
+; SPARC-NEXT:    mov %o2, %i2
 ; SPARC-NEXT:    ret
-; SPARC-NEXT:    restore %g0, %o2, %o2
+; SPARC-NEXT:    restore %g0, %o3, %o3
 ;
 ; SPARC64-LABEL: muloti_test:
 ; SPARC64:         .cfi_startproc
 ; SPARC64-NEXT:    .register %g2, #scratch
-; SPARC64-NEXT:    .register %g3, #scratch
 ; SPARC64-NEXT:  ! %bb.0: ! %start
 ; SPARC64-NEXT:    save %sp, -176, %sp
 ; SPARC64-NEXT:    .cfi_def_cfa_register %fp
 ; SPARC64-NEXT:    .cfi_window_save
 ; SPARC64-NEXT:    .cfi_register %o7, %i7
-; SPARC64-NEXT:    mov %g0, %o0
+; SPARC64-NEXT:    mov 0, %i4
+; SPARC64-NEXT:    mov %i4, %o0
 ; SPARC64-NEXT:    mov %i2, %o1
-; SPARC64-NEXT:    mov %g0, %o2
+; SPARC64-NEXT:    mov %i4, %o2
 ; SPARC64-NEXT:    call __multi3
 ; SPARC64-NEXT:    mov %i1, %o3
-; SPARC64-NEXT:    mov %o0, %i4
-; SPARC64-NEXT:    mov %o1, %i5
-; SPARC64-NEXT:    mov %g0, %o0
+; SPARC64-NEXT:    mov %o0, %i5
+; SPARC64-NEXT:    mov %o1, %l0
+; SPARC64-NEXT:    mov %i4, %o0
 ; SPARC64-NEXT:    mov %i0, %o1
-; SPARC64-NEXT:    mov %g0, %o2
+; SPARC64-NEXT:    mov %i4, %o2
 ; SPARC64-NEXT:    call __multi3
 ; SPARC64-NEXT:    mov %i3, %o3
-; SPARC64-NEXT:    mov %o0, %l0
-; SPARC64-NEXT:    add %o1, %i5, %i5
-; SPARC64-NEXT:    mov %g0, %o0
+; SPARC64-NEXT:    mov %o0, %l1
+; SPARC64-NEXT:    add %o1, %l0, %l0
+; SPARC64-NEXT:    mov %i4, %o0
 ; SPARC64-NEXT:    mov %i1, %o1
-; SPARC64-NEXT:    mov %g0, %o2
+; SPARC64-NEXT:    mov %i4, %o2
 ; SPARC64-NEXT:    call __multi3
 ; SPARC64-NEXT:    mov %i3, %o3
+; SPARC64-NEXT:    add %o0, %l0, %i1
 ; SPARC64-NEXT:    mov %g0, %i3
-; SPARC64-NEXT:    mov %g0, %g2
-; SPARC64-NEXT:    mov %g0, %g3
-; SPARC64-NEXT:    mov %g0, %g4
-; SPARC64-NEXT:    mov %g0, %g5
-; SPARC64-NEXT:    add %o0, %i5, %i1
 ; SPARC64-NEXT:    cmp %i1, %o0
-; SPARC64-NEXT:    movcs %xcc, 1, %i3
-; SPARC64-NEXT:    cmp %l0, 0
+; SPARC64-NEXT:    mov %i3, %i4
+; SPARC64-NEXT:    movcs %xcc, 1, %i4
+; SPARC64-NEXT:    cmp %l1, 0
+; SPARC64-NEXT:    mov %i3, %g2
 ; SPARC64-NEXT:    movne %xcc, 1, %g2
 ; SPARC64-NEXT:    cmp %i2, 0
-; SPARC64-NEXT:    movne %xcc, 1, %g3
+; SPARC64-NEXT:    mov %i3, %i2
+; SPARC64-NEXT:    movne %xcc, 1, %i2
 ; SPARC64-NEXT:    cmp %i0, 0
-; SPARC64-NEXT:    movne %xcc, 1, %g4
-; SPARC64-NEXT:    and %g4, %g3, %i0
+; SPARC64-NEXT:    mov %i3, %i0
+; SPARC64-NEXT:    movne %xcc, 1, %i0
+; SPARC64-NEXT:    and %i0, %i2, %i0
 ; SPARC64-NEXT:    or %i0, %g2, %i0
-; SPARC64-NEXT:    cmp %i4, 0
-; SPARC64-NEXT:    movne %xcc, 1, %g5
-; SPARC64-NEXT:    or %i0, %g5, %i0
+; SPARC64-NEXT:    cmp %i5, 0
+; SPARC64-NEXT:    movne %xcc, 1, %i3
 ; SPARC64-NEXT:    or %i0, %i3, %i0
+; SPARC64-NEXT:    or %i0, %i4, %i0
 ; SPARC64-NEXT:    srl %i0, 0, %i2
 ; SPARC64-NEXT:    mov %i1, %i0
 ; SPARC64-NEXT:    ret

diff  --git a/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/sparc_generated_funcs.ll.generated.expected b/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/sparc_generated_funcs.ll.generated.expected
index 071afeefcda40..a57da32796bab 100644
--- a/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/sparc_generated_funcs.ll.generated.expected
+++ b/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/sparc_generated_funcs.ll.generated.expected
@@ -72,7 +72,8 @@ attributes #0 = { noredzone nounwind ssp uwtable "frame-pointer"="all" }
 ; CHECK-NEXT:    .cfi_window_save
 ; CHECK-NEXT:    .cfi_register %o7, %i7
 ; CHECK-NEXT:    st %g0, [%fp+-4]
-; CHECK-NEXT:    cmp %g0, 0
+; CHECK-NEXT:    mov %g0, %i0
+; CHECK-NEXT:    cmp %i0, 0
 ; CHECK-NEXT:    st %g0, [%fp+-8]
 ; CHECK-NEXT:    be .LBB0_1
 ; CHECK-NEXT:    mov 1, %i0
@@ -132,6 +133,7 @@ attributes #0 = { noredzone nounwind ssp uwtable "frame-pointer"="all" }
 ; CHECK-NEXT:    st %i1, [%fp+-8]
 ; CHECK-NEXT:    st %i2, [%fp+-12]
 ; CHECK-NEXT:    st %i3, [%fp+-16]
+; CHECK-NEXT:    mov %g0, %i0
 ; CHECK-NEXT:    st %i4, [%fp+-20]
 ; CHECK-NEXT:    ret
-; CHECK-NEXT:    restore %g0, %g0, %o0
+; CHECK-NEXT:    restore

diff  --git a/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/sparc_generated_funcs.ll.nogenerated.expected b/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/sparc_generated_funcs.ll.nogenerated.expected
index 2029df835f013..ae4087685942b 100644
--- a/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/sparc_generated_funcs.ll.nogenerated.expected
+++ b/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/sparc_generated_funcs.ll.nogenerated.expected
@@ -13,7 +13,8 @@ define dso_local i32 @check_boundaries() #0 {
 ; CHECK-NEXT:    .cfi_window_save
 ; CHECK-NEXT:    .cfi_register %o7, %i7
 ; CHECK-NEXT:    st %g0, [%fp+-4]
-; CHECK-NEXT:    cmp %g0, 0
+; CHECK-NEXT:    mov %g0, %i0
+; CHECK-NEXT:    cmp %i0, 0
 ; CHECK-NEXT:    st %g0, [%fp+-8]
 ; CHECK-NEXT:    be .LBB0_1
 ; CHECK-NEXT:    mov 1, %i0
@@ -109,9 +110,10 @@ define dso_local i32 @main() #0 {
 ; CHECK-NEXT:    st %i1, [%fp+-8]
 ; CHECK-NEXT:    st %i2, [%fp+-12]
 ; CHECK-NEXT:    st %i3, [%fp+-16]
+; CHECK-NEXT:    mov %g0, %i0
 ; CHECK-NEXT:    st %i4, [%fp+-20]
 ; CHECK-NEXT:    ret
-; CHECK-NEXT:    restore %g0, %g0, %o0
+; CHECK-NEXT:    restore
   %1 = alloca i32, align 4
   %2 = alloca i32, align 4
   %3 = alloca i32, align 4


        


More information about the llvm-commits mailing list