Skip to content

Commit 446a426

Browse files
[ARM] Record store with pre/post-indexed addressing as mayStore
A miscompilation issue observed during machine sinking has been addressed with improved handling. Fixes: #121299.
1 parent 7810e6a commit 446a426

File tree

3 files changed

+8
-8
lines changed

3 files changed

+8
-8
lines changed

llvm/lib/Target/ARM/ARMInstrInfo.td

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3320,7 +3320,7 @@ def STRH_preidx: ARMPseudoInst<(outs GPR:$Rn_wb),
33203320
}
33213321

33223322

3323-
3323+
let mayStore = 1, hasSideEffects = 0 in {
33243324
def STRH_PRE : AI3ldstidx<0b1011, 0, 1, (outs GPR:$Rn_wb),
33253325
(ins GPR:$Rt, addrmode3_pre:$addr), IndexModePre,
33263326
StMiscFrm, IIC_iStore_bh_ru,
@@ -3352,6 +3352,7 @@ def STRH_POST : AI3ldstidx<0b1011, 0, 0, (outs GPR:$Rn_wb),
33523352
let Inst{3-0} = offset{3-0}; // imm3_0/Rm
33533353
let DecoderMethod = "DecodeAddrMode3Instruction";
33543354
}
3355+
} // mayStore = 1, hasSideEffects = 0
33553356

33563357
let mayStore = 1, hasSideEffects = 0, hasExtraSrcRegAllocReq = 1 in {
33573358
def STRD_PRE : AI3ldstidx<0b1111, 0, 1, (outs GPR:$Rn_wb),

llvm/test/CodeGen/ARM/sink-store-pre-load-dependency.mir

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,16 @@ stack:
77
- { id: 0, type: default, size: 8, alignment: 8 }
88
body: |
99
bb.0:
10-
; FIXME: This is a miscompilation.
1110
; CHECK-LABEL: name: sink-store-load-dep
1211
; CHECK: bb.0:
1312
; CHECK: [[LDRi12_:%[0-9]+]]:gpr = LDRi12 %stack.0, 0, 14 /* CC::al */, $noreg :: (load (s32))
1413
; CHECK-NEXT: [[MOVi:%[0-9]+]]:gpr = MOVi 55296, 14 /* CC::al */, $noreg, $noreg
14+
; CHECK-NEXT: [[ADDri1:%[0-9]+]]:gpr = ADDri [[LDRi12_:%[0-9]+]], 0, 14 /* CC::al */, $noreg, $noreg
15+
; CHECK-NEXT: [[LDRH:%[0-9]+]]:gpr = LDRH killed [[ADDri1:%[0-9]+]], $noreg, 0, 14 /* CC::al */, $noreg :: (load (s16))
1516
; CHECK-NEXT: [[MOVi1:%[0-9]+]]:gpr = MOVi 0, 14 /* CC::al */, $noreg, $noreg
1617
; CHECK-NEXT: early-clobber %5:gpr = STRH_PRE [[MOVi:%[0-9]+]], [[LDRi12_:%[0-9]+]], [[MOVi1:%[0-9]+]], 0, 14 /* CC::al */, $noreg
17-
; CHECK-NEXT: [[SUBri:%.*]]:gpr = SUBri [[LDRi12_:%[0-9]+]], 0, 14 /* CC::al */, $noreg, $noreg
18+
; CHECK-NEXT: [[SUBri:%.*]]:gpr = SUBri killed [[LDRi12_:%[0-9]+]], 0, 14 /* CC::al */, $noreg, $noreg
1819
; CHECK: bb.2:
19-
; CHECK-NEXT: [[ADDri1:%[0-9]+]]:gpr = ADDri [[LDRi12_:%[0-9]+]], 0, 14 /* CC::al */, $noreg, $noreg
20-
; CHECK-NEXT: [[LDRH:%[0-9]+]]:gpr = LDRH [[ADDri1:%[0-9]+]], $noreg, 0, 14 /* CC::al */, $noreg :: (load (s16))
2120
; CHECK-NEXT: [[MOVi2:%[0-9]+]]:gpr = MOVi [[LDRH:%[0-9]+]], 14 /* CC::al */, $noreg, $noreg
2221
%0:gpr = LDRi12 %stack.0, 0, 14, $noreg :: (load (s32))
2322
%1:gpr = MOVi 55296, 14, $noreg, $noreg

llvm/test/tools/llvm-mca/ARM/cortex-a57-memory-instructions.s

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -325,11 +325,11 @@
325325
# CHECK-NEXT: 2 1 1.00 * strd r4, r5, [r12], -r10
326326
# CHECK-NEXT: 1 1 1.00 * strh r3, [r4]
327327
# CHECK-NEXT: 1 1 1.00 * strh r2, [r7, #4]
328-
# CHECK-NEXT: 2 1 1.00 U strh r1, [r8, #64]!
328+
# CHECK-NEXT: 2 1 1.00 * strh r1, [r8, #64]!
329329
# CHECK-NEXT: 2 1 1.00 * strh r12, [sp], #4
330330
# CHECK-NEXT: 1 1 1.00 * strh r6, [r5, r4]
331-
# CHECK-NEXT: 2 1 1.00 U strh r3, [r8, r11]!
332-
# CHECK-NEXT: 2 1 1.00 U strh r1, [r2, -r1]!
331+
# CHECK-NEXT: 2 1 1.00 * strh r3, [r8, r11]!
332+
# CHECK-NEXT: 2 1 1.00 * strh r1, [r2, -r1]!
333333
# CHECK-NEXT: 2 1 1.00 * strh r9, [r7], r2
334334
# CHECK-NEXT: 2 1 1.00 * strh r4, [r3], -r2
335335
# CHECK-NEXT: 2 1 1.00 U strht r2, [r5], #76

0 commit comments

Comments
 (0)