Skip to content

Commit 0def4e6

Browse files
committed
Revert "[AArch64] Merge LDRSWpre-LD[U]RSW pair into LDPSWpre"
This reverts commit b0093e1 due to a miscompile under MSan. See https://reviews.llvm.org/D152407#4533478 for more details. Reviewed By: asmok-g Differential Revision: https://reviews.llvm.org/D156328
1 parent ffe2b6f commit 0def4e6

File tree

3 files changed

+10
-19
lines changed

3 files changed

+10
-19
lines changed

llvm/lib/Target/AArch64/AArch64InstrInfo.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2228,7 +2228,6 @@ bool AArch64InstrInfo::hasUnscaledLdStOffset(unsigned Opc) {
22282228
case AArch64::LDRWpre:
22292229
case AArch64::LDURXi:
22302230
case AArch64::LDRXpre:
2231-
case AArch64::LDRSWpre:
22322231
case AArch64::LDURSWi:
22332232
case AArch64::LDURHHi:
22342233
case AArch64::LDURBBi:
@@ -2438,7 +2437,6 @@ bool AArch64InstrInfo::isPairableLdStInst(const MachineInstr &MI) {
24382437
case AArch64::LDURXi:
24392438
case AArch64::LDRXpre:
24402439
case AArch64::LDURSWi:
2441-
case AArch64::LDRSWpre:
24422440
return true;
24432441
}
24442442
}
@@ -2559,8 +2557,7 @@ bool AArch64InstrInfo::isCandidateToMergeOrPair(const MachineInstr &MI) const {
25592557
// Can't merge/pair if the instruction modifies the base register.
25602558
// e.g., ldr x0, [x0]
25612559
// This case will never occur with an FI base.
2562-
// However, if the instruction is an LDR<S,D,Q,W,X,SW>pre or
2563-
// STR<S,D,Q,W,X>pre, it can be merged.
2560+
// However, if the instruction is an LDR/STR<S,D,Q,W,X>pre, it can be merged.
25642561
// For example:
25652562
// ldr q0, [x11, #32]!
25662563
// ldr q1, [x11, #16]
@@ -3137,7 +3134,6 @@ int AArch64InstrInfo::getMemScale(unsigned Opc) {
31373134
case AArch64::LDRSpre:
31383135
case AArch64::LDRSWui:
31393136
case AArch64::LDURSWi:
3140-
case AArch64::LDRSWpre:
31413137
case AArch64::LDRWpre:
31423138
case AArch64::LDRWui:
31433139
case AArch64::LDURWi:
@@ -3193,7 +3189,6 @@ bool AArch64InstrInfo::isPreLd(const MachineInstr &MI) {
31933189
return false;
31943190
case AArch64::LDRWpre:
31953191
case AArch64::LDRXpre:
3196-
case AArch64::LDRSWpre:
31973192
case AArch64::LDRSpre:
31983193
case AArch64::LDRDpre:
31993194
case AArch64::LDRQpre:

llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -293,8 +293,6 @@ static unsigned getMatchingNonSExtOpcode(unsigned Opc,
293293
return AArch64::LDRWui;
294294
case AArch64::LDURSWi:
295295
return AArch64::LDURWi;
296-
case AArch64::LDRSWpre:
297-
return AArch64::LDRWpre;
298296
}
299297
}
300298

@@ -374,8 +372,6 @@ static unsigned getMatchingPairOpcode(unsigned Opc) {
374372
case AArch64::LDRSWui:
375373
case AArch64::LDURSWi:
376374
return AArch64::LDPSWi;
377-
case AArch64::LDRSWpre:
378-
return AArch64::LDPSWpre;
379375
}
380376
}
381377

@@ -589,8 +585,6 @@ static bool isPreLdStPairCandidate(MachineInstr &FirstMI, MachineInstr &MI) {
589585
return (OpcB == AArch64::LDRWui) || (OpcB == AArch64::LDURWi);
590586
case AArch64::LDRXpre:
591587
return (OpcB == AArch64::LDRXui) || (OpcB == AArch64::LDURXi);
592-
case AArch64::LDRSWpre:
593-
return (OpcB == AArch64::LDRSWui) || (OpcB == AArch64::LDURSWi);
594588
}
595589
}
596590

