1 //===-- LanaiInstrInfo.cpp - Lanai Instruction Information ------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file contains the Lanai implementation of the TargetInstrInfo class.
11 //===----------------------------------------------------------------------===//
13 #include "LanaiInstrInfo.h"
14 #include "LanaiAluCode.h"
15 #include "LanaiCondCode.h"
16 #include "MCTargetDesc/LanaiBaseInfo.h"
17 #include "llvm/ADT/STLExtras.h"
18 #include "llvm/ADT/SmallVector.h"
19 #include "llvm/CodeGen/MachineFunctionPass.h"
20 #include "llvm/CodeGen/MachineInstrBuilder.h"
21 #include "llvm/CodeGen/MachineRegisterInfo.h"
22 #include "llvm/Support/ErrorHandling.h"
23 #include "llvm/Support/TargetRegistry.h"
27 #define GET_INSTRINFO_CTOR_DTOR
28 #include "LanaiGenInstrInfo.inc"
30 LanaiInstrInfo::LanaiInstrInfo()
31 : LanaiGenInstrInfo(Lanai::ADJCALLSTACKDOWN
, Lanai::ADJCALLSTACKUP
),
34 void LanaiInstrInfo::copyPhysReg(MachineBasicBlock
&MBB
,
35 MachineBasicBlock::iterator Position
,
37 unsigned DestinationRegister
,
38 unsigned SourceRegister
,
39 bool KillSource
) const {
40 if (!Lanai::GPRRegClass
.contains(DestinationRegister
, SourceRegister
)) {
41 llvm_unreachable("Impossible reg-to-reg copy");
44 BuildMI(MBB
, Position
, DL
, get(Lanai::OR_I_LO
), DestinationRegister
)
45 .addReg(SourceRegister
, getKillRegState(KillSource
))
49 void LanaiInstrInfo::storeRegToStackSlot(
50 MachineBasicBlock
&MBB
, MachineBasicBlock::iterator Position
,
51 unsigned SourceRegister
, bool IsKill
, int FrameIndex
,
52 const TargetRegisterClass
*RegisterClass
,
53 const TargetRegisterInfo
* /*RegisterInfo*/) const {
55 if (Position
!= MBB
.end()) {
56 DL
= Position
->getDebugLoc();
59 if (!Lanai::GPRRegClass
.hasSubClassEq(RegisterClass
)) {
60 llvm_unreachable("Can't store this register to stack slot");
62 BuildMI(MBB
, Position
, DL
, get(Lanai::SW_RI
))
63 .addReg(SourceRegister
, getKillRegState(IsKill
))
64 .addFrameIndex(FrameIndex
)
69 void LanaiInstrInfo::loadRegFromStackSlot(
70 MachineBasicBlock
&MBB
, MachineBasicBlock::iterator Position
,
71 unsigned DestinationRegister
, int FrameIndex
,
72 const TargetRegisterClass
*RegisterClass
,
73 const TargetRegisterInfo
* /*RegisterInfo*/) const {
75 if (Position
!= MBB
.end()) {
76 DL
= Position
->getDebugLoc();
79 if (!Lanai::GPRRegClass
.hasSubClassEq(RegisterClass
)) {
80 llvm_unreachable("Can't load this register from stack slot");
82 BuildMI(MBB
, Position
, DL
, get(Lanai::LDW_RI
), DestinationRegister
)
83 .addFrameIndex(FrameIndex
)
88 bool LanaiInstrInfo::areMemAccessesTriviallyDisjoint(
89 const MachineInstr
&MIa
, const MachineInstr
&MIb
,
90 AliasAnalysis
* /*AA*/) const {
91 assert(MIa
.mayLoadOrStore() && "MIa must be a load or store.");
92 assert(MIb
.mayLoadOrStore() && "MIb must be a load or store.");
94 if (MIa
.hasUnmodeledSideEffects() || MIb
.hasUnmodeledSideEffects() ||
95 MIa
.hasOrderedMemoryRef() || MIb
.hasOrderedMemoryRef())
98 // Retrieve the base register, offset from the base register and width. Width
99 // is the size of memory that is being loaded/stored (e.g. 1, 2, 4). If
100 // base registers are identical, and the offset of a lower memory access +
101 // the width doesn't overlap the offset of a higher memory access,
102 // then the memory accesses are different.
103 const TargetRegisterInfo
*TRI
= &getRegisterInfo();
104 const MachineOperand
*BaseOpA
= nullptr, *BaseOpB
= nullptr;
105 int64_t OffsetA
= 0, OffsetB
= 0;
106 unsigned int WidthA
= 0, WidthB
= 0;
107 if (getMemOperandWithOffsetWidth(MIa
, BaseOpA
, OffsetA
, WidthA
, TRI
) &&
108 getMemOperandWithOffsetWidth(MIb
, BaseOpB
, OffsetB
, WidthB
, TRI
)) {
109 if (BaseOpA
->isIdenticalTo(*BaseOpB
)) {
110 int LowOffset
= std::min(OffsetA
, OffsetB
);
111 int HighOffset
= std::max(OffsetA
, OffsetB
);
112 int LowWidth
= (LowOffset
== OffsetA
) ? WidthA
: WidthB
;
113 if (LowOffset
+ LowWidth
<= HighOffset
)
120 bool LanaiInstrInfo::expandPostRAPseudo(MachineInstr
& /*MI*/) const {
124 static LPCC::CondCode
getOppositeCondition(LPCC::CondCode CC
) {
126 case LPCC::ICC_T
: // true
128 case LPCC::ICC_F
: // false
130 case LPCC::ICC_HI
: // high
132 case LPCC::ICC_LS
: // low or same
134 case LPCC::ICC_CC
: // carry cleared
136 case LPCC::ICC_CS
: // carry set
138 case LPCC::ICC_NE
: // not equal
140 case LPCC::ICC_EQ
: // equal
142 case LPCC::ICC_VC
: // oVerflow cleared
144 case LPCC::ICC_VS
: // oVerflow set
146 case LPCC::ICC_PL
: // plus (note: 0 is "minus" too here)
148 case LPCC::ICC_MI
: // minus
150 case LPCC::ICC_GE
: // greater than or equal
152 case LPCC::ICC_LT
: // less than
154 case LPCC::ICC_GT
: // greater than
156 case LPCC::ICC_LE
: // less than or equal
159 llvm_unreachable("Invalid condtional code");
163 std::pair
<unsigned, unsigned>
164 LanaiInstrInfo::decomposeMachineOperandsTargetFlags(unsigned TF
) const {
165 return std::make_pair(TF
, 0u);
168 ArrayRef
<std::pair
<unsigned, const char *>>
169 LanaiInstrInfo::getSerializableDirectMachineOperandTargetFlags() const {
170 using namespace LanaiII
;
171 static const std::pair
<unsigned, const char *> TargetFlags
[] = {
172 {MO_ABS_HI
, "lanai-hi"},
173 {MO_ABS_LO
, "lanai-lo"},
174 {MO_NO_FLAG
, "lanai-nf"}};
175 return makeArrayRef(TargetFlags
);
178 bool LanaiInstrInfo::analyzeCompare(const MachineInstr
&MI
, unsigned &SrcReg
,
179 unsigned &SrcReg2
, int &CmpMask
,
180 int &CmpValue
) const {
181 switch (MI
.getOpcode()) {
184 case Lanai::SFSUB_F_RI_LO
:
185 case Lanai::SFSUB_F_RI_HI
:
186 SrcReg
= MI
.getOperand(0).getReg();
189 CmpValue
= MI
.getOperand(1).getImm();
191 case Lanai::SFSUB_F_RR
:
192 SrcReg
= MI
.getOperand(0).getReg();
193 SrcReg2
= MI
.getOperand(1).getReg();
202 // isRedundantFlagInstr - check whether the first instruction, whose only
203 // purpose is to update flags, can be made redundant.
204 // * SFSUB_F_RR can be made redundant by SUB_RI if the operands are the same.
205 // * SFSUB_F_RI can be made redundant by SUB_I if the operands are the same.
206 inline static bool isRedundantFlagInstr(MachineInstr
*CmpI
, unsigned SrcReg
,
207 unsigned SrcReg2
, int ImmValue
,
209 if (CmpI
->getOpcode() == Lanai::SFSUB_F_RR
&&
210 OI
->getOpcode() == Lanai::SUB_R
&&
211 ((OI
->getOperand(1).getReg() == SrcReg
&&
212 OI
->getOperand(2).getReg() == SrcReg2
) ||
213 (OI
->getOperand(1).getReg() == SrcReg2
&&
214 OI
->getOperand(2).getReg() == SrcReg
)))
217 if (((CmpI
->getOpcode() == Lanai::SFSUB_F_RI_LO
&&
218 OI
->getOpcode() == Lanai::SUB_I_LO
) ||
219 (CmpI
->getOpcode() == Lanai::SFSUB_F_RI_HI
&&
220 OI
->getOpcode() == Lanai::SUB_I_HI
)) &&
221 OI
->getOperand(1).getReg() == SrcReg
&&
222 OI
->getOperand(2).getImm() == ImmValue
)
227 inline static unsigned flagSettingOpcodeVariant(unsigned OldOpcode
) {
229 case Lanai::ADD_I_HI
:
230 return Lanai::ADD_F_I_HI
;
231 case Lanai::ADD_I_LO
:
232 return Lanai::ADD_F_I_LO
;
234 return Lanai::ADD_F_R
;
235 case Lanai::ADDC_I_HI
:
236 return Lanai::ADDC_F_I_HI
;
237 case Lanai::ADDC_I_LO
:
238 return Lanai::ADDC_F_I_LO
;
240 return Lanai::ADDC_F_R
;
241 case Lanai::AND_I_HI
:
242 return Lanai::AND_F_I_HI
;
243 case Lanai::AND_I_LO
:
244 return Lanai::AND_F_I_LO
;
246 return Lanai::AND_F_R
;
248 return Lanai::OR_F_I_HI
;
250 return Lanai::OR_F_I_LO
;
252 return Lanai::OR_F_R
;
254 return Lanai::SL_F_I
;
256 return Lanai::SRL_F_R
;
258 return Lanai::SA_F_I
;
260 return Lanai::SRA_F_R
;
261 case Lanai::SUB_I_HI
:
262 return Lanai::SUB_F_I_HI
;
263 case Lanai::SUB_I_LO
:
264 return Lanai::SUB_F_I_LO
;
266 return Lanai::SUB_F_R
;
267 case Lanai::SUBB_I_HI
:
268 return Lanai::SUBB_F_I_HI
;
269 case Lanai::SUBB_I_LO
:
270 return Lanai::SUBB_F_I_LO
;
272 return Lanai::SUBB_F_R
;
273 case Lanai::XOR_I_HI
:
274 return Lanai::XOR_F_I_HI
;
275 case Lanai::XOR_I_LO
:
276 return Lanai::XOR_F_I_LO
;
278 return Lanai::XOR_F_R
;
284 bool LanaiInstrInfo::optimizeCompareInstr(
285 MachineInstr
&CmpInstr
, unsigned SrcReg
, unsigned SrcReg2
, int /*CmpMask*/,
286 int CmpValue
, const MachineRegisterInfo
*MRI
) const {
287 // Get the unique definition of SrcReg.
288 MachineInstr
*MI
= MRI
->getUniqueVRegDef(SrcReg
);
292 // Get ready to iterate backward from CmpInstr.
293 MachineBasicBlock::iterator I
= CmpInstr
, E
= MI
,
294 B
= CmpInstr
.getParent()->begin();
296 // Early exit if CmpInstr is at the beginning of the BB.
300 // There are two possible candidates which can be changed to set SR:
301 // One is MI, the other is a SUB instruction.
302 // * For SFSUB_F_RR(r1,r2), we are looking for SUB(r1,r2) or SUB(r2,r1).
303 // * For SFSUB_F_RI(r1, CmpValue), we are looking for SUB(r1, CmpValue).
304 MachineInstr
*Sub
= nullptr;
306 // MI is not a candidate to transform into a flag setting instruction.
308 else if (MI
->getParent() != CmpInstr
.getParent() || CmpValue
!= 0) {
309 // Conservatively refuse to convert an instruction which isn't in the same
310 // BB as the comparison. Don't return if SFSUB_F_RI and CmpValue != 0 as Sub
311 // may still be a candidate.
312 if (CmpInstr
.getOpcode() == Lanai::SFSUB_F_RI_LO
)
318 // Check that SR isn't set between the comparison instruction and the
319 // instruction we want to change while searching for Sub.
320 const TargetRegisterInfo
*TRI
= &getRegisterInfo();
321 for (--I
; I
!= E
; --I
) {
322 const MachineInstr
&Instr
= *I
;
324 if (Instr
.modifiesRegister(Lanai::SR
, TRI
) ||
325 Instr
.readsRegister(Lanai::SR
, TRI
))
326 // This instruction modifies or uses SR after the one we want to change.
327 // We can't do this transformation.
330 // Check whether CmpInstr can be made redundant by the current instruction.
331 if (isRedundantFlagInstr(&CmpInstr
, SrcReg
, SrcReg2
, CmpValue
, &*I
)) {
336 // Don't search outside the containing basic block.
341 // Return false if no candidates exist.
345 // The single candidate is called MI.
349 if (flagSettingOpcodeVariant(MI
->getOpcode()) != Lanai::NOP
) {
352 SmallVector
<std::pair
<MachineOperand
*, LPCC::CondCode
>, 4>
355 E
= CmpInstr
.getParent()->end();
356 while (!isSafe
&& ++I
!= E
) {
357 const MachineInstr
&Instr
= *I
;
358 for (unsigned IO
= 0, EO
= Instr
.getNumOperands(); !isSafe
&& IO
!= EO
;
360 const MachineOperand
&MO
= Instr
.getOperand(IO
);
361 if (MO
.isRegMask() && MO
.clobbersPhysReg(Lanai::SR
)) {
365 if (!MO
.isReg() || MO
.getReg() != Lanai::SR
)
371 // Condition code is after the operand before SR.
373 CC
= (LPCC::CondCode
)Instr
.getOperand(IO
- 1).getImm();
376 LPCC::CondCode NewCC
= getOppositeCondition(CC
);
377 if (NewCC
== LPCC::ICC_T
)
379 // If we have SUB(r1, r2) and CMP(r2, r1), the condition code based on
380 // CMP needs to be updated to be based on SUB. Push the condition
381 // code operands to OperandsToUpdate. If it is safe to remove
382 // CmpInstr, the condition code of these operands will be modified.
383 if (SrcReg2
!= 0 && Sub
->getOperand(1).getReg() == SrcReg2
&&
384 Sub
->getOperand(2).getReg() == SrcReg
) {
385 OperandsToUpdate
.push_back(
386 std::make_pair(&((*I
).getOperand(IO
- 1)), NewCC
));
389 // No Sub, so this is x = <op> y, z; cmp x, 0.
391 case LPCC::ICC_EQ
: // Z
392 case LPCC::ICC_NE
: // Z
393 case LPCC::ICC_MI
: // N
394 case LPCC::ICC_PL
: // N
395 case LPCC::ICC_F
: // none
396 case LPCC::ICC_T
: // none
397 // SR can be used multiple times, we should continue.
399 case LPCC::ICC_CS
: // C
400 case LPCC::ICC_CC
: // C
401 case LPCC::ICC_VS
: // V
402 case LPCC::ICC_VC
: // V
403 case LPCC::ICC_HI
: // C Z
404 case LPCC::ICC_LS
: // C Z
405 case LPCC::ICC_GE
: // N V
406 case LPCC::ICC_LT
: // N V
407 case LPCC::ICC_GT
: // Z N V
408 case LPCC::ICC_LE
: // Z N V
409 // The instruction uses the V bit or C bit which is not safe.
418 // If SR is not killed nor re-defined, we should check whether it is
419 // live-out. If it is live-out, do not optimize.
421 MachineBasicBlock
*MBB
= CmpInstr
.getParent();
422 for (MachineBasicBlock::succ_iterator SI
= MBB
->succ_begin(),
423 SE
= MBB
->succ_end();
425 if ((*SI
)->isLiveIn(Lanai::SR
))
429 // Toggle the optional operand to SR.
430 MI
->setDesc(get(flagSettingOpcodeVariant(MI
->getOpcode())));
431 MI
->addRegisterDefined(Lanai::SR
);
432 CmpInstr
.eraseFromParent();
439 bool LanaiInstrInfo::analyzeSelect(const MachineInstr
&MI
,
440 SmallVectorImpl
<MachineOperand
> &Cond
,
441 unsigned &TrueOp
, unsigned &FalseOp
,
442 bool &Optimizable
) const {
443 assert(MI
.getOpcode() == Lanai::SELECT
&& "unknown select instruction");
448 // 3: Condition code.
451 Cond
.push_back(MI
.getOperand(3));
456 // Identify instructions that can be folded into a SELECT instruction, and
457 // return the defining instruction.
458 static MachineInstr
*canFoldIntoSelect(unsigned Reg
,
459 const MachineRegisterInfo
&MRI
) {
460 if (!TargetRegisterInfo::isVirtualRegister(Reg
))
462 if (!MRI
.hasOneNonDBGUse(Reg
))
464 MachineInstr
*MI
= MRI
.getVRegDef(Reg
);
467 // MI is folded into the SELECT by predicating it.
468 if (!MI
->isPredicable())
470 // Check if MI has any non-dead defs or physreg uses. This also detects
471 // predicated instructions which will be reading SR.
472 for (unsigned i
= 1, e
= MI
->getNumOperands(); i
!= e
; ++i
) {
473 const MachineOperand
&MO
= MI
->getOperand(i
);
474 // Reject frame index operands.
475 if (MO
.isFI() || MO
.isCPI() || MO
.isJTI())
479 // MI can't have any tied operands, that would conflict with predication.
482 if (TargetRegisterInfo::isPhysicalRegister(MO
.getReg()))
484 if (MO
.isDef() && !MO
.isDead())
487 bool DontMoveAcrossStores
= true;
488 if (!MI
->isSafeToMove(/*AliasAnalysis=*/nullptr, DontMoveAcrossStores
))
494 LanaiInstrInfo::optimizeSelect(MachineInstr
&MI
,
495 SmallPtrSetImpl
<MachineInstr
*> &SeenMIs
,
496 bool /*PreferFalse*/) const {
497 assert(MI
.getOpcode() == Lanai::SELECT
&& "unknown select instruction");
498 MachineRegisterInfo
&MRI
= MI
.getParent()->getParent()->getRegInfo();
499 MachineInstr
*DefMI
= canFoldIntoSelect(MI
.getOperand(1).getReg(), MRI
);
500 bool Invert
= !DefMI
;
502 DefMI
= canFoldIntoSelect(MI
.getOperand(2).getReg(), MRI
);
506 // Find new register class to use.
507 MachineOperand FalseReg
= MI
.getOperand(Invert
? 1 : 2);
508 unsigned DestReg
= MI
.getOperand(0).getReg();
509 const TargetRegisterClass
*PreviousClass
= MRI
.getRegClass(FalseReg
.getReg());
510 if (!MRI
.constrainRegClass(DestReg
, PreviousClass
))
513 // Create a new predicated version of DefMI.
514 MachineInstrBuilder NewMI
=
515 BuildMI(*MI
.getParent(), MI
, MI
.getDebugLoc(), DefMI
->getDesc(), DestReg
);
517 // Copy all the DefMI operands, excluding its (null) predicate.
518 const MCInstrDesc
&DefDesc
= DefMI
->getDesc();
519 for (unsigned i
= 1, e
= DefDesc
.getNumOperands();
520 i
!= e
&& !DefDesc
.OpInfo
[i
].isPredicate(); ++i
)
521 NewMI
.add(DefMI
->getOperand(i
));
523 unsigned CondCode
= MI
.getOperand(3).getImm();
525 NewMI
.addImm(getOppositeCondition(LPCC::CondCode(CondCode
)));
527 NewMI
.addImm(CondCode
);
528 NewMI
.copyImplicitOps(MI
);
530 // The output register value when the predicate is false is an implicit
531 // register operand tied to the first def. The tie makes the register
532 // allocator ensure the FalseReg is allocated the same register as operand 0.
533 FalseReg
.setImplicit();
535 NewMI
->tieOperands(0, NewMI
->getNumOperands() - 1);
537 // Update SeenMIs set: register newly created MI and erase removed DefMI.
538 SeenMIs
.insert(NewMI
);
539 SeenMIs
.erase(DefMI
);
541 // If MI is inside a loop, and DefMI is outside the loop, then kill flags on
542 // DefMI would be invalid when transferred inside the loop. Checking for a
543 // loop is expensive, but at least remove kill flags if they are in different
545 if (DefMI
->getParent() != MI
.getParent())
546 NewMI
->clearKillInfo();
548 // The caller will erase MI, but not DefMI.
549 DefMI
->eraseFromParent();
553 // The analyzeBranch function is used to examine conditional instructions and
554 // remove unnecessary instructions. This method is used by BranchFolder and
555 // IfConverter machine function passes to improve the CFG.
556 // - TrueBlock is set to the destination if condition evaluates true (it is the
557 // nullptr if the destination is the fall-through branch);
558 // - FalseBlock is set to the destination if condition evaluates to false (it
559 // is the nullptr if the branch is unconditional);
560 // - condition is populated with machine operands needed to generate the branch
561 // to insert in insertBranch;
562 // Returns: false if branch could successfully be analyzed.
563 bool LanaiInstrInfo::analyzeBranch(MachineBasicBlock
&MBB
,
564 MachineBasicBlock
*&TrueBlock
,
565 MachineBasicBlock
*&FalseBlock
,
566 SmallVectorImpl
<MachineOperand
> &Condition
,
567 bool AllowModify
) const {
568 // Iterator to current instruction being considered.
569 MachineBasicBlock::iterator Instruction
= MBB
.end();
571 // Start from the bottom of the block and work up, examining the
572 // terminator instructions.
573 while (Instruction
!= MBB
.begin()) {
576 // Skip over debug instructions.
577 if (Instruction
->isDebugInstr())
580 // Working from the bottom, when we see a non-terminator
581 // instruction, we're done.
582 if (!isUnpredicatedTerminator(*Instruction
))
585 // A terminator that isn't a branch can't easily be handled
587 if (!Instruction
->isBranch())
590 // Handle unconditional branches.
591 if (Instruction
->getOpcode() == Lanai::BT
) {
593 TrueBlock
= Instruction
->getOperand(0).getMBB();
597 // If the block has any instructions after a branch, delete them.
598 while (std::next(Instruction
) != MBB
.end()) {
599 std::next(Instruction
)->eraseFromParent();
603 FalseBlock
= nullptr;
605 // Delete the jump if it's equivalent to a fall-through.
606 if (MBB
.isLayoutSuccessor(Instruction
->getOperand(0).getMBB())) {
608 Instruction
->eraseFromParent();
609 Instruction
= MBB
.end();
613 // TrueBlock is used to indicate the unconditional destination.
614 TrueBlock
= Instruction
->getOperand(0).getMBB();
618 // Handle conditional branches
619 unsigned Opcode
= Instruction
->getOpcode();
620 if (Opcode
!= Lanai::BRCC
)
621 return true; // Unknown opcode.
623 // Multiple conditional branches are not handled here so only proceed if
624 // there are no conditions enqueued.
625 if (Condition
.empty()) {
626 LPCC::CondCode BranchCond
=
627 static_cast<LPCC::CondCode
>(Instruction
->getOperand(1).getImm());
629 // TrueBlock is the target of the previously seen unconditional branch.
630 FalseBlock
= TrueBlock
;
631 TrueBlock
= Instruction
->getOperand(0).getMBB();
632 Condition
.push_back(MachineOperand::CreateImm(BranchCond
));
636 // Multiple conditional branches are not handled.
640 // Return false indicating branch successfully analyzed.
644 // reverseBranchCondition - Reverses the branch condition of the specified
645 // condition list, returning false on success and true if it cannot be
647 bool LanaiInstrInfo::reverseBranchCondition(
648 SmallVectorImpl
<llvm::MachineOperand
> &Condition
) const {
649 assert((Condition
.size() == 1) &&
650 "Lanai branch conditions should have one component.");
652 LPCC::CondCode BranchCond
=
653 static_cast<LPCC::CondCode
>(Condition
[0].getImm());
654 Condition
[0].setImm(getOppositeCondition(BranchCond
));
658 // Insert the branch with condition specified in condition and given targets
659 // (TrueBlock and FalseBlock). This function returns the number of machine
660 // instructions inserted.
661 unsigned LanaiInstrInfo::insertBranch(MachineBasicBlock
&MBB
,
662 MachineBasicBlock
*TrueBlock
,
663 MachineBasicBlock
*FalseBlock
,
664 ArrayRef
<MachineOperand
> Condition
,
666 int *BytesAdded
) const {
667 // Shouldn't be a fall through.
668 assert(TrueBlock
&& "insertBranch must not be told to insert a fallthrough");
669 assert(!BytesAdded
&& "code size not handled");
671 // If condition is empty then an unconditional branch is being inserted.
672 if (Condition
.empty()) {
673 assert(!FalseBlock
&& "Unconditional branch with multiple successors!");
674 BuildMI(&MBB
, DL
, get(Lanai::BT
)).addMBB(TrueBlock
);
678 // Else a conditional branch is inserted.
679 assert((Condition
.size() == 1) &&
680 "Lanai branch conditions should have one component.");
681 unsigned ConditionalCode
= Condition
[0].getImm();
682 BuildMI(&MBB
, DL
, get(Lanai::BRCC
)).addMBB(TrueBlock
).addImm(ConditionalCode
);
684 // If no false block, then false behavior is fall through and no branch needs
689 BuildMI(&MBB
, DL
, get(Lanai::BT
)).addMBB(FalseBlock
);
693 unsigned LanaiInstrInfo::removeBranch(MachineBasicBlock
&MBB
,
694 int *BytesRemoved
) const {
695 assert(!BytesRemoved
&& "code size not handled");
697 MachineBasicBlock::iterator Instruction
= MBB
.end();
700 while (Instruction
!= MBB
.begin()) {
702 if (Instruction
->isDebugInstr())
704 if (Instruction
->getOpcode() != Lanai::BT
&&
705 Instruction
->getOpcode() != Lanai::BRCC
) {
709 // Remove the branch.
710 Instruction
->eraseFromParent();
711 Instruction
= MBB
.end();
718 unsigned LanaiInstrInfo::isLoadFromStackSlot(const MachineInstr
&MI
,
719 int &FrameIndex
) const {
720 if (MI
.getOpcode() == Lanai::LDW_RI
)
721 if (MI
.getOperand(1).isFI() && MI
.getOperand(2).isImm() &&
722 MI
.getOperand(2).getImm() == 0) {
723 FrameIndex
= MI
.getOperand(1).getIndex();
724 return MI
.getOperand(0).getReg();
729 unsigned LanaiInstrInfo::isLoadFromStackSlotPostFE(const MachineInstr
&MI
,
730 int &FrameIndex
) const {
731 if (MI
.getOpcode() == Lanai::LDW_RI
) {
733 if ((Reg
= isLoadFromStackSlot(MI
, FrameIndex
)))
735 // Check for post-frame index elimination operations
736 SmallVector
<const MachineMemOperand
*, 1> Accesses
;
737 if (hasLoadFromStackSlot(MI
, Accesses
)){
739 cast
<FixedStackPseudoSourceValue
>(Accesses
.front()->getPseudoValue())
747 unsigned LanaiInstrInfo::isStoreToStackSlot(const MachineInstr
&MI
,
748 int &FrameIndex
) const {
749 if (MI
.getOpcode() == Lanai::SW_RI
)
750 if (MI
.getOperand(0).isFI() && MI
.getOperand(1).isImm() &&
751 MI
.getOperand(1).getImm() == 0) {
752 FrameIndex
= MI
.getOperand(0).getIndex();
753 return MI
.getOperand(2).getReg();
758 bool LanaiInstrInfo::getMemOperandWithOffsetWidth(
759 const MachineInstr
&LdSt
, const MachineOperand
*&BaseOp
, int64_t &Offset
,
760 unsigned &Width
, const TargetRegisterInfo
* /*TRI*/) const {
761 // Handle only loads/stores with base register followed by immediate offset
762 // and with add as ALU op.
763 if (LdSt
.getNumOperands() != 4)
765 if (!LdSt
.getOperand(1).isReg() || !LdSt
.getOperand(2).isImm() ||
766 !(LdSt
.getOperand(3).isImm() && LdSt
.getOperand(3).getImm() == LPAC::ADD
))
769 switch (LdSt
.getOpcode()) {
790 BaseOp
= &LdSt
.getOperand(1);
791 Offset
= LdSt
.getOperand(2).getImm();
792 assert(BaseOp
->isReg() && "getMemOperandWithOffset only supports base "
793 "operands of type register.");
797 bool LanaiInstrInfo::getMemOperandWithOffset(const MachineInstr
&LdSt
,
798 const MachineOperand
*&BaseOp
,
800 const TargetRegisterInfo
*TRI
) const {
801 switch (LdSt
.getOpcode()) {
814 return getMemOperandWithOffsetWidth(LdSt
, BaseOp
, Offset
, Width
, TRI
);