Sparc: When storing 0, use %g0 directly in the store instruction instead of
authorVenkatraman Govindaraju <venkatra@cs.wisc.edu>
Mon, 3 Jun 2013 00:21:54 +0000 (00:21 +0000)
committerVenkatraman Govindaraju <venkatra@cs.wisc.edu>
Mon, 3 Jun 2013 00:21:54 +0000 (00:21 +0000)
       using two instructions (sethi and store).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183090 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Sparc/SparcInstr64Bit.td
lib/Target/Sparc/SparcInstrInfo.td
test/CodeGen/SPARC/64bit.ll
test/CodeGen/SPARC/basictest.ll

index daafb432372420d015df0b4c8aaaa5b6a8060a48..ed7f05f3c4b9f1753b8d2fd0fb3230233867e9ce 100644 (file)
@@ -286,6 +286,10 @@ def : Pat<(truncstorei16 i64:$src, ADDRri:$addr), (STHri ADDRri:$addr, $src)>;
 def : Pat<(truncstorei32 i64:$src, ADDRrr:$addr), (STrr  ADDRrr:$addr, $src)>;
 def : Pat<(truncstorei32 i64:$src, ADDRri:$addr), (STri  ADDRri:$addr, $src)>;
 
+// store 0, addr -> store %g0, addr
+def : Pat<(store (i64 0), ADDRrr:$dst), (STXrr ADDRrr:$dst, (i64 G0))>;
+def : Pat<(store (i64 0), ADDRri:$dst), (STXri ADDRri:$dst, (i64 G0))>;
+
 } // Predicates = [Is64Bit]
 
 
index 8f2ba2655cac14b54e43e122917a249045ff04b9..45ff113b72c206cef88db596351df4a723474e1e 100644 (file)
@@ -815,4 +815,8 @@ def : Pat<(i32 (extloadi16 ADDRri:$src)), (LDUHri ADDRri:$src)>;
 def : Pat<(i32 (zextloadi1 ADDRrr:$src)), (LDUBrr ADDRrr:$src)>;
 def : Pat<(i32 (zextloadi1 ADDRri:$src)), (LDUBri ADDRri:$src)>;
 
+// store 0, addr -> store %g0, addr
+def : Pat<(store (i32 0), ADDRrr:$dst), (STrr ADDRrr:$dst, (i32 G0))>;
+def : Pat<(store (i32 0), ADDRri:$dst), (STri ADDRri:$dst, (i32 G0))>;
+
 include "SparcInstr64Bit.td"
index f881ddfbc06d45c3d1991ea08b6c5578b75acf65..4eb25536650eedfd6db434cd30cfdb4f10a32d08 100644 (file)
@@ -262,3 +262,18 @@ define double @bitcast_f64_i64(i64 %x) {
   %y = bitcast i64 %x to double
   ret double %y
 }
+
+; CHECK: store_zero:
+; CHECK: stx %g0, [%i0]
+; CHECK: stx %g0, [%i1+8]
+
+; OPT:  store_zero:
+; OPT:  stx %g0, [%o0]
+; OPT:  stx %g0, [%o1+8]
+define i64 @store_zero(i64* nocapture %a, i64* nocapture %b) {
+entry:
+  store i64 0, i64* %a, align 8
+  %0 = getelementptr inbounds i64* %b, i32 1
+  store i64 0, i64* %0, align 8
+  ret i64 0
+}
index e67b39ccaadc224ca4b2bf472b32dba0464d2ece..ce60653a72ec1f82270e2c848b3425d389b5d8ca 100644 (file)
@@ -24,3 +24,15 @@ define i32 @test2(i32 %X, i32 %Y) {
 ; CHECK: test2:
 ; CHECK: xnor %o0, %o1, %o0
 }
+
+; CHECK: store_zero:
+; CHECK: st   %g0, [%o0]
+; CHECK: st   %g0, [%o1+4]
+define i32 @store_zero(i32* %a, i32* %b) {
+entry:
+  store i32 0, i32* %a, align 4
+  %0 = getelementptr inbounds i32* %b, i32 1
+  store i32 0, i32* %0, align 4
+  ret i32 0
+}
+