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) ||
89 Hexagon::HlxLLRRegClass.hasSubClassEq(&RC) ||
90 Hexagon::CircRegsRegClass.hasSubClassEq(&RC))
94 <<
TRI.getRegClassName(&RC) <<
'\n';
102 if (HST.useHLXOps()) {
104 if (RC->contains(Reg))
105 return TRI.getRegSizeInBits(*RC);
107 if (HST.useHVXOps()) {
109 {&HvxVRRegClass, &HvxWRRegClass, &HvxQRRegClass, &HvxVQRRegClass})
110 if (RC->contains(Reg))
111 return TRI.getRegSizeInBits(*RC);
115 return TRI.getRegSizeInBits(*RC);
118 (
Twine(
"Unhandled physical register") +
TRI.getName(Reg)).str().c_str());
130 assert(IsSubLo != IsSubHi &&
"Must refer to either low or high subreg");
133 if (Hexagon::DoubleRegsRegClass.hasSubClassEq(&RC) ||
134 Hexagon::CircRegsRegClass.hasSubClassEq(&RC))
135 return Hexagon::IntRegsRegClass;
136 if (Hexagon::HvxWRRegClass.hasSubClassEq(&RC))
137 return Hexagon::HvxVRRegClass;
138 if (Hexagon::HvxVQRRegClass.hasSubClassEq(&RC))
139 return Hexagon::HvxWRRegClass;
140 if (Hexagon::HlxLLRRegClass.hasSubClassEq(&RC))
141 return Hexagon::HlxLRRegClass;
143 dbgs() <<
"Reg class id: " << RC.
getID() <<
" idx: " << Idx <<
'\n';
151 std::vector<BT::RegisterRef>
Vector;
155 for (
unsigned i = 0, n =
Vector.size(); i < n; ++i) {
156 const MachineOperand &MO = MI.getOperand(i);
158 Vector[i] = BT::RegisterRef(MO);
166 const BT::RegisterRef &operator[](
unsigned n)
const {
180 unsigned NumDefs = 0;
184 if (!MO.isReg() || !MO.isDef())
187 assert(MO.getSubReg() == 0);
193 unsigned Opc =
MI.getOpcode();
203 return evaluateLoad(
MI, Inputs, Outputs);
222 if (evaluateFormalCopy(
MI, Inputs, Outputs))
233 if (MO.isGlobal() || MO.isBlockAddress() || MO.isSymbol() || MO.isJTI() ||
238 RegisterRefs
Reg(
MI);
239#define op(i) MI.getOperand(i)
240#define rc(i) RegisterCell::ref(getCell(Reg[i], Inputs))
241#define im(i) MI.getOperand(i).getImm()
254 auto cop = [
this, &Reg, &
MI, &Inputs](
unsigned N,
258 return eIMM(
Op.getImm(), W);
268 return eXTR(RC, 0, RW);
273 uint16_t W = RC.
width();
275 return eXTR(RC, W-RW, W);
281 return eXTR(RC,
N*16,
N*16+16);
286 uint16_t
I = Odd, Ws = Rs.
width();
304 unsigned Reg0 = Reg[0].Reg;
313 return rr0(
eIMM(
im(1), W0), Outputs);
319 int FI =
op(1).getIndex();
320 int Off =
op(2).getImm();
321 unsigned A =
MFI.getObjectAlign(FI).value() + std::abs(
Off);
324 RC.
fill(0, L, BT::BitValue::Zero);
325 return rr0(RC, Outputs);
333 return rr0(
rc(1), Outputs);
340 RC.
fill(PW, RW, BT::BitValue::Zero);
341 return rr0(RC, Outputs);
347 RC.
fill(PW, RW, BT::BitValue::Zero);
348 return rr0(
eINS(RC,
eXTR(
rc(1), 0, PW), 0), Outputs);
360 assert(W0 == 64 && W1 == 32);
363 return rr0(RC, Outputs);
367 return rr0(
eADD(
rc(1),
rc(2)), Outputs);
370 case S4_addi_asl_ri: {
372 return rr0(RC, Outputs);
374 case S4_addi_lsr_ri: {
376 return rr0(RC, Outputs);
380 return rr0(RC, Outputs);
382 case M4_mpyri_addi: {
385 return rr0(RC, Outputs);
387 case M4_mpyrr_addi: {
390 return rr0(RC, Outputs);
392 case M4_mpyri_addr_u2: {
395 return rr0(RC, Outputs);
397 case M4_mpyri_addr: {
400 return rr0(RC, Outputs);
402 case M4_mpyrr_addr: {
405 return rr0(RC, Outputs);
409 return rr0(RC, Outputs);
413 return rr0(RC, Outputs);
417 return rr0(RC, Outputs);
421 return rr0(RC, Outputs);
423 case S2_addasl_rrri: {
425 return rr0(RC, Outputs);
429 RPC.
fill(0, 2, BT::BitValue::Zero);
430 return rr0(
eADD(RPC,
eIMM(
im(2), W0)), Outputs);
434 return rr0(
eSUB(
rc(1),
rc(2)), Outputs);
437 case S4_subi_asl_ri: {
439 return rr0(RC, Outputs);
441 case S4_subi_lsr_ri: {
443 return rr0(RC, Outputs);
447 return rr0(RC, Outputs);
451 return rr0(RC, Outputs);
455 return rr0(
eSUB(
eIMM(0, W0),
rc(1)), Outputs);
459 return rr0(hi(M, W0), Outputs);
462 return rr0(
eMLS(
rc(1),
rc(2)), Outputs);
463 case M2_dpmpyss_acc_s0:
465 case M2_dpmpyss_nac_s0:
469 return rr0(lo(M, W0), Outputs);
474 return rr0(RC, Outputs);
479 return rr0(RC, Outputs);
484 return rr0(RC, Outputs);
489 return rr0(RC, Outputs);
493 return rr0(lo(M, 32), Outputs);
497 return rr0(lo(M, 32), Outputs);
501 return rr0(lo(M, 32), Outputs);
505 return rr0(hi(M, W0), Outputs);
508 return rr0(
eMLU(
rc(1),
rc(2)), Outputs);
509 case M2_dpmpyuu_acc_s0:
511 case M2_dpmpyuu_nac_s0:
521 return rr0(
eAND(
rc(1),
rc(2)), Outputs);
525 case S4_andi_asl_ri: {
527 return rr0(RC, Outputs);
529 case S4_andi_lsr_ri: {
531 return rr0(RC, Outputs);
545 return rr0(
eORL(
rc(1),
rc(2)), Outputs);
549 case S4_ori_asl_ri: {
551 return rr0(RC, Outputs);
553 case S4_ori_lsr_ri: {
555 return rr0(RC, Outputs);
564 return rr0(RC, Outputs);
568 return rr0(RC, Outputs);
576 return rr0(
eXOR(
rc(1),
rc(2)), Outputs);
587 return rr0(
eNOT(
rc(1)), Outputs);
591 return rr0(
eASL(
rc(1),
im(2)), Outputs);
593 return rr0(
eASL(
rc(1), 16), Outputs);
606 case S2_asl_i_r_xacc:
607 case S2_asl_i_p_xacc:
616 return rr0(
eASR(
rc(1),
im(2)), Outputs);
618 return rr0(
eASR(
rc(1), 16), Outputs);
631 case S2_asr_i_r_rnd: {
637 return rr0(
eXTR(RC, 0, W0), Outputs);
639 case S2_asr_i_r_rnd_goodsyntax: {
642 return rr0(
rc(1), Outputs);
646 return rr0(
eXTR(RC, 0, W0), Outputs);
650 case S2_asr_i_svw_trun:
656 return rr0(
eLSR(
rc(1),
im(2)), Outputs);
669 case S2_lsr_i_r_xacc:
670 case S2_lsr_i_p_xacc:
675 RC[
im(2)] = BT::BitValue::Zero;
676 return rr0(RC, Outputs);
680 RC[
im(2)] = BT::BitValue::One;
681 return rr0(RC, Outputs);
683 case S2_togglebit_i: {
686 RC[BX] = RC[BX].is(0) ? BT::BitValue::One
687 : RC[BX].is(1) ? BT::BitValue::Zero
688 : BT::BitValue::self();
689 return rr0(RC, Outputs);
701 return rr0(RC, Outputs);
707 uint16_t Wd =
im(2), Of =
im(3);
710 return rr0(
eIMM(0, W0), Outputs);
717 if (
Opc == S2_extractu ||
Opc == S2_extractup)
718 return rr0(
eZXT(RC, Wd), Outputs);
719 return rr0(
eSXT(RC, Wd), Outputs);
723 uint16_t Wd =
im(3), Of =
im(4);
724 assert(Wd < W0 && Of < W0);
729 return rr0(
rc(1), Outputs);
730 return rr0(
eINS(
rc(1),
eXTR(
rc(2), 0, Wd), Of), Outputs);
742 return rr0(cop(2, W0/2).cat(cop(1, W0/2)), Outputs);
746 case A2_combine_hh: {
750 unsigned LoH = !(
Opc == A2_combine_ll ||
Opc == A2_combine_hl);
752 unsigned HiH = !(
Opc == A2_combine_ll ||
Opc == A2_combine_lh);
756 return rr0(RC, Outputs);
765 return rr0(RC, Outputs);
769 return rr0(RC, Outputs);
773 return rr0(RC, Outputs);
777 return rr0(RC, Outputs);
781 return rr0(RC, Outputs);
786 assert(WR == 64 && WP == 8);
789 for (uint16_t i = 0; i < WP; ++i) {
791 BT::BitValue F = (V.is(0) || V.is(1)) ? V : BT::BitValue::self();
792 RC.
fill(i*8, i*8+8,
F);
794 return rr0(RC, Outputs);
806 if (PC0.
is(0) || PC0.
is(1))
808 R2.meet(R3, Reg[0].Reg);
809 return rr0(
R2, Outputs);
818 return rr0(
eSXT(
rc(1), 8), Outputs);
820 return rr0(
eSXT(
rc(1), 16), Outputs);
823 assert(W0 == 64 && W1 == 32);
825 return rr0(RC, Outputs);
828 return rr0(
eZXT(
rc(1), 8), Outputs);
830 return rr0(
eZXT(
rc(1), 16), Outputs);
848 return rr0(
eCLB(
rc(1),
false, 32), Outputs);
851 return rr0(
eCLB(
rc(1),
true, 32), Outputs);
857 if (TV.
is(0) || TV.
is(1))
858 return rr0(
eCLB(R1, TV, 32), Outputs);
863 return rr0(
eCTB(
rc(1),
false, 32), Outputs);
866 return rr0(
eCTB(
rc(1),
true, 32), Outputs);
873 bool Has0 =
false, All1 =
true;
874 for (uint16_t i = 0; i < 8; ++i) {
885 RC.
fill(0, W0, (All1 ? BT::BitValue::One : BT::BitValue::Zero));
886 return rr0(RC, Outputs);
890 bool Has1 =
false, All0 =
true;
891 for (uint16_t i = 0; i < 8; ++i) {
902 RC.
fill(0, W0, (Has1 ? BT::BitValue::One : BT::BitValue::Zero));
903 return rr0(RC, Outputs);
906 return rr0(
eAND(
rc(1),
rc(2)), Outputs);
910 return rr0(
eNOT(
rc(1)), Outputs);
912 return rr0(
eORL(
rc(1),
rc(2)), Outputs);
916 return rr0(
eXOR(
rc(1),
rc(2)), Outputs);
944 if (V.is(0) || V.is(1)) {
946 bool TV = (
Opc == S2_tstbit_i);
947 BT::BitValue F = V.is(TV) ? BT::BitValue::One : BT::BitValue::Zero;
956 if (
unsigned DefR = getUniqueDefVReg(
MI)) {
957 if (
MRI.getRegClass(DefR) == &Hexagon::PredRegsRegClass) {
962 RC.
fill(PW, RW, BT::BitValue::Zero);
967 return MachineEvaluator::evaluate(
MI, Inputs, Outputs);
978 bool &FallsThru)
const {
982 bool SimpleBranch =
false;
983 bool Negated =
false;
985 case Hexagon::J2_jumpf:
986 case Hexagon::J2_jumpfpt:
987 case Hexagon::J2_jumpfnew:
988 case Hexagon::J2_jumpfnewpt:
991 case Hexagon::J2_jumpt:
992 case Hexagon::J2_jumptpt:
993 case Hexagon::J2_jumptnew:
994 case Hexagon::J2_jumptnewpt:
999 case Hexagon::J2_jump:
1022 if (!
Test.is(!Negated)) {
1033unsigned HexagonEvaluator::getUniqueDefVReg(
const MachineInstr &
MI)
const {
1034 unsigned DefReg = 0;
1036 if (!
Op.isReg() || !
Op.isDef())
1049 const CellMapType &Inputs,
1050 CellMapType &Outputs)
const {
1051 using namespace Hexagon;
1053 if (
TII.isPredicated(
MI))
1055 assert(
MI.mayLoad() &&
"A load that mayn't?");
1056 unsigned Opc =
MI.getOpcode();
1067 case L2_loadalignb_pbr:
1068 case L2_loadalignb_pcr:
1069 case L2_loadalignb_pi:
1071 case L2_loadalignh_pbr:
1072 case L2_loadalignh_pcr:
1073 case L2_loadalignh_pi:
1075 case L2_loadbsw2_pbr:
1076 case L2_loadbsw2_pci:
1077 case L2_loadbsw2_pcr:
1078 case L2_loadbsw2_pi:
1079 case L2_loadbsw4_pbr:
1080 case L2_loadbsw4_pci:
1081 case L2_loadbsw4_pcr:
1082 case L2_loadbsw4_pi:
1084 case L2_loadbzw2_pbr:
1085 case L2_loadbzw2_pci:
1086 case L2_loadbzw2_pcr:
1087 case L2_loadbzw2_pi:
1088 case L2_loadbzw4_pbr:
1089 case L2_loadbzw4_pci:
1090 case L2_loadbzw4_pcr:
1091 case L2_loadbzw4_pi:
1110 case L2_loadrub_pbr:
1111 case L2_loadrub_pci:
1112 case L2_loadrub_pcr:
1138 case L2_loadruh_pbr:
1139 case L2_loadruh_pci:
1140 case L2_loadruh_pcr:
1156 case L2_loadw_locked:
1172 case L4_loadd_locked:
1182 const MachineOperand &MD =
MI.getOperand(0);
1187 assert(W >= BitNum && BitNum > 0);
1190 for (uint16_t i = 0; i < BitNum; ++i)
1191 Res[i] = BT::BitValue::self(
BT::BitRef(RD.Reg, i));
1195 for (uint16_t i = BitNum; i <
W; ++i)
1196 Res[i] = BT::BitValue::ref(
Sign);
1198 for (uint16_t i = BitNum; i <
W; ++i)
1199 Res[i] = BT::BitValue::Zero;
1207 const CellMapType &Inputs,
1208 CellMapType &Outputs)
const {
1216 if (!
RS.Reg.isPhysical())
1222 uint16_t EW =
F->second.Width;
1231 if (
F->second.Type == ExtType::SExt)
1233 else if (
F->second.Type == ExtType::ZExt)
1240unsigned HexagonEvaluator::getNextPhysReg(
unsigned PReg,
unsigned Width)
const {
1241 using namespace Hexagon;
1243 bool Is64 = DoubleRegsRegClass.contains(PReg);
1244 assert(PReg == 0 || Is64 || IntRegsRegClass.contains(PReg));
1246 static const unsigned Phys32[] = { R0, R1,
R2, R3,
R4, R5 };
1247 static const unsigned Phys64[] = { D0, D1, D2 };
1248 const unsigned Num32 =
sizeof(Phys32)/
sizeof(
unsigned);
1249 const unsigned Num64 =
sizeof(Phys64)/
sizeof(
unsigned);
1253 return (Width <= 32) ? Phys32[0] : Phys64[0];
1257 unsigned Idx32 = 0, Idx64 = 0;
1259 while (Idx32 < Num32) {
1260 if (Phys32[Idx32] == PReg)
1266 while (Idx64 < Num64) {
1267 if (Phys64[Idx64] == PReg)
1275 return (Idx32+1 < Num32) ? Phys32[Idx32+1] : 0;
1276 return (Idx64+1 < Num64) ? Phys64[Idx64+1] : 0;
1279unsigned HexagonEvaluator::getVirtRegFor(
unsigned PReg)
const {
1280 for (std::pair<MCRegister, Register>
P :
MRI.liveins())
1281 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