Skip to content

Commit 6c32ce8

Browse files
committed
Revert "[AArch64][GlobalISel] Fix incorrect handling of fp truncating stores."
This reverts commit ce65262.
1 parent ce65262 commit 6c32ce8

File tree

3 files changed

+15
-151
lines changed

3 files changed

+15
-151
lines changed

llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp

+11-31
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
#include "MCTargetDesc/AArch64AddressingModes.h"
2323
#include "MCTargetDesc/AArch64MCTargetDesc.h"
2424
#include "llvm/ADT/Optional.h"
25-
#include "llvm/CodeGen/GlobalISel/GenericMachineInstrs.h"
2625
#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
2726
#include "llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h"
2827
#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
@@ -2702,29 +2701,29 @@ bool AArch64InstructionSelector::select(MachineInstr &I) {
27022701
case TargetOpcode::G_ZEXTLOAD:
27032702
case TargetOpcode::G_LOAD:
27042703
case TargetOpcode::G_STORE: {
2705-
GLoadStore &LdSt = cast<GLoadStore>(I);
27062704
bool IsZExtLoad = I.getOpcode() == TargetOpcode::G_ZEXTLOAD;
2707-
LLT PtrTy = MRI.getType(LdSt.getPointerReg());
2705+
LLT PtrTy = MRI.getType(I.getOperand(1).getReg());
27082706

27092707
if (PtrTy != LLT::pointer(0, 64)) {
27102708
LLVM_DEBUG(dbgs() << "Load/Store pointer has type: " << PtrTy
27112709
<< ", expected: " << LLT::pointer(0, 64) << '\n');
27122710
return false;
27132711
}
27142712

2715-
uint64_t MemSizeInBytes = LdSt.getMemSize();
2716-
unsigned MemSizeInBits = LdSt.getMemSizeInBits();
2717-
AtomicOrdering Order = LdSt.getMMO().getSuccessOrdering();
2713+
auto &MemOp = **I.memoperands_begin();
2714+
uint64_t MemSizeInBytes = MemOp.getSize();
2715+
unsigned MemSizeInBits = MemSizeInBytes * 8;
2716+
AtomicOrdering Order = MemOp.getSuccessOrdering();
27182717

27192718
// Need special instructions for atomics that affect ordering.
27202719
if (Order != AtomicOrdering::NotAtomic &&
27212720
Order != AtomicOrdering::Unordered &&
27222721
Order != AtomicOrdering::Monotonic) {
2723-
assert(!isa<GZExtLoad>(LdSt));
2722+
assert(I.getOpcode() != TargetOpcode::G_ZEXTLOAD);
27242723
if (MemSizeInBytes > 64)
27252724
return false;
27262725

2727-
if (isa<GLoad>(LdSt)) {
2726+
if (I.getOpcode() == TargetOpcode::G_LOAD) {
27282727
static unsigned Opcodes[] = {AArch64::LDARB, AArch64::LDARH,
27292728
AArch64::LDARW, AArch64::LDARX};
27302729
I.setDesc(TII.get(Opcodes[Log2_32(MemSizeInBytes)]));
@@ -2738,7 +2737,7 @@ bool AArch64InstructionSelector::select(MachineInstr &I) {
27382737
}
27392738

27402739
#ifndef NDEBUG
2741-
const Register PtrReg = LdSt.getPointerReg();
2740+
const Register PtrReg = I.getOperand(1).getReg();
27422741
const RegisterBank &PtrRB = *RBI.getRegBank(PtrReg, MRI, TRI);
27432742
// Sanity-check the pointer register.
27442743
assert(PtrRB.getID() == AArch64::GPRRegBankID &&
@@ -2747,31 +2746,13 @@ bool AArch64InstructionSelector::select(MachineInstr &I) {
27472746
"Load/Store pointer operand isn't a pointer");
27482747
#endif
27492748

2750-
const Register ValReg = LdSt.getReg(0);
2751-
const LLT ValTy = MRI.getType(ValReg);
2749+
const Register ValReg = I.getOperand(0).getReg();
27522750
const RegisterBank &RB = *RBI.getRegBank(ValReg, MRI, TRI);
27532751

2754-
// The code below doesn't support truncating stores, so we need to split it
2755-
// again.
2756-
if (isa<GStore>(LdSt) && ValTy.getSizeInBits() > MemSizeInBits) {
2757-
unsigned SubReg;
2758-
LLT MemTy = LdSt.getMMO().getMemoryType();
2759-
auto *RC = getRegClassForTypeOnBank(MemTy, RB, RBI);
2760-
if (!getSubRegForClass(RC, TRI, SubReg))
2761-
return false;
2762-
2763-
// Generate a subreg copy.
2764-
auto Copy = MIB.buildInstr(TargetOpcode::COPY, {MemTy}, {})
2765-
.addReg(ValReg, 0, SubReg)
2766-
.getReg(0);
2767-
RBI.constrainGenericRegister(Copy, *RC, MRI);
2768-
LdSt.getOperand(0).setReg(Copy);
2769-
}
2770-
27712752
// Helper lambda for partially selecting I. Either returns the original
27722753
// instruction with an updated opcode, or a new instruction.
27732754
auto SelectLoadStoreAddressingMode = [&]() -> MachineInstr * {
2774-
bool IsStore = isa<GStore>(I);
2755+
bool IsStore = I.getOpcode() == TargetOpcode::G_STORE;
27752756
const unsigned NewOpc =
27762757
selectLoadStoreUIOp(I.getOpcode(), RB.getID(), MemSizeInBits);
27772758
if (NewOpc == I.getOpcode())
@@ -2788,8 +2769,7 @@ bool AArch64InstructionSelector::select(MachineInstr &I) {
27882769

27892770
// Folded something. Create a new instruction and return it.
27902771
auto NewInst = MIB.buildInstr(NewOpc, {}, {}, I.getFlags());
2791-
Register CurValReg = I.getOperand(0).getReg();
2792-
IsStore ? NewInst.addUse(CurValReg) : NewInst.addDef(CurValReg);
2772+
IsStore ? NewInst.addUse(ValReg) : NewInst.addDef(ValReg);
27932773
NewInst.cloneMemRefs(I);
27942774
for (auto &Fn : *AddrModeFns)
27952775
Fn(NewInst);

llvm/test/CodeGen/AArch64/GlobalISel/select-store-truncating-float.mir

-116
This file was deleted.

llvm/test/CodeGen/AArch64/GlobalISel/select-with-no-legality-check.mir

+4-4
Original file line numberDiff line numberDiff line change
@@ -278,13 +278,13 @@ body: |
278278
; CHECK-LABEL: name: test_rule96_id2146_at_idx8070
279279
; CHECK: liveins: $x0
280280
; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
281-
; CHECK: [[LDRBui:%[0-9]+]]:fpr8 = LDRBui [[COPY]], 0 :: (load (s8))
281+
; CHECK: [[LDRBui:%[0-9]+]]:fpr8 = LDRBui [[COPY]], 0 :: (load (s1))
282282
; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY [[LDRBui]]
283-
; CHECK: [[UBFMWri:%[0-9]+]]:gpr32 = UBFMWri [[COPY1]], 0, 7
283+
; CHECK: [[UBFMWri:%[0-9]+]]:gpr32 = UBFMWri [[COPY1]], 0, 0
284284
; CHECK: $noreg = PATCHABLE_RET [[UBFMWri]]
285285
%2:gpr(p0) = COPY $x0
286-
%0:fpr(s8) = G_LOAD %2(p0) :: (load (s8))
287-
%1:gpr(s32) = G_ZEXT %0(s8)
286+
%0:fpr(s1) = G_LOAD %2(p0) :: (load (s1))
287+
%1:gpr(s32) = G_ZEXT %0(s1)
288288
$noreg = PATCHABLE_RET %1(s32)
289289
290290
...

0 commit comments

Comments
 (0)