forked from OSchip/llvm-project
[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
This commit is contained in:
parent
bff29b78b5
commit
c64c175173
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue