51 unsigned InVirtReg, InPhysReg = 0;
53 for (
const Argument &Arg :
MF.getFunction().args()) {
54 Type *ATy = Arg.getType();
56 if (ATy->isIntegerTy())
57 Width = ATy->getIntegerBitWidth();
58 else if (ATy->isPointerTy())
62 if (Width == 0 || Width > 64)
64 if (Arg.hasAttribute(Attribute::ByVal))
66 InPhysReg = getNextPhysReg(InPhysReg, Width);
69 InVirtReg = getVirtRegFor(InPhysReg);
72 if (Arg.hasAttribute(Attribute::SExt))
73 VRX.insert(std::make_pair(InVirtReg, ExtType(ExtType::SExt, Width)));
74 else if (Arg.hasAttribute(Attribute::ZExt))
75 VRX.insert(std::make_pair(InVirtReg, ExtType(ExtType::ZExt, Width)));
81 return MachineEvaluator::mask(Reg, 0);
86 if (Hexagon::DoubleRegsRegClass.hasSubClassEq(&RC) ||
87 Hexagon::HvxWRRegClass.hasSubClassEq(&RC) ||
88 Hexagon::HvxVQRRegClass.hasSubClassEq(&RC))
92 <<
TRI.getRegClassName(&RC) <<
'\n';
100 if (HST.useHVXOps()) {
102 {&HvxVRRegClass, &HvxWRRegClass, &HvxQRRegClass, &HvxVQRRegClass})
103 if (RC->contains(Reg))
104 return TRI.getRegSizeInBits(*RC);
108 return TRI.getRegSizeInBits(*RC);
111 (
Twine(
"Unhandled physical register") +
TRI.getName(Reg)).str().c_str());
123 assert(IsSubLo != IsSubHi &&
"Must refer to either low or high subreg");
126 if (Hexagon::DoubleRegsRegClass.hasSubClassEq(&RC))
127 return Hexagon::IntRegsRegClass;
128 if (Hexagon::HvxWRRegClass.hasSubClassEq(&RC))
129 return Hexagon::HvxVRRegClass;
130 if (Hexagon::HvxVQRRegClass.hasSubClassEq(&RC))
131 return Hexagon::HvxWRRegClass;
133 dbgs() <<
"Reg class id: " << RC.
getID() <<
" idx: " << Idx <<
'\n';
141 std::vector<BT::RegisterRef>
Vector;
145 for (
unsigned i = 0, n =
Vector.size(); i < n; ++i) {
146 const MachineOperand &MO = MI.getOperand(i);
148 Vector[i] = BT::RegisterRef(MO);
156 const BT::RegisterRef &operator[](
unsigned n)
const {
170 unsigned NumDefs = 0;
174 if (!MO.isReg() || !MO.isDef())
177 assert(MO.getSubReg() == 0);
183 unsigned Opc =
MI.getOpcode();
193 return evaluateLoad(
MI, Inputs, Outputs);
212 if (evaluateFormalCopy(
MI, Inputs, Outputs))
223 if (MO.isGlobal() || MO.isBlockAddress() || MO.isSymbol() || MO.isJTI() ||
228 RegisterRefs
Reg(
MI);
229#define op(i) MI.getOperand(i)
230#define rc(i) RegisterCell::ref(getCell(Reg[i], Inputs))
231#define im(i) MI.getOperand(i).getImm()
244 auto cop = [
this, &Reg, &
MI, &Inputs](
unsigned N,
248 return eIMM(
Op.getImm(), W);
258 return eXTR(RC, 0, RW);
263 uint16_t W = RC.
width();
265 return eXTR(RC, W-RW, W);
271 return eXTR(RC,
N*16,
N*16+16);
276 uint16_t
I = Odd, Ws = Rs.
width();
294 unsigned Reg0 = Reg[0].Reg;
303 return rr0(
eIMM(
im(1), W0), Outputs);
309 int FI =
op(1).getIndex();
310 int Off =
op(2).getImm();
311 unsigned A =
MFI.getObjectAlign(FI).value() + std::abs(Off);
314 RC.
fill(0, L, BT::BitValue::Zero);
315 return rr0(RC, Outputs);
323 return rr0(
rc(1), Outputs);
330 RC.
fill(PW, RW, BT::BitValue::Zero);
331 return rr0(RC, Outputs);
337 RC.
fill(PW, RW, BT::BitValue::Zero);
338 return rr0(
eINS(RC,
eXTR(
rc(1), 0, PW), 0), Outputs);
350 assert(W0 == 64 && W1 == 32);
353 return rr0(RC, Outputs);
357 return rr0(
eADD(
rc(1),
rc(2)), Outputs);
360 case S4_addi_asl_ri: {
362 return rr0(RC, Outputs);
364 case S4_addi_lsr_ri: {
366 return rr0(RC, Outputs);
370 return rr0(RC, Outputs);
372 case M4_mpyri_addi: {
375 return rr0(RC, Outputs);
377 case M4_mpyrr_addi: {
380 return rr0(RC, Outputs);
382 case M4_mpyri_addr_u2: {
385 return rr0(RC, Outputs);
387 case M4_mpyri_addr: {
390 return rr0(RC, Outputs);
392 case M4_mpyrr_addr: {
395 return rr0(RC, Outputs);
399 return rr0(RC, Outputs);
403 return rr0(RC, Outputs);
407 return rr0(RC, Outputs);
411 return rr0(RC, Outputs);
413 case S2_addasl_rrri: {
415 return rr0(RC, Outputs);
419 RPC.
fill(0, 2, BT::BitValue::Zero);
420 return rr0(
eADD(RPC,
eIMM(
im(2), W0)), Outputs);
424 return rr0(
eSUB(
rc(1),
rc(2)), Outputs);
427 case S4_subi_asl_ri: {
429 return rr0(RC, Outputs);
431 case S4_subi_lsr_ri: {
433 return rr0(RC, Outputs);
437 return rr0(RC, Outputs);
441 return rr0(RC, Outputs);
445 return rr0(
eSUB(
eIMM(0, W0),
rc(1)), Outputs);
449 return rr0(hi(M, W0), Outputs);
452 return rr0(
eMLS(
rc(1),
rc(2)), Outputs);
453 case M2_dpmpyss_acc_s0:
455 case M2_dpmpyss_nac_s0:
459 return rr0(lo(M, W0), Outputs);
464 return rr0(RC, Outputs);
469 return rr0(RC, Outputs);
474 return rr0(RC, Outputs);
479 return rr0(RC, Outputs);
483 return rr0(lo(M, 32), Outputs);
487 return rr0(lo(M, 32), Outputs);
491 return rr0(lo(M, 32), Outputs);
495 return rr0(hi(M, W0), Outputs);
498 return rr0(
eMLU(
rc(1),
rc(2)), Outputs);
499 case M2_dpmpyuu_acc_s0:
501 case M2_dpmpyuu_nac_s0:
511 return rr0(
eAND(
rc(1),
rc(2)), Outputs);
515 case S4_andi_asl_ri: {
517 return rr0(RC, Outputs);
519 case S4_andi_lsr_ri: {
521 return rr0(RC, Outputs);
535 return rr0(
eORL(
rc(1),
rc(2)), Outputs);
539 case S4_ori_asl_ri: {
541 return rr0(RC, Outputs);
543 case S4_ori_lsr_ri: {
545 return rr0(RC, Outputs);
554 return rr0(RC, Outputs);
558 return rr0(RC, Outputs);
566 return rr0(
eXOR(
rc(1),
rc(2)), Outputs);
577 return rr0(
eNOT(
rc(1)), Outputs);
581 return rr0(
eASL(
rc(1),
im(2)), Outputs);
583 return rr0(
eASL(
rc(1), 16), Outputs);
596 case S2_asl_i_r_xacc:
597 case S2_asl_i_p_xacc:
606 return rr0(
eASR(
rc(1),
im(2)), Outputs);
608 return rr0(
eASR(
rc(1), 16), Outputs);
621 case S2_asr_i_r_rnd: {
627 return rr0(
eXTR(RC, 0, W0), Outputs);
629 case S2_asr_i_r_rnd_goodsyntax: {
632 return rr0(
rc(1), Outputs);
636 return rr0(
eXTR(RC, 0, W0), Outputs);
640 case S2_asr_i_svw_trun:
646 return rr0(
eLSR(
rc(1),
im(2)), Outputs);
659 case S2_lsr_i_r_xacc:
660 case S2_lsr_i_p_xacc:
665 RC[
im(2)] = BT::BitValue::Zero;
666 return rr0(RC, Outputs);
670 RC[
im(2)] = BT::BitValue::One;
671 return rr0(RC, Outputs);
673 case S2_togglebit_i: {
676 RC[BX] = RC[BX].is(0) ? BT::BitValue::One
677 : RC[BX].is(1) ? BT::BitValue::Zero
678 : BT::BitValue::self();
679 return rr0(RC, Outputs);
688 .
fill(W1+(W1-BX), W0, Zero);
691 return rr0(RC, Outputs);
697 uint16_t Wd =
im(2), Of =
im(3);
700 return rr0(
eIMM(0, W0), Outputs);
707 if (
Opc == S2_extractu ||
Opc == S2_extractup)
708 return rr0(
eZXT(RC, Wd), Outputs);
709 return rr0(
eSXT(RC, Wd), Outputs);
713 uint16_t Wd =
im(3), Of =
im(4);
714 assert(Wd < W0 && Of < W0);
719 return rr0(
rc(1), Outputs);
720 return rr0(
eINS(
rc(1),
eXTR(
rc(2), 0, Wd), Of), Outputs);
732 return rr0(cop(2, W0/2).cat(cop(1, W0/2)), Outputs);
736 case A2_combine_hh: {
740 unsigned LoH = !(
Opc == A2_combine_ll ||
Opc == A2_combine_hl);
742 unsigned HiH = !(
Opc == A2_combine_ll ||
Opc == A2_combine_lh);
746 return rr0(RC, Outputs);
755 return rr0(RC, Outputs);
759 return rr0(RC, Outputs);
763 return rr0(RC, Outputs);
767 return rr0(RC, Outputs);
771 return rr0(RC, Outputs);
776 assert(WR == 64 && WP == 8);
779 for (uint16_t i = 0; i < WP; ++i) {
781 BT::BitValue F = (V.is(0) || V.is(1)) ? V : BT::BitValue::self();
782 RC.
fill(i*8, i*8+8,
F);
784 return rr0(RC, Outputs);
796 if (PC0.
is(0) || PC0.
is(1))
798 R2.meet(R3, Reg[0].Reg);
799 return rr0(
R2, Outputs);
808 return rr0(
eSXT(
rc(1), 8), Outputs);
810 return rr0(
eSXT(
rc(1), 16), Outputs);
813 assert(W0 == 64 && W1 == 32);
815 return rr0(RC, Outputs);
818 return rr0(
eZXT(
rc(1), 8), Outputs);
820 return rr0(
eZXT(
rc(1), 16), Outputs);
838 return rr0(
eCLB(
rc(1),
false, 32), Outputs);
841 return rr0(
eCLB(
rc(1),
true, 32), Outputs);
847 if (TV.
is(0) || TV.
is(1))
848 return rr0(
eCLB(R1, TV, 32), Outputs);
853 return rr0(
eCTB(
rc(1),
false, 32), Outputs);
856 return rr0(
eCTB(
rc(1),
true, 32), Outputs);
863 bool Has0 =
false, All1 =
true;
864 for (uint16_t i = 0; i < 8; ++i) {
875 RC.
fill(0, W0, (All1 ? BT::BitValue::One : BT::BitValue::Zero));
876 return rr0(RC, Outputs);
880 bool Has1 =
false, All0 =
true;
881 for (uint16_t i = 0; i < 8; ++i) {
892 RC.
fill(0, W0, (Has1 ? BT::BitValue::One : BT::BitValue::Zero));
893 return rr0(RC, Outputs);
896 return rr0(
eAND(
rc(1),
rc(2)), Outputs);
900 return rr0(
eNOT(
rc(1)), Outputs);
902 return rr0(
eORL(
rc(1),
rc(2)), Outputs);
906 return rr0(
eXOR(
rc(1),
rc(2)), Outputs);
934 if (V.is(0) || V.is(1)) {
936 bool TV = (
Opc == S2_tstbit_i);
937 BT::BitValue F = V.is(TV) ? BT::BitValue::One : BT::BitValue::Zero;
946 if (
unsigned DefR = getUniqueDefVReg(
MI)) {
947 if (
MRI.getRegClass(DefR) == &Hexagon::PredRegsRegClass) {
952 RC.
fill(PW, RW, BT::BitValue::Zero);
957 return MachineEvaluator::evaluate(
MI, Inputs, Outputs);
968 bool &FallsThru)
const {
972 bool SimpleBranch =
false;
973 bool Negated =
false;
975 case Hexagon::J2_jumpf:
976 case Hexagon::J2_jumpfpt:
977 case Hexagon::J2_jumpfnew:
978 case Hexagon::J2_jumpfnewpt:
981 case Hexagon::J2_jumpt:
982 case Hexagon::J2_jumptpt:
983 case Hexagon::J2_jumptnew:
984 case Hexagon::J2_jumptnewpt:
989 case Hexagon::J2_jump:
1012 if (!
Test.is(!Negated)) {
1023unsigned HexagonEvaluator::getUniqueDefVReg(
const MachineInstr &
MI)
const {
1024 unsigned DefReg = 0;
1026 if (!
Op.isReg() || !
Op.isDef())
1039 const CellMapType &Inputs,
1040 CellMapType &Outputs)
const {
1041 using namespace Hexagon;
1043 if (
TII.isPredicated(
MI))
1045 assert(
MI.mayLoad() &&
"A load that mayn't?");
1046 unsigned Opc =
MI.getOpcode();
1057 case L2_loadalignb_pbr:
1058 case L2_loadalignb_pcr:
1059 case L2_loadalignb_pi:
1061 case L2_loadalignh_pbr:
1062 case L2_loadalignh_pcr:
1063 case L2_loadalignh_pi:
1065 case L2_loadbsw2_pbr:
1066 case L2_loadbsw2_pci:
1067 case L2_loadbsw2_pcr:
1068 case L2_loadbsw2_pi:
1069 case L2_loadbsw4_pbr:
1070 case L2_loadbsw4_pci:
1071 case L2_loadbsw4_pcr:
1072 case L2_loadbsw4_pi:
1074 case L2_loadbzw2_pbr:
1075 case L2_loadbzw2_pci:
1076 case L2_loadbzw2_pcr:
1077 case L2_loadbzw2_pi:
1078 case L2_loadbzw4_pbr:
1079 case L2_loadbzw4_pci:
1080 case L2_loadbzw4_pcr:
1081 case L2_loadbzw4_pi:
1100 case L2_loadrub_pbr:
1101 case L2_loadrub_pci:
1102 case L2_loadrub_pcr:
1128 case L2_loadruh_pbr:
1129 case L2_loadruh_pci:
1130 case L2_loadruh_pcr:
1146 case L2_loadw_locked:
1162 case L4_loadd_locked:
1172 const MachineOperand &MD =
MI.getOperand(0);
1177 assert(W >= BitNum && BitNum > 0);
1180 for (uint16_t i = 0; i < BitNum; ++i)
1181 Res[i] = BT::BitValue::self(
BT::BitRef(RD.Reg, i));
1185 for (uint16_t i = BitNum; i <
W; ++i)
1186 Res[i] = BT::BitValue::ref(Sign);
1188 for (uint16_t i = BitNum; i <
W; ++i)
1189 Res[i] = BT::BitValue::Zero;
1197 const CellMapType &Inputs,
1198 CellMapType &Outputs)
const {
1206 if (!
RS.Reg.isPhysical())
1212 uint16_t EW =
F->second.Width;
1221 if (
F->second.Type == ExtType::SExt)
1223 else if (
F->second.Type == ExtType::ZExt)
1230unsigned HexagonEvaluator::getNextPhysReg(
unsigned PReg,
unsigned Width)
const {
1231 using namespace Hexagon;
1233 bool Is64 = DoubleRegsRegClass.contains(PReg);
1234 assert(PReg == 0 || Is64 || IntRegsRegClass.contains(PReg));
1236 static const unsigned Phys32[] = { R0, R1,
R2, R3,
R4, R5 };
1237 static const unsigned Phys64[] = { D0, D1, D2 };
1238 const unsigned Num32 =
sizeof(Phys32)/
sizeof(
unsigned);
1239 const unsigned Num64 =
sizeof(Phys64)/
sizeof(
unsigned);
1243 return (Width <= 32) ? Phys32[0] : Phys64[0];
1247 unsigned Idx32 = 0, Idx64 = 0;
1249 while (Idx32 < Num32) {
1250 if (Phys32[Idx32] == PReg)
1256 while (Idx64 < Num64) {
1257 if (Phys64[Idx64] == PReg)
1265 return (Idx32+1 < Num32) ? Phys32[Idx32+1] : 0;
1266 return (Idx64+1 < Num64) ? Phys64[Idx64+1] : 0;
1269unsigned HexagonEvaluator::getVirtRegFor(
unsigned PReg)
const {
1270 for (std::pair<MCRegister, Register>
P :
MRI.liveins())
1271 if (
P.first == PReg)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file contains the simple types necessary to represent the attributes associated with functions a...
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
This class represents an incoming formal argument to a Function.
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT, true > const_iterator
unsigned getID() const
getID() - Return the register class ID number.
Wrapper class representing physical registers. Should be passed by value.
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
MachineOperand class - Representation of each machine instruction operand.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
MachineBasicBlock * getMBB() const
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Wrapper class representing virtual and physical registers.
bool insert(const value_type &X)
Insert a new element into the SetVector.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is an optimization pass for GlobalISel generic memory operations.
void fill(R &&Range, T &&Value)
Provide wrappers to std::fill which take ranges instead of having to pass begin/end explicitly.
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
void shuffle(Iterator first, Iterator last, RNG &&g)
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
@ Sub
Subtraction of integers.
DWARFExpression::Operation Op
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
MCRegisterClass TargetRegisterClass
bool is(unsigned T) const
RegisterCell eXOR(const RegisterCell &A1, const RegisterCell &A2) const
MachineEvaluator(const TargetRegisterInfo &T, MachineRegisterInfo &M)
const TargetRegisterInfo & TRI
RegisterCell eNOT(const RegisterCell &A1) const
RegisterCell eIMM(int64_t V, uint16_t W) const
RegisterCell eLSR(const RegisterCell &A1, uint16_t Sh) const
RegisterCell eMLU(const RegisterCell &A1, const RegisterCell &A2) const
RegisterCell eZXT(const RegisterCell &A1, uint16_t FromN) const
RegisterCell eMLS(const RegisterCell &A1, const RegisterCell &A2) const
uint16_t getRegBitWidth(const RegisterRef &RR) const
RegisterCell eCLB(const RegisterCell &A1, bool B, uint16_t W) const
MachineRegisterInfo & MRI
RegisterCell eASR(const RegisterCell &A1, uint16_t Sh) const
RegisterCell eASL(const RegisterCell &A1, uint16_t Sh) const
void putCell(const RegisterRef &RR, RegisterCell RC, CellMapType &M) const
RegisterCell eCTB(const RegisterCell &A1, bool B, uint16_t W) const
RegisterCell getCell(const RegisterRef &RR, const CellMapType &M) const
RegisterCell eAND(const RegisterCell &A1, const RegisterCell &A2) const
RegisterCell eORL(const RegisterCell &A1, const RegisterCell &A2) const
RegisterCell eSXT(const RegisterCell &A1, uint16_t FromN) const
RegisterCell eINS(const RegisterCell &A1, const RegisterCell &A2, uint16_t AtN) const
RegisterCell eADD(const RegisterCell &A1, const RegisterCell &A2) const
RegisterCell eSUB(const RegisterCell &A1, const RegisterCell &A2) const
RegisterCell eXTR(const RegisterCell &A1, uint16_t B, uint16_t E) const
RegisterCell & cat(const RegisterCell &RC)
static RegisterCell self(unsigned Reg, uint16_t Width)
static RegisterCell ref(const RegisterCell &C)
RegisterCell & fill(uint16_t B, uint16_t E, const BitValue &V)
RegisterCell & insert(const RegisterCell &RC, const BitMask &M)
BitTracker::BitMask mask(Register Reg, unsigned Sub) const override
uint16_t getPhysRegBitWidth(MCRegister Reg) const override
BitTracker::BranchTargetList BranchTargetList
bool evaluate(const MachineInstr &MI, const CellMapType &Inputs, CellMapType &Outputs) const override
HexagonEvaluator(const HexagonRegisterInfo &tri, MachineRegisterInfo &mri, const HexagonInstrInfo &tii, MachineFunction &mf)
BitTracker::RegisterCell RegisterCell
const HexagonInstrInfo & TII
const TargetRegisterClass & composeWithSubRegIndex(const TargetRegisterClass &RC, unsigned Idx) const override
BitTracker::CellMapType CellMapType
BitTracker::RegisterRef RegisterRef