@@ -1346,7 +1340,7 @@ static bool areCandidatesToMergeOrPair(MachineInstr &FirstMI, MachineInstr &MI,
13461340
return false;
13471341

13481342
// The STR<S,D,Q,W,X>pre - STR<S,D,Q,W,X>ui and
1349-
// LDR<S,D,Q,W,X,SW>pre-LDR<S,D,Q,W,X,SW>ui
1343+
// LDR<S,D,Q,W,X>pre-LDR<S,D,Q,W,X>ui
13501344
// are candidate pairs that can be merged.
13511345
if (isPreLdStPairCandidate(FirstMI, MI))
13521346
return true;

llvm/test/CodeGen/AArch64/ldrpre-ldr-merge.mir

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,7 @@ body: |
588588

589589

590590
---
591-
name: 21-ldrswpre-ldrswui-merge
591+
name: 21-ldrswpre-ldrswui-no-merge
592592
tracksRegLiveness: true
593593
liveins:
594594
- { reg: '$x0' }
@@ -599,9 +599,10 @@ machineFunctionInfo:
599599
body: |
600600
bb.0:
601601
liveins: $x0, $x1, $x2
602-
; CHECK-LABEL: name: 21-ldrswpre-ldrswui-merge
602+
; CHECK-LABEL: name: 21-ldrswpre-ldrswui-no-merge
603603
; CHECK: liveins: $x0, $x1, $x2
604-
; CHECK: early-clobber $x1, renamable $x0, renamable $x2 = LDPSWpre renamable $x1, 10 :: (load (s32))
604+
; CHECK: early-clobber renamable $x1, renamable $x0 = LDRSWpre renamable $x1, 40, implicit $w1 :: (load (s32))
605+
; CHECK: renamable $x2 = LDRSWui renamable $x1, 1 :: (load (s32))
605606
; CHECK: STPXi renamable $x0, renamable $x2, renamable $x1, 0 :: (store (s64))
606607
; CHECK: RET undef $lr
607608
early-clobber renamable $x1, renamable $x0 = LDRSWpre killed renamable $x1, 40 :: (load (s32))
@@ -613,7 +614,7 @@ body: |
613614

614615

615616
---
616-
name: 22-ldrswpre-ldurswi-merge
617+
name: 22-ldrswpre-ldurswi-no-merge
617618
tracksRegLiveness: true
618619
liveins:
619620
- { reg: '$x0' }
@@ -624,9 +625,10 @@ machineFunctionInfo:
624625
body: |
625626
bb.0:
626627
liveins: $x0, $x1, $x2
627-
; CHECK-LABEL: name: 22-ldrswpre-ldurswi-merge
628+
; CHECK-LABEL: name: 22-ldrswpre-ldurswi-no-merge
628629
; CHECK: liveins: $x0, $x1, $x2
629-
; CHECK: early-clobber $x1, renamable $x0, renamable $x2 = LDPSWpre renamable $x1, 10 :: (load (s32))
630+
; CHECK: early-clobber renamable $x1, renamable $x0 = LDRSWpre renamable $x1, 40, implicit $w1 :: (load (s32))
631+
; CHECK: renamable $x2 = LDURSWi renamable $x1, 4 :: (load (s32))
630632
; CHECK: STPXi renamable $x0, renamable $x2, renamable $x1, 0 :: (store (s64))
631633
; CHECK: RET undef $lr
632634
early-clobber renamable $x1, renamable $x0 = LDRSWpre killed renamable $x1, 40 :: (load (s32))

0 commit comments

Comments
 (0)