3030#include " llvm/CodeGen/StackMaps.h"
3131#include " llvm/CodeGen/TargetRegisterInfo.h"
3232#include " llvm/CodeGen/TargetSubtargetInfo.h"
33- #include " llvm/IR/DebugInfoMetadata.h"
3433#include " llvm/IR/DebugLoc.h"
3534#include " llvm/IR/GlobalValue.h"
3635#include " llvm/MC/MCAsmInfo.h"
@@ -6448,16 +6447,10 @@ AArch64InstrInfo::isCopyInstrImpl(const MachineInstr &MI) const {
64486447 return None;
64496448}
64506449
6451- Optional<RegImmPair> AArch64InstrInfo::isAddImmediate (const MachineInstr &MI,
6452- Register Reg) const {
6450+ Optional<DestSourcePair>
6451+ AArch64InstrInfo::isAddImmediate (const MachineInstr &MI,
6452+ int64_t &Offset) const {
64536453 int Sign = 1 ;
6454- int64_t Offset = 0 ;
6455-
6456- // TODO: Handle cases where Reg is a super- or sub-register of the
6457- // destination register.
6458- if (Reg != MI.getOperand (0 ).getReg ())
6459- return None;
6460-
64616454 switch (MI.getOpcode ()) {
64626455 default :
64636456 return None;
@@ -6481,73 +6474,22 @@ Optional<RegImmPair> AArch64InstrInfo::isAddImmediate(const MachineInstr &MI,
64816474 Offset = Offset << Shift;
64826475 }
64836476 }
6484- return RegImmPair{MI.getOperand (1 ).getReg (), Offset};
6485- }
6486-
6487- // / If the given ORR instruction is a copy, and \p DescribedReg overlaps with
6488- // / the destination register then, if possible, describe the value in terms of
6489- // / the source register.
6490- static Optional<ParamLoadedValue>
6491- describeORRLoadedValue (const MachineInstr &MI, Register DescribedReg,
6492- const TargetInstrInfo *TII,
6493- const TargetRegisterInfo *TRI) {
6494- auto DestSrc = TII->isCopyInstr (MI);
6495- if (!DestSrc)
6496- return None;
6497-
6498- Register DestReg = DestSrc->Destination ->getReg ();
6499- Register SrcReg = DestSrc->Source ->getReg ();
6500-
6501- auto Expr = DIExpression::get (MI.getMF ()->getFunction ().getContext (), {});
6502-
6503- // If the described register is the destination, just return the source.
6504- if (DestReg == DescribedReg)
6505- return ParamLoadedValue (MachineOperand::CreateReg (SrcReg, false ), Expr);
6506-
6507- // ORRWrs zero-extends to 64-bits, so we need to consider such cases.
6508- if (MI.getOpcode () == AArch64::ORRWrs &&
6509- TRI->isSuperRegister (DestReg, DescribedReg))
6510- return ParamLoadedValue (MachineOperand::CreateReg (SrcReg, false ), Expr);
6511-
6512- // We may need to describe the lower part of a ORRXrs move.
6513- if (MI.getOpcode () == AArch64::ORRXrs &&
6514- TRI->isSubRegister (DestReg, DescribedReg)) {
6515- Register SrcSubReg = TRI->getSubReg (SrcReg, AArch64::sub_32);
6516- return ParamLoadedValue (MachineOperand::CreateReg (SrcSubReg, false ), Expr);
6517- }
6518-
6519- assert (!TRI->isSuperOrSubRegisterEq (DestReg, DescribedReg) &&
6520- " Unhandled ORR[XW]rs copy case" );
6521-
6522- return None;
6477+ return DestSourcePair{MI.getOperand (0 ), MI.getOperand (1 )};
65236478}
65246479
65256480Optional<ParamLoadedValue>
6526- AArch64InstrInfo::describeLoadedValue (const MachineInstr &MI,
6527- Register Reg) const {
6528- const MachineFunction *MF = MI.getMF ();
6529- const TargetRegisterInfo *TRI = MF->getSubtarget ().getRegisterInfo ();
6481+ AArch64InstrInfo::describeLoadedValue (const MachineInstr &MI) const {
65306482 switch (MI.getOpcode ()) {
65316483 case AArch64::MOVZWi:
6532- case AArch64::MOVZXi: {
6533- // MOVZWi may be used for producing zero-extended 32-bit immediates in
6534- // 64-bit parameters, so we need to consider super-registers.
6535- if (!TRI->isSuperRegisterEq (MI.getOperand (0 ).getReg (), Reg))
6536- return None;
6537-
6484+ case AArch64::MOVZXi:
65386485 if (!MI.getOperand (1 ).isImm ())
65396486 return None;
65406487 int64_t Immediate = MI.getOperand (1 ).getImm ();
65416488 int Shift = MI.getOperand (2 ).getImm ();
65426489 return ParamLoadedValue (MachineOperand::CreateImm (Immediate << Shift),
65436490 nullptr );
65446491 }
6545- case AArch64::ORRWrs:
6546- case AArch64::ORRXrs:
6547- return describeORRLoadedValue (MI, Reg, this , TRI);
6548- }
6549-
6550- return TargetInstrInfo::describeLoadedValue (MI, Reg);
6492+ return TargetInstrInfo::describeLoadedValue (MI);
65516493}
65526494
65536495#define GET_INSTRINFO_HELPERS
0 commit comments