1 //===- FastISel.cpp - Implementation of the FastISel class ----------------===//
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 implementation of the FastISel class.
11 // "Fast" instruction selection is designed to emit very poor code quickly.
12 // Also, it is not designed to be able to do much lowering, so most illegal
13 // types (e.g. i64 on 32-bit targets) and operations are not supported. It is
14 // also not intended to be able to do much optimization, except in a few cases
15 // where doing optimizations reduces overall compile time. For example, folding
16 // constants into immediate fields is often done, because it's cheap and it
17 // reduces the number of instructions later phases have to examine.
19 // "Fast" instruction selection is able to fail gracefully and transfer
20 // control to the SelectionDAG selector for operations that it doesn't
21 // support. In many cases, this allows us to avoid duplicating a lot of
22 // the complicated lowering logic that SelectionDAG currently has.
24 // The intended use for "fast" instruction selection is "-O0" mode
25 // compilation, where the quality of the generated code is irrelevant when
26 // weighed against the speed at which the code can be generated. Also,
27 // at -O0, the LLVM optimizers are not running, and this makes the
28 // compile time of codegen a much higher portion of the overall compile
29 // time. Despite its limitations, "fast" instruction selection is able to
30 // handle enough code on its own to provide noticeable overall speedups
33 // Basic operations are supported in a target-independent way, by reading
34 // the same instruction descriptions that the SelectionDAG selector reads,
35 // and identifying simple arithmetic operations that can be directly selected
36 // from simple operators. More complicated operations currently require
37 // target-specific code.
39 //===----------------------------------------------------------------------===//
41 #include "llvm/CodeGen/FastISel.h"
42 #include "llvm/ADT/APFloat.h"
43 #include "llvm/ADT/APSInt.h"
44 #include "llvm/ADT/DenseMap.h"
45 #include "llvm/ADT/SmallPtrSet.h"
46 #include "llvm/ADT/SmallString.h"
47 #include "llvm/ADT/SmallVector.h"
48 #include "llvm/ADT/Statistic.h"
49 #include "llvm/Analysis/BranchProbabilityInfo.h"
50 #include "llvm/Analysis/TargetLibraryInfo.h"
51 #include "llvm/CodeGen/Analysis.h"
52 #include "llvm/CodeGen/FunctionLoweringInfo.h"
53 #include "llvm/CodeGen/ISDOpcodes.h"
54 #include "llvm/CodeGen/MachineBasicBlock.h"
55 #include "llvm/CodeGen/MachineFrameInfo.h"
56 #include "llvm/CodeGen/MachineInstr.h"
57 #include "llvm/CodeGen/MachineInstrBuilder.h"
58 #include "llvm/CodeGen/MachineMemOperand.h"
59 #include "llvm/CodeGen/MachineModuleInfo.h"
60 #include "llvm/CodeGen/MachineOperand.h"
61 #include "llvm/CodeGen/MachineRegisterInfo.h"
62 #include "llvm/CodeGen/StackMaps.h"
63 #include "llvm/CodeGen/TargetInstrInfo.h"
64 #include "llvm/CodeGen/TargetLowering.h"
65 #include "llvm/CodeGen/TargetSubtargetInfo.h"
66 #include "llvm/CodeGen/ValueTypes.h"
67 #include "llvm/CodeGenTypes/MachineValueType.h"
68 #include "llvm/IR/Argument.h"
69 #include "llvm/IR/Attributes.h"
70 #include "llvm/IR/BasicBlock.h"
71 #include "llvm/IR/CallingConv.h"
72 #include "llvm/IR/Constant.h"
73 #include "llvm/IR/Constants.h"
74 #include "llvm/IR/DataLayout.h"
75 #include "llvm/IR/DebugLoc.h"
76 #include "llvm/IR/DerivedTypes.h"
77 #include "llvm/IR/DiagnosticInfo.h"
78 #include "llvm/IR/Function.h"
79 #include "llvm/IR/GetElementPtrTypeIterator.h"
80 #include "llvm/IR/GlobalValue.h"
81 #include "llvm/IR/InlineAsm.h"
82 #include "llvm/IR/InstrTypes.h"
83 #include "llvm/IR/Instruction.h"
84 #include "llvm/IR/Instructions.h"
85 #include "llvm/IR/IntrinsicInst.h"
86 #include "llvm/IR/LLVMContext.h"
87 #include "llvm/IR/Mangler.h"
88 #include "llvm/IR/Metadata.h"
89 #include "llvm/IR/Module.h"
90 #include "llvm/IR/Operator.h"
91 #include "llvm/IR/PatternMatch.h"
92 #include "llvm/IR/Type.h"
93 #include "llvm/IR/User.h"
94 #include "llvm/IR/Value.h"
95 #include "llvm/MC/MCContext.h"
96 #include "llvm/MC/MCInstrDesc.h"
97 #include "llvm/Support/Casting.h"
98 #include "llvm/Support/Debug.h"
99 #include "llvm/Support/ErrorHandling.h"
100 #include "llvm/Support/MathExtras.h"
101 #include "llvm/Support/raw_ostream.h"
102 #include "llvm/Target/TargetMachine.h"
103 #include "llvm/Target/TargetOptions.h"
110 using namespace llvm
;
111 using namespace PatternMatch
;
113 #define DEBUG_TYPE "isel"
115 STATISTIC(NumFastIselSuccessIndependent
, "Number of insts selected by "
116 "target-independent selector");
117 STATISTIC(NumFastIselSuccessTarget
, "Number of insts selected by "
118 "target-specific selector");
119 STATISTIC(NumFastIselDead
, "Number of dead insts removed on failure");
121 /// Set the current block to which generated machine instructions will be
123 void FastISel::startNewBlock() {
124 assert(LocalValueMap
.empty() &&
125 "local values should be cleared after finishing a BB");
127 // Instructions are appended to FuncInfo.MBB. If the basic block already
128 // contains labels or copies, use the last instruction as the last local
130 EmitStartPt
= nullptr;
131 if (!FuncInfo
.MBB
->empty())
132 EmitStartPt
= &FuncInfo
.MBB
->back();
133 LastLocalValue
= EmitStartPt
;
136 void FastISel::finishBasicBlock() { flushLocalValueMap(); }
138 bool FastISel::lowerArguments() {
139 if (!FuncInfo
.CanLowerReturn
)
140 // Fallback to SDISel argument lowering code to deal with sret pointer
144 if (!fastLowerArguments())
147 // Enter arguments into ValueMap for uses in non-entry BBs.
148 for (Function::const_arg_iterator I
= FuncInfo
.Fn
->arg_begin(),
149 E
= FuncInfo
.Fn
->arg_end();
151 DenseMap
<const Value
*, Register
>::iterator VI
= LocalValueMap
.find(&*I
);
152 assert(VI
!= LocalValueMap
.end() && "Missed an argument?");
153 FuncInfo
.ValueMap
[&*I
] = VI
->second
;
158 /// Return the defined register if this instruction defines exactly one
159 /// virtual register and uses no other virtual registers. Otherwise return 0.
160 static Register
findLocalRegDef(MachineInstr
&MI
) {
162 for (const MachineOperand
&MO
: MI
.operands()) {
168 RegDef
= MO
.getReg();
169 } else if (MO
.getReg().isVirtual()) {
170 // This is another use of a vreg. Don't delete it.
177 static bool isRegUsedByPhiNodes(Register DefReg
,
178 FunctionLoweringInfo
&FuncInfo
) {
179 for (auto &P
: FuncInfo
.PHINodesToUpdate
)
180 if (P
.second
== DefReg
)
185 void FastISel::flushLocalValueMap() {
186 // If FastISel bails out, it could leave local value instructions behind
187 // that aren't used for anything. Detect and erase those.
188 if (LastLocalValue
!= EmitStartPt
) {
189 // Save the first instruction after local values, for later.
190 MachineBasicBlock::iterator
FirstNonValue(LastLocalValue
);
193 MachineBasicBlock::reverse_iterator RE
=
194 EmitStartPt
? MachineBasicBlock::reverse_iterator(EmitStartPt
)
195 : FuncInfo
.MBB
->rend();
196 MachineBasicBlock::reverse_iterator
RI(LastLocalValue
);
197 for (MachineInstr
&LocalMI
:
198 llvm::make_early_inc_range(llvm::make_range(RI
, RE
))) {
199 Register DefReg
= findLocalRegDef(LocalMI
);
202 if (FuncInfo
.RegsWithFixups
.count(DefReg
))
204 bool UsedByPHI
= isRegUsedByPhiNodes(DefReg
, FuncInfo
);
205 if (!UsedByPHI
&& MRI
.use_nodbg_empty(DefReg
)) {
206 if (EmitStartPt
== &LocalMI
)
207 EmitStartPt
= EmitStartPt
->getPrevNode();
208 LLVM_DEBUG(dbgs() << "removing dead local value materialization"
210 LocalMI
.eraseFromParent();
214 if (FirstNonValue
!= FuncInfo
.MBB
->end()) {
215 // See if there are any local value instructions left. If so, we want to
216 // make sure the first one has a debug location; if it doesn't, use the
217 // first non-value instruction's debug location.
219 // If EmitStartPt is non-null, this block had copies at the top before
220 // FastISel started doing anything; it points to the last one, so the
221 // first local value instruction is the one after EmitStartPt.
222 // If EmitStartPt is null, the first local value instruction is at the
224 MachineBasicBlock::iterator FirstLocalValue
=
225 EmitStartPt
? ++MachineBasicBlock::iterator(EmitStartPt
)
226 : FuncInfo
.MBB
->begin();
227 if (FirstLocalValue
!= FirstNonValue
&& !FirstLocalValue
->getDebugLoc())
228 FirstLocalValue
->setDebugLoc(FirstNonValue
->getDebugLoc());
232 LocalValueMap
.clear();
233 LastLocalValue
= EmitStartPt
;
235 SavedInsertPt
= FuncInfo
.InsertPt
;
238 Register
FastISel::getRegForValue(const Value
*V
) {
239 EVT RealVT
= TLI
.getValueType(DL
, V
->getType(), /*AllowUnknown=*/true);
240 // Don't handle non-simple values in FastISel.
241 if (!RealVT
.isSimple())
244 // Ignore illegal types. We must do this before looking up the value
245 // in ValueMap because Arguments are given virtual registers regardless
246 // of whether FastISel can handle them.
247 MVT VT
= RealVT
.getSimpleVT();
248 if (!TLI
.isTypeLegal(VT
)) {
249 // Handle integer promotions, though, because they're common and easy.
250 if (VT
== MVT::i1
|| VT
== MVT::i8
|| VT
== MVT::i16
)
251 VT
= TLI
.getTypeToTransformTo(V
->getContext(), VT
).getSimpleVT();
256 // Look up the value to see if we already have a register for it.
257 Register Reg
= lookUpRegForValue(V
);
261 // In bottom-up mode, just create the virtual register which will be used
262 // to hold the value. It will be materialized later.
263 if (isa
<Instruction
>(V
) &&
264 (!isa
<AllocaInst
>(V
) ||
265 !FuncInfo
.StaticAllocaMap
.count(cast
<AllocaInst
>(V
))))
266 return FuncInfo
.InitializeRegForValue(V
);
268 SavePoint SaveInsertPt
= enterLocalValueArea();
270 // Materialize the value in a register. Emit any instructions in the
272 Reg
= materializeRegForValue(V
, VT
);
274 leaveLocalValueArea(SaveInsertPt
);
279 Register
FastISel::materializeConstant(const Value
*V
, MVT VT
) {
281 if (const auto *CI
= dyn_cast
<ConstantInt
>(V
)) {
282 if (CI
->getValue().getActiveBits() <= 64)
283 Reg
= fastEmit_i(VT
, VT
, ISD::Constant
, CI
->getZExtValue());
284 } else if (isa
<AllocaInst
>(V
))
285 Reg
= fastMaterializeAlloca(cast
<AllocaInst
>(V
));
286 else if (isa
<ConstantPointerNull
>(V
))
287 // Translate this as an integer zero so that it can be
288 // local-CSE'd with actual integer zeros.
290 getRegForValue(Constant::getNullValue(DL
.getIntPtrType(V
->getType())));
291 else if (const auto *CF
= dyn_cast
<ConstantFP
>(V
)) {
292 if (CF
->isNullValue())
293 Reg
= fastMaterializeFloatZero(CF
);
295 // Try to emit the constant directly.
296 Reg
= fastEmit_f(VT
, VT
, ISD::ConstantFP
, CF
);
299 // Try to emit the constant by using an integer constant with a cast.
300 const APFloat
&Flt
= CF
->getValueAPF();
301 EVT IntVT
= TLI
.getPointerTy(DL
);
302 uint32_t IntBitWidth
= IntVT
.getSizeInBits();
303 APSInt
SIntVal(IntBitWidth
, /*isUnsigned=*/false);
305 (void)Flt
.convertToInteger(SIntVal
, APFloat::rmTowardZero
, &isExact
);
307 Register IntegerReg
=
308 getRegForValue(ConstantInt::get(V
->getContext(), SIntVal
));
310 Reg
= fastEmit_r(IntVT
.getSimpleVT(), VT
, ISD::SINT_TO_FP
,
314 } else if (const auto *Op
= dyn_cast
<Operator
>(V
)) {
315 if (!selectOperator(Op
, Op
->getOpcode()))
316 if (!isa
<Instruction
>(Op
) ||
317 !fastSelectInstruction(cast
<Instruction
>(Op
)))
319 Reg
= lookUpRegForValue(Op
);
320 } else if (isa
<UndefValue
>(V
)) {
321 Reg
= createResultReg(TLI
.getRegClassFor(VT
));
322 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
,
323 TII
.get(TargetOpcode::IMPLICIT_DEF
), Reg
);
328 /// Helper for getRegForValue. This function is called when the value isn't
329 /// already available in a register and must be materialized with new
331 Register
FastISel::materializeRegForValue(const Value
*V
, MVT VT
) {
333 // Give the target-specific code a try first.
334 if (isa
<Constant
>(V
))
335 Reg
= fastMaterializeConstant(cast
<Constant
>(V
));
337 // If target-specific code couldn't or didn't want to handle the value, then
338 // give target-independent code a try.
340 Reg
= materializeConstant(V
, VT
);
342 // Don't cache constant materializations in the general ValueMap.
343 // To do so would require tracking what uses they dominate.
345 LocalValueMap
[V
] = Reg
;
346 LastLocalValue
= MRI
.getVRegDef(Reg
);
351 Register
FastISel::lookUpRegForValue(const Value
*V
) {
352 // Look up the value to see if we already have a register for it. We
353 // cache values defined by Instructions across blocks, and other values
354 // only locally. This is because Instructions already have the SSA
355 // def-dominates-use requirement enforced.
356 DenseMap
<const Value
*, Register
>::iterator I
= FuncInfo
.ValueMap
.find(V
);
357 if (I
!= FuncInfo
.ValueMap
.end())
359 return LocalValueMap
[V
];
362 void FastISel::updateValueMap(const Value
*I
, Register Reg
, unsigned NumRegs
) {
363 if (!isa
<Instruction
>(I
)) {
364 LocalValueMap
[I
] = Reg
;
368 Register
&AssignedReg
= FuncInfo
.ValueMap
[I
];
370 // Use the new register.
372 else if (Reg
!= AssignedReg
) {
373 // Arrange for uses of AssignedReg to be replaced by uses of Reg.
374 for (unsigned i
= 0; i
< NumRegs
; i
++) {
375 FuncInfo
.RegFixups
[AssignedReg
+ i
] = Reg
+ i
;
376 FuncInfo
.RegsWithFixups
.insert(Reg
+ i
);
383 Register
FastISel::getRegForGEPIndex(MVT PtrVT
, const Value
*Idx
) {
384 Register IdxN
= getRegForValue(Idx
);
386 // Unhandled operand. Halt "fast" selection and bail.
389 // If the index is smaller or larger than intptr_t, truncate or extend it.
390 EVT IdxVT
= EVT::getEVT(Idx
->getType(), /*HandleUnknown=*/false);
391 if (IdxVT
.bitsLT(PtrVT
)) {
392 IdxN
= fastEmit_r(IdxVT
.getSimpleVT(), PtrVT
, ISD::SIGN_EXTEND
, IdxN
);
393 } else if (IdxVT
.bitsGT(PtrVT
)) {
395 fastEmit_r(IdxVT
.getSimpleVT(), PtrVT
, ISD::TRUNCATE
, IdxN
);
400 void FastISel::recomputeInsertPt() {
401 if (getLastLocalValue()) {
402 FuncInfo
.InsertPt
= getLastLocalValue();
403 FuncInfo
.MBB
= FuncInfo
.InsertPt
->getParent();
406 FuncInfo
.InsertPt
= FuncInfo
.MBB
->getFirstNonPHI();
409 void FastISel::removeDeadCode(MachineBasicBlock::iterator I
,
410 MachineBasicBlock::iterator E
) {
411 assert(I
.isValid() && E
.isValid() && std::distance(I
, E
) > 0 &&
412 "Invalid iterator!");
414 if (SavedInsertPt
== I
)
416 if (EmitStartPt
== I
)
417 EmitStartPt
= E
.isValid() ? &*E
: nullptr;
418 if (LastLocalValue
== I
)
419 LastLocalValue
= E
.isValid() ? &*E
: nullptr;
421 MachineInstr
*Dead
= &*I
;
423 Dead
->eraseFromParent();
429 FastISel::SavePoint
FastISel::enterLocalValueArea() {
430 SavePoint OldInsertPt
= FuncInfo
.InsertPt
;
435 void FastISel::leaveLocalValueArea(SavePoint OldInsertPt
) {
436 if (FuncInfo
.InsertPt
!= FuncInfo
.MBB
->begin())
437 LastLocalValue
= &*std::prev(FuncInfo
.InsertPt
);
439 // Restore the previous insert position.
440 FuncInfo
.InsertPt
= OldInsertPt
;
443 bool FastISel::selectBinaryOp(const User
*I
, unsigned ISDOpcode
) {
444 EVT VT
= EVT::getEVT(I
->getType(), /*HandleUnknown=*/true);
445 if (VT
== MVT::Other
|| !VT
.isSimple())
446 // Unhandled type. Halt "fast" selection and bail.
449 // We only handle legal types. For example, on x86-32 the instruction
450 // selector contains all of the 64-bit instructions from x86-64,
451 // under the assumption that i64 won't be used if the target doesn't
453 if (!TLI
.isTypeLegal(VT
)) {
454 // MVT::i1 is special. Allow AND, OR, or XOR because they
455 // don't require additional zeroing, which makes them easy.
456 if (VT
== MVT::i1
&& ISD::isBitwiseLogicOp(ISDOpcode
))
457 VT
= TLI
.getTypeToTransformTo(I
->getContext(), VT
);
462 // Check if the first operand is a constant, and handle it as "ri". At -O0,
463 // we don't have anything that canonicalizes operand order.
464 if (const auto *CI
= dyn_cast
<ConstantInt
>(I
->getOperand(0)))
465 if (isa
<Instruction
>(I
) && cast
<Instruction
>(I
)->isCommutative()) {
466 Register Op1
= getRegForValue(I
->getOperand(1));
471 fastEmit_ri_(VT
.getSimpleVT(), ISDOpcode
, Op1
, CI
->getZExtValue(),
476 // We successfully emitted code for the given LLVM Instruction.
477 updateValueMap(I
, ResultReg
);
481 Register Op0
= getRegForValue(I
->getOperand(0));
482 if (!Op0
) // Unhandled operand. Halt "fast" selection and bail.
485 // Check if the second operand is a constant and handle it appropriately.
486 if (const auto *CI
= dyn_cast
<ConstantInt
>(I
->getOperand(1))) {
487 uint64_t Imm
= CI
->getSExtValue();
489 // Transform "sdiv exact X, 8" -> "sra X, 3".
490 if (ISDOpcode
== ISD::SDIV
&& isa
<BinaryOperator
>(I
) &&
491 cast
<BinaryOperator
>(I
)->isExact() && isPowerOf2_64(Imm
)) {
493 ISDOpcode
= ISD::SRA
;
496 // Transform "urem x, pow2" -> "and x, pow2-1".
497 if (ISDOpcode
== ISD::UREM
&& isa
<BinaryOperator
>(I
) &&
498 isPowerOf2_64(Imm
)) {
500 ISDOpcode
= ISD::AND
;
503 Register ResultReg
= fastEmit_ri_(VT
.getSimpleVT(), ISDOpcode
, Op0
, Imm
,
508 // We successfully emitted code for the given LLVM Instruction.
509 updateValueMap(I
, ResultReg
);
513 Register Op1
= getRegForValue(I
->getOperand(1));
514 if (!Op1
) // Unhandled operand. Halt "fast" selection and bail.
517 // Now we have both operands in registers. Emit the instruction.
518 Register ResultReg
= fastEmit_rr(VT
.getSimpleVT(), VT
.getSimpleVT(),
519 ISDOpcode
, Op0
, Op1
);
521 // Target-specific code wasn't able to find a machine opcode for
522 // the given ISD opcode and type. Halt "fast" selection and bail.
525 // We successfully emitted code for the given LLVM Instruction.
526 updateValueMap(I
, ResultReg
);
530 bool FastISel::selectGetElementPtr(const User
*I
) {
531 Register N
= getRegForValue(I
->getOperand(0));
532 if (!N
) // Unhandled operand. Halt "fast" selection and bail.
535 // FIXME: The code below does not handle vector GEPs. Halt "fast" selection
537 if (isa
<VectorType
>(I
->getType()))
540 // Keep a running tab of the total offset to coalesce multiple N = N + Offset
541 // into a single N = N + TotalOffset.
542 uint64_t TotalOffs
= 0;
543 // FIXME: What's a good SWAG number for MaxOffs?
544 uint64_t MaxOffs
= 2048;
545 MVT VT
= TLI
.getValueType(DL
, I
->getType()).getSimpleVT();
547 for (gep_type_iterator GTI
= gep_type_begin(I
), E
= gep_type_end(I
);
549 const Value
*Idx
= GTI
.getOperand();
550 if (StructType
*StTy
= GTI
.getStructTypeOrNull()) {
551 uint64_t Field
= cast
<ConstantInt
>(Idx
)->getZExtValue();
554 TotalOffs
+= DL
.getStructLayout(StTy
)->getElementOffset(Field
);
555 if (TotalOffs
>= MaxOffs
) {
556 N
= fastEmit_ri_(VT
, ISD::ADD
, N
, TotalOffs
, VT
);
557 if (!N
) // Unhandled operand. Halt "fast" selection and bail.
563 // If this is a constant subscript, handle it quickly.
564 if (const auto *CI
= dyn_cast
<ConstantInt
>(Idx
)) {
568 uint64_t IdxN
= CI
->getValue().sextOrTrunc(64).getSExtValue();
569 TotalOffs
+= GTI
.getSequentialElementStride(DL
) * IdxN
;
570 if (TotalOffs
>= MaxOffs
) {
571 N
= fastEmit_ri_(VT
, ISD::ADD
, N
, TotalOffs
, VT
);
572 if (!N
) // Unhandled operand. Halt "fast" selection and bail.
579 N
= fastEmit_ri_(VT
, ISD::ADD
, N
, TotalOffs
, VT
);
580 if (!N
) // Unhandled operand. Halt "fast" selection and bail.
585 // N = N + Idx * ElementSize;
586 uint64_t ElementSize
= GTI
.getSequentialElementStride(DL
);
587 Register IdxN
= getRegForGEPIndex(VT
, Idx
);
588 if (!IdxN
) // Unhandled operand. Halt "fast" selection and bail.
591 if (ElementSize
!= 1) {
592 IdxN
= fastEmit_ri_(VT
, ISD::MUL
, IdxN
, ElementSize
, VT
);
593 if (!IdxN
) // Unhandled operand. Halt "fast" selection and bail.
596 N
= fastEmit_rr(VT
, VT
, ISD::ADD
, N
, IdxN
);
597 if (!N
) // Unhandled operand. Halt "fast" selection and bail.
602 N
= fastEmit_ri_(VT
, ISD::ADD
, N
, TotalOffs
, VT
);
603 if (!N
) // Unhandled operand. Halt "fast" selection and bail.
607 // We successfully emitted code for the given LLVM Instruction.
608 updateValueMap(I
, N
);
612 bool FastISel::addStackMapLiveVars(SmallVectorImpl
<MachineOperand
> &Ops
,
613 const CallInst
*CI
, unsigned StartIdx
) {
614 for (unsigned i
= StartIdx
, e
= CI
->arg_size(); i
!= e
; ++i
) {
615 Value
*Val
= CI
->getArgOperand(i
);
616 // Check for constants and encode them with a StackMaps::ConstantOp prefix.
617 if (const auto *C
= dyn_cast
<ConstantInt
>(Val
)) {
618 Ops
.push_back(MachineOperand::CreateImm(StackMaps::ConstantOp
));
619 Ops
.push_back(MachineOperand::CreateImm(C
->getSExtValue()));
620 } else if (isa
<ConstantPointerNull
>(Val
)) {
621 Ops
.push_back(MachineOperand::CreateImm(StackMaps::ConstantOp
));
622 Ops
.push_back(MachineOperand::CreateImm(0));
623 } else if (auto *AI
= dyn_cast
<AllocaInst
>(Val
)) {
624 // Values coming from a stack location also require a special encoding,
625 // but that is added later on by the target specific frame index
626 // elimination implementation.
627 auto SI
= FuncInfo
.StaticAllocaMap
.find(AI
);
628 if (SI
!= FuncInfo
.StaticAllocaMap
.end())
629 Ops
.push_back(MachineOperand::CreateFI(SI
->second
));
633 Register Reg
= getRegForValue(Val
);
636 Ops
.push_back(MachineOperand::CreateReg(Reg
, /*isDef=*/false));
642 bool FastISel::selectStackmap(const CallInst
*I
) {
643 // void @llvm.experimental.stackmap(i64 <id>, i32 <numShadowBytes>,
644 // [live variables...])
645 assert(I
->getCalledFunction()->getReturnType()->isVoidTy() &&
646 "Stackmap cannot return a value.");
648 // The stackmap intrinsic only records the live variables (the arguments
649 // passed to it) and emits NOPS (if requested). Unlike the patchpoint
650 // intrinsic, this won't be lowered to a function call. This means we don't
651 // have to worry about calling conventions and target-specific lowering code.
652 // Instead we perform the call lowering right here.
654 // CALLSEQ_START(0, 0...)
655 // STACKMAP(id, nbytes, ...)
658 SmallVector
<MachineOperand
, 32> Ops
;
660 // Add the <id> and <numBytes> constants.
661 assert(isa
<ConstantInt
>(I
->getOperand(PatchPointOpers::IDPos
)) &&
662 "Expected a constant integer.");
663 const auto *ID
= cast
<ConstantInt
>(I
->getOperand(PatchPointOpers::IDPos
));
664 Ops
.push_back(MachineOperand::CreateImm(ID
->getZExtValue()));
666 assert(isa
<ConstantInt
>(I
->getOperand(PatchPointOpers::NBytesPos
)) &&
667 "Expected a constant integer.");
668 const auto *NumBytes
=
669 cast
<ConstantInt
>(I
->getOperand(PatchPointOpers::NBytesPos
));
670 Ops
.push_back(MachineOperand::CreateImm(NumBytes
->getZExtValue()));
672 // Push live variables for the stack map (skipping the first two arguments
673 // <id> and <numBytes>).
674 if (!addStackMapLiveVars(Ops
, I
, 2))
677 // We are not adding any register mask info here, because the stackmap doesn't
680 // Add scratch registers as implicit def and early clobber.
681 CallingConv::ID CC
= I
->getCallingConv();
682 const MCPhysReg
*ScratchRegs
= TLI
.getScratchRegisters(CC
);
683 for (unsigned i
= 0; ScratchRegs
[i
]; ++i
)
684 Ops
.push_back(MachineOperand::CreateReg(
685 ScratchRegs
[i
], /*isDef=*/true, /*isImp=*/true, /*isKill=*/false,
686 /*isDead=*/false, /*isUndef=*/false, /*isEarlyClobber=*/true));
688 // Issue CALLSEQ_START
689 unsigned AdjStackDown
= TII
.getCallFrameSetupOpcode();
691 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, TII
.get(AdjStackDown
));
692 const MCInstrDesc
&MCID
= Builder
.getInstr()->getDesc();
693 for (unsigned I
= 0, E
= MCID
.getNumOperands(); I
< E
; ++I
)
697 MachineInstrBuilder MIB
= BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
,
698 TII
.get(TargetOpcode::STACKMAP
));
699 for (auto const &MO
: Ops
)
703 unsigned AdjStackUp
= TII
.getCallFrameDestroyOpcode();
704 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, TII
.get(AdjStackUp
))
708 // Inform the Frame Information that we have a stackmap in this function.
709 FuncInfo
.MF
->getFrameInfo().setHasStackMap();
714 /// Lower an argument list according to the target calling convention.
716 /// This is a helper for lowering intrinsics that follow a target calling
717 /// convention or require stack pointer adjustment. Only a subset of the
718 /// intrinsic's operands need to participate in the calling convention.
719 bool FastISel::lowerCallOperands(const CallInst
*CI
, unsigned ArgIdx
,
720 unsigned NumArgs
, const Value
*Callee
,
721 bool ForceRetVoidTy
, CallLoweringInfo
&CLI
) {
723 Args
.reserve(NumArgs
);
725 // Populate the argument list.
726 for (unsigned ArgI
= ArgIdx
, ArgE
= ArgIdx
+ NumArgs
; ArgI
!= ArgE
; ++ArgI
) {
727 Value
*V
= CI
->getOperand(ArgI
);
729 assert(!V
->getType()->isEmptyTy() && "Empty type passed to intrinsic.");
733 Entry
.Ty
= V
->getType();
734 Entry
.setAttributes(CI
, ArgI
);
735 Args
.push_back(Entry
);
738 Type
*RetTy
= ForceRetVoidTy
? Type::getVoidTy(CI
->getType()->getContext())
740 CLI
.setCallee(CI
->getCallingConv(), RetTy
, Callee
, std::move(Args
), NumArgs
);
742 return lowerCallTo(CLI
);
745 FastISel::CallLoweringInfo
&FastISel::CallLoweringInfo::setCallee(
746 const DataLayout
&DL
, MCContext
&Ctx
, CallingConv::ID CC
, Type
*ResultTy
,
747 StringRef Target
, ArgListTy
&&ArgsList
, unsigned FixedArgs
) {
748 SmallString
<32> MangledName
;
749 Mangler::getNameWithPrefix(MangledName
, Target
, DL
);
750 MCSymbol
*Sym
= Ctx
.getOrCreateSymbol(MangledName
);
751 return setCallee(CC
, ResultTy
, Sym
, std::move(ArgsList
), FixedArgs
);
754 bool FastISel::selectPatchpoint(const CallInst
*I
) {
755 // <ty> @llvm.experimental.patchpoint.<ty>(i64 <id>,
760 // [live variables...])
761 CallingConv::ID CC
= I
->getCallingConv();
762 bool IsAnyRegCC
= CC
== CallingConv::AnyReg
;
763 bool HasDef
= !I
->getType()->isVoidTy();
764 Value
*Callee
= I
->getOperand(PatchPointOpers::TargetPos
)->stripPointerCasts();
766 // Check if we can lower the return type when using anyregcc.
768 if (IsAnyRegCC
&& HasDef
) {
769 ValueType
= TLI
.getSimpleValueType(DL
, I
->getType(), /*AllowUnknown=*/true);
770 if (ValueType
== MVT::Other
)
774 // Get the real number of arguments participating in the call <numArgs>
775 assert(isa
<ConstantInt
>(I
->getOperand(PatchPointOpers::NArgPos
)) &&
776 "Expected a constant integer.");
777 const auto *NumArgsVal
=
778 cast
<ConstantInt
>(I
->getOperand(PatchPointOpers::NArgPos
));
779 unsigned NumArgs
= NumArgsVal
->getZExtValue();
781 // Skip the four meta args: <id>, <numNopBytes>, <target>, <numArgs>
782 // This includes all meta-operands up to but not including CC.
783 unsigned NumMetaOpers
= PatchPointOpers::CCPos
;
784 assert(I
->arg_size() >= NumMetaOpers
+ NumArgs
&&
785 "Not enough arguments provided to the patchpoint intrinsic");
787 // For AnyRegCC the arguments are lowered later on manually.
788 unsigned NumCallArgs
= IsAnyRegCC
? 0 : NumArgs
;
789 CallLoweringInfo CLI
;
790 CLI
.setIsPatchPoint();
791 if (!lowerCallOperands(I
, NumMetaOpers
, NumCallArgs
, Callee
, IsAnyRegCC
, CLI
))
794 assert(CLI
.Call
&& "No call instruction specified.");
796 SmallVector
<MachineOperand
, 32> Ops
;
798 // Add an explicit result reg if we use the anyreg calling convention.
799 if (IsAnyRegCC
&& HasDef
) {
800 assert(CLI
.NumResultRegs
== 0 && "Unexpected result register.");
801 assert(ValueType
.isValid());
802 CLI
.ResultReg
= createResultReg(TLI
.getRegClassFor(ValueType
));
803 CLI
.NumResultRegs
= 1;
804 Ops
.push_back(MachineOperand::CreateReg(CLI
.ResultReg
, /*isDef=*/true));
807 // Add the <id> and <numBytes> constants.
808 assert(isa
<ConstantInt
>(I
->getOperand(PatchPointOpers::IDPos
)) &&
809 "Expected a constant integer.");
810 const auto *ID
= cast
<ConstantInt
>(I
->getOperand(PatchPointOpers::IDPos
));
811 Ops
.push_back(MachineOperand::CreateImm(ID
->getZExtValue()));
813 assert(isa
<ConstantInt
>(I
->getOperand(PatchPointOpers::NBytesPos
)) &&
814 "Expected a constant integer.");
815 const auto *NumBytes
=
816 cast
<ConstantInt
>(I
->getOperand(PatchPointOpers::NBytesPos
));
817 Ops
.push_back(MachineOperand::CreateImm(NumBytes
->getZExtValue()));
819 // Add the call target.
820 if (const auto *C
= dyn_cast
<IntToPtrInst
>(Callee
)) {
821 uint64_t CalleeConstAddr
=
822 cast
<ConstantInt
>(C
->getOperand(0))->getZExtValue();
823 Ops
.push_back(MachineOperand::CreateImm(CalleeConstAddr
));
824 } else if (const auto *C
= dyn_cast
<ConstantExpr
>(Callee
)) {
825 if (C
->getOpcode() == Instruction::IntToPtr
) {
826 uint64_t CalleeConstAddr
=
827 cast
<ConstantInt
>(C
->getOperand(0))->getZExtValue();
828 Ops
.push_back(MachineOperand::CreateImm(CalleeConstAddr
));
830 llvm_unreachable("Unsupported ConstantExpr.");
831 } else if (const auto *GV
= dyn_cast
<GlobalValue
>(Callee
)) {
832 Ops
.push_back(MachineOperand::CreateGA(GV
, 0));
833 } else if (isa
<ConstantPointerNull
>(Callee
))
834 Ops
.push_back(MachineOperand::CreateImm(0));
836 llvm_unreachable("Unsupported callee address.");
838 // Adjust <numArgs> to account for any arguments that have been passed on
839 // the stack instead.
840 unsigned NumCallRegArgs
= IsAnyRegCC
? NumArgs
: CLI
.OutRegs
.size();
841 Ops
.push_back(MachineOperand::CreateImm(NumCallRegArgs
));
843 // Add the calling convention
844 Ops
.push_back(MachineOperand::CreateImm((unsigned)CC
));
846 // Add the arguments we omitted previously. The register allocator should
847 // place these in any free register.
849 for (unsigned i
= NumMetaOpers
, e
= NumMetaOpers
+ NumArgs
; i
!= e
; ++i
) {
850 Register Reg
= getRegForValue(I
->getArgOperand(i
));
853 Ops
.push_back(MachineOperand::CreateReg(Reg
, /*isDef=*/false));
857 // Push the arguments from the call instruction.
858 for (auto Reg
: CLI
.OutRegs
)
859 Ops
.push_back(MachineOperand::CreateReg(Reg
, /*isDef=*/false));
861 // Push live variables for the stack map.
862 if (!addStackMapLiveVars(Ops
, I
, NumMetaOpers
+ NumArgs
))
865 // Push the register mask info.
866 Ops
.push_back(MachineOperand::CreateRegMask(
867 TRI
.getCallPreservedMask(*FuncInfo
.MF
, CC
)));
869 // Add scratch registers as implicit def and early clobber.
870 const MCPhysReg
*ScratchRegs
= TLI
.getScratchRegisters(CC
);
871 for (unsigned i
= 0; ScratchRegs
[i
]; ++i
)
872 Ops
.push_back(MachineOperand::CreateReg(
873 ScratchRegs
[i
], /*isDef=*/true, /*isImp=*/true, /*isKill=*/false,
874 /*isDead=*/false, /*isUndef=*/false, /*isEarlyClobber=*/true));
876 // Add implicit defs (return values).
877 for (auto Reg
: CLI
.InRegs
)
878 Ops
.push_back(MachineOperand::CreateReg(Reg
, /*isDef=*/true,
881 // Insert the patchpoint instruction before the call generated by the target.
882 MachineInstrBuilder MIB
= BuildMI(*FuncInfo
.MBB
, CLI
.Call
, MIMD
,
883 TII
.get(TargetOpcode::PATCHPOINT
));
888 MIB
->setPhysRegsDeadExcept(CLI
.InRegs
, TRI
);
890 // Delete the original call instruction.
891 CLI
.Call
->eraseFromParent();
893 // Inform the Frame Information that we have a patchpoint in this function.
894 FuncInfo
.MF
->getFrameInfo().setHasPatchPoint();
896 if (CLI
.NumResultRegs
)
897 updateValueMap(I
, CLI
.ResultReg
, CLI
.NumResultRegs
);
901 bool FastISel::selectXRayCustomEvent(const CallInst
*I
) {
902 const auto &Triple
= TM
.getTargetTriple();
903 if (Triple
.isAArch64(64) && Triple
.getArch() != Triple::x86_64
)
904 return true; // don't do anything to this instruction.
905 SmallVector
<MachineOperand
, 8> Ops
;
906 Ops
.push_back(MachineOperand::CreateReg(getRegForValue(I
->getArgOperand(0)),
908 Ops
.push_back(MachineOperand::CreateReg(getRegForValue(I
->getArgOperand(1)),
910 MachineInstrBuilder MIB
=
911 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
,
912 TII
.get(TargetOpcode::PATCHABLE_EVENT_CALL
));
916 // Insert the Patchable Event Call instruction, that gets lowered properly.
920 bool FastISel::selectXRayTypedEvent(const CallInst
*I
) {
921 const auto &Triple
= TM
.getTargetTriple();
922 if (Triple
.isAArch64(64) && Triple
.getArch() != Triple::x86_64
)
923 return true; // don't do anything to this instruction.
924 SmallVector
<MachineOperand
, 8> Ops
;
925 Ops
.push_back(MachineOperand::CreateReg(getRegForValue(I
->getArgOperand(0)),
927 Ops
.push_back(MachineOperand::CreateReg(getRegForValue(I
->getArgOperand(1)),
929 Ops
.push_back(MachineOperand::CreateReg(getRegForValue(I
->getArgOperand(2)),
931 MachineInstrBuilder MIB
=
932 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
,
933 TII
.get(TargetOpcode::PATCHABLE_TYPED_EVENT_CALL
));
937 // Insert the Patchable Typed Event Call instruction, that gets lowered properly.
941 /// Returns an AttributeList representing the attributes applied to the return
942 /// value of the given call.
943 static AttributeList
getReturnAttrs(FastISel::CallLoweringInfo
&CLI
) {
944 SmallVector
<Attribute::AttrKind
, 2> Attrs
;
946 Attrs
.push_back(Attribute::SExt
);
948 Attrs
.push_back(Attribute::ZExt
);
950 Attrs
.push_back(Attribute::InReg
);
952 return AttributeList::get(CLI
.RetTy
->getContext(), AttributeList::ReturnIndex
,
956 bool FastISel::lowerCallTo(const CallInst
*CI
, const char *SymName
,
958 MCContext
&Ctx
= MF
->getContext();
959 SmallString
<32> MangledName
;
960 Mangler::getNameWithPrefix(MangledName
, SymName
, DL
);
961 MCSymbol
*Sym
= Ctx
.getOrCreateSymbol(MangledName
);
962 return lowerCallTo(CI
, Sym
, NumArgs
);
965 bool FastISel::lowerCallTo(const CallInst
*CI
, MCSymbol
*Symbol
,
967 FunctionType
*FTy
= CI
->getFunctionType();
968 Type
*RetTy
= CI
->getType();
971 Args
.reserve(NumArgs
);
973 // Populate the argument list.
974 // Attributes for args start at offset 1, after the return attribute.
975 for (unsigned ArgI
= 0; ArgI
!= NumArgs
; ++ArgI
) {
976 Value
*V
= CI
->getOperand(ArgI
);
978 assert(!V
->getType()->isEmptyTy() && "Empty type passed to intrinsic.");
982 Entry
.Ty
= V
->getType();
983 Entry
.setAttributes(CI
, ArgI
);
984 Args
.push_back(Entry
);
986 TLI
.markLibCallAttributes(MF
, CI
->getCallingConv(), Args
);
988 CallLoweringInfo CLI
;
989 CLI
.setCallee(RetTy
, FTy
, Symbol
, std::move(Args
), *CI
, NumArgs
);
991 return lowerCallTo(CLI
);
994 bool FastISel::lowerCallTo(CallLoweringInfo
&CLI
) {
995 // Handle the incoming return values from the call.
997 SmallVector
<EVT
, 4> RetTys
;
998 ComputeValueVTs(TLI
, DL
, CLI
.RetTy
, RetTys
);
1000 SmallVector
<ISD::OutputArg
, 4> Outs
;
1001 GetReturnInfo(CLI
.CallConv
, CLI
.RetTy
, getReturnAttrs(CLI
), Outs
, TLI
, DL
);
1003 bool CanLowerReturn
= TLI
.CanLowerReturn(
1004 CLI
.CallConv
, *FuncInfo
.MF
, CLI
.IsVarArg
, Outs
, CLI
.RetTy
->getContext());
1006 // FIXME: sret demotion isn't supported yet - bail out.
1007 if (!CanLowerReturn
)
1010 for (EVT VT
: RetTys
) {
1011 MVT RegisterVT
= TLI
.getRegisterType(CLI
.RetTy
->getContext(), VT
);
1012 unsigned NumRegs
= TLI
.getNumRegisters(CLI
.RetTy
->getContext(), VT
);
1013 for (unsigned i
= 0; i
!= NumRegs
; ++i
) {
1014 ISD::InputArg MyFlags
;
1015 MyFlags
.VT
= RegisterVT
;
1017 MyFlags
.Used
= CLI
.IsReturnValueUsed
;
1019 MyFlags
.Flags
.setSExt();
1021 MyFlags
.Flags
.setZExt();
1023 MyFlags
.Flags
.setInReg();
1024 CLI
.Ins
.push_back(MyFlags
);
1028 // Handle all of the outgoing arguments.
1030 for (auto &Arg
: CLI
.getArgs()) {
1031 Type
*FinalType
= Arg
.Ty
;
1033 FinalType
= Arg
.IndirectType
;
1034 bool NeedsRegBlock
= TLI
.functionArgumentNeedsConsecutiveRegisters(
1035 FinalType
, CLI
.CallConv
, CLI
.IsVarArg
, DL
);
1037 ISD::ArgFlagsTy Flags
;
1046 if (Arg
.IsSwiftSelf
)
1047 Flags
.setSwiftSelf();
1048 if (Arg
.IsSwiftAsync
)
1049 Flags
.setSwiftAsync();
1050 if (Arg
.IsSwiftError
)
1051 Flags
.setSwiftError();
1052 if (Arg
.IsCFGuardTarget
)
1053 Flags
.setCFGuardTarget();
1056 if (Arg
.IsInAlloca
) {
1057 Flags
.setInAlloca();
1058 // Set the byval flag for CCAssignFn callbacks that don't know about
1059 // inalloca. This way we can know how many bytes we should've allocated
1060 // and how many bytes a callee cleanup function will pop. If we port
1061 // inalloca to more targets, we'll have to add custom inalloca handling in
1062 // the various CC lowering callbacks.
1065 if (Arg
.IsPreallocated
) {
1066 Flags
.setPreallocated();
1067 // Set the byval flag for CCAssignFn callbacks that don't know about
1068 // preallocated. This way we can know how many bytes we should've
1069 // allocated and how many bytes a callee cleanup function will pop. If we
1070 // port preallocated to more targets, we'll have to add custom
1071 // preallocated handling in the various CC lowering callbacks.
1074 MaybeAlign MemAlign
= Arg
.Alignment
;
1075 if (Arg
.IsByVal
|| Arg
.IsInAlloca
|| Arg
.IsPreallocated
) {
1076 unsigned FrameSize
= DL
.getTypeAllocSize(Arg
.IndirectType
);
1078 // For ByVal, alignment should come from FE. BE will guess if this info
1079 // is not there, but there are cases it cannot get right.
1081 MemAlign
= TLI
.getByValTypeAlignment(Arg
.IndirectType
, DL
);
1082 Flags
.setByValSize(FrameSize
);
1083 } else if (!MemAlign
) {
1084 MemAlign
= DL
.getABITypeAlign(Arg
.Ty
);
1086 Flags
.setMemAlign(*MemAlign
);
1090 Flags
.setInConsecutiveRegs();
1091 Flags
.setOrigAlign(DL
.getABITypeAlign(Arg
.Ty
));
1092 CLI
.OutVals
.push_back(Arg
.Val
);
1093 CLI
.OutFlags
.push_back(Flags
);
1096 if (!fastLowerCall(CLI
))
1099 // Set all unused physreg defs as dead.
1100 assert(CLI
.Call
&& "No call instruction specified.");
1101 CLI
.Call
->setPhysRegsDeadExcept(CLI
.InRegs
, TRI
);
1103 if (CLI
.NumResultRegs
&& CLI
.CB
)
1104 updateValueMap(CLI
.CB
, CLI
.ResultReg
, CLI
.NumResultRegs
);
1106 // Set labels for heapallocsite call.
1108 if (MDNode
*MD
= CLI
.CB
->getMetadata("heapallocsite"))
1109 CLI
.Call
->setHeapAllocMarker(*MF
, MD
);
1114 bool FastISel::lowerCall(const CallInst
*CI
) {
1115 FunctionType
*FuncTy
= CI
->getFunctionType();
1116 Type
*RetTy
= CI
->getType();
1120 Args
.reserve(CI
->arg_size());
1122 for (auto i
= CI
->arg_begin(), e
= CI
->arg_end(); i
!= e
; ++i
) {
1126 if (V
->getType()->isEmptyTy())
1130 Entry
.Ty
= V
->getType();
1132 // Skip the first return-type Attribute to get to params.
1133 Entry
.setAttributes(CI
, i
- CI
->arg_begin());
1134 Args
.push_back(Entry
);
1137 // Check if target-independent constraints permit a tail call here.
1138 // Target-dependent constraints are checked within fastLowerCall.
1139 bool IsTailCall
= CI
->isTailCall();
1140 if (IsTailCall
&& !isInTailCallPosition(*CI
, TM
))
1142 if (IsTailCall
&& !CI
->isMustTailCall() &&
1143 MF
->getFunction().getFnAttribute("disable-tail-calls").getValueAsBool())
1146 CallLoweringInfo CLI
;
1147 CLI
.setCallee(RetTy
, FuncTy
, CI
->getCalledOperand(), std::move(Args
), *CI
)
1148 .setTailCall(IsTailCall
);
1150 diagnoseDontCall(*CI
);
1152 return lowerCallTo(CLI
);
1155 bool FastISel::selectCall(const User
*I
) {
1156 const CallInst
*Call
= cast
<CallInst
>(I
);
1158 // Handle simple inline asms.
1159 if (const InlineAsm
*IA
= dyn_cast
<InlineAsm
>(Call
->getCalledOperand())) {
1160 // Don't attempt to handle constraints.
1161 if (!IA
->getConstraintString().empty())
1164 unsigned ExtraInfo
= 0;
1165 if (IA
->hasSideEffects())
1166 ExtraInfo
|= InlineAsm::Extra_HasSideEffects
;
1167 if (IA
->isAlignStack())
1168 ExtraInfo
|= InlineAsm::Extra_IsAlignStack
;
1169 if (Call
->isConvergent())
1170 ExtraInfo
|= InlineAsm::Extra_IsConvergent
;
1171 ExtraInfo
|= IA
->getDialect() * InlineAsm::Extra_AsmDialect
;
1173 MachineInstrBuilder MIB
= BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
,
1174 TII
.get(TargetOpcode::INLINEASM
));
1175 MIB
.addExternalSymbol(IA
->getAsmString().c_str());
1176 MIB
.addImm(ExtraInfo
);
1178 const MDNode
*SrcLoc
= Call
->getMetadata("srcloc");
1180 MIB
.addMetadata(SrcLoc
);
1185 // Handle intrinsic function calls.
1186 if (const auto *II
= dyn_cast
<IntrinsicInst
>(Call
))
1187 return selectIntrinsicCall(II
);
1189 return lowerCall(Call
);
1192 void FastISel::handleDbgInfo(const Instruction
*II
) {
1193 if (!II
->hasDbgRecords())
1196 // Clear any metadata.
1197 MIMD
= MIMetadata();
1199 // Reverse order of debug records, because fast-isel walks through backwards.
1200 for (DbgRecord
&DR
: llvm::reverse(II
->getDbgRecordRange())) {
1201 flushLocalValueMap();
1202 recomputeInsertPt();
1204 if (DbgLabelRecord
*DLR
= dyn_cast
<DbgLabelRecord
>(&DR
)) {
1205 assert(DLR
->getLabel() && "Missing label");
1206 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, DLR
->getDebugLoc(),
1207 TII
.get(TargetOpcode::DBG_LABEL
))
1208 .addMetadata(DLR
->getLabel());
1212 DbgVariableRecord
&DVR
= cast
<DbgVariableRecord
>(DR
);
1215 if (!DVR
.hasArgList())
1216 V
= DVR
.getVariableLocationOp(0);
1219 if (DVR
.getType() == DbgVariableRecord::LocationType::Value
||
1220 DVR
.getType() == DbgVariableRecord::LocationType::Assign
) {
1221 Res
= lowerDbgValue(V
, DVR
.getExpression(), DVR
.getVariable(),
1224 assert(DVR
.getType() == DbgVariableRecord::LocationType::Declare
);
1225 if (FuncInfo
.PreprocessedDVRDeclares
.contains(&DVR
))
1227 Res
= lowerDbgDeclare(V
, DVR
.getExpression(), DVR
.getVariable(),
1232 LLVM_DEBUG(dbgs() << "Dropping debug-info for " << DVR
<< "\n");
1236 bool FastISel::lowerDbgValue(const Value
*V
, DIExpression
*Expr
,
1237 DILocalVariable
*Var
, const DebugLoc
&DL
) {
1238 // This form of DBG_VALUE is target-independent.
1239 const MCInstrDesc
&II
= TII
.get(TargetOpcode::DBG_VALUE
);
1240 if (!V
|| isa
<UndefValue
>(V
)) {
1241 // DI is either undef or cannot produce a valid DBG_VALUE, so produce an
1242 // undef DBG_VALUE to terminate any prior location.
1243 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, DL
, II
, false, 0U, Var
, Expr
);
1246 if (const auto *CI
= dyn_cast
<ConstantInt
>(V
)) {
1247 // See if there's an expression to constant-fold.
1249 std::tie(Expr
, CI
) = Expr
->constantFold(CI
);
1250 if (CI
->getBitWidth() > 64)
1251 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, DL
, II
)
1257 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, DL
, II
)
1258 .addImm(CI
->getZExtValue())
1264 if (const auto *CF
= dyn_cast
<ConstantFP
>(V
)) {
1265 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, DL
, II
)
1272 if (const auto *Arg
= dyn_cast
<Argument
>(V
);
1273 Arg
&& Expr
&& Expr
->isEntryValue()) {
1274 // As per the Verifier, this case is only valid for swift async Args.
1275 assert(Arg
->hasAttribute(Attribute::AttrKind::SwiftAsync
));
1277 Register Reg
= getRegForValue(Arg
);
1278 for (auto [PhysReg
, VirtReg
] : FuncInfo
.RegInfo
->liveins())
1279 if (Reg
== VirtReg
|| Reg
== PhysReg
) {
1280 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, DL
, II
, false /*IsIndirect*/,
1281 PhysReg
, Var
, Expr
);
1285 LLVM_DEBUG(dbgs() << "Dropping dbg.value: expression is entry_value but "
1286 "couldn't find a physical register\n");
1289 if (auto SI
= FuncInfo
.StaticAllocaMap
.find(dyn_cast
<AllocaInst
>(V
));
1290 SI
!= FuncInfo
.StaticAllocaMap
.end()) {
1291 MachineOperand FrameIndexOp
= MachineOperand::CreateFI(SI
->second
);
1292 bool IsIndirect
= false;
1293 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, DL
, II
, IsIndirect
, FrameIndexOp
,
1297 if (Register Reg
= lookUpRegForValue(V
)) {
1298 // FIXME: This does not handle register-indirect values at offset 0.
1299 if (!FuncInfo
.MF
->useDebugInstrRef()) {
1300 bool IsIndirect
= false;
1301 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, DL
, II
, IsIndirect
, Reg
, Var
,
1305 // If using instruction referencing, produce this as a DBG_INSTR_REF,
1306 // to be later patched up by finalizeDebugInstrRefs.
1307 SmallVector
<MachineOperand
, 1> MOs({MachineOperand::CreateReg(
1308 /* Reg */ Reg
, /* isDef */ false, /* isImp */ false,
1309 /* isKill */ false, /* isDead */ false,
1310 /* isUndef */ false, /* isEarlyClobber */ false,
1311 /* SubReg */ 0, /* isDebug */ true)});
1312 SmallVector
<uint64_t, 2> Ops({dwarf::DW_OP_LLVM_arg
, 0});
1313 auto *NewExpr
= DIExpression::prependOpcodes(Expr
, Ops
);
1314 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, DL
,
1315 TII
.get(TargetOpcode::DBG_INSTR_REF
), /*IsIndirect*/ false, MOs
,
1322 bool FastISel::lowerDbgDeclare(const Value
*Address
, DIExpression
*Expr
,
1323 DILocalVariable
*Var
, const DebugLoc
&DL
) {
1324 if (!Address
|| isa
<UndefValue
>(Address
)) {
1325 LLVM_DEBUG(dbgs() << "Dropping debug info (bad/undef address)\n");
1329 std::optional
<MachineOperand
> Op
;
1330 if (Register Reg
= lookUpRegForValue(Address
))
1331 Op
= MachineOperand::CreateReg(Reg
, false);
1333 // If we have a VLA that has a "use" in a metadata node that's then used
1334 // here but it has no other uses, then we have a problem. E.g.,
1336 // int foo (const int *x) {
1341 // If we assign 'a' a vreg and fast isel later on has to use the selection
1342 // DAG isel, it will want to copy the value to the vreg. However, there are
1343 // no uses, which goes counter to what selection DAG isel expects.
1344 if (!Op
&& !Address
->use_empty() && isa
<Instruction
>(Address
) &&
1345 (!isa
<AllocaInst
>(Address
) ||
1346 !FuncInfo
.StaticAllocaMap
.count(cast
<AllocaInst
>(Address
))))
1347 Op
= MachineOperand::CreateReg(FuncInfo
.InitializeRegForValue(Address
),
1351 assert(Var
->isValidLocationForIntrinsic(DL
) &&
1352 "Expected inlined-at fields to agree");
1353 if (FuncInfo
.MF
->useDebugInstrRef() && Op
->isReg()) {
1354 // If using instruction referencing, produce this as a DBG_INSTR_REF,
1355 // to be later patched up by finalizeDebugInstrRefs. Tack a deref onto
1356 // the expression, we don't have an "indirect" flag in DBG_INSTR_REF.
1357 SmallVector
<uint64_t, 3> Ops(
1358 {dwarf::DW_OP_LLVM_arg
, 0, dwarf::DW_OP_deref
});
1359 auto *NewExpr
= DIExpression::prependOpcodes(Expr
, Ops
);
1360 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, DL
,
1361 TII
.get(TargetOpcode::DBG_INSTR_REF
), /*IsIndirect*/ false, *Op
,
1366 // A dbg.declare describes the address of a source variable, so lower it
1367 // into an indirect DBG_VALUE.
1368 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, DL
,
1369 TII
.get(TargetOpcode::DBG_VALUE
), /*IsIndirect*/ true, *Op
, Var
,
1374 // We can't yet handle anything else here because it would require
1375 // generating code, thus altering codegen because of debug info.
1377 dbgs() << "Dropping debug info (no materialized reg for address)\n");
1381 bool FastISel::selectIntrinsicCall(const IntrinsicInst
*II
) {
1382 switch (II
->getIntrinsicID()) {
1385 // At -O0 we don't care about the lifetime intrinsics.
1386 case Intrinsic::lifetime_start
:
1387 case Intrinsic::lifetime_end
:
1388 // The donothing intrinsic does, well, nothing.
1389 case Intrinsic::donothing
:
1390 // Neither does the sideeffect intrinsic.
1391 case Intrinsic::sideeffect
:
1392 // Neither does the assume intrinsic; it's also OK not to codegen its operand.
1393 case Intrinsic::assume
:
1394 // Neither does the llvm.experimental.noalias.scope.decl intrinsic
1395 case Intrinsic::experimental_noalias_scope_decl
:
1397 case Intrinsic::dbg_declare
: {
1398 const DbgDeclareInst
*DI
= cast
<DbgDeclareInst
>(II
);
1399 assert(DI
->getVariable() && "Missing variable");
1400 if (FuncInfo
.PreprocessedDbgDeclares
.contains(DI
))
1403 const Value
*Address
= DI
->getAddress();
1404 if (!lowerDbgDeclare(Address
, DI
->getExpression(), DI
->getVariable(),
1406 LLVM_DEBUG(dbgs() << "Dropping debug info for " << *DI
);
1410 case Intrinsic::dbg_assign
:
1411 // A dbg.assign is a dbg.value with more information, typically produced
1412 // during optimisation. If one reaches fastisel then something odd has
1413 // happened (such as an optimised function being always-inlined into an
1414 // optnone function). We will not be using the extra information in the
1415 // dbg.assign in that case, just use its dbg.value fields.
1417 case Intrinsic::dbg_value
: {
1418 // This form of DBG_VALUE is target-independent.
1419 const DbgValueInst
*DI
= cast
<DbgValueInst
>(II
);
1420 const Value
*V
= DI
->getValue();
1421 DIExpression
*Expr
= DI
->getExpression();
1422 DILocalVariable
*Var
= DI
->getVariable();
1423 if (DI
->hasArgList())
1424 // Signal that we don't have a location for this.
1427 assert(Var
->isValidLocationForIntrinsic(MIMD
.getDL()) &&
1428 "Expected inlined-at fields to agree");
1430 if (!lowerDbgValue(V
, Expr
, Var
, MIMD
.getDL()))
1431 LLVM_DEBUG(dbgs() << "Dropping debug info for " << *DI
<< "\n");
1435 case Intrinsic::dbg_label
: {
1436 const DbgLabelInst
*DI
= cast
<DbgLabelInst
>(II
);
1437 assert(DI
->getLabel() && "Missing label");
1438 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
,
1439 TII
.get(TargetOpcode::DBG_LABEL
)).addMetadata(DI
->getLabel());
1442 case Intrinsic::objectsize
:
1443 llvm_unreachable("llvm.objectsize.* should have been lowered already");
1445 case Intrinsic::is_constant
:
1446 llvm_unreachable("llvm.is.constant.* should have been lowered already");
1448 case Intrinsic::allow_runtime_check
:
1449 case Intrinsic::allow_ubsan_check
: {
1450 Register ResultReg
= getRegForValue(ConstantInt::getTrue(II
->getType()));
1453 updateValueMap(II
, ResultReg
);
1457 case Intrinsic::launder_invariant_group
:
1458 case Intrinsic::strip_invariant_group
:
1459 case Intrinsic::expect
:
1460 case Intrinsic::expect_with_probability
: {
1461 Register ResultReg
= getRegForValue(II
->getArgOperand(0));
1464 updateValueMap(II
, ResultReg
);
1467 case Intrinsic::fake_use
:
1468 // At -O0, we don't need fake use, so just ignore it.
1470 case Intrinsic::experimental_stackmap
:
1471 return selectStackmap(II
);
1472 case Intrinsic::experimental_patchpoint_void
:
1473 case Intrinsic::experimental_patchpoint
:
1474 return selectPatchpoint(II
);
1476 case Intrinsic::xray_customevent
:
1477 return selectXRayCustomEvent(II
);
1478 case Intrinsic::xray_typedevent
:
1479 return selectXRayTypedEvent(II
);
1482 return fastLowerIntrinsicCall(II
);
1485 bool FastISel::selectCast(const User
*I
, unsigned Opcode
) {
1486 EVT SrcVT
= TLI
.getValueType(DL
, I
->getOperand(0)->getType());
1487 EVT DstVT
= TLI
.getValueType(DL
, I
->getType());
1489 if (SrcVT
== MVT::Other
|| !SrcVT
.isSimple() || DstVT
== MVT::Other
||
1491 // Unhandled type. Halt "fast" selection and bail.
1494 // Check if the destination type is legal.
1495 if (!TLI
.isTypeLegal(DstVT
))
1498 // Check if the source operand is legal.
1499 if (!TLI
.isTypeLegal(SrcVT
))
1502 Register InputReg
= getRegForValue(I
->getOperand(0));
1504 // Unhandled operand. Halt "fast" selection and bail.
1507 Register ResultReg
= fastEmit_r(SrcVT
.getSimpleVT(), DstVT
.getSimpleVT(),
1512 updateValueMap(I
, ResultReg
);
1516 bool FastISel::selectBitCast(const User
*I
) {
1517 EVT SrcEVT
= TLI
.getValueType(DL
, I
->getOperand(0)->getType());
1518 EVT DstEVT
= TLI
.getValueType(DL
, I
->getType());
1519 if (SrcEVT
== MVT::Other
|| DstEVT
== MVT::Other
||
1520 !TLI
.isTypeLegal(SrcEVT
) || !TLI
.isTypeLegal(DstEVT
))
1521 // Unhandled type. Halt "fast" selection and bail.
1524 MVT SrcVT
= SrcEVT
.getSimpleVT();
1525 MVT DstVT
= DstEVT
.getSimpleVT();
1526 Register Op0
= getRegForValue(I
->getOperand(0));
1527 if (!Op0
) // Unhandled operand. Halt "fast" selection and bail.
1530 // If the bitcast doesn't change the type, just use the operand value.
1531 if (SrcVT
== DstVT
) {
1532 updateValueMap(I
, Op0
);
1536 // Otherwise, select a BITCAST opcode.
1537 Register ResultReg
= fastEmit_r(SrcVT
, DstVT
, ISD::BITCAST
, Op0
);
1541 updateValueMap(I
, ResultReg
);
1545 bool FastISel::selectFreeze(const User
*I
) {
1546 Register Reg
= getRegForValue(I
->getOperand(0));
1548 // Unhandled operand.
1551 EVT ETy
= TLI
.getValueType(DL
, I
->getOperand(0)->getType());
1552 if (ETy
== MVT::Other
|| !TLI
.isTypeLegal(ETy
))
1553 // Unhandled type, bail out.
1556 MVT Ty
= ETy
.getSimpleVT();
1557 const TargetRegisterClass
*TyRegClass
= TLI
.getRegClassFor(Ty
);
1558 Register ResultReg
= createResultReg(TyRegClass
);
1559 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
,
1560 TII
.get(TargetOpcode::COPY
), ResultReg
).addReg(Reg
);
1562 updateValueMap(I
, ResultReg
);
1566 // Remove local value instructions starting from the instruction after
1567 // SavedLastLocalValue to the current function insert point.
1568 void FastISel::removeDeadLocalValueCode(MachineInstr
*SavedLastLocalValue
)
1570 MachineInstr
*CurLastLocalValue
= getLastLocalValue();
1571 if (CurLastLocalValue
!= SavedLastLocalValue
) {
1572 // Find the first local value instruction to be deleted.
1573 // This is the instruction after SavedLastLocalValue if it is non-NULL.
1574 // Otherwise it's the first instruction in the block.
1575 MachineBasicBlock::iterator
FirstDeadInst(SavedLastLocalValue
);
1576 if (SavedLastLocalValue
)
1579 FirstDeadInst
= FuncInfo
.MBB
->getFirstNonPHI();
1580 setLastLocalValue(SavedLastLocalValue
);
1581 removeDeadCode(FirstDeadInst
, FuncInfo
.InsertPt
);
1585 bool FastISel::selectInstruction(const Instruction
*I
) {
1586 // Flush the local value map before starting each instruction.
1587 // This improves locality and debugging, and can reduce spills.
1588 // Reuse of values across IR instructions is relatively uncommon.
1589 flushLocalValueMap();
1591 MachineInstr
*SavedLastLocalValue
= getLastLocalValue();
1592 // Just before the terminator instruction, insert instructions to
1593 // feed PHI nodes in successor blocks.
1594 if (I
->isTerminator()) {
1595 if (!handlePHINodesInSuccessorBlocks(I
->getParent())) {
1596 // PHI node handling may have generated local value instructions,
1597 // even though it failed to handle all PHI nodes.
1598 // We remove these instructions because SelectionDAGISel will generate
1600 removeDeadLocalValueCode(SavedLastLocalValue
);
1605 // FastISel does not handle any operand bundles except OB_funclet.
1606 if (auto *Call
= dyn_cast
<CallBase
>(I
))
1607 for (unsigned i
= 0, e
= Call
->getNumOperandBundles(); i
!= e
; ++i
)
1608 if (Call
->getOperandBundleAt(i
).getTagID() != LLVMContext::OB_funclet
)
1611 MIMD
= MIMetadata(*I
);
1613 SavedInsertPt
= FuncInfo
.InsertPt
;
1615 if (const auto *Call
= dyn_cast
<CallInst
>(I
)) {
1616 const Function
*F
= Call
->getCalledFunction();
1619 // As a special case, don't handle calls to builtin library functions that
1620 // may be translated directly to target instructions.
1621 if (F
&& !F
->hasLocalLinkage() && F
->hasName() &&
1622 LibInfo
->getLibFunc(F
->getName(), Func
) &&
1623 LibInfo
->hasOptimizedCodeGen(Func
))
1626 // Don't handle Intrinsic::trap if a trap function is specified.
1627 if (F
&& F
->getIntrinsicID() == Intrinsic::trap
&&
1628 Call
->hasFnAttr("trap-func-name"))
1632 // First, try doing target-independent selection.
1633 if (!SkipTargetIndependentISel
) {
1634 if (selectOperator(I
, I
->getOpcode())) {
1635 ++NumFastIselSuccessIndependent
;
1639 // Remove dead code.
1640 recomputeInsertPt();
1641 if (SavedInsertPt
!= FuncInfo
.InsertPt
)
1642 removeDeadCode(FuncInfo
.InsertPt
, SavedInsertPt
);
1643 SavedInsertPt
= FuncInfo
.InsertPt
;
1645 // Next, try calling the target to attempt to handle the instruction.
1646 if (fastSelectInstruction(I
)) {
1647 ++NumFastIselSuccessTarget
;
1651 // Remove dead code.
1652 recomputeInsertPt();
1653 if (SavedInsertPt
!= FuncInfo
.InsertPt
)
1654 removeDeadCode(FuncInfo
.InsertPt
, SavedInsertPt
);
1657 // Undo phi node updates, because they will be added again by SelectionDAG.
1658 if (I
->isTerminator()) {
1659 // PHI node handling may have generated local value instructions.
1660 // We remove them because SelectionDAGISel will generate them again.
1661 removeDeadLocalValueCode(SavedLastLocalValue
);
1662 FuncInfo
.PHINodesToUpdate
.resize(FuncInfo
.OrigNumPHINodesToUpdate
);
1667 /// Emit an unconditional branch to the given block, unless it is the immediate
1668 /// (fall-through) successor, and update the CFG.
1669 void FastISel::fastEmitBranch(MachineBasicBlock
*MSucc
,
1670 const DebugLoc
&DbgLoc
) {
1671 const BasicBlock
*BB
= FuncInfo
.MBB
->getBasicBlock();
1672 bool BlockHasMultipleInstrs
= &BB
->front() != &BB
->back();
1673 // Handle legacy case of debug intrinsics
1674 if (BlockHasMultipleInstrs
&& !BB
->getModule()->IsNewDbgInfoFormat
)
1675 BlockHasMultipleInstrs
= BB
->sizeWithoutDebug() > 1;
1676 if (BlockHasMultipleInstrs
&& FuncInfo
.MBB
->isLayoutSuccessor(MSucc
)) {
1677 // For more accurate line information if this is the only non-debug
1678 // instruction in the block then emit it, otherwise we have the
1679 // unconditional fall-through case, which needs no instructions.
1681 // The unconditional branch case.
1682 TII
.insertBranch(*FuncInfo
.MBB
, MSucc
, nullptr,
1683 SmallVector
<MachineOperand
, 0>(), DbgLoc
);
1686 auto BranchProbability
= FuncInfo
.BPI
->getEdgeProbability(
1687 FuncInfo
.MBB
->getBasicBlock(), MSucc
->getBasicBlock());
1688 FuncInfo
.MBB
->addSuccessor(MSucc
, BranchProbability
);
1690 FuncInfo
.MBB
->addSuccessorWithoutProb(MSucc
);
1693 void FastISel::finishCondBranch(const BasicBlock
*BranchBB
,
1694 MachineBasicBlock
*TrueMBB
,
1695 MachineBasicBlock
*FalseMBB
) {
1696 // Add TrueMBB as successor unless it is equal to the FalseMBB: This can
1697 // happen in degenerate IR and MachineIR forbids to have a block twice in the
1698 // successor/predecessor lists.
1699 if (TrueMBB
!= FalseMBB
) {
1701 auto BranchProbability
=
1702 FuncInfo
.BPI
->getEdgeProbability(BranchBB
, TrueMBB
->getBasicBlock());
1703 FuncInfo
.MBB
->addSuccessor(TrueMBB
, BranchProbability
);
1705 FuncInfo
.MBB
->addSuccessorWithoutProb(TrueMBB
);
1708 fastEmitBranch(FalseMBB
, MIMD
.getDL());
1711 /// Emit an FNeg operation.
1712 bool FastISel::selectFNeg(const User
*I
, const Value
*In
) {
1713 Register OpReg
= getRegForValue(In
);
1717 // If the target has ISD::FNEG, use it.
1718 EVT VT
= TLI
.getValueType(DL
, I
->getType());
1719 Register ResultReg
= fastEmit_r(VT
.getSimpleVT(), VT
.getSimpleVT(), ISD::FNEG
,
1722 updateValueMap(I
, ResultReg
);
1726 // Bitcast the value to integer, twiddle the sign bit with xor,
1727 // and then bitcast it back to floating-point.
1728 if (VT
.getSizeInBits() > 64)
1730 EVT IntVT
= EVT::getIntegerVT(I
->getContext(), VT
.getSizeInBits());
1731 if (!TLI
.isTypeLegal(IntVT
))
1734 Register IntReg
= fastEmit_r(VT
.getSimpleVT(), IntVT
.getSimpleVT(),
1735 ISD::BITCAST
, OpReg
);
1739 Register IntResultReg
= fastEmit_ri_(
1740 IntVT
.getSimpleVT(), ISD::XOR
, IntReg
,
1741 UINT64_C(1) << (VT
.getSizeInBits() - 1), IntVT
.getSimpleVT());
1745 ResultReg
= fastEmit_r(IntVT
.getSimpleVT(), VT
.getSimpleVT(), ISD::BITCAST
,
1750 updateValueMap(I
, ResultReg
);
1754 bool FastISel::selectExtractValue(const User
*U
) {
1755 const ExtractValueInst
*EVI
= dyn_cast
<ExtractValueInst
>(U
);
1759 // Make sure we only try to handle extracts with a legal result. But also
1760 // allow i1 because it's easy.
1761 EVT RealVT
= TLI
.getValueType(DL
, EVI
->getType(), /*AllowUnknown=*/true);
1762 if (!RealVT
.isSimple())
1764 MVT VT
= RealVT
.getSimpleVT();
1765 if (!TLI
.isTypeLegal(VT
) && VT
!= MVT::i1
)
1768 const Value
*Op0
= EVI
->getOperand(0);
1769 Type
*AggTy
= Op0
->getType();
1771 // Get the base result register.
1773 DenseMap
<const Value
*, Register
>::iterator I
= FuncInfo
.ValueMap
.find(Op0
);
1774 if (I
!= FuncInfo
.ValueMap
.end())
1775 ResultReg
= I
->second
;
1776 else if (isa
<Instruction
>(Op0
))
1777 ResultReg
= FuncInfo
.InitializeRegForValue(Op0
);
1779 return false; // fast-isel can't handle aggregate constants at the moment
1781 // Get the actual result register, which is an offset from the base register.
1782 unsigned VTIndex
= ComputeLinearIndex(AggTy
, EVI
->getIndices());
1784 SmallVector
<EVT
, 4> AggValueVTs
;
1785 ComputeValueVTs(TLI
, DL
, AggTy
, AggValueVTs
);
1787 for (unsigned i
= 0; i
< VTIndex
; i
++)
1788 ResultReg
+= TLI
.getNumRegisters(FuncInfo
.Fn
->getContext(), AggValueVTs
[i
]);
1790 updateValueMap(EVI
, ResultReg
);
1794 bool FastISel::selectOperator(const User
*I
, unsigned Opcode
) {
1796 case Instruction::Add
:
1797 return selectBinaryOp(I
, ISD::ADD
);
1798 case Instruction::FAdd
:
1799 return selectBinaryOp(I
, ISD::FADD
);
1800 case Instruction::Sub
:
1801 return selectBinaryOp(I
, ISD::SUB
);
1802 case Instruction::FSub
:
1803 return selectBinaryOp(I
, ISD::FSUB
);
1804 case Instruction::Mul
:
1805 return selectBinaryOp(I
, ISD::MUL
);
1806 case Instruction::FMul
:
1807 return selectBinaryOp(I
, ISD::FMUL
);
1808 case Instruction::SDiv
:
1809 return selectBinaryOp(I
, ISD::SDIV
);
1810 case Instruction::UDiv
:
1811 return selectBinaryOp(I
, ISD::UDIV
);
1812 case Instruction::FDiv
:
1813 return selectBinaryOp(I
, ISD::FDIV
);
1814 case Instruction::SRem
:
1815 return selectBinaryOp(I
, ISD::SREM
);
1816 case Instruction::URem
:
1817 return selectBinaryOp(I
, ISD::UREM
);
1818 case Instruction::FRem
:
1819 return selectBinaryOp(I
, ISD::FREM
);
1820 case Instruction::Shl
:
1821 return selectBinaryOp(I
, ISD::SHL
);
1822 case Instruction::LShr
:
1823 return selectBinaryOp(I
, ISD::SRL
);
1824 case Instruction::AShr
:
1825 return selectBinaryOp(I
, ISD::SRA
);
1826 case Instruction::And
:
1827 return selectBinaryOp(I
, ISD::AND
);
1828 case Instruction::Or
:
1829 return selectBinaryOp(I
, ISD::OR
);
1830 case Instruction::Xor
:
1831 return selectBinaryOp(I
, ISD::XOR
);
1833 case Instruction::FNeg
:
1834 return selectFNeg(I
, I
->getOperand(0));
1836 case Instruction::GetElementPtr
:
1837 return selectGetElementPtr(I
);
1839 case Instruction::Br
: {
1840 const BranchInst
*BI
= cast
<BranchInst
>(I
);
1842 if (BI
->isUnconditional()) {
1843 const BasicBlock
*LLVMSucc
= BI
->getSuccessor(0);
1844 MachineBasicBlock
*MSucc
= FuncInfo
.getMBB(LLVMSucc
);
1845 fastEmitBranch(MSucc
, BI
->getDebugLoc());
1849 // Conditional branches are not handed yet.
1850 // Halt "fast" selection and bail.
1854 case Instruction::Unreachable
: {
1855 if (TM
.Options
.TrapUnreachable
) {
1856 if (TM
.Options
.NoTrapAfterNoreturn
) {
1858 dyn_cast_or_null
<CallInst
>(cast
<Instruction
>(I
)->getPrevNode());
1859 if (Call
&& Call
->doesNotReturn())
1863 return fastEmit_(MVT::Other
, MVT::Other
, ISD::TRAP
) != 0;
1868 case Instruction::Alloca
:
1869 // FunctionLowering has the static-sized case covered.
1870 if (FuncInfo
.StaticAllocaMap
.count(cast
<AllocaInst
>(I
)))
1873 // Dynamic-sized alloca is not handled yet.
1876 case Instruction::Call
:
1877 // On AIX, normal call lowering uses the DAG-ISEL path currently so that the
1878 // callee of the direct function call instruction will be mapped to the
1879 // symbol for the function's entry point, which is distinct from the
1880 // function descriptor symbol. The latter is the symbol whose XCOFF symbol
1881 // name is the C-linkage name of the source level function.
1882 // But fast isel still has the ability to do selection for intrinsics.
1883 if (TM
.getTargetTriple().isOSAIX() && !isa
<IntrinsicInst
>(I
))
1885 return selectCall(I
);
1887 case Instruction::BitCast
:
1888 return selectBitCast(I
);
1890 case Instruction::FPToSI
:
1891 return selectCast(I
, ISD::FP_TO_SINT
);
1892 case Instruction::ZExt
:
1893 return selectCast(I
, ISD::ZERO_EXTEND
);
1894 case Instruction::SExt
:
1895 return selectCast(I
, ISD::SIGN_EXTEND
);
1896 case Instruction::Trunc
:
1897 return selectCast(I
, ISD::TRUNCATE
);
1898 case Instruction::SIToFP
:
1899 return selectCast(I
, ISD::SINT_TO_FP
);
1901 case Instruction::IntToPtr
: // Deliberate fall-through.
1902 case Instruction::PtrToInt
: {
1903 EVT SrcVT
= TLI
.getValueType(DL
, I
->getOperand(0)->getType());
1904 EVT DstVT
= TLI
.getValueType(DL
, I
->getType());
1905 if (DstVT
.bitsGT(SrcVT
))
1906 return selectCast(I
, ISD::ZERO_EXTEND
);
1907 if (DstVT
.bitsLT(SrcVT
))
1908 return selectCast(I
, ISD::TRUNCATE
);
1909 Register Reg
= getRegForValue(I
->getOperand(0));
1912 updateValueMap(I
, Reg
);
1916 case Instruction::ExtractValue
:
1917 return selectExtractValue(I
);
1919 case Instruction::Freeze
:
1920 return selectFreeze(I
);
1922 case Instruction::PHI
:
1923 llvm_unreachable("FastISel shouldn't visit PHI nodes!");
1926 // Unhandled instruction. Halt "fast" selection and bail.
1931 FastISel::FastISel(FunctionLoweringInfo
&FuncInfo
,
1932 const TargetLibraryInfo
*LibInfo
,
1933 bool SkipTargetIndependentISel
)
1934 : FuncInfo(FuncInfo
), MF(FuncInfo
.MF
), MRI(FuncInfo
.MF
->getRegInfo()),
1935 MFI(FuncInfo
.MF
->getFrameInfo()), MCP(*FuncInfo
.MF
->getConstantPool()),
1936 TM(FuncInfo
.MF
->getTarget()), DL(MF
->getDataLayout()),
1937 TII(*MF
->getSubtarget().getInstrInfo()),
1938 TLI(*MF
->getSubtarget().getTargetLowering()),
1939 TRI(*MF
->getSubtarget().getRegisterInfo()), LibInfo(LibInfo
),
1940 SkipTargetIndependentISel(SkipTargetIndependentISel
) {}
1942 FastISel::~FastISel() = default;
1944 bool FastISel::fastLowerArguments() { return false; }
1946 bool FastISel::fastLowerCall(CallLoweringInfo
& /*CLI*/) { return false; }
1948 bool FastISel::fastLowerIntrinsicCall(const IntrinsicInst
* /*II*/) {
1952 unsigned FastISel::fastEmit_(MVT
, MVT
, unsigned) { return 0; }
1954 unsigned FastISel::fastEmit_r(MVT
, MVT
, unsigned, unsigned /*Op0*/) {
1958 unsigned FastISel::fastEmit_rr(MVT
, MVT
, unsigned, unsigned /*Op0*/,
1963 unsigned FastISel::fastEmit_i(MVT
, MVT
, unsigned, uint64_t /*Imm*/) {
1967 unsigned FastISel::fastEmit_f(MVT
, MVT
, unsigned,
1968 const ConstantFP
* /*FPImm*/) {
1972 unsigned FastISel::fastEmit_ri(MVT
, MVT
, unsigned, unsigned /*Op0*/,
1977 /// This method is a wrapper of fastEmit_ri. It first tries to emit an
1978 /// instruction with an immediate operand using fastEmit_ri.
1979 /// If that fails, it materializes the immediate into a register and try
1980 /// fastEmit_rr instead.
1981 Register
FastISel::fastEmit_ri_(MVT VT
, unsigned Opcode
, unsigned Op0
,
1982 uint64_t Imm
, MVT ImmType
) {
1983 // If this is a multiply by a power of two, emit this as a shift left.
1984 if (Opcode
== ISD::MUL
&& isPowerOf2_64(Imm
)) {
1987 } else if (Opcode
== ISD::UDIV
&& isPowerOf2_64(Imm
)) {
1988 // div x, 8 -> srl x, 3
1993 // Horrible hack (to be removed), check to make sure shift amounts are
1995 if ((Opcode
== ISD::SHL
|| Opcode
== ISD::SRA
|| Opcode
== ISD::SRL
) &&
1996 Imm
>= VT
.getSizeInBits())
1999 // First check if immediate type is legal. If not, we can't use the ri form.
2000 Register ResultReg
= fastEmit_ri(VT
, VT
, Opcode
, Op0
, Imm
);
2003 Register MaterialReg
= fastEmit_i(ImmType
, ImmType
, ISD::Constant
, Imm
);
2005 // This is a bit ugly/slow, but failing here means falling out of
2006 // fast-isel, which would be very slow.
2008 IntegerType::get(FuncInfo
.Fn
->getContext(), VT
.getSizeInBits());
2009 MaterialReg
= getRegForValue(ConstantInt::get(ITy
, Imm
));
2013 return fastEmit_rr(VT
, VT
, Opcode
, Op0
, MaterialReg
);
2016 Register
FastISel::createResultReg(const TargetRegisterClass
*RC
) {
2017 return MRI
.createVirtualRegister(RC
);
2020 Register
FastISel::constrainOperandRegClass(const MCInstrDesc
&II
, Register Op
,
2022 if (Op
.isVirtual()) {
2023 const TargetRegisterClass
*RegClass
=
2024 TII
.getRegClass(II
, OpNum
, &TRI
, *FuncInfo
.MF
);
2025 if (!MRI
.constrainRegClass(Op
, RegClass
)) {
2026 // If it's not legal to COPY between the register classes, something
2027 // has gone very wrong before we got here.
2028 Register NewOp
= createResultReg(RegClass
);
2029 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
,
2030 TII
.get(TargetOpcode::COPY
), NewOp
).addReg(Op
);
2037 Register
FastISel::fastEmitInst_(unsigned MachineInstOpcode
,
2038 const TargetRegisterClass
*RC
) {
2039 Register ResultReg
= createResultReg(RC
);
2040 const MCInstrDesc
&II
= TII
.get(MachineInstOpcode
);
2042 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, II
, ResultReg
);
2046 Register
FastISel::fastEmitInst_r(unsigned MachineInstOpcode
,
2047 const TargetRegisterClass
*RC
, unsigned Op0
) {
2048 const MCInstrDesc
&II
= TII
.get(MachineInstOpcode
);
2050 Register ResultReg
= createResultReg(RC
);
2051 Op0
= constrainOperandRegClass(II
, Op0
, II
.getNumDefs());
2053 if (II
.getNumDefs() >= 1)
2054 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, II
, ResultReg
)
2057 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, II
)
2059 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, TII
.get(TargetOpcode::COPY
),
2061 .addReg(II
.implicit_defs()[0]);
2067 Register
FastISel::fastEmitInst_rr(unsigned MachineInstOpcode
,
2068 const TargetRegisterClass
*RC
, unsigned Op0
,
2070 const MCInstrDesc
&II
= TII
.get(MachineInstOpcode
);
2072 Register ResultReg
= createResultReg(RC
);
2073 Op0
= constrainOperandRegClass(II
, Op0
, II
.getNumDefs());
2074 Op1
= constrainOperandRegClass(II
, Op1
, II
.getNumDefs() + 1);
2076 if (II
.getNumDefs() >= 1)
2077 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, II
, ResultReg
)
2081 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, II
)
2084 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, TII
.get(TargetOpcode::COPY
),
2086 .addReg(II
.implicit_defs()[0]);
2091 Register
FastISel::fastEmitInst_rrr(unsigned MachineInstOpcode
,
2092 const TargetRegisterClass
*RC
, unsigned Op0
,
2093 unsigned Op1
, unsigned Op2
) {
2094 const MCInstrDesc
&II
= TII
.get(MachineInstOpcode
);
2096 Register ResultReg
= createResultReg(RC
);
2097 Op0
= constrainOperandRegClass(II
, Op0
, II
.getNumDefs());
2098 Op1
= constrainOperandRegClass(II
, Op1
, II
.getNumDefs() + 1);
2099 Op2
= constrainOperandRegClass(II
, Op2
, II
.getNumDefs() + 2);
2101 if (II
.getNumDefs() >= 1)
2102 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, II
, ResultReg
)
2107 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, II
)
2111 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, TII
.get(TargetOpcode::COPY
),
2113 .addReg(II
.implicit_defs()[0]);
2118 Register
FastISel::fastEmitInst_ri(unsigned MachineInstOpcode
,
2119 const TargetRegisterClass
*RC
, unsigned Op0
,
2121 const MCInstrDesc
&II
= TII
.get(MachineInstOpcode
);
2123 Register ResultReg
= createResultReg(RC
);
2124 Op0
= constrainOperandRegClass(II
, Op0
, II
.getNumDefs());
2126 if (II
.getNumDefs() >= 1)
2127 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, II
, ResultReg
)
2131 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, II
)
2134 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, TII
.get(TargetOpcode::COPY
),
2136 .addReg(II
.implicit_defs()[0]);
2141 Register
FastISel::fastEmitInst_rii(unsigned MachineInstOpcode
,
2142 const TargetRegisterClass
*RC
, unsigned Op0
,
2143 uint64_t Imm1
, uint64_t Imm2
) {
2144 const MCInstrDesc
&II
= TII
.get(MachineInstOpcode
);
2146 Register ResultReg
= createResultReg(RC
);
2147 Op0
= constrainOperandRegClass(II
, Op0
, II
.getNumDefs());
2149 if (II
.getNumDefs() >= 1)
2150 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, II
, ResultReg
)
2155 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, II
)
2159 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, TII
.get(TargetOpcode::COPY
),
2161 .addReg(II
.implicit_defs()[0]);
2166 Register
FastISel::fastEmitInst_f(unsigned MachineInstOpcode
,
2167 const TargetRegisterClass
*RC
,
2168 const ConstantFP
*FPImm
) {
2169 const MCInstrDesc
&II
= TII
.get(MachineInstOpcode
);
2171 Register ResultReg
= createResultReg(RC
);
2173 if (II
.getNumDefs() >= 1)
2174 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, II
, ResultReg
)
2177 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, II
)
2179 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, TII
.get(TargetOpcode::COPY
),
2181 .addReg(II
.implicit_defs()[0]);
2186 Register
FastISel::fastEmitInst_rri(unsigned MachineInstOpcode
,
2187 const TargetRegisterClass
*RC
, unsigned Op0
,
2188 unsigned Op1
, uint64_t Imm
) {
2189 const MCInstrDesc
&II
= TII
.get(MachineInstOpcode
);
2191 Register ResultReg
= createResultReg(RC
);
2192 Op0
= constrainOperandRegClass(II
, Op0
, II
.getNumDefs());
2193 Op1
= constrainOperandRegClass(II
, Op1
, II
.getNumDefs() + 1);
2195 if (II
.getNumDefs() >= 1)
2196 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, II
, ResultReg
)
2201 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, II
)
2205 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, TII
.get(TargetOpcode::COPY
),
2207 .addReg(II
.implicit_defs()[0]);
2212 Register
FastISel::fastEmitInst_i(unsigned MachineInstOpcode
,
2213 const TargetRegisterClass
*RC
, uint64_t Imm
) {
2214 Register ResultReg
= createResultReg(RC
);
2215 const MCInstrDesc
&II
= TII
.get(MachineInstOpcode
);
2217 if (II
.getNumDefs() >= 1)
2218 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, II
, ResultReg
)
2221 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, II
).addImm(Imm
);
2222 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, TII
.get(TargetOpcode::COPY
),
2224 .addReg(II
.implicit_defs()[0]);
2229 Register
FastISel::fastEmitInst_extractsubreg(MVT RetVT
, unsigned Op0
,
2231 Register ResultReg
= createResultReg(TLI
.getRegClassFor(RetVT
));
2232 assert(Register::isVirtualRegister(Op0
) &&
2233 "Cannot yet extract from physregs");
2234 const TargetRegisterClass
*RC
= MRI
.getRegClass(Op0
);
2235 MRI
.constrainRegClass(Op0
, TRI
.getSubClassWithSubReg(RC
, Idx
));
2236 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, MIMD
, TII
.get(TargetOpcode::COPY
),
2237 ResultReg
).addReg(Op0
, 0, Idx
);
2241 /// Emit MachineInstrs to compute the value of Op with all but the least
2242 /// significant bit set to zero.
2243 Register
FastISel::fastEmitZExtFromI1(MVT VT
, unsigned Op0
) {
2244 return fastEmit_ri(VT
, VT
, ISD::AND
, Op0
, 1);
2247 /// HandlePHINodesInSuccessorBlocks - Handle PHI nodes in successor blocks.
2248 /// Emit code to ensure constants are copied into registers when needed.
2249 /// Remember the virtual registers that need to be added to the Machine PHI
2250 /// nodes as input. We cannot just directly add them, because expansion
2251 /// might result in multiple MBB's for one BB. As such, the start of the
2252 /// BB might correspond to a different MBB than the end.
2253 bool FastISel::handlePHINodesInSuccessorBlocks(const BasicBlock
*LLVMBB
) {
2254 SmallPtrSet
<MachineBasicBlock
*, 4> SuccsHandled
;
2255 FuncInfo
.OrigNumPHINodesToUpdate
= FuncInfo
.PHINodesToUpdate
.size();
2257 // Check successor nodes' PHI nodes that expect a constant to be available
2259 for (const BasicBlock
*SuccBB
: successors(LLVMBB
)) {
2260 if (!isa
<PHINode
>(SuccBB
->begin()))
2262 MachineBasicBlock
*SuccMBB
= FuncInfo
.getMBB(SuccBB
);
2264 // If this terminator has multiple identical successors (common for
2265 // switches), only handle each succ once.
2266 if (!SuccsHandled
.insert(SuccMBB
).second
)
2269 MachineBasicBlock::iterator MBBI
= SuccMBB
->begin();
2271 // At this point we know that there is a 1-1 correspondence between LLVM PHI
2272 // nodes and Machine PHI nodes, but the incoming operands have not been
2274 for (const PHINode
&PN
: SuccBB
->phis()) {
2275 // Ignore dead phi's.
2279 // Only handle legal types. Two interesting things to note here. First,
2280 // by bailing out early, we may leave behind some dead instructions,
2281 // since SelectionDAG's HandlePHINodesInSuccessorBlocks will insert its
2282 // own moves. Second, this check is necessary because FastISel doesn't
2283 // use CreateRegs to create registers, so it always creates
2284 // exactly one register for each non-void instruction.
2285 EVT VT
= TLI
.getValueType(DL
, PN
.getType(), /*AllowUnknown=*/true);
2286 if (VT
== MVT::Other
|| !TLI
.isTypeLegal(VT
)) {
2287 // Handle integer promotions, though, because they're common and easy.
2288 if (!(VT
== MVT::i1
|| VT
== MVT::i8
|| VT
== MVT::i16
)) {
2289 FuncInfo
.PHINodesToUpdate
.resize(FuncInfo
.OrigNumPHINodesToUpdate
);
2294 const Value
*PHIOp
= PN
.getIncomingValueForBlock(LLVMBB
);
2296 // Set the DebugLoc for the copy. Use the location of the operand if
2297 // there is one; otherwise no location, flushLocalValueMap will fix it.
2299 if (const auto *Inst
= dyn_cast
<Instruction
>(PHIOp
))
2300 MIMD
= MIMetadata(*Inst
);
2302 Register Reg
= getRegForValue(PHIOp
);
2304 FuncInfo
.PHINodesToUpdate
.resize(FuncInfo
.OrigNumPHINodesToUpdate
);
2307 FuncInfo
.PHINodesToUpdate
.push_back(std::make_pair(&*MBBI
++, Reg
));
2315 bool FastISel::tryToFoldLoad(const LoadInst
*LI
, const Instruction
*FoldInst
) {
2316 assert(LI
->hasOneUse() &&
2317 "tryToFoldLoad expected a LoadInst with a single use");
2318 // We know that the load has a single use, but don't know what it is. If it
2319 // isn't one of the folded instructions, then we can't succeed here. Handle
2320 // this by scanning the single-use users of the load until we get to FoldInst.
2321 unsigned MaxUsers
= 6; // Don't scan down huge single-use chains of instrs.
2323 const Instruction
*TheUser
= LI
->user_back();
2324 while (TheUser
!= FoldInst
&& // Scan up until we find FoldInst.
2325 // Stay in the right block.
2326 TheUser
->getParent() == FoldInst
->getParent() &&
2327 --MaxUsers
) { // Don't scan too far.
2328 // If there are multiple or no uses of this instruction, then bail out.
2329 if (!TheUser
->hasOneUse())
2332 TheUser
= TheUser
->user_back();
2335 // If we didn't find the fold instruction, then we failed to collapse the
2337 if (TheUser
!= FoldInst
)
2340 // Don't try to fold volatile loads. Target has to deal with alignment
2342 if (LI
->isVolatile())
2345 // Figure out which vreg this is going into. If there is no assigned vreg yet
2346 // then there actually was no reference to it. Perhaps the load is referenced
2347 // by a dead instruction.
2348 Register LoadReg
= getRegForValue(LI
);
2352 // We can't fold if this vreg has no uses or more than one use. Multiple uses
2353 // may mean that the instruction got lowered to multiple MIs, or the use of
2354 // the loaded value ended up being multiple operands of the result.
2355 if (!MRI
.hasOneUse(LoadReg
))
2358 // If the register has fixups, there may be additional uses through a
2359 // different alias of the register.
2360 if (FuncInfo
.RegsWithFixups
.contains(LoadReg
))
2363 MachineRegisterInfo::reg_iterator RI
= MRI
.reg_begin(LoadReg
);
2364 MachineInstr
*User
= RI
->getParent();
2366 // Set the insertion point properly. Folding the load can cause generation of
2367 // other random instructions (like sign extends) for addressing modes; make
2368 // sure they get inserted in a logical place before the new instruction.
2369 FuncInfo
.InsertPt
= User
;
2370 FuncInfo
.MBB
= User
->getParent();
2372 // Ask the target to try folding the load.
2373 return tryToFoldLoadIntoMI(User
, RI
.getOperandNo(), LI
);
2376 bool FastISel::canFoldAddIntoGEP(const User
*GEP
, const Value
*Add
) {
2378 if (!isa
<AddOperator
>(Add
))
2380 // Type size needs to match.
2381 if (DL
.getTypeSizeInBits(GEP
->getType()) !=
2382 DL
.getTypeSizeInBits(Add
->getType()))
2384 // Must be in the same basic block.
2385 if (isa
<Instruction
>(Add
) &&
2386 FuncInfo
.getMBB(cast
<Instruction
>(Add
)->getParent()) != FuncInfo
.MBB
)
2388 // Must have a constant operand.
2389 return isa
<ConstantInt
>(cast
<AddOperator
>(Add
)->getOperand(1));
2393 FastISel::createMachineMemOperandFor(const Instruction
*I
) const {
2396 MaybeAlign Alignment
;
2397 MachineMemOperand::Flags Flags
;
2400 if (const auto *LI
= dyn_cast
<LoadInst
>(I
)) {
2401 Alignment
= LI
->getAlign();
2402 IsVolatile
= LI
->isVolatile();
2403 Flags
= MachineMemOperand::MOLoad
;
2404 Ptr
= LI
->getPointerOperand();
2405 ValTy
= LI
->getType();
2406 } else if (const auto *SI
= dyn_cast
<StoreInst
>(I
)) {
2407 Alignment
= SI
->getAlign();
2408 IsVolatile
= SI
->isVolatile();
2409 Flags
= MachineMemOperand::MOStore
;
2410 Ptr
= SI
->getPointerOperand();
2411 ValTy
= SI
->getValueOperand()->getType();
2415 bool IsNonTemporal
= I
->hasMetadata(LLVMContext::MD_nontemporal
);
2416 bool IsInvariant
= I
->hasMetadata(LLVMContext::MD_invariant_load
);
2417 bool IsDereferenceable
= I
->hasMetadata(LLVMContext::MD_dereferenceable
);
2418 const MDNode
*Ranges
= I
->getMetadata(LLVMContext::MD_range
);
2420 AAMDNodes AAInfo
= I
->getAAMetadata();
2422 if (!Alignment
) // Ensure that codegen never sees alignment 0.
2423 Alignment
= DL
.getABITypeAlign(ValTy
);
2425 unsigned Size
= DL
.getTypeStoreSize(ValTy
);
2428 Flags
|= MachineMemOperand::MOVolatile
;
2430 Flags
|= MachineMemOperand::MONonTemporal
;
2431 if (IsDereferenceable
)
2432 Flags
|= MachineMemOperand::MODereferenceable
;
2434 Flags
|= MachineMemOperand::MOInvariant
;
2436 return FuncInfo
.MF
->getMachineMemOperand(MachinePointerInfo(Ptr
), Flags
, Size
,
2437 *Alignment
, AAInfo
, Ranges
);
2440 CmpInst::Predicate
FastISel::optimizeCmpPredicate(const CmpInst
*CI
) const {
2441 // If both operands are the same, then try to optimize or fold the cmp.
2442 CmpInst::Predicate Predicate
= CI
->getPredicate();
2443 if (CI
->getOperand(0) != CI
->getOperand(1))
2446 switch (Predicate
) {
2447 default: llvm_unreachable("Invalid predicate!");
2448 case CmpInst::FCMP_FALSE
: Predicate
= CmpInst::FCMP_FALSE
; break;
2449 case CmpInst::FCMP_OEQ
: Predicate
= CmpInst::FCMP_ORD
; break;
2450 case CmpInst::FCMP_OGT
: Predicate
= CmpInst::FCMP_FALSE
; break;
2451 case CmpInst::FCMP_OGE
: Predicate
= CmpInst::FCMP_ORD
; break;
2452 case CmpInst::FCMP_OLT
: Predicate
= CmpInst::FCMP_FALSE
; break;
2453 case CmpInst::FCMP_OLE
: Predicate
= CmpInst::FCMP_ORD
; break;
2454 case CmpInst::FCMP_ONE
: Predicate
= CmpInst::FCMP_FALSE
; break;
2455 case CmpInst::FCMP_ORD
: Predicate
= CmpInst::FCMP_ORD
; break;
2456 case CmpInst::FCMP_UNO
: Predicate
= CmpInst::FCMP_UNO
; break;
2457 case CmpInst::FCMP_UEQ
: Predicate
= CmpInst::FCMP_TRUE
; break;
2458 case CmpInst::FCMP_UGT
: Predicate
= CmpInst::FCMP_UNO
; break;
2459 case CmpInst::FCMP_UGE
: Predicate
= CmpInst::FCMP_TRUE
; break;
2460 case CmpInst::FCMP_ULT
: Predicate
= CmpInst::FCMP_UNO
; break;
2461 case CmpInst::FCMP_ULE
: Predicate
= CmpInst::FCMP_TRUE
; break;
2462 case CmpInst::FCMP_UNE
: Predicate
= CmpInst::FCMP_UNO
; break;
2463 case CmpInst::FCMP_TRUE
: Predicate
= CmpInst::FCMP_TRUE
; break;
2465 case CmpInst::ICMP_EQ
: Predicate
= CmpInst::FCMP_TRUE
; break;
2466 case CmpInst::ICMP_NE
: Predicate
= CmpInst::FCMP_FALSE
; break;
2467 case CmpInst::ICMP_UGT
: Predicate
= CmpInst::FCMP_FALSE
; break;
2468 case CmpInst::ICMP_UGE
: Predicate
= CmpInst::FCMP_TRUE
; break;
2469 case CmpInst::ICMP_ULT
: Predicate
= CmpInst::FCMP_FALSE
; break;
2470 case CmpInst::ICMP_ULE
: Predicate
= CmpInst::FCMP_TRUE
; break;
2471 case CmpInst::ICMP_SGT
: Predicate
= CmpInst::FCMP_FALSE
; break;
2472 case CmpInst::ICMP_SGE
: Predicate
= CmpInst::FCMP_TRUE
; break;
2473 case CmpInst::ICMP_SLT
: Predicate
= CmpInst::FCMP_FALSE
; break;
2474 case CmpInst::ICMP_SLE
: Predicate
= CmpInst::FCMP_TRUE
; break;