diff options
author | Quentin Colombet <qcolombet@apple.com> | 2014-08-11 21:39:53 +0000 |
---|---|---|
committer | Quentin Colombet <qcolombet@apple.com> | 2014-08-11 21:39:53 +0000 |
commit | c64c1751738ecd3c3fb388aaaaced56b010a6607 (patch) | |
tree | b8efdfdd7d1ffbeeacf94046ce1b794c7c88d58e | |
parent | bff29b78b519baf4f9d0747eddf73e383c7dc4ad (diff) | |
download | bcm5719-llvm-c64c1751738ecd3c3fb388aaaaced56b010a6607.tar.gz bcm5719-llvm-c64c1751738ecd3c3fb388aaaaced56b010a6607.zip |
[AArch64] Fix registerAllocator assigns same register for base and wback in
pre/post-index load and store.
Patch by Steven Wu <stevenwu@apple.com>
llvm-svn: 215390
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64InstrFormats.td | 13 | ||||
-rw-r--r-- | llvm/test/CodeGen/AArch64/arm64-indexed-memory.ll | 12 |
2 files changed, 18 insertions, 7 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64InstrFormats.td b/llvm/lib/Target/AArch64/AArch64InstrFormats.td index 3f764239290..6a1bab52ab8 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrFormats.td +++ b/llvm/lib/Target/AArch64/AArch64InstrFormats.td @@ -2998,7 +2998,7 @@ class LoadPreIdx<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, : BaseLoadStorePreIdx<sz, V, opc, (outs GPR64sp:$wback, regtype:$Rt), (ins GPR64sp:$Rn, simm9:$offset), asm, - "$Rn = $wback", []>, + "$Rn = $wback,@earlyclobber $wback", []>, Sched<[WriteLD, WriteAdr]>; let mayStore = 1, mayLoad = 0 in @@ -3007,7 +3007,7 @@ class StorePreIdx<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, : BaseLoadStorePreIdx<sz, V, opc, (outs GPR64sp:$wback), (ins regtype:$Rt, GPR64sp:$Rn, simm9:$offset), - asm, "$Rn = $wback", + asm, "$Rn = $wback,@earlyclobber $wback", [(set GPR64sp:$wback, (storeop (Ty regtype:$Rt), GPR64sp:$Rn, simm9:$offset))]>, Sched<[WriteAdr, WriteST]>; @@ -3017,7 +3017,6 @@ class StorePreIdx<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, // Load/store post-indexed //--- -// (pre-index) load/stores. class BaseLoadStorePostIdx<bits<2> sz, bit V, bits<2> opc, dag oops, dag iops, string asm, string cstr, list<dag> pat> : I<oops, iops, asm, "\t$Rt, [$Rn], $offset", cstr, pat> { @@ -3045,7 +3044,7 @@ class LoadPostIdx<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, : BaseLoadStorePostIdx<sz, V, opc, (outs GPR64sp:$wback, regtype:$Rt), (ins GPR64sp:$Rn, simm9:$offset), - asm, "$Rn = $wback", []>, + asm, "$Rn = $wback,@earlyclobber $wback", []>, Sched<[WriteLD, WriteI]>; let mayStore = 1, mayLoad = 0 in @@ -3054,7 +3053,7 @@ class StorePostIdx<bits<2> sz, bit V, bits<2> opc, RegisterClass regtype, : BaseLoadStorePostIdx<sz, V, opc, (outs GPR64sp:$wback), (ins regtype:$Rt, GPR64sp:$Rn, simm9:$offset), - asm, "$Rn = $wback", + asm, "$Rn = $wback,@earlyclobber $wback", [(set GPR64sp:$wback, (storeop (Ty regtype:$Rt), GPR64sp:$Rn, simm9:$offset))]>, Sched<[WriteAdr, WriteST, ReadAdrBase]>; @@ -3118,7 +3117,7 @@ multiclass StorePairOffset<bits<2> opc, bit V, RegisterClass regtype, // (pre-indexed) class BaseLoadStorePairPreIdx<bits<2> opc, bit V, bit L, dag oops, dag iops, string asm> - : I<oops, iops, asm, "\t$Rt, $Rt2, [$Rn, $offset]!", "$Rn = $wback", []> { + : I<oops, iops, asm, "\t$Rt, $Rt2, [$Rn, $offset]!", "$Rn = $wback,@earlyclobber $wback", []> { bits<5> Rt; bits<5> Rt2; bits<5> Rn; @@ -3159,7 +3158,7 @@ class StorePairPreIdx<bits<2> opc, bit V, RegisterClass regtype, class BaseLoadStorePairPostIdx<bits<2> opc, bit V, bit L, dag oops, dag iops, string asm> - : I<oops, iops, asm, "\t$Rt, $Rt2, [$Rn], $offset", "$Rn = $wback", []> { + : I<oops, iops, asm, "\t$Rt, $Rt2, [$Rn], $offset", "$Rn = $wback,@earlyclobber $wback", []> { bits<5> Rt; bits<5> Rt2; bits<5> Rn; diff --git a/llvm/test/CodeGen/AArch64/arm64-indexed-memory.ll b/llvm/test/CodeGen/AArch64/arm64-indexed-memory.ll index e501c6e403b..a8620f428da 100644 --- a/llvm/test/CodeGen/AArch64/arm64-indexed-memory.ll +++ b/llvm/test/CodeGen/AArch64/arm64-indexed-memory.ll @@ -349,3 +349,15 @@ define i8* @preidx8sext64(i8* %src, i64* %out) { store i64 %ext, i64* %out, align 4 ret i8* %ptr } + +; This test checks if illegal post-index is generated + +define i64* @postidx_clobber(i64* %addr) nounwind noinline ssp { +; CHECK-LABEL: postidx_clobber: +; CHECK-NOT: str x0, [x0], #8 +; ret + %paddr = bitcast i64* %addr to i64** + store i64* %addr, i64** %paddr + %newaddr = getelementptr i64* %addr, i32 1 + ret i64* %newaddr +} |