diff --git a/lib/Target/Sparc/README.txt b/lib/Target/Sparc/README.txt index b4991fe5790..c831367e436 100644 --- a/lib/Target/Sparc/README.txt +++ b/lib/Target/Sparc/README.txt @@ -57,3 +57,5 @@ int %t1(int %a, int %b) { * Fill delay slots * Implement JIT support + +* Use %g0 directly to materialize 0. No instruction is required. diff --git a/lib/Target/Sparc/SparcInstr64Bit.td b/lib/Target/Sparc/SparcInstr64Bit.td index 3af494ee0c7..daafb432372 100644 --- a/lib/Target/Sparc/SparcInstr64Bit.td +++ b/lib/Target/Sparc/SparcInstr64Bit.td @@ -59,10 +59,6 @@ defm SRAX : F3_S<"srax", 0b100111, 1, sra, i64, I64Regs>; // preferable to use a constant pool load instead, depending on the // microarchitecture. -// The %g0 register is constant 0. -// This is useful for stx %g0, [...], for example. -def : Pat<(i64 0), (i64 G0)>, Requires<[Is64Bit]>; - // Single-instruction patterns. // The ALU instructions want their simm13 operands as i32 immediates. diff --git a/test/CodeGen/SPARC/64bit.ll b/test/CodeGen/SPARC/64bit.ll index 37dcea9891d..dd6cee30b15 100644 --- a/test/CodeGen/SPARC/64bit.ll +++ b/test/CodeGen/SPARC/64bit.ll @@ -26,7 +26,7 @@ define i64 @sra_reg(i64 %a, i64 %b) { ; restore %g0, %g0, %o0 ; ; CHECK: ret_imm0 -; CHECK: or %g0, %g0, %i0 +; CHECK: or %g0, 0, %i0 define i64 @ret_imm0() { ret i64 0 } diff --git a/test/CodeGen/SPARC/64cond.ll b/test/CodeGen/SPARC/64cond.ll index 0c025b36e3b..594eff6f554 100644 --- a/test/CodeGen/SPARC/64cond.ll +++ b/test/CodeGen/SPARC/64cond.ll @@ -98,3 +98,14 @@ entry: %rv = select i1 %tobool, double %a, double %b ret double %rv } + +; The MOVXCC instruction can't use %g0 for its tied operand. +; CHECK: select_consti64_xcc +; CHECK: subcc +; CHECK: movg %xcc, 123, %i0 +define i64 @select_consti64_xcc(i64 %x, i64 %y) { +entry: + %tobool = icmp sgt i64 %x, %y + %rv = select i1 %tobool, i64 123, i64 0 + ret i64 %rv +}