1 //===- SelectionDAGBuilder.cpp - Selection-DAG building -------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This implements routines for translating from LLVM IR into SelectionDAG IR.
12 //===----------------------------------------------------------------------===//
14 #include "SelectionDAGBuilder.h"
15 #include "SDNodeDbgValue.h"
16 #include "llvm/ADT/APFloat.h"
17 #include "llvm/ADT/APInt.h"
18 #include "llvm/ADT/ArrayRef.h"
19 #include "llvm/ADT/BitVector.h"
20 #include "llvm/ADT/DenseMap.h"
21 #include "llvm/ADT/None.h"
22 #include "llvm/ADT/Optional.h"
23 #include "llvm/ADT/STLExtras.h"
24 #include "llvm/ADT/SmallPtrSet.h"
25 #include "llvm/ADT/SmallSet.h"
26 #include "llvm/ADT/SmallVector.h"
27 #include "llvm/ADT/StringRef.h"
28 #include "llvm/ADT/Triple.h"
29 #include "llvm/ADT/Twine.h"
30 #include "llvm/Analysis/AliasAnalysis.h"
31 #include "llvm/Analysis/BranchProbabilityInfo.h"
32 #include "llvm/Analysis/ConstantFolding.h"
33 #include "llvm/Analysis/EHPersonalities.h"
34 #include "llvm/Analysis/Loads.h"
35 #include "llvm/Analysis/MemoryLocation.h"
36 #include "llvm/Analysis/TargetLibraryInfo.h"
37 #include "llvm/Analysis/ValueTracking.h"
38 #include "llvm/Analysis/VectorUtils.h"
39 #include "llvm/CodeGen/Analysis.h"
40 #include "llvm/CodeGen/FunctionLoweringInfo.h"
41 #include "llvm/CodeGen/GCMetadata.h"
42 #include "llvm/CodeGen/ISDOpcodes.h"
43 #include "llvm/CodeGen/MachineBasicBlock.h"
44 #include "llvm/CodeGen/MachineFrameInfo.h"
45 #include "llvm/CodeGen/MachineFunction.h"
46 #include "llvm/CodeGen/MachineInstr.h"
47 #include "llvm/CodeGen/MachineInstrBuilder.h"
48 #include "llvm/CodeGen/MachineJumpTableInfo.h"
49 #include "llvm/CodeGen/MachineMemOperand.h"
50 #include "llvm/CodeGen/MachineModuleInfo.h"
51 #include "llvm/CodeGen/MachineOperand.h"
52 #include "llvm/CodeGen/MachineRegisterInfo.h"
53 #include "llvm/CodeGen/RuntimeLibcalls.h"
54 #include "llvm/CodeGen/SelectionDAG.h"
55 #include "llvm/CodeGen/SelectionDAGNodes.h"
56 #include "llvm/CodeGen/SelectionDAGTargetInfo.h"
57 #include "llvm/CodeGen/StackMaps.h"
58 #include "llvm/CodeGen/TargetFrameLowering.h"
59 #include "llvm/CodeGen/TargetInstrInfo.h"
60 #include "llvm/CodeGen/TargetLowering.h"
61 #include "llvm/CodeGen/TargetOpcodes.h"
62 #include "llvm/CodeGen/TargetRegisterInfo.h"
63 #include "llvm/CodeGen/TargetSubtargetInfo.h"
64 #include "llvm/CodeGen/ValueTypes.h"
65 #include "llvm/CodeGen/WinEHFuncInfo.h"
66 #include "llvm/IR/Argument.h"
67 #include "llvm/IR/Attributes.h"
68 #include "llvm/IR/BasicBlock.h"
69 #include "llvm/IR/CFG.h"
70 #include "llvm/IR/CallSite.h"
71 #include "llvm/IR/CallingConv.h"
72 #include "llvm/IR/Constant.h"
73 #include "llvm/IR/ConstantRange.h"
74 #include "llvm/IR/Constants.h"
75 #include "llvm/IR/DataLayout.h"
76 #include "llvm/IR/DebugInfoMetadata.h"
77 #include "llvm/IR/DebugLoc.h"
78 #include "llvm/IR/DerivedTypes.h"
79 #include "llvm/IR/Function.h"
80 #include "llvm/IR/GetElementPtrTypeIterator.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/Intrinsics.h"
87 #include "llvm/IR/LLVMContext.h"
88 #include "llvm/IR/Metadata.h"
89 #include "llvm/IR/Module.h"
90 #include "llvm/IR/Operator.h"
91 #include "llvm/IR/Statepoint.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/MCSymbol.h"
97 #include "llvm/Support/AtomicOrdering.h"
98 #include "llvm/Support/BranchProbability.h"
99 #include "llvm/Support/Casting.h"
100 #include "llvm/Support/CodeGen.h"
101 #include "llvm/Support/CommandLine.h"
102 #include "llvm/Support/Compiler.h"
103 #include "llvm/Support/Debug.h"
104 #include "llvm/Support/ErrorHandling.h"
105 #include "llvm/Support/MachineValueType.h"
106 #include "llvm/Support/MathExtras.h"
107 #include "llvm/Support/raw_ostream.h"
108 #include "llvm/Target/TargetIntrinsicInfo.h"
109 #include "llvm/Target/TargetMachine.h"
110 #include "llvm/Target/TargetOptions.h"
123 using namespace llvm
;
125 #define DEBUG_TYPE "isel"
127 /// LimitFloatPrecision - Generate low-precision inline sequences for
128 /// some float libcalls (6, 8 or 12 bits).
129 static unsigned LimitFloatPrecision
;
131 static cl::opt
<unsigned, true>
132 LimitFPPrecision("limit-float-precision",
133 cl::desc("Generate low-precision inline sequences "
134 "for some float libcalls"),
135 cl::location(LimitFloatPrecision
), cl::Hidden
,
138 static cl::opt
<unsigned> SwitchPeelThreshold(
139 "switch-peel-threshold", cl::Hidden
, cl::init(66),
140 cl::desc("Set the case probability threshold for peeling the case from a "
141 "switch statement. A value greater than 100 will void this "
144 // Limit the width of DAG chains. This is important in general to prevent
145 // DAG-based analysis from blowing up. For example, alias analysis and
146 // load clustering may not complete in reasonable time. It is difficult to
147 // recognize and avoid this situation within each individual analysis, and
148 // future analyses are likely to have the same behavior. Limiting DAG width is
149 // the safe approach and will be especially important with global DAGs.
151 // MaxParallelChains default is arbitrarily high to avoid affecting
152 // optimization, but could be lowered to improve compile time. Any ld-ld-st-st
153 // sequence over this should have been converted to llvm.memcpy by the
154 // frontend. It is easy to induce this behavior with .ll code such as:
155 // %buffer = alloca [4096 x i8]
156 // %data = load [4096 x i8]* %argPtr
157 // store [4096 x i8] %data, [4096 x i8]* %buffer
158 static const unsigned MaxParallelChains
= 64;
160 // Return the calling convention if the Value passed requires ABI mangling as it
161 // is a parameter to a function or a return value from a function which is not
163 static Optional
<CallingConv::ID
> getABIRegCopyCC(const Value
*V
) {
164 if (auto *R
= dyn_cast
<ReturnInst
>(V
))
165 return R
->getParent()->getParent()->getCallingConv();
167 if (auto *CI
= dyn_cast
<CallInst
>(V
)) {
168 const bool IsInlineAsm
= CI
->isInlineAsm();
169 const bool IsIndirectFunctionCall
=
170 !IsInlineAsm
&& !CI
->getCalledFunction();
172 // It is possible that the call instruction is an inline asm statement or an
173 // indirect function call in which case the return value of
174 // getCalledFunction() would be nullptr.
175 const bool IsInstrinsicCall
=
176 !IsInlineAsm
&& !IsIndirectFunctionCall
&&
177 CI
->getCalledFunction()->getIntrinsicID() != Intrinsic::not_intrinsic
;
179 if (!IsInlineAsm
&& !IsInstrinsicCall
)
180 return CI
->getCallingConv();
186 static SDValue
getCopyFromPartsVector(SelectionDAG
&DAG
, const SDLoc
&DL
,
187 const SDValue
*Parts
, unsigned NumParts
,
188 MVT PartVT
, EVT ValueVT
, const Value
*V
,
189 Optional
<CallingConv::ID
> CC
);
191 /// getCopyFromParts - Create a value that contains the specified legal parts
192 /// combined into the value they represent. If the parts combine to a type
193 /// larger than ValueVT then AssertOp can be used to specify whether the extra
194 /// bits are known to be zero (ISD::AssertZext) or sign extended from ValueVT
195 /// (ISD::AssertSext).
196 static SDValue
getCopyFromParts(SelectionDAG
&DAG
, const SDLoc
&DL
,
197 const SDValue
*Parts
, unsigned NumParts
,
198 MVT PartVT
, EVT ValueVT
, const Value
*V
,
199 Optional
<CallingConv::ID
> CC
= None
,
200 Optional
<ISD::NodeType
> AssertOp
= None
) {
201 if (ValueVT
.isVector())
202 return getCopyFromPartsVector(DAG
, DL
, Parts
, NumParts
, PartVT
, ValueVT
, V
,
205 assert(NumParts
> 0 && "No parts to assemble!");
206 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
207 SDValue Val
= Parts
[0];
210 // Assemble the value from multiple parts.
211 if (ValueVT
.isInteger()) {
212 unsigned PartBits
= PartVT
.getSizeInBits();
213 unsigned ValueBits
= ValueVT
.getSizeInBits();
215 // Assemble the power of 2 part.
216 unsigned RoundParts
= NumParts
& (NumParts
- 1) ?
217 1 << Log2_32(NumParts
) : NumParts
;
218 unsigned RoundBits
= PartBits
* RoundParts
;
219 EVT RoundVT
= RoundBits
== ValueBits
?
220 ValueVT
: EVT::getIntegerVT(*DAG
.getContext(), RoundBits
);
223 EVT HalfVT
= EVT::getIntegerVT(*DAG
.getContext(), RoundBits
/2);
225 if (RoundParts
> 2) {
226 Lo
= getCopyFromParts(DAG
, DL
, Parts
, RoundParts
/ 2,
228 Hi
= getCopyFromParts(DAG
, DL
, Parts
+ RoundParts
/ 2,
229 RoundParts
/ 2, PartVT
, HalfVT
, V
);
231 Lo
= DAG
.getNode(ISD::BITCAST
, DL
, HalfVT
, Parts
[0]);
232 Hi
= DAG
.getNode(ISD::BITCAST
, DL
, HalfVT
, Parts
[1]);
235 if (DAG
.getDataLayout().isBigEndian())
238 Val
= DAG
.getNode(ISD::BUILD_PAIR
, DL
, RoundVT
, Lo
, Hi
);
240 if (RoundParts
< NumParts
) {
241 // Assemble the trailing non-power-of-2 part.
242 unsigned OddParts
= NumParts
- RoundParts
;
243 EVT OddVT
= EVT::getIntegerVT(*DAG
.getContext(), OddParts
* PartBits
);
244 Hi
= getCopyFromParts(DAG
, DL
, Parts
+ RoundParts
, OddParts
, PartVT
,
247 // Combine the round and odd parts.
249 if (DAG
.getDataLayout().isBigEndian())
251 EVT TotalVT
= EVT::getIntegerVT(*DAG
.getContext(), NumParts
* PartBits
);
252 Hi
= DAG
.getNode(ISD::ANY_EXTEND
, DL
, TotalVT
, Hi
);
254 DAG
.getNode(ISD::SHL
, DL
, TotalVT
, Hi
,
255 DAG
.getConstant(Lo
.getValueSizeInBits(), DL
,
256 TLI
.getPointerTy(DAG
.getDataLayout())));
257 Lo
= DAG
.getNode(ISD::ZERO_EXTEND
, DL
, TotalVT
, Lo
);
258 Val
= DAG
.getNode(ISD::OR
, DL
, TotalVT
, Lo
, Hi
);
260 } else if (PartVT
.isFloatingPoint()) {
261 // FP split into multiple FP parts (for ppcf128)
262 assert(ValueVT
== EVT(MVT::ppcf128
) && PartVT
== MVT::f64
&&
265 Lo
= DAG
.getNode(ISD::BITCAST
, DL
, EVT(MVT::f64
), Parts
[0]);
266 Hi
= DAG
.getNode(ISD::BITCAST
, DL
, EVT(MVT::f64
), Parts
[1]);
267 if (TLI
.hasBigEndianPartOrdering(ValueVT
, DAG
.getDataLayout()))
269 Val
= DAG
.getNode(ISD::BUILD_PAIR
, DL
, ValueVT
, Lo
, Hi
);
271 // FP split into integer parts (soft fp)
272 assert(ValueVT
.isFloatingPoint() && PartVT
.isInteger() &&
273 !PartVT
.isVector() && "Unexpected split");
274 EVT IntVT
= EVT::getIntegerVT(*DAG
.getContext(), ValueVT
.getSizeInBits());
275 Val
= getCopyFromParts(DAG
, DL
, Parts
, NumParts
, PartVT
, IntVT
, V
, CC
);
279 // There is now one part, held in Val. Correct it to match ValueVT.
280 // PartEVT is the type of the register class that holds the value.
281 // ValueVT is the type of the inline asm operation.
282 EVT PartEVT
= Val
.getValueType();
284 if (PartEVT
== ValueVT
)
287 if (PartEVT
.isInteger() && ValueVT
.isFloatingPoint() &&
288 ValueVT
.bitsLT(PartEVT
)) {
289 // For an FP value in an integer part, we need to truncate to the right
291 PartEVT
= EVT::getIntegerVT(*DAG
.getContext(), ValueVT
.getSizeInBits());
292 Val
= DAG
.getNode(ISD::TRUNCATE
, DL
, PartEVT
, Val
);
295 // Handle types that have the same size.
296 if (PartEVT
.getSizeInBits() == ValueVT
.getSizeInBits())
297 return DAG
.getNode(ISD::BITCAST
, DL
, ValueVT
, Val
);
299 // Handle types with different sizes.
300 if (PartEVT
.isInteger() && ValueVT
.isInteger()) {
301 if (ValueVT
.bitsLT(PartEVT
)) {
302 // For a truncate, see if we have any information to
303 // indicate whether the truncated bits will always be
304 // zero or sign-extension.
305 if (AssertOp
.hasValue())
306 Val
= DAG
.getNode(*AssertOp
, DL
, PartEVT
, Val
,
307 DAG
.getValueType(ValueVT
));
308 return DAG
.getNode(ISD::TRUNCATE
, DL
, ValueVT
, Val
);
310 return DAG
.getNode(ISD::ANY_EXTEND
, DL
, ValueVT
, Val
);
313 if (PartEVT
.isFloatingPoint() && ValueVT
.isFloatingPoint()) {
314 // FP_ROUND's are always exact here.
315 if (ValueVT
.bitsLT(Val
.getValueType()))
317 ISD::FP_ROUND
, DL
, ValueVT
, Val
,
318 DAG
.getTargetConstant(1, DL
, TLI
.getPointerTy(DAG
.getDataLayout())));
320 return DAG
.getNode(ISD::FP_EXTEND
, DL
, ValueVT
, Val
);
323 llvm_unreachable("Unknown mismatch!");
326 static void diagnosePossiblyInvalidConstraint(LLVMContext
&Ctx
, const Value
*V
,
327 const Twine
&ErrMsg
) {
328 const Instruction
*I
= dyn_cast_or_null
<Instruction
>(V
);
330 return Ctx
.emitError(ErrMsg
);
332 const char *AsmError
= ", possible invalid constraint for vector type";
333 if (const CallInst
*CI
= dyn_cast
<CallInst
>(I
))
334 if (isa
<InlineAsm
>(CI
->getCalledValue()))
335 return Ctx
.emitError(I
, ErrMsg
+ AsmError
);
337 return Ctx
.emitError(I
, ErrMsg
);
340 /// getCopyFromPartsVector - Create a value that contains the specified legal
341 /// parts combined into the value they represent. If the parts combine to a
342 /// type larger than ValueVT then AssertOp can be used to specify whether the
343 /// extra bits are known to be zero (ISD::AssertZext) or sign extended from
344 /// ValueVT (ISD::AssertSext).
345 static SDValue
getCopyFromPartsVector(SelectionDAG
&DAG
, const SDLoc
&DL
,
346 const SDValue
*Parts
, unsigned NumParts
,
347 MVT PartVT
, EVT ValueVT
, const Value
*V
,
348 Optional
<CallingConv::ID
> CallConv
) {
349 assert(ValueVT
.isVector() && "Not a vector value");
350 assert(NumParts
> 0 && "No parts to assemble!");
351 const bool IsABIRegCopy
= CallConv
.hasValue();
353 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
354 SDValue Val
= Parts
[0];
356 // Handle a multi-element vector.
360 unsigned NumIntermediates
;
364 NumRegs
= TLI
.getVectorTypeBreakdownForCallingConv(
365 *DAG
.getContext(), CallConv
.getValue(), ValueVT
, IntermediateVT
,
366 NumIntermediates
, RegisterVT
);
369 TLI
.getVectorTypeBreakdown(*DAG
.getContext(), ValueVT
, IntermediateVT
,
370 NumIntermediates
, RegisterVT
);
373 assert(NumRegs
== NumParts
&& "Part count doesn't match vector breakdown!");
374 NumParts
= NumRegs
; // Silence a compiler warning.
375 assert(RegisterVT
== PartVT
&& "Part type doesn't match vector breakdown!");
376 assert(RegisterVT
.getSizeInBits() ==
377 Parts
[0].getSimpleValueType().getSizeInBits() &&
378 "Part type sizes don't match!");
380 // Assemble the parts into intermediate operands.
381 SmallVector
<SDValue
, 8> Ops(NumIntermediates
);
382 if (NumIntermediates
== NumParts
) {
383 // If the register was not expanded, truncate or copy the value,
385 for (unsigned i
= 0; i
!= NumParts
; ++i
)
386 Ops
[i
] = getCopyFromParts(DAG
, DL
, &Parts
[i
], 1,
387 PartVT
, IntermediateVT
, V
);
388 } else if (NumParts
> 0) {
389 // If the intermediate type was expanded, build the intermediate
390 // operands from the parts.
391 assert(NumParts
% NumIntermediates
== 0 &&
392 "Must expand into a divisible number of parts!");
393 unsigned Factor
= NumParts
/ NumIntermediates
;
394 for (unsigned i
= 0; i
!= NumIntermediates
; ++i
)
395 Ops
[i
] = getCopyFromParts(DAG
, DL
, &Parts
[i
* Factor
], Factor
,
396 PartVT
, IntermediateVT
, V
);
399 // Build a vector with BUILD_VECTOR or CONCAT_VECTORS from the
400 // intermediate operands.
402 EVT::getVectorVT(*DAG
.getContext(), IntermediateVT
.getScalarType(),
403 (IntermediateVT
.isVector()
404 ? IntermediateVT
.getVectorNumElements() * NumParts
405 : NumIntermediates
));
406 Val
= DAG
.getNode(IntermediateVT
.isVector() ? ISD::CONCAT_VECTORS
408 DL
, BuiltVectorTy
, Ops
);
411 // There is now one part, held in Val. Correct it to match ValueVT.
412 EVT PartEVT
= Val
.getValueType();
414 if (PartEVT
== ValueVT
)
417 if (PartEVT
.isVector()) {
418 // If the element type of the source/dest vectors are the same, but the
419 // parts vector has more elements than the value vector, then we have a
420 // vector widening case (e.g. <2 x float> -> <4 x float>). Extract the
422 if (PartEVT
.getVectorElementType() == ValueVT
.getVectorElementType()) {
423 assert(PartEVT
.getVectorNumElements() > ValueVT
.getVectorNumElements() &&
424 "Cannot narrow, it would be a lossy transformation");
426 ISD::EXTRACT_SUBVECTOR
, DL
, ValueVT
, Val
,
427 DAG
.getConstant(0, DL
, TLI
.getVectorIdxTy(DAG
.getDataLayout())));
430 // Vector/Vector bitcast.
431 if (ValueVT
.getSizeInBits() == PartEVT
.getSizeInBits())
432 return DAG
.getNode(ISD::BITCAST
, DL
, ValueVT
, Val
);
434 assert(PartEVT
.getVectorNumElements() == ValueVT
.getVectorNumElements() &&
435 "Cannot handle this kind of promotion");
436 // Promoted vector extract
437 return DAG
.getAnyExtOrTrunc(Val
, DL
, ValueVT
);
441 // Trivial bitcast if the types are the same size and the destination
442 // vector type is legal.
443 if (PartEVT
.getSizeInBits() == ValueVT
.getSizeInBits() &&
444 TLI
.isTypeLegal(ValueVT
))
445 return DAG
.getNode(ISD::BITCAST
, DL
, ValueVT
, Val
);
447 if (ValueVT
.getVectorNumElements() != 1) {
448 // Certain ABIs require that vectors are passed as integers. For vectors
449 // are the same size, this is an obvious bitcast.
450 if (ValueVT
.getSizeInBits() == PartEVT
.getSizeInBits()) {
451 return DAG
.getNode(ISD::BITCAST
, DL
, ValueVT
, Val
);
452 } else if (ValueVT
.getSizeInBits() < PartEVT
.getSizeInBits()) {
453 // Bitcast Val back the original type and extract the corresponding
455 unsigned Elts
= PartEVT
.getSizeInBits() / ValueVT
.getScalarSizeInBits();
456 EVT WiderVecType
= EVT::getVectorVT(*DAG
.getContext(),
457 ValueVT
.getVectorElementType(), Elts
);
458 Val
= DAG
.getBitcast(WiderVecType
, Val
);
460 ISD::EXTRACT_SUBVECTOR
, DL
, ValueVT
, Val
,
461 DAG
.getConstant(0, DL
, TLI
.getVectorIdxTy(DAG
.getDataLayout())));
464 diagnosePossiblyInvalidConstraint(
465 *DAG
.getContext(), V
, "non-trivial scalar-to-vector conversion");
466 return DAG
.getUNDEF(ValueVT
);
469 // Handle cases such as i8 -> <1 x i1>
470 EVT ValueSVT
= ValueVT
.getVectorElementType();
471 if (ValueVT
.getVectorNumElements() == 1 && ValueSVT
!= PartEVT
)
472 Val
= ValueVT
.isFloatingPoint() ? DAG
.getFPExtendOrRound(Val
, DL
, ValueSVT
)
473 : DAG
.getAnyExtOrTrunc(Val
, DL
, ValueSVT
);
475 return DAG
.getBuildVector(ValueVT
, DL
, Val
);
478 static void getCopyToPartsVector(SelectionDAG
&DAG
, const SDLoc
&dl
,
479 SDValue Val
, SDValue
*Parts
, unsigned NumParts
,
480 MVT PartVT
, const Value
*V
,
481 Optional
<CallingConv::ID
> CallConv
);
483 /// getCopyToParts - Create a series of nodes that contain the specified value
484 /// split into legal parts. If the parts contain more bits than Val, then, for
485 /// integers, ExtendKind can be used to specify how to generate the extra bits.
486 static void getCopyToParts(SelectionDAG
&DAG
, const SDLoc
&DL
, SDValue Val
,
487 SDValue
*Parts
, unsigned NumParts
, MVT PartVT
,
489 Optional
<CallingConv::ID
> CallConv
= None
,
490 ISD::NodeType ExtendKind
= ISD::ANY_EXTEND
) {
491 EVT ValueVT
= Val
.getValueType();
493 // Handle the vector case separately.
494 if (ValueVT
.isVector())
495 return getCopyToPartsVector(DAG
, DL
, Val
, Parts
, NumParts
, PartVT
, V
,
498 unsigned PartBits
= PartVT
.getSizeInBits();
499 unsigned OrigNumParts
= NumParts
;
500 assert(DAG
.getTargetLoweringInfo().isTypeLegal(PartVT
) &&
501 "Copying to an illegal type!");
506 assert(!ValueVT
.isVector() && "Vector case handled elsewhere");
507 EVT PartEVT
= PartVT
;
508 if (PartEVT
== ValueVT
) {
509 assert(NumParts
== 1 && "No-op copy with multiple parts!");
514 if (NumParts
* PartBits
> ValueVT
.getSizeInBits()) {
515 // If the parts cover more bits than the value has, promote the value.
516 if (PartVT
.isFloatingPoint() && ValueVT
.isFloatingPoint()) {
517 assert(NumParts
== 1 && "Do not know what to promote to!");
518 Val
= DAG
.getNode(ISD::FP_EXTEND
, DL
, PartVT
, Val
);
520 if (ValueVT
.isFloatingPoint()) {
521 // FP values need to be bitcast, then extended if they are being put
522 // into a larger container.
523 ValueVT
= EVT::getIntegerVT(*DAG
.getContext(), ValueVT
.getSizeInBits());
524 Val
= DAG
.getNode(ISD::BITCAST
, DL
, ValueVT
, Val
);
526 assert((PartVT
.isInteger() || PartVT
== MVT::x86mmx
) &&
527 ValueVT
.isInteger() &&
528 "Unknown mismatch!");
529 ValueVT
= EVT::getIntegerVT(*DAG
.getContext(), NumParts
* PartBits
);
530 Val
= DAG
.getNode(ExtendKind
, DL
, ValueVT
, Val
);
531 if (PartVT
== MVT::x86mmx
)
532 Val
= DAG
.getNode(ISD::BITCAST
, DL
, PartVT
, Val
);
534 } else if (PartBits
== ValueVT
.getSizeInBits()) {
535 // Different types of the same size.
536 assert(NumParts
== 1 && PartEVT
!= ValueVT
);
537 Val
= DAG
.getNode(ISD::BITCAST
, DL
, PartVT
, Val
);
538 } else if (NumParts
* PartBits
< ValueVT
.getSizeInBits()) {
539 // If the parts cover less bits than value has, truncate the value.
540 assert((PartVT
.isInteger() || PartVT
== MVT::x86mmx
) &&
541 ValueVT
.isInteger() &&
542 "Unknown mismatch!");
543 ValueVT
= EVT::getIntegerVT(*DAG
.getContext(), NumParts
* PartBits
);
544 Val
= DAG
.getNode(ISD::TRUNCATE
, DL
, ValueVT
, Val
);
545 if (PartVT
== MVT::x86mmx
)
546 Val
= DAG
.getNode(ISD::BITCAST
, DL
, PartVT
, Val
);
549 // The value may have changed - recompute ValueVT.
550 ValueVT
= Val
.getValueType();
551 assert(NumParts
* PartBits
== ValueVT
.getSizeInBits() &&
552 "Failed to tile the value with PartVT!");
555 if (PartEVT
!= ValueVT
) {
556 diagnosePossiblyInvalidConstraint(*DAG
.getContext(), V
,
557 "scalar-to-vector conversion failed");
558 Val
= DAG
.getNode(ISD::BITCAST
, DL
, PartVT
, Val
);
565 // Expand the value into multiple parts.
566 if (NumParts
& (NumParts
- 1)) {
567 // The number of parts is not a power of 2. Split off and copy the tail.
568 assert(PartVT
.isInteger() && ValueVT
.isInteger() &&
569 "Do not know what to expand to!");
570 unsigned RoundParts
= 1 << Log2_32(NumParts
);
571 unsigned RoundBits
= RoundParts
* PartBits
;
572 unsigned OddParts
= NumParts
- RoundParts
;
573 SDValue OddVal
= DAG
.getNode(ISD::SRL
, DL
, ValueVT
, Val
,
574 DAG
.getIntPtrConstant(RoundBits
, DL
));
575 getCopyToParts(DAG
, DL
, OddVal
, Parts
+ RoundParts
, OddParts
, PartVT
, V
,
578 if (DAG
.getDataLayout().isBigEndian())
579 // The odd parts were reversed by getCopyToParts - unreverse them.
580 std::reverse(Parts
+ RoundParts
, Parts
+ NumParts
);
582 NumParts
= RoundParts
;
583 ValueVT
= EVT::getIntegerVT(*DAG
.getContext(), NumParts
* PartBits
);
584 Val
= DAG
.getNode(ISD::TRUNCATE
, DL
, ValueVT
, Val
);
587 // The number of parts is a power of 2. Repeatedly bisect the value using
589 Parts
[0] = DAG
.getNode(ISD::BITCAST
, DL
,
590 EVT::getIntegerVT(*DAG
.getContext(),
591 ValueVT
.getSizeInBits()),
594 for (unsigned StepSize
= NumParts
; StepSize
> 1; StepSize
/= 2) {
595 for (unsigned i
= 0; i
< NumParts
; i
+= StepSize
) {
596 unsigned ThisBits
= StepSize
* PartBits
/ 2;
597 EVT ThisVT
= EVT::getIntegerVT(*DAG
.getContext(), ThisBits
);
598 SDValue
&Part0
= Parts
[i
];
599 SDValue
&Part1
= Parts
[i
+StepSize
/2];
601 Part1
= DAG
.getNode(ISD::EXTRACT_ELEMENT
, DL
,
602 ThisVT
, Part0
, DAG
.getIntPtrConstant(1, DL
));
603 Part0
= DAG
.getNode(ISD::EXTRACT_ELEMENT
, DL
,
604 ThisVT
, Part0
, DAG
.getIntPtrConstant(0, DL
));
606 if (ThisBits
== PartBits
&& ThisVT
!= PartVT
) {
607 Part0
= DAG
.getNode(ISD::BITCAST
, DL
, PartVT
, Part0
);
608 Part1
= DAG
.getNode(ISD::BITCAST
, DL
, PartVT
, Part1
);
613 if (DAG
.getDataLayout().isBigEndian())
614 std::reverse(Parts
, Parts
+ OrigNumParts
);
617 static SDValue
widenVectorToPartType(SelectionDAG
&DAG
,
618 SDValue Val
, const SDLoc
&DL
, EVT PartVT
) {
619 if (!PartVT
.isVector())
622 EVT ValueVT
= Val
.getValueType();
623 unsigned PartNumElts
= PartVT
.getVectorNumElements();
624 unsigned ValueNumElts
= ValueVT
.getVectorNumElements();
625 if (PartNumElts
> ValueNumElts
&&
626 PartVT
.getVectorElementType() == ValueVT
.getVectorElementType()) {
627 EVT ElementVT
= PartVT
.getVectorElementType();
628 // Vector widening case, e.g. <2 x float> -> <4 x float>. Shuffle in
630 SmallVector
<SDValue
, 16> Ops
;
631 DAG
.ExtractVectorElements(Val
, Ops
);
632 SDValue EltUndef
= DAG
.getUNDEF(ElementVT
);
633 for (unsigned i
= ValueNumElts
, e
= PartNumElts
; i
!= e
; ++i
)
634 Ops
.push_back(EltUndef
);
636 // FIXME: Use CONCAT for 2x -> 4x.
637 return DAG
.getBuildVector(PartVT
, DL
, Ops
);
643 /// getCopyToPartsVector - Create a series of nodes that contain the specified
644 /// value split into legal parts.
645 static void getCopyToPartsVector(SelectionDAG
&DAG
, const SDLoc
&DL
,
646 SDValue Val
, SDValue
*Parts
, unsigned NumParts
,
647 MVT PartVT
, const Value
*V
,
648 Optional
<CallingConv::ID
> CallConv
) {
649 EVT ValueVT
= Val
.getValueType();
650 assert(ValueVT
.isVector() && "Not a vector");
651 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
652 const bool IsABIRegCopy
= CallConv
.hasValue();
655 EVT PartEVT
= PartVT
;
656 if (PartEVT
== ValueVT
) {
658 } else if (PartVT
.getSizeInBits() == ValueVT
.getSizeInBits()) {
659 // Bitconvert vector->vector case.
660 Val
= DAG
.getNode(ISD::BITCAST
, DL
, PartVT
, Val
);
661 } else if (SDValue Widened
= widenVectorToPartType(DAG
, Val
, DL
, PartVT
)) {
663 } else if (PartVT
.isVector() &&
664 PartEVT
.getVectorElementType().bitsGE(
665 ValueVT
.getVectorElementType()) &&
666 PartEVT
.getVectorNumElements() == ValueVT
.getVectorNumElements()) {
668 // Promoted vector extract
669 Val
= DAG
.getAnyExtOrTrunc(Val
, DL
, PartVT
);
671 if (ValueVT
.getVectorNumElements() == 1) {
673 ISD::EXTRACT_VECTOR_ELT
, DL
, PartVT
, Val
,
674 DAG
.getConstant(0, DL
, TLI
.getVectorIdxTy(DAG
.getDataLayout())));
676 assert(PartVT
.getSizeInBits() > ValueVT
.getSizeInBits() &&
677 "lossy conversion of vector to scalar type");
678 EVT IntermediateType
=
679 EVT::getIntegerVT(*DAG
.getContext(), ValueVT
.getSizeInBits());
680 Val
= DAG
.getBitcast(IntermediateType
, Val
);
681 Val
= DAG
.getAnyExtOrTrunc(Val
, DL
, PartVT
);
685 assert(Val
.getValueType() == PartVT
&& "Unexpected vector part value type");
690 // Handle a multi-element vector.
693 unsigned NumIntermediates
;
696 NumRegs
= TLI
.getVectorTypeBreakdownForCallingConv(
697 *DAG
.getContext(), CallConv
.getValue(), ValueVT
, IntermediateVT
,
698 NumIntermediates
, RegisterVT
);
701 TLI
.getVectorTypeBreakdown(*DAG
.getContext(), ValueVT
, IntermediateVT
,
702 NumIntermediates
, RegisterVT
);
705 assert(NumRegs
== NumParts
&& "Part count doesn't match vector breakdown!");
706 NumParts
= NumRegs
; // Silence a compiler warning.
707 assert(RegisterVT
== PartVT
&& "Part type doesn't match vector breakdown!");
709 unsigned IntermediateNumElts
= IntermediateVT
.isVector() ?
710 IntermediateVT
.getVectorNumElements() : 1;
712 // Convert the vector to the appropiate type if necessary.
713 unsigned DestVectorNoElts
= NumIntermediates
* IntermediateNumElts
;
715 EVT BuiltVectorTy
= EVT::getVectorVT(
716 *DAG
.getContext(), IntermediateVT
.getScalarType(), DestVectorNoElts
);
717 MVT IdxVT
= TLI
.getVectorIdxTy(DAG
.getDataLayout());
718 if (ValueVT
!= BuiltVectorTy
) {
719 if (SDValue Widened
= widenVectorToPartType(DAG
, Val
, DL
, BuiltVectorTy
))
722 Val
= DAG
.getNode(ISD::BITCAST
, DL
, BuiltVectorTy
, Val
);
725 // Split the vector into intermediate operands.
726 SmallVector
<SDValue
, 8> Ops(NumIntermediates
);
727 for (unsigned i
= 0; i
!= NumIntermediates
; ++i
) {
728 if (IntermediateVT
.isVector()) {
729 Ops
[i
] = DAG
.getNode(ISD::EXTRACT_SUBVECTOR
, DL
, IntermediateVT
, Val
,
730 DAG
.getConstant(i
* IntermediateNumElts
, DL
, IdxVT
));
732 Ops
[i
] = DAG
.getNode(
733 ISD::EXTRACT_VECTOR_ELT
, DL
, IntermediateVT
, Val
,
734 DAG
.getConstant(i
, DL
, IdxVT
));
738 // Split the intermediate operands into legal parts.
739 if (NumParts
== NumIntermediates
) {
740 // If the register was not expanded, promote or copy the value,
742 for (unsigned i
= 0; i
!= NumParts
; ++i
)
743 getCopyToParts(DAG
, DL
, Ops
[i
], &Parts
[i
], 1, PartVT
, V
, CallConv
);
744 } else if (NumParts
> 0) {
745 // If the intermediate type was expanded, split each the value into
747 assert(NumIntermediates
!= 0 && "division by zero");
748 assert(NumParts
% NumIntermediates
== 0 &&
749 "Must expand into a divisible number of parts!");
750 unsigned Factor
= NumParts
/ NumIntermediates
;
751 for (unsigned i
= 0; i
!= NumIntermediates
; ++i
)
752 getCopyToParts(DAG
, DL
, Ops
[i
], &Parts
[i
* Factor
], Factor
, PartVT
, V
,
757 RegsForValue::RegsForValue(const SmallVector
<unsigned, 4> ®s
, MVT regvt
,
758 EVT valuevt
, Optional
<CallingConv::ID
> CC
)
759 : ValueVTs(1, valuevt
), RegVTs(1, regvt
), Regs(regs
),
760 RegCount(1, regs
.size()), CallConv(CC
) {}
762 RegsForValue::RegsForValue(LLVMContext
&Context
, const TargetLowering
&TLI
,
763 const DataLayout
&DL
, unsigned Reg
, Type
*Ty
,
764 Optional
<CallingConv::ID
> CC
) {
765 ComputeValueVTs(TLI
, DL
, Ty
, ValueVTs
);
769 for (EVT ValueVT
: ValueVTs
) {
772 ? TLI
.getNumRegistersForCallingConv(Context
, CC
.getValue(), ValueVT
)
773 : TLI
.getNumRegisters(Context
, ValueVT
);
776 ? TLI
.getRegisterTypeForCallingConv(Context
, CC
.getValue(), ValueVT
)
777 : TLI
.getRegisterType(Context
, ValueVT
);
778 for (unsigned i
= 0; i
!= NumRegs
; ++i
)
779 Regs
.push_back(Reg
+ i
);
780 RegVTs
.push_back(RegisterVT
);
781 RegCount
.push_back(NumRegs
);
786 SDValue
RegsForValue::getCopyFromRegs(SelectionDAG
&DAG
,
787 FunctionLoweringInfo
&FuncInfo
,
788 const SDLoc
&dl
, SDValue
&Chain
,
789 SDValue
*Flag
, const Value
*V
) const {
790 // A Value with type {} or [0 x %t] needs no registers.
791 if (ValueVTs
.empty())
794 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
796 // Assemble the legal parts into the final values.
797 SmallVector
<SDValue
, 4> Values(ValueVTs
.size());
798 SmallVector
<SDValue
, 8> Parts
;
799 for (unsigned Value
= 0, Part
= 0, e
= ValueVTs
.size(); Value
!= e
; ++Value
) {
800 // Copy the legal parts from the registers.
801 EVT ValueVT
= ValueVTs
[Value
];
802 unsigned NumRegs
= RegCount
[Value
];
803 MVT RegisterVT
= isABIMangled() ? TLI
.getRegisterTypeForCallingConv(
805 CallConv
.getValue(), RegVTs
[Value
])
808 Parts
.resize(NumRegs
);
809 for (unsigned i
= 0; i
!= NumRegs
; ++i
) {
812 P
= DAG
.getCopyFromReg(Chain
, dl
, Regs
[Part
+i
], RegisterVT
);
814 P
= DAG
.getCopyFromReg(Chain
, dl
, Regs
[Part
+i
], RegisterVT
, *Flag
);
815 *Flag
= P
.getValue(2);
818 Chain
= P
.getValue(1);
821 // If the source register was virtual and if we know something about it,
822 // add an assert node.
823 if (!TargetRegisterInfo::isVirtualRegister(Regs
[Part
+i
]) ||
824 !RegisterVT
.isInteger() || RegisterVT
.isVector())
827 const FunctionLoweringInfo::LiveOutInfo
*LOI
=
828 FuncInfo
.GetLiveOutRegInfo(Regs
[Part
+i
]);
832 unsigned RegSize
= RegisterVT
.getSizeInBits();
833 unsigned NumSignBits
= LOI
->NumSignBits
;
834 unsigned NumZeroBits
= LOI
->Known
.countMinLeadingZeros();
836 if (NumZeroBits
== RegSize
) {
837 // The current value is a zero.
838 // Explicitly express that as it would be easier for
839 // optimizations to kick in.
840 Parts
[i
] = DAG
.getConstant(0, dl
, RegisterVT
);
844 // FIXME: We capture more information than the dag can represent. For
845 // now, just use the tightest assertzext/assertsext possible.
847 EVT
FromVT(MVT::Other
);
849 FromVT
= EVT::getIntegerVT(*DAG
.getContext(), RegSize
- NumZeroBits
);
851 } else if (NumSignBits
> 1) {
853 EVT::getIntegerVT(*DAG
.getContext(), RegSize
- NumSignBits
+ 1);
858 // Add an assertion node.
859 assert(FromVT
!= MVT::Other
);
860 Parts
[i
] = DAG
.getNode(isSExt
? ISD::AssertSext
: ISD::AssertZext
, dl
,
861 RegisterVT
, P
, DAG
.getValueType(FromVT
));
864 Values
[Value
] = getCopyFromParts(DAG
, dl
, Parts
.begin(), NumRegs
,
865 RegisterVT
, ValueVT
, V
, CallConv
);
870 return DAG
.getNode(ISD::MERGE_VALUES
, dl
, DAG
.getVTList(ValueVTs
), Values
);
873 void RegsForValue::getCopyToRegs(SDValue Val
, SelectionDAG
&DAG
,
874 const SDLoc
&dl
, SDValue
&Chain
, SDValue
*Flag
,
876 ISD::NodeType PreferredExtendType
) const {
877 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
878 ISD::NodeType ExtendKind
= PreferredExtendType
;
880 // Get the list of the values's legal parts.
881 unsigned NumRegs
= Regs
.size();
882 SmallVector
<SDValue
, 8> Parts(NumRegs
);
883 for (unsigned Value
= 0, Part
= 0, e
= ValueVTs
.size(); Value
!= e
; ++Value
) {
884 unsigned NumParts
= RegCount
[Value
];
886 MVT RegisterVT
= isABIMangled() ? TLI
.getRegisterTypeForCallingConv(
888 CallConv
.getValue(), RegVTs
[Value
])
891 if (ExtendKind
== ISD::ANY_EXTEND
&& TLI
.isZExtFree(Val
, RegisterVT
))
892 ExtendKind
= ISD::ZERO_EXTEND
;
894 getCopyToParts(DAG
, dl
, Val
.getValue(Val
.getResNo() + Value
), &Parts
[Part
],
895 NumParts
, RegisterVT
, V
, CallConv
, ExtendKind
);
899 // Copy the parts into the registers.
900 SmallVector
<SDValue
, 8> Chains(NumRegs
);
901 for (unsigned i
= 0; i
!= NumRegs
; ++i
) {
904 Part
= DAG
.getCopyToReg(Chain
, dl
, Regs
[i
], Parts
[i
]);
906 Part
= DAG
.getCopyToReg(Chain
, dl
, Regs
[i
], Parts
[i
], *Flag
);
907 *Flag
= Part
.getValue(1);
910 Chains
[i
] = Part
.getValue(0);
913 if (NumRegs
== 1 || Flag
)
914 // If NumRegs > 1 && Flag is used then the use of the last CopyToReg is
915 // flagged to it. That is the CopyToReg nodes and the user are considered
916 // a single scheduling unit. If we create a TokenFactor and return it as
917 // chain, then the TokenFactor is both a predecessor (operand) of the
918 // user as well as a successor (the TF operands are flagged to the user).
919 // c1, f1 = CopyToReg
920 // c2, f2 = CopyToReg
921 // c3 = TokenFactor c1, c2
924 Chain
= Chains
[NumRegs
-1];
926 Chain
= DAG
.getNode(ISD::TokenFactor
, dl
, MVT::Other
, Chains
);
929 void RegsForValue::AddInlineAsmOperands(unsigned Code
, bool HasMatching
,
930 unsigned MatchingIdx
, const SDLoc
&dl
,
932 std::vector
<SDValue
> &Ops
) const {
933 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
935 unsigned Flag
= InlineAsm::getFlagWord(Code
, Regs
.size());
937 Flag
= InlineAsm::getFlagWordForMatchingOp(Flag
, MatchingIdx
);
938 else if (!Regs
.empty() &&
939 TargetRegisterInfo::isVirtualRegister(Regs
.front())) {
940 // Put the register class of the virtual registers in the flag word. That
941 // way, later passes can recompute register class constraints for inline
942 // assembly as well as normal instructions.
943 // Don't do this for tied operands that can use the regclass information
945 const MachineRegisterInfo
&MRI
= DAG
.getMachineFunction().getRegInfo();
946 const TargetRegisterClass
*RC
= MRI
.getRegClass(Regs
.front());
947 Flag
= InlineAsm::getFlagWordForRegClass(Flag
, RC
->getID());
950 SDValue Res
= DAG
.getTargetConstant(Flag
, dl
, MVT::i32
);
953 if (Code
== InlineAsm::Kind_Clobber
) {
954 // Clobbers should always have a 1:1 mapping with registers, and may
955 // reference registers that have illegal (e.g. vector) types. Hence, we
956 // shouldn't try to apply any sort of splitting logic to them.
957 assert(Regs
.size() == RegVTs
.size() && Regs
.size() == ValueVTs
.size() &&
958 "No 1:1 mapping from clobbers to regs?");
959 unsigned SP
= TLI
.getStackPointerRegisterToSaveRestore();
961 for (unsigned I
= 0, E
= ValueVTs
.size(); I
!= E
; ++I
) {
962 Ops
.push_back(DAG
.getRegister(Regs
[I
], RegVTs
[I
]));
965 DAG
.getMachineFunction().getFrameInfo().hasOpaqueSPAdjustment()) &&
966 "If we clobbered the stack pointer, MFI should know about it.");
971 for (unsigned Value
= 0, Reg
= 0, e
= ValueVTs
.size(); Value
!= e
; ++Value
) {
972 unsigned NumRegs
= TLI
.getNumRegisters(*DAG
.getContext(), ValueVTs
[Value
]);
973 MVT RegisterVT
= RegVTs
[Value
];
974 for (unsigned i
= 0; i
!= NumRegs
; ++i
) {
975 assert(Reg
< Regs
.size() && "Mismatch in # registers expected");
976 unsigned TheReg
= Regs
[Reg
++];
977 Ops
.push_back(DAG
.getRegister(TheReg
, RegisterVT
));
982 SmallVector
<std::pair
<unsigned, unsigned>, 4>
983 RegsForValue::getRegsAndSizes() const {
984 SmallVector
<std::pair
<unsigned, unsigned>, 4> OutVec
;
986 for (auto CountAndVT
: zip_first(RegCount
, RegVTs
)) {
987 unsigned RegCount
= std::get
<0>(CountAndVT
);
988 MVT RegisterVT
= std::get
<1>(CountAndVT
);
989 unsigned RegisterSize
= RegisterVT
.getSizeInBits();
990 for (unsigned E
= I
+ RegCount
; I
!= E
; ++I
)
991 OutVec
.push_back(std::make_pair(Regs
[I
], RegisterSize
));
996 void SelectionDAGBuilder::init(GCFunctionInfo
*gfi
, AliasAnalysis
*aa
,
997 const TargetLibraryInfo
*li
) {
1001 DL
= &DAG
.getDataLayout();
1002 Context
= DAG
.getContext();
1003 LPadToCallSiteMap
.clear();
1006 void SelectionDAGBuilder::clear() {
1008 UnusedArgNodeMap
.clear();
1009 PendingLoads
.clear();
1010 PendingExports
.clear();
1012 HasTailCall
= false;
1013 SDNodeOrder
= LowestSDNodeOrder
;
1014 StatepointLowering
.clear();
1017 void SelectionDAGBuilder::clearDanglingDebugInfo() {
1018 DanglingDebugInfoMap
.clear();
1021 SDValue
SelectionDAGBuilder::getRoot() {
1022 if (PendingLoads
.empty())
1023 return DAG
.getRoot();
1025 if (PendingLoads
.size() == 1) {
1026 SDValue Root
= PendingLoads
[0];
1028 PendingLoads
.clear();
1032 // Otherwise, we have to make a token factor node.
1033 SDValue Root
= DAG
.getNode(ISD::TokenFactor
, getCurSDLoc(), MVT::Other
,
1035 PendingLoads
.clear();
1040 SDValue
SelectionDAGBuilder::getControlRoot() {
1041 SDValue Root
= DAG
.getRoot();
1043 if (PendingExports
.empty())
1046 // Turn all of the CopyToReg chains into one factored node.
1047 if (Root
.getOpcode() != ISD::EntryToken
) {
1048 unsigned i
= 0, e
= PendingExports
.size();
1049 for (; i
!= e
; ++i
) {
1050 assert(PendingExports
[i
].getNode()->getNumOperands() > 1);
1051 if (PendingExports
[i
].getNode()->getOperand(0) == Root
)
1052 break; // Don't add the root if we already indirectly depend on it.
1056 PendingExports
.push_back(Root
);
1059 Root
= DAG
.getNode(ISD::TokenFactor
, getCurSDLoc(), MVT::Other
,
1061 PendingExports
.clear();
1066 void SelectionDAGBuilder::visit(const Instruction
&I
) {
1067 // Set up outgoing PHI node register values before emitting the terminator.
1068 if (I
.isTerminator()) {
1069 HandlePHINodesInSuccessorBlocks(I
.getParent());
1072 // Increase the SDNodeOrder if dealing with a non-debug instruction.
1073 if (!isa
<DbgInfoIntrinsic
>(I
))
1078 visit(I
.getOpcode(), I
);
1080 if (auto *FPMO
= dyn_cast
<FPMathOperator
>(&I
)) {
1081 // Propagate the fast-math-flags of this IR instruction to the DAG node that
1082 // maps to this instruction.
1083 // TODO: We could handle all flags (nsw, etc) here.
1084 // TODO: If an IR instruction maps to >1 node, only the final node will have
1086 if (SDNode
*Node
= getNodeForIRValue(&I
)) {
1087 SDNodeFlags IncomingFlags
;
1088 IncomingFlags
.copyFMF(*FPMO
);
1089 if (!Node
->getFlags().isDefined())
1090 Node
->setFlags(IncomingFlags
);
1092 Node
->intersectFlagsWith(IncomingFlags
);
1096 if (!I
.isTerminator() && !HasTailCall
&&
1097 !isStatepoint(&I
)) // statepoints handle their exports internally
1098 CopyToExportRegsIfNeeded(&I
);
1103 void SelectionDAGBuilder::visitPHI(const PHINode
&) {
1104 llvm_unreachable("SelectionDAGBuilder shouldn't visit PHI nodes!");
1107 void SelectionDAGBuilder::visit(unsigned Opcode
, const User
&I
) {
1108 // Note: this doesn't use InstVisitor, because it has to work with
1109 // ConstantExpr's in addition to instructions.
1111 default: llvm_unreachable("Unknown instruction type encountered!");
1112 // Build the switch statement using the Instruction.def file.
1113 #define HANDLE_INST(NUM, OPCODE, CLASS) \
1114 case Instruction::OPCODE: visit##OPCODE((const CLASS&)I); break;
1115 #include "llvm/IR/Instruction.def"
1119 void SelectionDAGBuilder::dropDanglingDebugInfo(const DILocalVariable
*Variable
,
1120 const DIExpression
*Expr
) {
1121 auto isMatchingDbgValue
= [&](DanglingDebugInfo
&DDI
) {
1122 const DbgValueInst
*DI
= DDI
.getDI();
1123 DIVariable
*DanglingVariable
= DI
->getVariable();
1124 DIExpression
*DanglingExpr
= DI
->getExpression();
1125 if (DanglingVariable
== Variable
&& Expr
->fragmentsOverlap(DanglingExpr
)) {
1126 LLVM_DEBUG(dbgs() << "Dropping dangling debug info for " << *DI
<< "\n");
1132 for (auto &DDIMI
: DanglingDebugInfoMap
) {
1133 DanglingDebugInfoVector
&DDIV
= DDIMI
.second
;
1134 DDIV
.erase(remove_if(DDIV
, isMatchingDbgValue
), DDIV
.end());
1138 // resolveDanglingDebugInfo - if we saw an earlier dbg_value referring to V,
1139 // generate the debug data structures now that we've seen its definition.
1140 void SelectionDAGBuilder::resolveDanglingDebugInfo(const Value
*V
,
1142 auto DanglingDbgInfoIt
= DanglingDebugInfoMap
.find(V
);
1143 if (DanglingDbgInfoIt
== DanglingDebugInfoMap
.end())
1146 DanglingDebugInfoVector
&DDIV
= DanglingDbgInfoIt
->second
;
1147 for (auto &DDI
: DDIV
) {
1148 const DbgValueInst
*DI
= DDI
.getDI();
1149 assert(DI
&& "Ill-formed DanglingDebugInfo");
1150 DebugLoc dl
= DDI
.getdl();
1151 unsigned ValSDNodeOrder
= Val
.getNode()->getIROrder();
1152 unsigned DbgSDNodeOrder
= DDI
.getSDNodeOrder();
1153 DILocalVariable
*Variable
= DI
->getVariable();
1154 DIExpression
*Expr
= DI
->getExpression();
1155 assert(Variable
->isValidLocationForIntrinsic(dl
) &&
1156 "Expected inlined-at fields to agree");
1158 if (Val
.getNode()) {
1159 if (!EmitFuncArgumentDbgValue(V
, Variable
, Expr
, dl
, false, Val
)) {
1160 LLVM_DEBUG(dbgs() << "Resolve dangling debug info [order="
1161 << DbgSDNodeOrder
<< "] for:\n " << *DI
<< "\n");
1162 LLVM_DEBUG(dbgs() << " By mapping to:\n "; Val
.dump());
1163 // Increase the SDNodeOrder for the DbgValue here to make sure it is
1164 // inserted after the definition of Val when emitting the instructions
1165 // after ISel. An alternative could be to teach
1166 // ScheduleDAGSDNodes::EmitSchedule to delay the insertion properly.
1167 LLVM_DEBUG(if (ValSDNodeOrder
> DbgSDNodeOrder
) dbgs()
1168 << "changing SDNodeOrder from " << DbgSDNodeOrder
<< " to "
1169 << ValSDNodeOrder
<< "\n");
1170 SDV
= getDbgValue(Val
, Variable
, Expr
, dl
,
1171 std::max(DbgSDNodeOrder
, ValSDNodeOrder
));
1172 DAG
.AddDbgValue(SDV
, Val
.getNode(), false);
1174 LLVM_DEBUG(dbgs() << "Resolved dangling debug info for " << *DI
1175 << "in EmitFuncArgumentDbgValue\n");
1177 LLVM_DEBUG(dbgs() << "Dropping debug info for " << *DI
<< "\n");
1182 /// getCopyFromRegs - If there was virtual register allocated for the value V
1183 /// emit CopyFromReg of the specified type Ty. Return empty SDValue() otherwise.
1184 SDValue
SelectionDAGBuilder::getCopyFromRegs(const Value
*V
, Type
*Ty
) {
1185 DenseMap
<const Value
*, unsigned>::iterator It
= FuncInfo
.ValueMap
.find(V
);
1188 if (It
!= FuncInfo
.ValueMap
.end()) {
1189 unsigned InReg
= It
->second
;
1191 RegsForValue
RFV(*DAG
.getContext(), DAG
.getTargetLoweringInfo(),
1192 DAG
.getDataLayout(), InReg
, Ty
,
1193 None
); // This is not an ABI copy.
1194 SDValue Chain
= DAG
.getEntryNode();
1195 Result
= RFV
.getCopyFromRegs(DAG
, FuncInfo
, getCurSDLoc(), Chain
, nullptr,
1197 resolveDanglingDebugInfo(V
, Result
);
1203 /// getValue - Return an SDValue for the given Value.
1204 SDValue
SelectionDAGBuilder::getValue(const Value
*V
) {
1205 // If we already have an SDValue for this value, use it. It's important
1206 // to do this first, so that we don't create a CopyFromReg if we already
1207 // have a regular SDValue.
1208 SDValue
&N
= NodeMap
[V
];
1209 if (N
.getNode()) return N
;
1211 // If there's a virtual register allocated and initialized for this
1213 if (SDValue copyFromReg
= getCopyFromRegs(V
, V
->getType()))
1216 // Otherwise create a new SDValue and remember it.
1217 SDValue Val
= getValueImpl(V
);
1219 resolveDanglingDebugInfo(V
, Val
);
1223 // Return true if SDValue exists for the given Value
1224 bool SelectionDAGBuilder::findValue(const Value
*V
) const {
1225 return (NodeMap
.find(V
) != NodeMap
.end()) ||
1226 (FuncInfo
.ValueMap
.find(V
) != FuncInfo
.ValueMap
.end());
1229 /// getNonRegisterValue - Return an SDValue for the given Value, but
1230 /// don't look in FuncInfo.ValueMap for a virtual register.
1231 SDValue
SelectionDAGBuilder::getNonRegisterValue(const Value
*V
) {
1232 // If we already have an SDValue for this value, use it.
1233 SDValue
&N
= NodeMap
[V
];
1235 if (isa
<ConstantSDNode
>(N
) || isa
<ConstantFPSDNode
>(N
)) {
1236 // Remove the debug location from the node as the node is about to be used
1237 // in a location which may differ from the original debug location. This
1238 // is relevant to Constant and ConstantFP nodes because they can appear
1239 // as constant expressions inside PHI nodes.
1240 N
->setDebugLoc(DebugLoc());
1245 // Otherwise create a new SDValue and remember it.
1246 SDValue Val
= getValueImpl(V
);
1248 resolveDanglingDebugInfo(V
, Val
);
1252 /// getValueImpl - Helper function for getValue and getNonRegisterValue.
1253 /// Create an SDValue for the given value.
1254 SDValue
SelectionDAGBuilder::getValueImpl(const Value
*V
) {
1255 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
1257 if (const Constant
*C
= dyn_cast
<Constant
>(V
)) {
1258 EVT VT
= TLI
.getValueType(DAG
.getDataLayout(), V
->getType(), true);
1260 if (const ConstantInt
*CI
= dyn_cast
<ConstantInt
>(C
))
1261 return DAG
.getConstant(*CI
, getCurSDLoc(), VT
);
1263 if (const GlobalValue
*GV
= dyn_cast
<GlobalValue
>(C
))
1264 return DAG
.getGlobalAddress(GV
, getCurSDLoc(), VT
);
1266 if (isa
<ConstantPointerNull
>(C
)) {
1267 unsigned AS
= V
->getType()->getPointerAddressSpace();
1268 return DAG
.getConstant(0, getCurSDLoc(),
1269 TLI
.getPointerTy(DAG
.getDataLayout(), AS
));
1272 if (const ConstantFP
*CFP
= dyn_cast
<ConstantFP
>(C
))
1273 return DAG
.getConstantFP(*CFP
, getCurSDLoc(), VT
);
1275 if (isa
<UndefValue
>(C
) && !V
->getType()->isAggregateType())
1276 return DAG
.getUNDEF(VT
);
1278 if (const ConstantExpr
*CE
= dyn_cast
<ConstantExpr
>(C
)) {
1279 visit(CE
->getOpcode(), *CE
);
1280 SDValue N1
= NodeMap
[V
];
1281 assert(N1
.getNode() && "visit didn't populate the NodeMap!");
1285 if (isa
<ConstantStruct
>(C
) || isa
<ConstantArray
>(C
)) {
1286 SmallVector
<SDValue
, 4> Constants
;
1287 for (User::const_op_iterator OI
= C
->op_begin(), OE
= C
->op_end();
1289 SDNode
*Val
= getValue(*OI
).getNode();
1290 // If the operand is an empty aggregate, there are no values.
1292 // Add each leaf value from the operand to the Constants list
1293 // to form a flattened list of all the values.
1294 for (unsigned i
= 0, e
= Val
->getNumValues(); i
!= e
; ++i
)
1295 Constants
.push_back(SDValue(Val
, i
));
1298 return DAG
.getMergeValues(Constants
, getCurSDLoc());
1301 if (const ConstantDataSequential
*CDS
=
1302 dyn_cast
<ConstantDataSequential
>(C
)) {
1303 SmallVector
<SDValue
, 4> Ops
;
1304 for (unsigned i
= 0, e
= CDS
->getNumElements(); i
!= e
; ++i
) {
1305 SDNode
*Val
= getValue(CDS
->getElementAsConstant(i
)).getNode();
1306 // Add each leaf value from the operand to the Constants list
1307 // to form a flattened list of all the values.
1308 for (unsigned i
= 0, e
= Val
->getNumValues(); i
!= e
; ++i
)
1309 Ops
.push_back(SDValue(Val
, i
));
1312 if (isa
<ArrayType
>(CDS
->getType()))
1313 return DAG
.getMergeValues(Ops
, getCurSDLoc());
1314 return NodeMap
[V
] = DAG
.getBuildVector(VT
, getCurSDLoc(), Ops
);
1317 if (C
->getType()->isStructTy() || C
->getType()->isArrayTy()) {
1318 assert((isa
<ConstantAggregateZero
>(C
) || isa
<UndefValue
>(C
)) &&
1319 "Unknown struct or array constant!");
1321 SmallVector
<EVT
, 4> ValueVTs
;
1322 ComputeValueVTs(TLI
, DAG
.getDataLayout(), C
->getType(), ValueVTs
);
1323 unsigned NumElts
= ValueVTs
.size();
1325 return SDValue(); // empty struct
1326 SmallVector
<SDValue
, 4> Constants(NumElts
);
1327 for (unsigned i
= 0; i
!= NumElts
; ++i
) {
1328 EVT EltVT
= ValueVTs
[i
];
1329 if (isa
<UndefValue
>(C
))
1330 Constants
[i
] = DAG
.getUNDEF(EltVT
);
1331 else if (EltVT
.isFloatingPoint())
1332 Constants
[i
] = DAG
.getConstantFP(0, getCurSDLoc(), EltVT
);
1334 Constants
[i
] = DAG
.getConstant(0, getCurSDLoc(), EltVT
);
1337 return DAG
.getMergeValues(Constants
, getCurSDLoc());
1340 if (const BlockAddress
*BA
= dyn_cast
<BlockAddress
>(C
))
1341 return DAG
.getBlockAddress(BA
, VT
);
1343 VectorType
*VecTy
= cast
<VectorType
>(V
->getType());
1344 unsigned NumElements
= VecTy
->getNumElements();
1346 // Now that we know the number and type of the elements, get that number of
1347 // elements into the Ops array based on what kind of constant it is.
1348 SmallVector
<SDValue
, 16> Ops
;
1349 if (const ConstantVector
*CV
= dyn_cast
<ConstantVector
>(C
)) {
1350 for (unsigned i
= 0; i
!= NumElements
; ++i
)
1351 Ops
.push_back(getValue(CV
->getOperand(i
)));
1353 assert(isa
<ConstantAggregateZero
>(C
) && "Unknown vector constant!");
1355 TLI
.getValueType(DAG
.getDataLayout(), VecTy
->getElementType());
1358 if (EltVT
.isFloatingPoint())
1359 Op
= DAG
.getConstantFP(0, getCurSDLoc(), EltVT
);
1361 Op
= DAG
.getConstant(0, getCurSDLoc(), EltVT
);
1362 Ops
.assign(NumElements
, Op
);
1365 // Create a BUILD_VECTOR node.
1366 return NodeMap
[V
] = DAG
.getBuildVector(VT
, getCurSDLoc(), Ops
);
1369 // If this is a static alloca, generate it as the frameindex instead of
1371 if (const AllocaInst
*AI
= dyn_cast
<AllocaInst
>(V
)) {
1372 DenseMap
<const AllocaInst
*, int>::iterator SI
=
1373 FuncInfo
.StaticAllocaMap
.find(AI
);
1374 if (SI
!= FuncInfo
.StaticAllocaMap
.end())
1375 return DAG
.getFrameIndex(SI
->second
,
1376 TLI
.getFrameIndexTy(DAG
.getDataLayout()));
1379 // If this is an instruction which fast-isel has deferred, select it now.
1380 if (const Instruction
*Inst
= dyn_cast
<Instruction
>(V
)) {
1381 unsigned InReg
= FuncInfo
.InitializeRegForValue(Inst
);
1383 RegsForValue
RFV(*DAG
.getContext(), TLI
, DAG
.getDataLayout(), InReg
,
1384 Inst
->getType(), getABIRegCopyCC(V
));
1385 SDValue Chain
= DAG
.getEntryNode();
1386 return RFV
.getCopyFromRegs(DAG
, FuncInfo
, getCurSDLoc(), Chain
, nullptr, V
);
1389 llvm_unreachable("Can't get register for value!");
1392 void SelectionDAGBuilder::visitCatchPad(const CatchPadInst
&I
) {
1393 auto Pers
= classifyEHPersonality(FuncInfo
.Fn
->getPersonalityFn());
1394 bool IsMSVCCXX
= Pers
== EHPersonality::MSVC_CXX
;
1395 bool IsCoreCLR
= Pers
== EHPersonality::CoreCLR
;
1396 bool IsSEH
= isAsynchronousEHPersonality(Pers
);
1397 bool IsWasmCXX
= Pers
== EHPersonality::Wasm_CXX
;
1398 MachineBasicBlock
*CatchPadMBB
= FuncInfo
.MBB
;
1400 CatchPadMBB
->setIsEHScopeEntry();
1401 // In MSVC C++ and CoreCLR, catchblocks are funclets and need prologues.
1402 if (IsMSVCCXX
|| IsCoreCLR
)
1403 CatchPadMBB
->setIsEHFuncletEntry();
1404 // Wasm does not need catchpads anymore
1406 DAG
.setRoot(DAG
.getNode(ISD::CATCHPAD
, getCurSDLoc(), MVT::Other
,
1410 void SelectionDAGBuilder::visitCatchRet(const CatchReturnInst
&I
) {
1411 // Update machine-CFG edge.
1412 MachineBasicBlock
*TargetMBB
= FuncInfo
.MBBMap
[I
.getSuccessor()];
1413 FuncInfo
.MBB
->addSuccessor(TargetMBB
);
1415 auto Pers
= classifyEHPersonality(FuncInfo
.Fn
->getPersonalityFn());
1416 bool IsSEH
= isAsynchronousEHPersonality(Pers
);
1418 // If this is not a fall-through branch or optimizations are switched off,
1420 if (TargetMBB
!= NextBlock(FuncInfo
.MBB
) ||
1421 TM
.getOptLevel() == CodeGenOpt::None
)
1422 DAG
.setRoot(DAG
.getNode(ISD::BR
, getCurSDLoc(), MVT::Other
,
1423 getControlRoot(), DAG
.getBasicBlock(TargetMBB
)));
1427 // Figure out the funclet membership for the catchret's successor.
1428 // This will be used by the FuncletLayout pass to determine how to order the
1430 // A 'catchret' returns to the outer scope's color.
1431 Value
*ParentPad
= I
.getCatchSwitchParentPad();
1432 const BasicBlock
*SuccessorColor
;
1433 if (isa
<ConstantTokenNone
>(ParentPad
))
1434 SuccessorColor
= &FuncInfo
.Fn
->getEntryBlock();
1436 SuccessorColor
= cast
<Instruction
>(ParentPad
)->getParent();
1437 assert(SuccessorColor
&& "No parent funclet for catchret!");
1438 MachineBasicBlock
*SuccessorColorMBB
= FuncInfo
.MBBMap
[SuccessorColor
];
1439 assert(SuccessorColorMBB
&& "No MBB for SuccessorColor!");
1441 // Create the terminator node.
1442 SDValue Ret
= DAG
.getNode(ISD::CATCHRET
, getCurSDLoc(), MVT::Other
,
1443 getControlRoot(), DAG
.getBasicBlock(TargetMBB
),
1444 DAG
.getBasicBlock(SuccessorColorMBB
));
1448 void SelectionDAGBuilder::visitCleanupPad(const CleanupPadInst
&CPI
) {
1449 // Don't emit any special code for the cleanuppad instruction. It just marks
1450 // the start of an EH scope/funclet.
1451 FuncInfo
.MBB
->setIsEHScopeEntry();
1452 auto Pers
= classifyEHPersonality(FuncInfo
.Fn
->getPersonalityFn());
1453 if (Pers
!= EHPersonality::Wasm_CXX
) {
1454 FuncInfo
.MBB
->setIsEHFuncletEntry();
1455 FuncInfo
.MBB
->setIsCleanupFuncletEntry();
1459 /// When an invoke or a cleanupret unwinds to the next EH pad, there are
1460 /// many places it could ultimately go. In the IR, we have a single unwind
1461 /// destination, but in the machine CFG, we enumerate all the possible blocks.
1462 /// This function skips over imaginary basic blocks that hold catchswitch
1463 /// instructions, and finds all the "real" machine
1464 /// basic block destinations. As those destinations may not be successors of
1465 /// EHPadBB, here we also calculate the edge probability to those destinations.
1466 /// The passed-in Prob is the edge probability to EHPadBB.
1467 static void findUnwindDestinations(
1468 FunctionLoweringInfo
&FuncInfo
, const BasicBlock
*EHPadBB
,
1469 BranchProbability Prob
,
1470 SmallVectorImpl
<std::pair
<MachineBasicBlock
*, BranchProbability
>>
1472 EHPersonality Personality
=
1473 classifyEHPersonality(FuncInfo
.Fn
->getPersonalityFn());
1474 bool IsMSVCCXX
= Personality
== EHPersonality::MSVC_CXX
;
1475 bool IsCoreCLR
= Personality
== EHPersonality::CoreCLR
;
1476 bool IsWasmCXX
= Personality
== EHPersonality::Wasm_CXX
;
1477 bool IsSEH
= isAsynchronousEHPersonality(Personality
);
1480 const Instruction
*Pad
= EHPadBB
->getFirstNonPHI();
1481 BasicBlock
*NewEHPadBB
= nullptr;
1482 if (isa
<LandingPadInst
>(Pad
)) {
1483 // Stop on landingpads. They are not funclets.
1484 UnwindDests
.emplace_back(FuncInfo
.MBBMap
[EHPadBB
], Prob
);
1486 } else if (isa
<CleanupPadInst
>(Pad
)) {
1487 // Stop on cleanup pads. Cleanups are always funclet entries for all known
1489 UnwindDests
.emplace_back(FuncInfo
.MBBMap
[EHPadBB
], Prob
);
1490 UnwindDests
.back().first
->setIsEHScopeEntry();
1492 UnwindDests
.back().first
->setIsEHFuncletEntry();
1494 } else if (auto *CatchSwitch
= dyn_cast
<CatchSwitchInst
>(Pad
)) {
1495 // Add the catchpad handlers to the possible destinations.
1496 for (const BasicBlock
*CatchPadBB
: CatchSwitch
->handlers()) {
1497 UnwindDests
.emplace_back(FuncInfo
.MBBMap
[CatchPadBB
], Prob
);
1498 // For MSVC++ and the CLR, catchblocks are funclets and need prologues.
1499 if (IsMSVCCXX
|| IsCoreCLR
)
1500 UnwindDests
.back().first
->setIsEHFuncletEntry();
1502 UnwindDests
.back().first
->setIsEHScopeEntry();
1504 NewEHPadBB
= CatchSwitch
->getUnwindDest();
1509 BranchProbabilityInfo
*BPI
= FuncInfo
.BPI
;
1510 if (BPI
&& NewEHPadBB
)
1511 Prob
*= BPI
->getEdgeProbability(EHPadBB
, NewEHPadBB
);
1512 EHPadBB
= NewEHPadBB
;
1516 void SelectionDAGBuilder::visitCleanupRet(const CleanupReturnInst
&I
) {
1517 // Update successor info.
1518 SmallVector
<std::pair
<MachineBasicBlock
*, BranchProbability
>, 1> UnwindDests
;
1519 auto UnwindDest
= I
.getUnwindDest();
1520 BranchProbabilityInfo
*BPI
= FuncInfo
.BPI
;
1521 BranchProbability UnwindDestProb
=
1523 ? BPI
->getEdgeProbability(FuncInfo
.MBB
->getBasicBlock(), UnwindDest
)
1524 : BranchProbability::getZero();
1525 findUnwindDestinations(FuncInfo
, UnwindDest
, UnwindDestProb
, UnwindDests
);
1526 for (auto &UnwindDest
: UnwindDests
) {
1527 UnwindDest
.first
->setIsEHPad();
1528 addSuccessorWithProb(FuncInfo
.MBB
, UnwindDest
.first
, UnwindDest
.second
);
1530 FuncInfo
.MBB
->normalizeSuccProbs();
1532 // Create the terminator node.
1534 DAG
.getNode(ISD::CLEANUPRET
, getCurSDLoc(), MVT::Other
, getControlRoot());
1538 void SelectionDAGBuilder::visitCatchSwitch(const CatchSwitchInst
&CSI
) {
1539 report_fatal_error("visitCatchSwitch not yet implemented!");
1542 void SelectionDAGBuilder::visitRet(const ReturnInst
&I
) {
1543 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
1544 auto &DL
= DAG
.getDataLayout();
1545 SDValue Chain
= getControlRoot();
1546 SmallVector
<ISD::OutputArg
, 8> Outs
;
1547 SmallVector
<SDValue
, 8> OutVals
;
1549 // Calls to @llvm.experimental.deoptimize don't generate a return value, so
1552 // %val = call <ty> @llvm.experimental.deoptimize()
1556 if (I
.getParent()->getTerminatingDeoptimizeCall()) {
1557 LowerDeoptimizingReturn();
1561 if (!FuncInfo
.CanLowerReturn
) {
1562 unsigned DemoteReg
= FuncInfo
.DemoteRegister
;
1563 const Function
*F
= I
.getParent()->getParent();
1565 // Emit a store of the return value through the virtual register.
1566 // Leave Outs empty so that LowerReturn won't try to load return
1567 // registers the usual way.
1568 SmallVector
<EVT
, 1> PtrValueVTs
;
1569 ComputeValueVTs(TLI
, DL
,
1570 F
->getReturnType()->getPointerTo(
1571 DAG
.getDataLayout().getAllocaAddrSpace()),
1574 SDValue RetPtr
= DAG
.getCopyFromReg(DAG
.getEntryNode(), getCurSDLoc(),
1575 DemoteReg
, PtrValueVTs
[0]);
1576 SDValue RetOp
= getValue(I
.getOperand(0));
1578 SmallVector
<EVT
, 4> ValueVTs
;
1579 SmallVector
<uint64_t, 4> Offsets
;
1580 ComputeValueVTs(TLI
, DL
, I
.getOperand(0)->getType(), ValueVTs
, &Offsets
);
1581 unsigned NumValues
= ValueVTs
.size();
1583 SmallVector
<SDValue
, 4> Chains(NumValues
);
1584 for (unsigned i
= 0; i
!= NumValues
; ++i
) {
1585 // An aggregate return value cannot wrap around the address space, so
1586 // offsets to its parts don't wrap either.
1587 SDValue Ptr
= DAG
.getObjectPtrOffset(getCurSDLoc(), RetPtr
, Offsets
[i
]);
1588 Chains
[i
] = DAG
.getStore(
1589 Chain
, getCurSDLoc(), SDValue(RetOp
.getNode(), RetOp
.getResNo() + i
),
1590 // FIXME: better loc info would be nice.
1591 Ptr
, MachinePointerInfo::getUnknownStack(DAG
.getMachineFunction()));
1594 Chain
= DAG
.getNode(ISD::TokenFactor
, getCurSDLoc(),
1595 MVT::Other
, Chains
);
1596 } else if (I
.getNumOperands() != 0) {
1597 SmallVector
<EVT
, 4> ValueVTs
;
1598 ComputeValueVTs(TLI
, DL
, I
.getOperand(0)->getType(), ValueVTs
);
1599 unsigned NumValues
= ValueVTs
.size();
1601 SDValue RetOp
= getValue(I
.getOperand(0));
1603 const Function
*F
= I
.getParent()->getParent();
1605 ISD::NodeType ExtendKind
= ISD::ANY_EXTEND
;
1606 if (F
->getAttributes().hasAttribute(AttributeList::ReturnIndex
,
1608 ExtendKind
= ISD::SIGN_EXTEND
;
1609 else if (F
->getAttributes().hasAttribute(AttributeList::ReturnIndex
,
1611 ExtendKind
= ISD::ZERO_EXTEND
;
1613 LLVMContext
&Context
= F
->getContext();
1614 bool RetInReg
= F
->getAttributes().hasAttribute(
1615 AttributeList::ReturnIndex
, Attribute::InReg
);
1617 for (unsigned j
= 0; j
!= NumValues
; ++j
) {
1618 EVT VT
= ValueVTs
[j
];
1620 if (ExtendKind
!= ISD::ANY_EXTEND
&& VT
.isInteger())
1621 VT
= TLI
.getTypeForExtReturn(Context
, VT
, ExtendKind
);
1623 CallingConv::ID CC
= F
->getCallingConv();
1625 unsigned NumParts
= TLI
.getNumRegistersForCallingConv(Context
, CC
, VT
);
1626 MVT PartVT
= TLI
.getRegisterTypeForCallingConv(Context
, CC
, VT
);
1627 SmallVector
<SDValue
, 4> Parts(NumParts
);
1628 getCopyToParts(DAG
, getCurSDLoc(),
1629 SDValue(RetOp
.getNode(), RetOp
.getResNo() + j
),
1630 &Parts
[0], NumParts
, PartVT
, &I
, CC
, ExtendKind
);
1632 // 'inreg' on function refers to return value
1633 ISD::ArgFlagsTy Flags
= ISD::ArgFlagsTy();
1637 // Propagate extension type if any
1638 if (ExtendKind
== ISD::SIGN_EXTEND
)
1640 else if (ExtendKind
== ISD::ZERO_EXTEND
)
1643 for (unsigned i
= 0; i
< NumParts
; ++i
) {
1644 Outs
.push_back(ISD::OutputArg(Flags
, Parts
[i
].getValueType(),
1645 VT
, /*isfixed=*/true, 0, 0));
1646 OutVals
.push_back(Parts
[i
]);
1652 // Push in swifterror virtual register as the last element of Outs. This makes
1653 // sure swifterror virtual register will be returned in the swifterror
1654 // physical register.
1655 const Function
*F
= I
.getParent()->getParent();
1656 if (TLI
.supportSwiftError() &&
1657 F
->getAttributes().hasAttrSomewhere(Attribute::SwiftError
)) {
1658 assert(FuncInfo
.SwiftErrorArg
&& "Need a swift error argument");
1659 ISD::ArgFlagsTy Flags
= ISD::ArgFlagsTy();
1660 Flags
.setSwiftError();
1661 Outs
.push_back(ISD::OutputArg(Flags
, EVT(TLI
.getPointerTy(DL
)) /*vt*/,
1662 EVT(TLI
.getPointerTy(DL
)) /*argvt*/,
1663 true /*isfixed*/, 1 /*origidx*/,
1665 // Create SDNode for the swifterror virtual register.
1667 DAG
.getRegister(FuncInfo
.getOrCreateSwiftErrorVRegUseAt(
1668 &I
, FuncInfo
.MBB
, FuncInfo
.SwiftErrorArg
).first
,
1669 EVT(TLI
.getPointerTy(DL
))));
1672 bool isVarArg
= DAG
.getMachineFunction().getFunction().isVarArg();
1673 CallingConv::ID CallConv
=
1674 DAG
.getMachineFunction().getFunction().getCallingConv();
1675 Chain
= DAG
.getTargetLoweringInfo().LowerReturn(
1676 Chain
, CallConv
, isVarArg
, Outs
, OutVals
, getCurSDLoc(), DAG
);
1678 // Verify that the target's LowerReturn behaved as expected.
1679 assert(Chain
.getNode() && Chain
.getValueType() == MVT::Other
&&
1680 "LowerReturn didn't return a valid chain!");
1682 // Update the DAG with the new chain value resulting from return lowering.
1686 /// CopyToExportRegsIfNeeded - If the given value has virtual registers
1687 /// created for it, emit nodes to copy the value into the virtual
1689 void SelectionDAGBuilder::CopyToExportRegsIfNeeded(const Value
*V
) {
1691 if (V
->getType()->isEmptyTy())
1694 DenseMap
<const Value
*, unsigned>::iterator VMI
= FuncInfo
.ValueMap
.find(V
);
1695 if (VMI
!= FuncInfo
.ValueMap
.end()) {
1696 assert(!V
->use_empty() && "Unused value assigned virtual registers!");
1697 CopyValueToVirtualRegister(V
, VMI
->second
);
1701 /// ExportFromCurrentBlock - If this condition isn't known to be exported from
1702 /// the current basic block, add it to ValueMap now so that we'll get a
1704 void SelectionDAGBuilder::ExportFromCurrentBlock(const Value
*V
) {
1705 // No need to export constants.
1706 if (!isa
<Instruction
>(V
) && !isa
<Argument
>(V
)) return;
1708 // Already exported?
1709 if (FuncInfo
.isExportedInst(V
)) return;
1711 unsigned Reg
= FuncInfo
.InitializeRegForValue(V
);
1712 CopyValueToVirtualRegister(V
, Reg
);
1715 bool SelectionDAGBuilder::isExportableFromCurrentBlock(const Value
*V
,
1716 const BasicBlock
*FromBB
) {
1717 // The operands of the setcc have to be in this block. We don't know
1718 // how to export them from some other block.
1719 if (const Instruction
*VI
= dyn_cast
<Instruction
>(V
)) {
1720 // Can export from current BB.
1721 if (VI
->getParent() == FromBB
)
1724 // Is already exported, noop.
1725 return FuncInfo
.isExportedInst(V
);
1728 // If this is an argument, we can export it if the BB is the entry block or
1729 // if it is already exported.
1730 if (isa
<Argument
>(V
)) {
1731 if (FromBB
== &FromBB
->getParent()->getEntryBlock())
1734 // Otherwise, can only export this if it is already exported.
1735 return FuncInfo
.isExportedInst(V
);
1738 // Otherwise, constants can always be exported.
1742 /// Return branch probability calculated by BranchProbabilityInfo for IR blocks.
1744 SelectionDAGBuilder::getEdgeProbability(const MachineBasicBlock
*Src
,
1745 const MachineBasicBlock
*Dst
) const {
1746 BranchProbabilityInfo
*BPI
= FuncInfo
.BPI
;
1747 const BasicBlock
*SrcBB
= Src
->getBasicBlock();
1748 const BasicBlock
*DstBB
= Dst
->getBasicBlock();
1750 // If BPI is not available, set the default probability as 1 / N, where N is
1751 // the number of successors.
1752 auto SuccSize
= std::max
<uint32_t>(succ_size(SrcBB
), 1);
1753 return BranchProbability(1, SuccSize
);
1755 return BPI
->getEdgeProbability(SrcBB
, DstBB
);
1758 void SelectionDAGBuilder::addSuccessorWithProb(MachineBasicBlock
*Src
,
1759 MachineBasicBlock
*Dst
,
1760 BranchProbability Prob
) {
1762 Src
->addSuccessorWithoutProb(Dst
);
1764 if (Prob
.isUnknown())
1765 Prob
= getEdgeProbability(Src
, Dst
);
1766 Src
->addSuccessor(Dst
, Prob
);
1770 static bool InBlock(const Value
*V
, const BasicBlock
*BB
) {
1771 if (const Instruction
*I
= dyn_cast
<Instruction
>(V
))
1772 return I
->getParent() == BB
;
1776 /// EmitBranchForMergedCondition - Helper method for FindMergedConditions.
1777 /// This function emits a branch and is used at the leaves of an OR or an
1778 /// AND operator tree.
1780 SelectionDAGBuilder::EmitBranchForMergedCondition(const Value
*Cond
,
1781 MachineBasicBlock
*TBB
,
1782 MachineBasicBlock
*FBB
,
1783 MachineBasicBlock
*CurBB
,
1784 MachineBasicBlock
*SwitchBB
,
1785 BranchProbability TProb
,
1786 BranchProbability FProb
,
1788 const BasicBlock
*BB
= CurBB
->getBasicBlock();
1790 // If the leaf of the tree is a comparison, merge the condition into
1792 if (const CmpInst
*BOp
= dyn_cast
<CmpInst
>(Cond
)) {
1793 // The operands of the cmp have to be in this block. We don't know
1794 // how to export them from some other block. If this is the first block
1795 // of the sequence, no exporting is needed.
1796 if (CurBB
== SwitchBB
||
1797 (isExportableFromCurrentBlock(BOp
->getOperand(0), BB
) &&
1798 isExportableFromCurrentBlock(BOp
->getOperand(1), BB
))) {
1799 ISD::CondCode Condition
;
1800 if (const ICmpInst
*IC
= dyn_cast
<ICmpInst
>(Cond
)) {
1801 ICmpInst::Predicate Pred
=
1802 InvertCond
? IC
->getInversePredicate() : IC
->getPredicate();
1803 Condition
= getICmpCondCode(Pred
);
1805 const FCmpInst
*FC
= cast
<FCmpInst
>(Cond
);
1806 FCmpInst::Predicate Pred
=
1807 InvertCond
? FC
->getInversePredicate() : FC
->getPredicate();
1808 Condition
= getFCmpCondCode(Pred
);
1809 if (TM
.Options
.NoNaNsFPMath
)
1810 Condition
= getFCmpCodeWithoutNaN(Condition
);
1813 CaseBlock
CB(Condition
, BOp
->getOperand(0), BOp
->getOperand(1), nullptr,
1814 TBB
, FBB
, CurBB
, getCurSDLoc(), TProb
, FProb
);
1815 SwitchCases
.push_back(CB
);
1820 // Create a CaseBlock record representing this branch.
1821 ISD::CondCode Opc
= InvertCond
? ISD::SETNE
: ISD::SETEQ
;
1822 CaseBlock
CB(Opc
, Cond
, ConstantInt::getTrue(*DAG
.getContext()),
1823 nullptr, TBB
, FBB
, CurBB
, getCurSDLoc(), TProb
, FProb
);
1824 SwitchCases
.push_back(CB
);
1827 /// FindMergedConditions - If Cond is an expression like
1828 void SelectionDAGBuilder::FindMergedConditions(const Value
*Cond
,
1829 MachineBasicBlock
*TBB
,
1830 MachineBasicBlock
*FBB
,
1831 MachineBasicBlock
*CurBB
,
1832 MachineBasicBlock
*SwitchBB
,
1833 Instruction::BinaryOps Opc
,
1834 BranchProbability TProb
,
1835 BranchProbability FProb
,
1837 // Skip over not part of the tree and remember to invert op and operands at
1839 if (BinaryOperator::isNot(Cond
) && Cond
->hasOneUse()) {
1840 const Value
*CondOp
= BinaryOperator::getNotArgument(Cond
);
1841 if (InBlock(CondOp
, CurBB
->getBasicBlock())) {
1842 FindMergedConditions(CondOp
, TBB
, FBB
, CurBB
, SwitchBB
, Opc
, TProb
, FProb
,
1848 const Instruction
*BOp
= dyn_cast
<Instruction
>(Cond
);
1849 // Compute the effective opcode for Cond, taking into account whether it needs
1850 // to be inverted, e.g.
1851 // and (not (or A, B)), C
1853 // and (and (not A, not B), C)
1856 BOpc
= BOp
->getOpcode();
1858 if (BOpc
== Instruction::And
)
1859 BOpc
= Instruction::Or
;
1860 else if (BOpc
== Instruction::Or
)
1861 BOpc
= Instruction::And
;
1865 // If this node is not part of the or/and tree, emit it as a branch.
1866 if (!BOp
|| !(isa
<BinaryOperator
>(BOp
) || isa
<CmpInst
>(BOp
)) ||
1867 BOpc
!= unsigned(Opc
) || !BOp
->hasOneUse() ||
1868 BOp
->getParent() != CurBB
->getBasicBlock() ||
1869 !InBlock(BOp
->getOperand(0), CurBB
->getBasicBlock()) ||
1870 !InBlock(BOp
->getOperand(1), CurBB
->getBasicBlock())) {
1871 EmitBranchForMergedCondition(Cond
, TBB
, FBB
, CurBB
, SwitchBB
,
1872 TProb
, FProb
, InvertCond
);
1876 // Create TmpBB after CurBB.
1877 MachineFunction::iterator
BBI(CurBB
);
1878 MachineFunction
&MF
= DAG
.getMachineFunction();
1879 MachineBasicBlock
*TmpBB
= MF
.CreateMachineBasicBlock(CurBB
->getBasicBlock());
1880 CurBB
->getParent()->insert(++BBI
, TmpBB
);
1882 if (Opc
== Instruction::Or
) {
1883 // Codegen X | Y as:
1892 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
1893 // The requirement is that
1894 // TrueProb for BB1 + (FalseProb for BB1 * TrueProb for TmpBB)
1895 // = TrueProb for original BB.
1896 // Assuming the original probabilities are A and B, one choice is to set
1897 // BB1's probabilities to A/2 and A/2+B, and set TmpBB's probabilities to
1898 // A/(1+B) and 2B/(1+B). This choice assumes that
1899 // TrueProb for BB1 == FalseProb for BB1 * TrueProb for TmpBB.
1900 // Another choice is to assume TrueProb for BB1 equals to TrueProb for
1901 // TmpBB, but the math is more complicated.
1903 auto NewTrueProb
= TProb
/ 2;
1904 auto NewFalseProb
= TProb
/ 2 + FProb
;
1905 // Emit the LHS condition.
1906 FindMergedConditions(BOp
->getOperand(0), TBB
, TmpBB
, CurBB
, SwitchBB
, Opc
,
1907 NewTrueProb
, NewFalseProb
, InvertCond
);
1909 // Normalize A/2 and B to get A/(1+B) and 2B/(1+B).
1910 SmallVector
<BranchProbability
, 2> Probs
{TProb
/ 2, FProb
};
1911 BranchProbability::normalizeProbabilities(Probs
.begin(), Probs
.end());
1912 // Emit the RHS condition into TmpBB.
1913 FindMergedConditions(BOp
->getOperand(1), TBB
, FBB
, TmpBB
, SwitchBB
, Opc
,
1914 Probs
[0], Probs
[1], InvertCond
);
1916 assert(Opc
== Instruction::And
&& "Unknown merge op!");
1917 // Codegen X & Y as:
1925 // This requires creation of TmpBB after CurBB.
1927 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
1928 // The requirement is that
1929 // FalseProb for BB1 + (TrueProb for BB1 * FalseProb for TmpBB)
1930 // = FalseProb for original BB.
1931 // Assuming the original probabilities are A and B, one choice is to set
1932 // BB1's probabilities to A+B/2 and B/2, and set TmpBB's probabilities to
1933 // 2A/(1+A) and B/(1+A). This choice assumes that FalseProb for BB1 ==
1934 // TrueProb for BB1 * FalseProb for TmpBB.
1936 auto NewTrueProb
= TProb
+ FProb
/ 2;
1937 auto NewFalseProb
= FProb
/ 2;
1938 // Emit the LHS condition.
1939 FindMergedConditions(BOp
->getOperand(0), TmpBB
, FBB
, CurBB
, SwitchBB
, Opc
,
1940 NewTrueProb
, NewFalseProb
, InvertCond
);
1942 // Normalize A and B/2 to get 2A/(1+A) and B/(1+A).
1943 SmallVector
<BranchProbability
, 2> Probs
{TProb
, FProb
/ 2};
1944 BranchProbability::normalizeProbabilities(Probs
.begin(), Probs
.end());
1945 // Emit the RHS condition into TmpBB.
1946 FindMergedConditions(BOp
->getOperand(1), TBB
, FBB
, TmpBB
, SwitchBB
, Opc
,
1947 Probs
[0], Probs
[1], InvertCond
);
1951 /// If the set of cases should be emitted as a series of branches, return true.
1952 /// If we should emit this as a bunch of and/or'd together conditions, return
1955 SelectionDAGBuilder::ShouldEmitAsBranches(const std::vector
<CaseBlock
> &Cases
) {
1956 if (Cases
.size() != 2) return true;
1958 // If this is two comparisons of the same values or'd or and'd together, they
1959 // will get folded into a single comparison, so don't emit two blocks.
1960 if ((Cases
[0].CmpLHS
== Cases
[1].CmpLHS
&&
1961 Cases
[0].CmpRHS
== Cases
[1].CmpRHS
) ||
1962 (Cases
[0].CmpRHS
== Cases
[1].CmpLHS
&&
1963 Cases
[0].CmpLHS
== Cases
[1].CmpRHS
)) {
1967 // Handle: (X != null) | (Y != null) --> (X|Y) != 0
1968 // Handle: (X == null) & (Y == null) --> (X|Y) == 0
1969 if (Cases
[0].CmpRHS
== Cases
[1].CmpRHS
&&
1970 Cases
[0].CC
== Cases
[1].CC
&&
1971 isa
<Constant
>(Cases
[0].CmpRHS
) &&
1972 cast
<Constant
>(Cases
[0].CmpRHS
)->isNullValue()) {
1973 if (Cases
[0].CC
== ISD::SETEQ
&& Cases
[0].TrueBB
== Cases
[1].ThisBB
)
1975 if (Cases
[0].CC
== ISD::SETNE
&& Cases
[0].FalseBB
== Cases
[1].ThisBB
)
1982 void SelectionDAGBuilder::visitBr(const BranchInst
&I
) {
1983 MachineBasicBlock
*BrMBB
= FuncInfo
.MBB
;
1985 // Update machine-CFG edges.
1986 MachineBasicBlock
*Succ0MBB
= FuncInfo
.MBBMap
[I
.getSuccessor(0)];
1988 if (I
.isUnconditional()) {
1989 // Update machine-CFG edges.
1990 BrMBB
->addSuccessor(Succ0MBB
);
1992 // If this is not a fall-through branch or optimizations are switched off,
1994 if (Succ0MBB
!= NextBlock(BrMBB
) || TM
.getOptLevel() == CodeGenOpt::None
)
1995 DAG
.setRoot(DAG
.getNode(ISD::BR
, getCurSDLoc(),
1996 MVT::Other
, getControlRoot(),
1997 DAG
.getBasicBlock(Succ0MBB
)));
2002 // If this condition is one of the special cases we handle, do special stuff
2004 const Value
*CondVal
= I
.getCondition();
2005 MachineBasicBlock
*Succ1MBB
= FuncInfo
.MBBMap
[I
.getSuccessor(1)];
2007 // If this is a series of conditions that are or'd or and'd together, emit
2008 // this as a sequence of branches instead of setcc's with and/or operations.
2009 // As long as jumps are not expensive, this should improve performance.
2010 // For example, instead of something like:
2022 if (const BinaryOperator
*BOp
= dyn_cast
<BinaryOperator
>(CondVal
)) {
2023 Instruction::BinaryOps Opcode
= BOp
->getOpcode();
2024 if (!DAG
.getTargetLoweringInfo().isJumpExpensive() && BOp
->hasOneUse() &&
2025 !I
.getMetadata(LLVMContext::MD_unpredictable
) &&
2026 (Opcode
== Instruction::And
|| Opcode
== Instruction::Or
)) {
2027 FindMergedConditions(BOp
, Succ0MBB
, Succ1MBB
, BrMBB
, BrMBB
,
2029 getEdgeProbability(BrMBB
, Succ0MBB
),
2030 getEdgeProbability(BrMBB
, Succ1MBB
),
2031 /*InvertCond=*/false);
2032 // If the compares in later blocks need to use values not currently
2033 // exported from this block, export them now. This block should always
2034 // be the first entry.
2035 assert(SwitchCases
[0].ThisBB
== BrMBB
&& "Unexpected lowering!");
2037 // Allow some cases to be rejected.
2038 if (ShouldEmitAsBranches(SwitchCases
)) {
2039 for (unsigned i
= 1, e
= SwitchCases
.size(); i
!= e
; ++i
) {
2040 ExportFromCurrentBlock(SwitchCases
[i
].CmpLHS
);
2041 ExportFromCurrentBlock(SwitchCases
[i
].CmpRHS
);
2044 // Emit the branch for this block.
2045 visitSwitchCase(SwitchCases
[0], BrMBB
);
2046 SwitchCases
.erase(SwitchCases
.begin());
2050 // Okay, we decided not to do this, remove any inserted MBB's and clear
2052 for (unsigned i
= 1, e
= SwitchCases
.size(); i
!= e
; ++i
)
2053 FuncInfo
.MF
->erase(SwitchCases
[i
].ThisBB
);
2055 SwitchCases
.clear();
2059 // Create a CaseBlock record representing this branch.
2060 CaseBlock
CB(ISD::SETEQ
, CondVal
, ConstantInt::getTrue(*DAG
.getContext()),
2061 nullptr, Succ0MBB
, Succ1MBB
, BrMBB
, getCurSDLoc());
2063 // Use visitSwitchCase to actually insert the fast branch sequence for this
2065 visitSwitchCase(CB
, BrMBB
);
2068 /// visitSwitchCase - Emits the necessary code to represent a single node in
2069 /// the binary search tree resulting from lowering a switch instruction.
2070 void SelectionDAGBuilder::visitSwitchCase(CaseBlock
&CB
,
2071 MachineBasicBlock
*SwitchBB
) {
2073 SDValue CondLHS
= getValue(CB
.CmpLHS
);
2076 // Build the setcc now.
2078 // Fold "(X == true)" to X and "(X == false)" to !X to
2079 // handle common cases produced by branch lowering.
2080 if (CB
.CmpRHS
== ConstantInt::getTrue(*DAG
.getContext()) &&
2081 CB
.CC
== ISD::SETEQ
)
2083 else if (CB
.CmpRHS
== ConstantInt::getFalse(*DAG
.getContext()) &&
2084 CB
.CC
== ISD::SETEQ
) {
2085 SDValue True
= DAG
.getConstant(1, dl
, CondLHS
.getValueType());
2086 Cond
= DAG
.getNode(ISD::XOR
, dl
, CondLHS
.getValueType(), CondLHS
, True
);
2088 Cond
= DAG
.getSetCC(dl
, MVT::i1
, CondLHS
, getValue(CB
.CmpRHS
), CB
.CC
);
2090 assert(CB
.CC
== ISD::SETLE
&& "Can handle only LE ranges now");
2092 const APInt
& Low
= cast
<ConstantInt
>(CB
.CmpLHS
)->getValue();
2093 const APInt
& High
= cast
<ConstantInt
>(CB
.CmpRHS
)->getValue();
2095 SDValue CmpOp
= getValue(CB
.CmpMHS
);
2096 EVT VT
= CmpOp
.getValueType();
2098 if (cast
<ConstantInt
>(CB
.CmpLHS
)->isMinValue(true)) {
2099 Cond
= DAG
.getSetCC(dl
, MVT::i1
, CmpOp
, DAG
.getConstant(High
, dl
, VT
),
2102 SDValue SUB
= DAG
.getNode(ISD::SUB
, dl
,
2103 VT
, CmpOp
, DAG
.getConstant(Low
, dl
, VT
));
2104 Cond
= DAG
.getSetCC(dl
, MVT::i1
, SUB
,
2105 DAG
.getConstant(High
-Low
, dl
, VT
), ISD::SETULE
);
2109 // Update successor info
2110 addSuccessorWithProb(SwitchBB
, CB
.TrueBB
, CB
.TrueProb
);
2111 // TrueBB and FalseBB are always different unless the incoming IR is
2112 // degenerate. This only happens when running llc on weird IR.
2113 if (CB
.TrueBB
!= CB
.FalseBB
)
2114 addSuccessorWithProb(SwitchBB
, CB
.FalseBB
, CB
.FalseProb
);
2115 SwitchBB
->normalizeSuccProbs();
2117 // If the lhs block is the next block, invert the condition so that we can
2118 // fall through to the lhs instead of the rhs block.
2119 if (CB
.TrueBB
== NextBlock(SwitchBB
)) {
2120 std::swap(CB
.TrueBB
, CB
.FalseBB
);
2121 SDValue True
= DAG
.getConstant(1, dl
, Cond
.getValueType());
2122 Cond
= DAG
.getNode(ISD::XOR
, dl
, Cond
.getValueType(), Cond
, True
);
2125 SDValue BrCond
= DAG
.getNode(ISD::BRCOND
, dl
,
2126 MVT::Other
, getControlRoot(), Cond
,
2127 DAG
.getBasicBlock(CB
.TrueBB
));
2129 // Insert the false branch. Do this even if it's a fall through branch,
2130 // this makes it easier to do DAG optimizations which require inverting
2131 // the branch condition.
2132 BrCond
= DAG
.getNode(ISD::BR
, dl
, MVT::Other
, BrCond
,
2133 DAG
.getBasicBlock(CB
.FalseBB
));
2135 DAG
.setRoot(BrCond
);
2138 /// visitJumpTable - Emit JumpTable node in the current MBB
2139 void SelectionDAGBuilder::visitJumpTable(JumpTable
&JT
) {
2140 // Emit the code for the jump table
2141 assert(JT
.Reg
!= -1U && "Should lower JT Header first!");
2142 EVT PTy
= DAG
.getTargetLoweringInfo().getPointerTy(DAG
.getDataLayout());
2143 SDValue Index
= DAG
.getCopyFromReg(getControlRoot(), getCurSDLoc(),
2145 SDValue Table
= DAG
.getJumpTable(JT
.JTI
, PTy
);
2146 SDValue BrJumpTable
= DAG
.getNode(ISD::BR_JT
, getCurSDLoc(),
2147 MVT::Other
, Index
.getValue(1),
2149 DAG
.setRoot(BrJumpTable
);
2152 /// visitJumpTableHeader - This function emits necessary code to produce index
2153 /// in the JumpTable from switch case.
2154 void SelectionDAGBuilder::visitJumpTableHeader(JumpTable
&JT
,
2155 JumpTableHeader
&JTH
,
2156 MachineBasicBlock
*SwitchBB
) {
2157 SDLoc dl
= getCurSDLoc();
2159 // Subtract the lowest switch case value from the value being switched on and
2160 // conditional branch to default mbb if the result is greater than the
2161 // difference between smallest and largest cases.
2162 SDValue SwitchOp
= getValue(JTH
.SValue
);
2163 EVT VT
= SwitchOp
.getValueType();
2164 SDValue Sub
= DAG
.getNode(ISD::SUB
, dl
, VT
, SwitchOp
,
2165 DAG
.getConstant(JTH
.First
, dl
, VT
));
2167 // The SDNode we just created, which holds the value being switched on minus
2168 // the smallest case value, needs to be copied to a virtual register so it
2169 // can be used as an index into the jump table in a subsequent basic block.
2170 // This value may be smaller or larger than the target's pointer type, and
2171 // therefore require extension or truncating.
2172 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
2173 SwitchOp
= DAG
.getZExtOrTrunc(Sub
, dl
, TLI
.getPointerTy(DAG
.getDataLayout()));
2175 unsigned JumpTableReg
=
2176 FuncInfo
.CreateReg(TLI
.getPointerTy(DAG
.getDataLayout()));
2177 SDValue CopyTo
= DAG
.getCopyToReg(getControlRoot(), dl
,
2178 JumpTableReg
, SwitchOp
);
2179 JT
.Reg
= JumpTableReg
;
2181 // Emit the range check for the jump table, and branch to the default block
2182 // for the switch statement if the value being switched on exceeds the largest
2183 // case in the switch.
2184 SDValue CMP
= DAG
.getSetCC(
2185 dl
, TLI
.getSetCCResultType(DAG
.getDataLayout(), *DAG
.getContext(),
2186 Sub
.getValueType()),
2187 Sub
, DAG
.getConstant(JTH
.Last
- JTH
.First
, dl
, VT
), ISD::SETUGT
);
2189 SDValue BrCond
= DAG
.getNode(ISD::BRCOND
, dl
,
2190 MVT::Other
, CopyTo
, CMP
,
2191 DAG
.getBasicBlock(JT
.Default
));
2193 // Avoid emitting unnecessary branches to the next block.
2194 if (JT
.MBB
!= NextBlock(SwitchBB
))
2195 BrCond
= DAG
.getNode(ISD::BR
, dl
, MVT::Other
, BrCond
,
2196 DAG
.getBasicBlock(JT
.MBB
));
2198 DAG
.setRoot(BrCond
);
2201 /// Create a LOAD_STACK_GUARD node, and let it carry the target specific global
2202 /// variable if there exists one.
2203 static SDValue
getLoadStackGuard(SelectionDAG
&DAG
, const SDLoc
&DL
,
2205 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
2206 EVT PtrTy
= TLI
.getPointerTy(DAG
.getDataLayout());
2207 MachineFunction
&MF
= DAG
.getMachineFunction();
2208 Value
*Global
= TLI
.getSDagStackGuard(*MF
.getFunction().getParent());
2209 MachineSDNode
*Node
=
2210 DAG
.getMachineNode(TargetOpcode::LOAD_STACK_GUARD
, DL
, PtrTy
, Chain
);
2212 MachinePointerInfo
MPInfo(Global
);
2213 auto Flags
= MachineMemOperand::MOLoad
| MachineMemOperand::MOInvariant
|
2214 MachineMemOperand::MODereferenceable
;
2215 MachineMemOperand
*MemRef
= MF
.getMachineMemOperand(
2216 MPInfo
, Flags
, PtrTy
.getSizeInBits() / 8, DAG
.getEVTAlignment(PtrTy
));
2217 DAG
.setNodeMemRefs(Node
, {MemRef
});
2219 return SDValue(Node
, 0);
2222 /// Codegen a new tail for a stack protector check ParentMBB which has had its
2223 /// tail spliced into a stack protector check success bb.
2225 /// For a high level explanation of how this fits into the stack protector
2226 /// generation see the comment on the declaration of class
2227 /// StackProtectorDescriptor.
2228 void SelectionDAGBuilder::visitSPDescriptorParent(StackProtectorDescriptor
&SPD
,
2229 MachineBasicBlock
*ParentBB
) {
2231 // First create the loads to the guard/stack slot for the comparison.
2232 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
2233 EVT PtrTy
= TLI
.getPointerTy(DAG
.getDataLayout());
2235 MachineFrameInfo
&MFI
= ParentBB
->getParent()->getFrameInfo();
2236 int FI
= MFI
.getStackProtectorIndex();
2239 SDLoc dl
= getCurSDLoc();
2240 SDValue StackSlotPtr
= DAG
.getFrameIndex(FI
, PtrTy
);
2241 const Module
&M
= *ParentBB
->getParent()->getFunction().getParent();
2242 unsigned Align
= DL
->getPrefTypeAlignment(Type::getInt8PtrTy(M
.getContext()));
2244 // Generate code to load the content of the guard slot.
2245 SDValue GuardVal
= DAG
.getLoad(
2246 PtrTy
, dl
, DAG
.getEntryNode(), StackSlotPtr
,
2247 MachinePointerInfo::getFixedStack(DAG
.getMachineFunction(), FI
), Align
,
2248 MachineMemOperand::MOVolatile
);
2250 if (TLI
.useStackGuardXorFP())
2251 GuardVal
= TLI
.emitStackGuardXorFP(DAG
, GuardVal
, dl
);
2253 // Retrieve guard check function, nullptr if instrumentation is inlined.
2254 if (const Value
*GuardCheck
= TLI
.getSSPStackGuardCheck(M
)) {
2255 // The target provides a guard check function to validate the guard value.
2256 // Generate a call to that function with the content of the guard slot as
2258 auto *Fn
= cast
<Function
>(GuardCheck
);
2259 FunctionType
*FnTy
= Fn
->getFunctionType();
2260 assert(FnTy
->getNumParams() == 1 && "Invalid function signature");
2262 TargetLowering::ArgListTy Args
;
2263 TargetLowering::ArgListEntry Entry
;
2264 Entry
.Node
= GuardVal
;
2265 Entry
.Ty
= FnTy
->getParamType(0);
2266 if (Fn
->hasAttribute(1, Attribute::AttrKind::InReg
))
2267 Entry
.IsInReg
= true;
2268 Args
.push_back(Entry
);
2270 TargetLowering::CallLoweringInfo
CLI(DAG
);
2271 CLI
.setDebugLoc(getCurSDLoc())
2272 .setChain(DAG
.getEntryNode())
2273 .setCallee(Fn
->getCallingConv(), FnTy
->getReturnType(),
2274 getValue(GuardCheck
), std::move(Args
));
2276 std::pair
<SDValue
, SDValue
> Result
= TLI
.LowerCallTo(CLI
);
2277 DAG
.setRoot(Result
.second
);
2281 // If useLoadStackGuardNode returns true, generate LOAD_STACK_GUARD.
2282 // Otherwise, emit a volatile load to retrieve the stack guard value.
2283 SDValue Chain
= DAG
.getEntryNode();
2284 if (TLI
.useLoadStackGuardNode()) {
2285 Guard
= getLoadStackGuard(DAG
, dl
, Chain
);
2287 const Value
*IRGuard
= TLI
.getSDagStackGuard(M
);
2288 SDValue GuardPtr
= getValue(IRGuard
);
2291 DAG
.getLoad(PtrTy
, dl
, Chain
, GuardPtr
, MachinePointerInfo(IRGuard
, 0),
2292 Align
, MachineMemOperand::MOVolatile
);
2295 // Perform the comparison via a subtract/getsetcc.
2296 EVT VT
= Guard
.getValueType();
2297 SDValue Sub
= DAG
.getNode(ISD::SUB
, dl
, VT
, Guard
, GuardVal
);
2299 SDValue Cmp
= DAG
.getSetCC(dl
, TLI
.getSetCCResultType(DAG
.getDataLayout(),
2301 Sub
.getValueType()),
2302 Sub
, DAG
.getConstant(0, dl
, VT
), ISD::SETNE
);
2304 // If the sub is not 0, then we know the guard/stackslot do not equal, so
2305 // branch to failure MBB.
2306 SDValue BrCond
= DAG
.getNode(ISD::BRCOND
, dl
,
2307 MVT::Other
, GuardVal
.getOperand(0),
2308 Cmp
, DAG
.getBasicBlock(SPD
.getFailureMBB()));
2309 // Otherwise branch to success MBB.
2310 SDValue Br
= DAG
.getNode(ISD::BR
, dl
,
2312 DAG
.getBasicBlock(SPD
.getSuccessMBB()));
2317 /// Codegen the failure basic block for a stack protector check.
2319 /// A failure stack protector machine basic block consists simply of a call to
2320 /// __stack_chk_fail().
2322 /// For a high level explanation of how this fits into the stack protector
2323 /// generation see the comment on the declaration of class
2324 /// StackProtectorDescriptor.
2326 SelectionDAGBuilder::visitSPDescriptorFailure(StackProtectorDescriptor
&SPD
) {
2327 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
2329 TLI
.makeLibCall(DAG
, RTLIB::STACKPROTECTOR_CHECK_FAIL
, MVT::isVoid
,
2330 None
, false, getCurSDLoc(), false, false).second
;
2334 /// visitBitTestHeader - This function emits necessary code to produce value
2335 /// suitable for "bit tests"
2336 void SelectionDAGBuilder::visitBitTestHeader(BitTestBlock
&B
,
2337 MachineBasicBlock
*SwitchBB
) {
2338 SDLoc dl
= getCurSDLoc();
2340 // Subtract the minimum value
2341 SDValue SwitchOp
= getValue(B
.SValue
);
2342 EVT VT
= SwitchOp
.getValueType();
2343 SDValue Sub
= DAG
.getNode(ISD::SUB
, dl
, VT
, SwitchOp
,
2344 DAG
.getConstant(B
.First
, dl
, VT
));
2347 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
2348 SDValue RangeCmp
= DAG
.getSetCC(
2349 dl
, TLI
.getSetCCResultType(DAG
.getDataLayout(), *DAG
.getContext(),
2350 Sub
.getValueType()),
2351 Sub
, DAG
.getConstant(B
.Range
, dl
, VT
), ISD::SETUGT
);
2353 // Determine the type of the test operands.
2354 bool UsePtrType
= false;
2355 if (!TLI
.isTypeLegal(VT
))
2358 for (unsigned i
= 0, e
= B
.Cases
.size(); i
!= e
; ++i
)
2359 if (!isUIntN(VT
.getSizeInBits(), B
.Cases
[i
].Mask
)) {
2360 // Switch table case range are encoded into series of masks.
2361 // Just use pointer type, it's guaranteed to fit.
2367 VT
= TLI
.getPointerTy(DAG
.getDataLayout());
2368 Sub
= DAG
.getZExtOrTrunc(Sub
, dl
, VT
);
2371 B
.RegVT
= VT
.getSimpleVT();
2372 B
.Reg
= FuncInfo
.CreateReg(B
.RegVT
);
2373 SDValue CopyTo
= DAG
.getCopyToReg(getControlRoot(), dl
, B
.Reg
, Sub
);
2375 MachineBasicBlock
* MBB
= B
.Cases
[0].ThisBB
;
2377 addSuccessorWithProb(SwitchBB
, B
.Default
, B
.DefaultProb
);
2378 addSuccessorWithProb(SwitchBB
, MBB
, B
.Prob
);
2379 SwitchBB
->normalizeSuccProbs();
2381 SDValue BrRange
= DAG
.getNode(ISD::BRCOND
, dl
,
2382 MVT::Other
, CopyTo
, RangeCmp
,
2383 DAG
.getBasicBlock(B
.Default
));
2385 // Avoid emitting unnecessary branches to the next block.
2386 if (MBB
!= NextBlock(SwitchBB
))
2387 BrRange
= DAG
.getNode(ISD::BR
, dl
, MVT::Other
, BrRange
,
2388 DAG
.getBasicBlock(MBB
));
2390 DAG
.setRoot(BrRange
);
2393 /// visitBitTestCase - this function produces one "bit test"
2394 void SelectionDAGBuilder::visitBitTestCase(BitTestBlock
&BB
,
2395 MachineBasicBlock
* NextMBB
,
2396 BranchProbability BranchProbToNext
,
2399 MachineBasicBlock
*SwitchBB
) {
2400 SDLoc dl
= getCurSDLoc();
2402 SDValue ShiftOp
= DAG
.getCopyFromReg(getControlRoot(), dl
, Reg
, VT
);
2404 unsigned PopCount
= countPopulation(B
.Mask
);
2405 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
2406 if (PopCount
== 1) {
2407 // Testing for a single bit; just compare the shift count with what it
2408 // would need to be to shift a 1 bit in that position.
2410 dl
, TLI
.getSetCCResultType(DAG
.getDataLayout(), *DAG
.getContext(), VT
),
2411 ShiftOp
, DAG
.getConstant(countTrailingZeros(B
.Mask
), dl
, VT
),
2413 } else if (PopCount
== BB
.Range
) {
2414 // There is only one zero bit in the range, test for it directly.
2416 dl
, TLI
.getSetCCResultType(DAG
.getDataLayout(), *DAG
.getContext(), VT
),
2417 ShiftOp
, DAG
.getConstant(countTrailingOnes(B
.Mask
), dl
, VT
),
2420 // Make desired shift
2421 SDValue SwitchVal
= DAG
.getNode(ISD::SHL
, dl
, VT
,
2422 DAG
.getConstant(1, dl
, VT
), ShiftOp
);
2424 // Emit bit tests and jumps
2425 SDValue AndOp
= DAG
.getNode(ISD::AND
, dl
,
2426 VT
, SwitchVal
, DAG
.getConstant(B
.Mask
, dl
, VT
));
2428 dl
, TLI
.getSetCCResultType(DAG
.getDataLayout(), *DAG
.getContext(), VT
),
2429 AndOp
, DAG
.getConstant(0, dl
, VT
), ISD::SETNE
);
2432 // The branch probability from SwitchBB to B.TargetBB is B.ExtraProb.
2433 addSuccessorWithProb(SwitchBB
, B
.TargetBB
, B
.ExtraProb
);
2434 // The branch probability from SwitchBB to NextMBB is BranchProbToNext.
2435 addSuccessorWithProb(SwitchBB
, NextMBB
, BranchProbToNext
);
2436 // It is not guaranteed that the sum of B.ExtraProb and BranchProbToNext is
2437 // one as they are relative probabilities (and thus work more like weights),
2438 // and hence we need to normalize them to let the sum of them become one.
2439 SwitchBB
->normalizeSuccProbs();
2441 SDValue BrAnd
= DAG
.getNode(ISD::BRCOND
, dl
,
2442 MVT::Other
, getControlRoot(),
2443 Cmp
, DAG
.getBasicBlock(B
.TargetBB
));
2445 // Avoid emitting unnecessary branches to the next block.
2446 if (NextMBB
!= NextBlock(SwitchBB
))
2447 BrAnd
= DAG
.getNode(ISD::BR
, dl
, MVT::Other
, BrAnd
,
2448 DAG
.getBasicBlock(NextMBB
));
2453 void SelectionDAGBuilder::visitInvoke(const InvokeInst
&I
) {
2454 MachineBasicBlock
*InvokeMBB
= FuncInfo
.MBB
;
2456 // Retrieve successors. Look through artificial IR level blocks like
2457 // catchswitch for successors.
2458 MachineBasicBlock
*Return
= FuncInfo
.MBBMap
[I
.getSuccessor(0)];
2459 const BasicBlock
*EHPadBB
= I
.getSuccessor(1);
2461 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
2462 // have to do anything here to lower funclet bundles.
2463 assert(!I
.hasOperandBundlesOtherThan(
2464 {LLVMContext::OB_deopt
, LLVMContext::OB_funclet
}) &&
2465 "Cannot lower invokes with arbitrary operand bundles yet!");
2467 const Value
*Callee(I
.getCalledValue());
2468 const Function
*Fn
= dyn_cast
<Function
>(Callee
);
2469 if (isa
<InlineAsm
>(Callee
))
2471 else if (Fn
&& Fn
->isIntrinsic()) {
2472 switch (Fn
->getIntrinsicID()) {
2474 llvm_unreachable("Cannot invoke this intrinsic");
2475 case Intrinsic::donothing
:
2476 // Ignore invokes to @llvm.donothing: jump directly to the next BB.
2478 case Intrinsic::experimental_patchpoint_void
:
2479 case Intrinsic::experimental_patchpoint_i64
:
2480 visitPatchpoint(&I
, EHPadBB
);
2482 case Intrinsic::experimental_gc_statepoint
:
2483 LowerStatepoint(ImmutableStatepoint(&I
), EHPadBB
);
2486 } else if (I
.countOperandBundlesOfType(LLVMContext::OB_deopt
)) {
2487 // Currently we do not lower any intrinsic calls with deopt operand bundles.
2488 // Eventually we will support lowering the @llvm.experimental.deoptimize
2489 // intrinsic, and right now there are no plans to support other intrinsics
2490 // with deopt state.
2491 LowerCallSiteWithDeoptBundle(&I
, getValue(Callee
), EHPadBB
);
2493 LowerCallTo(&I
, getValue(Callee
), false, EHPadBB
);
2496 // If the value of the invoke is used outside of its defining block, make it
2497 // available as a virtual register.
2498 // We already took care of the exported value for the statepoint instruction
2499 // during call to the LowerStatepoint.
2500 if (!isStatepoint(I
)) {
2501 CopyToExportRegsIfNeeded(&I
);
2504 SmallVector
<std::pair
<MachineBasicBlock
*, BranchProbability
>, 1> UnwindDests
;
2505 BranchProbabilityInfo
*BPI
= FuncInfo
.BPI
;
2506 BranchProbability EHPadBBProb
=
2507 BPI
? BPI
->getEdgeProbability(InvokeMBB
->getBasicBlock(), EHPadBB
)
2508 : BranchProbability::getZero();
2509 findUnwindDestinations(FuncInfo
, EHPadBB
, EHPadBBProb
, UnwindDests
);
2511 // Update successor info.
2512 addSuccessorWithProb(InvokeMBB
, Return
);
2513 for (auto &UnwindDest
: UnwindDests
) {
2514 UnwindDest
.first
->setIsEHPad();
2515 addSuccessorWithProb(InvokeMBB
, UnwindDest
.first
, UnwindDest
.second
);
2517 InvokeMBB
->normalizeSuccProbs();
2519 // Drop into normal successor.
2520 DAG
.setRoot(DAG
.getNode(ISD::BR
, getCurSDLoc(),
2521 MVT::Other
, getControlRoot(),
2522 DAG
.getBasicBlock(Return
)));
2525 void SelectionDAGBuilder::visitResume(const ResumeInst
&RI
) {
2526 llvm_unreachable("SelectionDAGBuilder shouldn't visit resume instructions!");
2529 void SelectionDAGBuilder::visitLandingPad(const LandingPadInst
&LP
) {
2530 assert(FuncInfo
.MBB
->isEHPad() &&
2531 "Call to landingpad not in landing pad!");
2533 // If there aren't registers to copy the values into (e.g., during SjLj
2534 // exceptions), then don't bother to create these DAG nodes.
2535 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
2536 const Constant
*PersonalityFn
= FuncInfo
.Fn
->getPersonalityFn();
2537 if (TLI
.getExceptionPointerRegister(PersonalityFn
) == 0 &&
2538 TLI
.getExceptionSelectorRegister(PersonalityFn
) == 0)
2541 // If landingpad's return type is token type, we don't create DAG nodes
2542 // for its exception pointer and selector value. The extraction of exception
2543 // pointer or selector value from token type landingpads is not currently
2545 if (LP
.getType()->isTokenTy())
2548 SmallVector
<EVT
, 2> ValueVTs
;
2549 SDLoc dl
= getCurSDLoc();
2550 ComputeValueVTs(TLI
, DAG
.getDataLayout(), LP
.getType(), ValueVTs
);
2551 assert(ValueVTs
.size() == 2 && "Only two-valued landingpads are supported");
2553 // Get the two live-in registers as SDValues. The physregs have already been
2554 // copied into virtual registers.
2556 if (FuncInfo
.ExceptionPointerVirtReg
) {
2557 Ops
[0] = DAG
.getZExtOrTrunc(
2558 DAG
.getCopyFromReg(DAG
.getEntryNode(), dl
,
2559 FuncInfo
.ExceptionPointerVirtReg
,
2560 TLI
.getPointerTy(DAG
.getDataLayout())),
2563 Ops
[0] = DAG
.getConstant(0, dl
, TLI
.getPointerTy(DAG
.getDataLayout()));
2565 Ops
[1] = DAG
.getZExtOrTrunc(
2566 DAG
.getCopyFromReg(DAG
.getEntryNode(), dl
,
2567 FuncInfo
.ExceptionSelectorVirtReg
,
2568 TLI
.getPointerTy(DAG
.getDataLayout())),
2572 SDValue Res
= DAG
.getNode(ISD::MERGE_VALUES
, dl
,
2573 DAG
.getVTList(ValueVTs
), Ops
);
2577 void SelectionDAGBuilder::sortAndRangeify(CaseClusterVector
&Clusters
) {
2579 for (const CaseCluster
&CC
: Clusters
)
2580 assert(CC
.Low
== CC
.High
&& "Input clusters must be single-case");
2583 llvm::sort(Clusters
, [](const CaseCluster
&a
, const CaseCluster
&b
) {
2584 return a
.Low
->getValue().slt(b
.Low
->getValue());
2587 // Merge adjacent clusters with the same destination.
2588 const unsigned N
= Clusters
.size();
2589 unsigned DstIndex
= 0;
2590 for (unsigned SrcIndex
= 0; SrcIndex
< N
; ++SrcIndex
) {
2591 CaseCluster
&CC
= Clusters
[SrcIndex
];
2592 const ConstantInt
*CaseVal
= CC
.Low
;
2593 MachineBasicBlock
*Succ
= CC
.MBB
;
2595 if (DstIndex
!= 0 && Clusters
[DstIndex
- 1].MBB
== Succ
&&
2596 (CaseVal
->getValue() - Clusters
[DstIndex
- 1].High
->getValue()) == 1) {
2597 // If this case has the same successor and is a neighbour, merge it into
2598 // the previous cluster.
2599 Clusters
[DstIndex
- 1].High
= CaseVal
;
2600 Clusters
[DstIndex
- 1].Prob
+= CC
.Prob
;
2602 std::memmove(&Clusters
[DstIndex
++], &Clusters
[SrcIndex
],
2603 sizeof(Clusters
[SrcIndex
]));
2606 Clusters
.resize(DstIndex
);
2609 void SelectionDAGBuilder::UpdateSplitBlock(MachineBasicBlock
*First
,
2610 MachineBasicBlock
*Last
) {
2612 for (unsigned i
= 0, e
= JTCases
.size(); i
!= e
; ++i
)
2613 if (JTCases
[i
].first
.HeaderBB
== First
)
2614 JTCases
[i
].first
.HeaderBB
= Last
;
2616 // Update BitTestCases.
2617 for (unsigned i
= 0, e
= BitTestCases
.size(); i
!= e
; ++i
)
2618 if (BitTestCases
[i
].Parent
== First
)
2619 BitTestCases
[i
].Parent
= Last
;
2622 void SelectionDAGBuilder::visitIndirectBr(const IndirectBrInst
&I
) {
2623 MachineBasicBlock
*IndirectBrMBB
= FuncInfo
.MBB
;
2625 // Update machine-CFG edges with unique successors.
2626 SmallSet
<BasicBlock
*, 32> Done
;
2627 for (unsigned i
= 0, e
= I
.getNumSuccessors(); i
!= e
; ++i
) {
2628 BasicBlock
*BB
= I
.getSuccessor(i
);
2629 bool Inserted
= Done
.insert(BB
).second
;
2633 MachineBasicBlock
*Succ
= FuncInfo
.MBBMap
[BB
];
2634 addSuccessorWithProb(IndirectBrMBB
, Succ
);
2636 IndirectBrMBB
->normalizeSuccProbs();
2638 DAG
.setRoot(DAG
.getNode(ISD::BRIND
, getCurSDLoc(),
2639 MVT::Other
, getControlRoot(),
2640 getValue(I
.getAddress())));
2643 void SelectionDAGBuilder::visitUnreachable(const UnreachableInst
&I
) {
2644 if (!DAG
.getTarget().Options
.TrapUnreachable
)
2647 // We may be able to ignore unreachable behind a noreturn call.
2648 if (DAG
.getTarget().Options
.NoTrapAfterNoreturn
) {
2649 const BasicBlock
&BB
= *I
.getParent();
2650 if (&I
!= &BB
.front()) {
2651 BasicBlock::const_iterator PredI
=
2652 std::prev(BasicBlock::const_iterator(&I
));
2653 if (const CallInst
*Call
= dyn_cast
<CallInst
>(&*PredI
)) {
2654 if (Call
->doesNotReturn())
2660 DAG
.setRoot(DAG
.getNode(ISD::TRAP
, getCurSDLoc(), MVT::Other
, DAG
.getRoot()));
2663 void SelectionDAGBuilder::visitFSub(const User
&I
) {
2664 // -0.0 - X --> fneg
2665 Type
*Ty
= I
.getType();
2666 if (isa
<Constant
>(I
.getOperand(0)) &&
2667 I
.getOperand(0) == ConstantFP::getZeroValueForNegation(Ty
)) {
2668 SDValue Op2
= getValue(I
.getOperand(1));
2669 setValue(&I
, DAG
.getNode(ISD::FNEG
, getCurSDLoc(),
2670 Op2
.getValueType(), Op2
));
2674 visitBinary(I
, ISD::FSUB
);
2677 /// Checks if the given instruction performs a vector reduction, in which case
2678 /// we have the freedom to alter the elements in the result as long as the
2679 /// reduction of them stays unchanged.
2680 static bool isVectorReductionOp(const User
*I
) {
2681 const Instruction
*Inst
= dyn_cast
<Instruction
>(I
);
2682 if (!Inst
|| !Inst
->getType()->isVectorTy())
2685 auto OpCode
= Inst
->getOpcode();
2687 case Instruction::Add
:
2688 case Instruction::Mul
:
2689 case Instruction::And
:
2690 case Instruction::Or
:
2691 case Instruction::Xor
:
2693 case Instruction::FAdd
:
2694 case Instruction::FMul
:
2695 if (const FPMathOperator
*FPOp
= dyn_cast
<const FPMathOperator
>(Inst
))
2696 if (FPOp
->getFastMathFlags().isFast())
2703 unsigned ElemNum
= Inst
->getType()->getVectorNumElements();
2704 // Ensure the reduction size is a power of 2.
2705 if (!isPowerOf2_32(ElemNum
))
2708 unsigned ElemNumToReduce
= ElemNum
;
2710 // Do DFS search on the def-use chain from the given instruction. We only
2711 // allow four kinds of operations during the search until we reach the
2712 // instruction that extracts the first element from the vector:
2714 // 1. The reduction operation of the same opcode as the given instruction.
2718 // 3. ShuffleVector instruction together with a reduction operation that
2719 // does a partial reduction.
2721 // 4. ExtractElement that extracts the first element from the vector, and we
2722 // stop searching the def-use chain here.
2724 // 3 & 4 above perform a reduction on all elements of the vector. We push defs
2725 // from 1-3 to the stack to continue the DFS. The given instruction is not
2726 // a reduction operation if we meet any other instructions other than those
2729 SmallVector
<const User
*, 16> UsersToVisit
{Inst
};
2730 SmallPtrSet
<const User
*, 16> Visited
;
2731 bool ReduxExtracted
= false;
2733 while (!UsersToVisit
.empty()) {
2734 auto User
= UsersToVisit
.back();
2735 UsersToVisit
.pop_back();
2736 if (!Visited
.insert(User
).second
)
2739 for (const auto &U
: User
->users()) {
2740 auto Inst
= dyn_cast
<Instruction
>(U
);
2744 if (Inst
->getOpcode() == OpCode
|| isa
<PHINode
>(U
)) {
2745 if (const FPMathOperator
*FPOp
= dyn_cast
<const FPMathOperator
>(Inst
))
2746 if (!isa
<PHINode
>(FPOp
) && !FPOp
->getFastMathFlags().isFast())
2748 UsersToVisit
.push_back(U
);
2749 } else if (const ShuffleVectorInst
*ShufInst
=
2750 dyn_cast
<ShuffleVectorInst
>(U
)) {
2751 // Detect the following pattern: A ShuffleVector instruction together
2752 // with a reduction that do partial reduction on the first and second
2753 // ElemNumToReduce / 2 elements, and store the result in
2754 // ElemNumToReduce / 2 elements in another vector.
2756 unsigned ResultElements
= ShufInst
->getType()->getVectorNumElements();
2757 if (ResultElements
< ElemNum
)
2760 if (ElemNumToReduce
== 1)
2762 if (!isa
<UndefValue
>(U
->getOperand(1)))
2764 for (unsigned i
= 0; i
< ElemNumToReduce
/ 2; ++i
)
2765 if (ShufInst
->getMaskValue(i
) != int(i
+ ElemNumToReduce
/ 2))
2767 for (unsigned i
= ElemNumToReduce
/ 2; i
< ElemNum
; ++i
)
2768 if (ShufInst
->getMaskValue(i
) != -1)
2771 // There is only one user of this ShuffleVector instruction, which
2772 // must be a reduction operation.
2773 if (!U
->hasOneUse())
2776 auto U2
= dyn_cast
<Instruction
>(*U
->user_begin());
2777 if (!U2
|| U2
->getOpcode() != OpCode
)
2780 // Check operands of the reduction operation.
2781 if ((U2
->getOperand(0) == U
->getOperand(0) && U2
->getOperand(1) == U
) ||
2782 (U2
->getOperand(1) == U
->getOperand(0) && U2
->getOperand(0) == U
)) {
2783 UsersToVisit
.push_back(U2
);
2784 ElemNumToReduce
/= 2;
2787 } else if (isa
<ExtractElementInst
>(U
)) {
2788 // At this moment we should have reduced all elements in the vector.
2789 if (ElemNumToReduce
!= 1)
2792 const ConstantInt
*Val
= dyn_cast
<ConstantInt
>(U
->getOperand(1));
2793 if (!Val
|| !Val
->isZero())
2796 ReduxExtracted
= true;
2801 return ReduxExtracted
;
2804 void SelectionDAGBuilder::visitBinary(const User
&I
, unsigned Opcode
) {
2806 if (auto *OFBinOp
= dyn_cast
<OverflowingBinaryOperator
>(&I
)) {
2807 Flags
.setNoSignedWrap(OFBinOp
->hasNoSignedWrap());
2808 Flags
.setNoUnsignedWrap(OFBinOp
->hasNoUnsignedWrap());
2810 if (auto *ExactOp
= dyn_cast
<PossiblyExactOperator
>(&I
)) {
2811 Flags
.setExact(ExactOp
->isExact());
2813 if (isVectorReductionOp(&I
)) {
2814 Flags
.setVectorReduction(true);
2815 LLVM_DEBUG(dbgs() << "Detected a reduction operation:" << I
<< "\n");
2818 SDValue Op1
= getValue(I
.getOperand(0));
2819 SDValue Op2
= getValue(I
.getOperand(1));
2820 SDValue BinNodeValue
= DAG
.getNode(Opcode
, getCurSDLoc(), Op1
.getValueType(),
2822 setValue(&I
, BinNodeValue
);
2825 void SelectionDAGBuilder::visitShift(const User
&I
, unsigned Opcode
) {
2826 SDValue Op1
= getValue(I
.getOperand(0));
2827 SDValue Op2
= getValue(I
.getOperand(1));
2829 EVT ShiftTy
= DAG
.getTargetLoweringInfo().getShiftAmountTy(
2830 Op1
.getValueType(), DAG
.getDataLayout());
2832 // Coerce the shift amount to the right type if we can.
2833 if (!I
.getType()->isVectorTy() && Op2
.getValueType() != ShiftTy
) {
2834 unsigned ShiftSize
= ShiftTy
.getSizeInBits();
2835 unsigned Op2Size
= Op2
.getValueSizeInBits();
2836 SDLoc DL
= getCurSDLoc();
2838 // If the operand is smaller than the shift count type, promote it.
2839 if (ShiftSize
> Op2Size
)
2840 Op2
= DAG
.getNode(ISD::ZERO_EXTEND
, DL
, ShiftTy
, Op2
);
2842 // If the operand is larger than the shift count type but the shift
2843 // count type has enough bits to represent any shift value, truncate
2844 // it now. This is a common case and it exposes the truncate to
2845 // optimization early.
2846 else if (ShiftSize
>= Log2_32_Ceil(Op2
.getValueSizeInBits()))
2847 Op2
= DAG
.getNode(ISD::TRUNCATE
, DL
, ShiftTy
, Op2
);
2848 // Otherwise we'll need to temporarily settle for some other convenient
2849 // type. Type legalization will make adjustments once the shiftee is split.
2851 Op2
= DAG
.getZExtOrTrunc(Op2
, DL
, MVT::i32
);
2858 if (Opcode
== ISD::SRL
|| Opcode
== ISD::SRA
|| Opcode
== ISD::SHL
) {
2860 if (const OverflowingBinaryOperator
*OFBinOp
=
2861 dyn_cast
<const OverflowingBinaryOperator
>(&I
)) {
2862 nuw
= OFBinOp
->hasNoUnsignedWrap();
2863 nsw
= OFBinOp
->hasNoSignedWrap();
2865 if (const PossiblyExactOperator
*ExactOp
=
2866 dyn_cast
<const PossiblyExactOperator
>(&I
))
2867 exact
= ExactOp
->isExact();
2870 Flags
.setExact(exact
);
2871 Flags
.setNoSignedWrap(nsw
);
2872 Flags
.setNoUnsignedWrap(nuw
);
2873 SDValue Res
= DAG
.getNode(Opcode
, getCurSDLoc(), Op1
.getValueType(), Op1
, Op2
,
2878 void SelectionDAGBuilder::visitSDiv(const User
&I
) {
2879 SDValue Op1
= getValue(I
.getOperand(0));
2880 SDValue Op2
= getValue(I
.getOperand(1));
2883 Flags
.setExact(isa
<PossiblyExactOperator
>(&I
) &&
2884 cast
<PossiblyExactOperator
>(&I
)->isExact());
2885 setValue(&I
, DAG
.getNode(ISD::SDIV
, getCurSDLoc(), Op1
.getValueType(), Op1
,
2889 void SelectionDAGBuilder::visitICmp(const User
&I
) {
2890 ICmpInst::Predicate predicate
= ICmpInst::BAD_ICMP_PREDICATE
;
2891 if (const ICmpInst
*IC
= dyn_cast
<ICmpInst
>(&I
))
2892 predicate
= IC
->getPredicate();
2893 else if (const ConstantExpr
*IC
= dyn_cast
<ConstantExpr
>(&I
))
2894 predicate
= ICmpInst::Predicate(IC
->getPredicate());
2895 SDValue Op1
= getValue(I
.getOperand(0));
2896 SDValue Op2
= getValue(I
.getOperand(1));
2897 ISD::CondCode Opcode
= getICmpCondCode(predicate
);
2899 EVT DestVT
= DAG
.getTargetLoweringInfo().getValueType(DAG
.getDataLayout(),
2901 setValue(&I
, DAG
.getSetCC(getCurSDLoc(), DestVT
, Op1
, Op2
, Opcode
));
2904 void SelectionDAGBuilder::visitFCmp(const User
&I
) {
2905 FCmpInst::Predicate predicate
= FCmpInst::BAD_FCMP_PREDICATE
;
2906 if (const FCmpInst
*FC
= dyn_cast
<FCmpInst
>(&I
))
2907 predicate
= FC
->getPredicate();
2908 else if (const ConstantExpr
*FC
= dyn_cast
<ConstantExpr
>(&I
))
2909 predicate
= FCmpInst::Predicate(FC
->getPredicate());
2910 SDValue Op1
= getValue(I
.getOperand(0));
2911 SDValue Op2
= getValue(I
.getOperand(1));
2913 ISD::CondCode Condition
= getFCmpCondCode(predicate
);
2914 auto *FPMO
= dyn_cast
<FPMathOperator
>(&I
);
2915 if ((FPMO
&& FPMO
->hasNoNaNs()) || TM
.Options
.NoNaNsFPMath
)
2916 Condition
= getFCmpCodeWithoutNaN(Condition
);
2918 EVT DestVT
= DAG
.getTargetLoweringInfo().getValueType(DAG
.getDataLayout(),
2920 setValue(&I
, DAG
.getSetCC(getCurSDLoc(), DestVT
, Op1
, Op2
, Condition
));
2923 // Check if the condition of the select has one use or two users that are both
2924 // selects with the same condition.
2925 static bool hasOnlySelectUsers(const Value
*Cond
) {
2926 return llvm::all_of(Cond
->users(), [](const Value
*V
) {
2927 return isa
<SelectInst
>(V
);
2931 void SelectionDAGBuilder::visitSelect(const User
&I
) {
2932 SmallVector
<EVT
, 4> ValueVTs
;
2933 ComputeValueVTs(DAG
.getTargetLoweringInfo(), DAG
.getDataLayout(), I
.getType(),
2935 unsigned NumValues
= ValueVTs
.size();
2936 if (NumValues
== 0) return;
2938 SmallVector
<SDValue
, 4> Values(NumValues
);
2939 SDValue Cond
= getValue(I
.getOperand(0));
2940 SDValue LHSVal
= getValue(I
.getOperand(1));
2941 SDValue RHSVal
= getValue(I
.getOperand(2));
2942 auto BaseOps
= {Cond
};
2943 ISD::NodeType OpCode
= Cond
.getValueType().isVector() ?
2944 ISD::VSELECT
: ISD::SELECT
;
2946 // Min/max matching is only viable if all output VTs are the same.
2947 if (is_splat(ValueVTs
)) {
2948 EVT VT
= ValueVTs
[0];
2949 LLVMContext
&Ctx
= *DAG
.getContext();
2950 auto &TLI
= DAG
.getTargetLoweringInfo();
2952 // We care about the legality of the operation after it has been type
2954 while (TLI
.getTypeAction(Ctx
, VT
) != TargetLoweringBase::TypeLegal
&&
2955 VT
!= TLI
.getTypeToTransformTo(Ctx
, VT
))
2956 VT
= TLI
.getTypeToTransformTo(Ctx
, VT
);
2958 // If the vselect is legal, assume we want to leave this as a vector setcc +
2959 // vselect. Otherwise, if this is going to be scalarized, we want to see if
2960 // min/max is legal on the scalar type.
2961 bool UseScalarMinMax
= VT
.isVector() &&
2962 !TLI
.isOperationLegalOrCustom(ISD::VSELECT
, VT
);
2965 auto SPR
= matchSelectPattern(const_cast<User
*>(&I
), LHS
, RHS
);
2966 ISD::NodeType Opc
= ISD::DELETED_NODE
;
2967 switch (SPR
.Flavor
) {
2968 case SPF_UMAX
: Opc
= ISD::UMAX
; break;
2969 case SPF_UMIN
: Opc
= ISD::UMIN
; break;
2970 case SPF_SMAX
: Opc
= ISD::SMAX
; break;
2971 case SPF_SMIN
: Opc
= ISD::SMIN
; break;
2973 switch (SPR
.NaNBehavior
) {
2974 case SPNB_NA
: llvm_unreachable("No NaN behavior for FP op?");
2975 case SPNB_RETURNS_NAN
: Opc
= ISD::FMINNAN
; break;
2976 case SPNB_RETURNS_OTHER
: Opc
= ISD::FMINNUM
; break;
2977 case SPNB_RETURNS_ANY
: {
2978 if (TLI
.isOperationLegalOrCustom(ISD::FMINNUM
, VT
))
2980 else if (TLI
.isOperationLegalOrCustom(ISD::FMINNAN
, VT
))
2982 else if (UseScalarMinMax
)
2983 Opc
= TLI
.isOperationLegalOrCustom(ISD::FMINNUM
, VT
.getScalarType()) ?
2984 ISD::FMINNUM
: ISD::FMINNAN
;
2990 switch (SPR
.NaNBehavior
) {
2991 case SPNB_NA
: llvm_unreachable("No NaN behavior for FP op?");
2992 case SPNB_RETURNS_NAN
: Opc
= ISD::FMAXNAN
; break;
2993 case SPNB_RETURNS_OTHER
: Opc
= ISD::FMAXNUM
; break;
2994 case SPNB_RETURNS_ANY
:
2996 if (TLI
.isOperationLegalOrCustom(ISD::FMAXNUM
, VT
))
2998 else if (TLI
.isOperationLegalOrCustom(ISD::FMAXNAN
, VT
))
3000 else if (UseScalarMinMax
)
3001 Opc
= TLI
.isOperationLegalOrCustom(ISD::FMAXNUM
, VT
.getScalarType()) ?
3002 ISD::FMAXNUM
: ISD::FMAXNAN
;
3009 if (Opc
!= ISD::DELETED_NODE
&&
3010 (TLI
.isOperationLegalOrCustom(Opc
, VT
) ||
3012 TLI
.isOperationLegalOrCustom(Opc
, VT
.getScalarType()))) &&
3013 // If the underlying comparison instruction is used by any other
3014 // instruction, the consumed instructions won't be destroyed, so it is
3015 // not profitable to convert to a min/max.
3016 hasOnlySelectUsers(cast
<SelectInst
>(I
).getCondition())) {
3018 LHSVal
= getValue(LHS
);
3019 RHSVal
= getValue(RHS
);
3024 for (unsigned i
= 0; i
!= NumValues
; ++i
) {
3025 SmallVector
<SDValue
, 3> Ops(BaseOps
.begin(), BaseOps
.end());
3026 Ops
.push_back(SDValue(LHSVal
.getNode(), LHSVal
.getResNo() + i
));
3027 Ops
.push_back(SDValue(RHSVal
.getNode(), RHSVal
.getResNo() + i
));
3028 Values
[i
] = DAG
.getNode(OpCode
, getCurSDLoc(),
3029 LHSVal
.getNode()->getValueType(LHSVal
.getResNo()+i
),
3033 setValue(&I
, DAG
.getNode(ISD::MERGE_VALUES
, getCurSDLoc(),
3034 DAG
.getVTList(ValueVTs
), Values
));
3037 void SelectionDAGBuilder::visitTrunc(const User
&I
) {
3038 // TruncInst cannot be a no-op cast because sizeof(src) > sizeof(dest).
3039 SDValue N
= getValue(I
.getOperand(0));
3040 EVT DestVT
= DAG
.getTargetLoweringInfo().getValueType(DAG
.getDataLayout(),
3042 setValue(&I
, DAG
.getNode(ISD::TRUNCATE
, getCurSDLoc(), DestVT
, N
));
3045 void SelectionDAGBuilder::visitZExt(const User
&I
) {
3046 // ZExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
3047 // ZExt also can't be a cast to bool for same reason. So, nothing much to do
3048 SDValue N
= getValue(I
.getOperand(0));
3049 EVT DestVT
= DAG
.getTargetLoweringInfo().getValueType(DAG
.getDataLayout(),
3051 setValue(&I
, DAG
.getNode(ISD::ZERO_EXTEND
, getCurSDLoc(), DestVT
, N
));
3054 void SelectionDAGBuilder::visitSExt(const User
&I
) {
3055 // SExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
3056 // SExt also can't be a cast to bool for same reason. So, nothing much to do
3057 SDValue N
= getValue(I
.getOperand(0));
3058 EVT DestVT
= DAG
.getTargetLoweringInfo().getValueType(DAG
.getDataLayout(),
3060 setValue(&I
, DAG
.getNode(ISD::SIGN_EXTEND
, getCurSDLoc(), DestVT
, N
));
3063 void SelectionDAGBuilder::visitFPTrunc(const User
&I
) {
3064 // FPTrunc is never a no-op cast, no need to check
3065 SDValue N
= getValue(I
.getOperand(0));
3066 SDLoc dl
= getCurSDLoc();
3067 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
3068 EVT DestVT
= TLI
.getValueType(DAG
.getDataLayout(), I
.getType());
3069 setValue(&I
, DAG
.getNode(ISD::FP_ROUND
, dl
, DestVT
, N
,
3070 DAG
.getTargetConstant(
3071 0, dl
, TLI
.getPointerTy(DAG
.getDataLayout()))));
3074 void SelectionDAGBuilder::visitFPExt(const User
&I
) {
3075 // FPExt is never a no-op cast, no need to check
3076 SDValue N
= getValue(I
.getOperand(0));
3077 EVT DestVT
= DAG
.getTargetLoweringInfo().getValueType(DAG
.getDataLayout(),
3079 setValue(&I
, DAG
.getNode(ISD::FP_EXTEND
, getCurSDLoc(), DestVT
, N
));
3082 void SelectionDAGBuilder::visitFPToUI(const User
&I
) {
3083 // FPToUI is never a no-op cast, no need to check
3084 SDValue N
= getValue(I
.getOperand(0));
3085 EVT DestVT
= DAG
.getTargetLoweringInfo().getValueType(DAG
.getDataLayout(),
3087 setValue(&I
, DAG
.getNode(ISD::FP_TO_UINT
, getCurSDLoc(), DestVT
, N
));
3090 void SelectionDAGBuilder::visitFPToSI(const User
&I
) {
3091 // FPToSI is never a no-op cast, no need to check
3092 SDValue N
= getValue(I
.getOperand(0));
3093 EVT DestVT
= DAG
.getTargetLoweringInfo().getValueType(DAG
.getDataLayout(),
3095 setValue(&I
, DAG
.getNode(ISD::FP_TO_SINT
, getCurSDLoc(), DestVT
, N
));
3098 void SelectionDAGBuilder::visitUIToFP(const User
&I
) {
3099 // UIToFP is never a no-op cast, no need to check
3100 SDValue N
= getValue(I
.getOperand(0));
3101 EVT DestVT
= DAG
.getTargetLoweringInfo().getValueType(DAG
.getDataLayout(),
3103 setValue(&I
, DAG
.getNode(ISD::UINT_TO_FP
, getCurSDLoc(), DestVT
, N
));
3106 void SelectionDAGBuilder::visitSIToFP(const User
&I
) {
3107 // SIToFP is never a no-op cast, no need to check
3108 SDValue N
= getValue(I
.getOperand(0));
3109 EVT DestVT
= DAG
.getTargetLoweringInfo().getValueType(DAG
.getDataLayout(),
3111 setValue(&I
, DAG
.getNode(ISD::SINT_TO_FP
, getCurSDLoc(), DestVT
, N
));
3114 void SelectionDAGBuilder::visitPtrToInt(const User
&I
) {
3115 // What to do depends on the size of the integer and the size of the pointer.
3116 // We can either truncate, zero extend, or no-op, accordingly.
3117 SDValue N
= getValue(I
.getOperand(0));
3118 EVT DestVT
= DAG
.getTargetLoweringInfo().getValueType(DAG
.getDataLayout(),
3120 setValue(&I
, DAG
.getZExtOrTrunc(N
, getCurSDLoc(), DestVT
));
3123 void SelectionDAGBuilder::visitIntToPtr(const User
&I
) {
3124 // What to do depends on the size of the integer and the size of the pointer.
3125 // We can either truncate, zero extend, or no-op, accordingly.
3126 SDValue N
= getValue(I
.getOperand(0));
3127 EVT DestVT
= DAG
.getTargetLoweringInfo().getValueType(DAG
.getDataLayout(),
3129 setValue(&I
, DAG
.getZExtOrTrunc(N
, getCurSDLoc(), DestVT
));
3132 void SelectionDAGBuilder::visitBitCast(const User
&I
) {
3133 SDValue N
= getValue(I
.getOperand(0));
3134 SDLoc dl
= getCurSDLoc();
3135 EVT DestVT
= DAG
.getTargetLoweringInfo().getValueType(DAG
.getDataLayout(),
3138 // BitCast assures us that source and destination are the same size so this is
3139 // either a BITCAST or a no-op.
3140 if (DestVT
!= N
.getValueType())
3141 setValue(&I
, DAG
.getNode(ISD::BITCAST
, dl
,
3142 DestVT
, N
)); // convert types.
3143 // Check if the original LLVM IR Operand was a ConstantInt, because getValue()
3144 // might fold any kind of constant expression to an integer constant and that
3145 // is not what we are looking for. Only recognize a bitcast of a genuine
3146 // constant integer as an opaque constant.
3147 else if(ConstantInt
*C
= dyn_cast
<ConstantInt
>(I
.getOperand(0)))
3148 setValue(&I
, DAG
.getConstant(C
->getValue(), dl
, DestVT
, /*isTarget=*/false,
3151 setValue(&I
, N
); // noop cast.
3154 void SelectionDAGBuilder::visitAddrSpaceCast(const User
&I
) {
3155 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
3156 const Value
*SV
= I
.getOperand(0);
3157 SDValue N
= getValue(SV
);
3158 EVT DestVT
= TLI
.getValueType(DAG
.getDataLayout(), I
.getType());
3160 unsigned SrcAS
= SV
->getType()->getPointerAddressSpace();
3161 unsigned DestAS
= I
.getType()->getPointerAddressSpace();
3163 if (!TLI
.isNoopAddrSpaceCast(SrcAS
, DestAS
))
3164 N
= DAG
.getAddrSpaceCast(getCurSDLoc(), DestVT
, N
, SrcAS
, DestAS
);
3169 void SelectionDAGBuilder::visitInsertElement(const User
&I
) {
3170 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
3171 SDValue InVec
= getValue(I
.getOperand(0));
3172 SDValue InVal
= getValue(I
.getOperand(1));
3173 SDValue InIdx
= DAG
.getSExtOrTrunc(getValue(I
.getOperand(2)), getCurSDLoc(),
3174 TLI
.getVectorIdxTy(DAG
.getDataLayout()));
3175 setValue(&I
, DAG
.getNode(ISD::INSERT_VECTOR_ELT
, getCurSDLoc(),
3176 TLI
.getValueType(DAG
.getDataLayout(), I
.getType()),
3177 InVec
, InVal
, InIdx
));
3180 void SelectionDAGBuilder::visitExtractElement(const User
&I
) {
3181 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
3182 SDValue InVec
= getValue(I
.getOperand(0));
3183 SDValue InIdx
= DAG
.getSExtOrTrunc(getValue(I
.getOperand(1)), getCurSDLoc(),
3184 TLI
.getVectorIdxTy(DAG
.getDataLayout()));
3185 setValue(&I
, DAG
.getNode(ISD::EXTRACT_VECTOR_ELT
, getCurSDLoc(),
3186 TLI
.getValueType(DAG
.getDataLayout(), I
.getType()),
3190 void SelectionDAGBuilder::visitShuffleVector(const User
&I
) {
3191 SDValue Src1
= getValue(I
.getOperand(0));
3192 SDValue Src2
= getValue(I
.getOperand(1));
3193 SDLoc DL
= getCurSDLoc();
3195 SmallVector
<int, 8> Mask
;
3196 ShuffleVectorInst::getShuffleMask(cast
<Constant
>(I
.getOperand(2)), Mask
);
3197 unsigned MaskNumElts
= Mask
.size();
3199 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
3200 EVT VT
= TLI
.getValueType(DAG
.getDataLayout(), I
.getType());
3201 EVT SrcVT
= Src1
.getValueType();
3202 unsigned SrcNumElts
= SrcVT
.getVectorNumElements();
3204 if (SrcNumElts
== MaskNumElts
) {
3205 setValue(&I
, DAG
.getVectorShuffle(VT
, DL
, Src1
, Src2
, Mask
));
3209 // Normalize the shuffle vector since mask and vector length don't match.
3210 if (SrcNumElts
< MaskNumElts
) {
3211 // Mask is longer than the source vectors. We can use concatenate vector to
3212 // make the mask and vectors lengths match.
3214 if (MaskNumElts
% SrcNumElts
== 0) {
3215 // Mask length is a multiple of the source vector length.
3216 // Check if the shuffle is some kind of concatenation of the input
3218 unsigned NumConcat
= MaskNumElts
/ SrcNumElts
;
3219 bool IsConcat
= true;
3220 SmallVector
<int, 8> ConcatSrcs(NumConcat
, -1);
3221 for (unsigned i
= 0; i
!= MaskNumElts
; ++i
) {
3225 // Ensure the indices in each SrcVT sized piece are sequential and that
3226 // the same source is used for the whole piece.
3227 if ((Idx
% SrcNumElts
!= (i
% SrcNumElts
)) ||
3228 (ConcatSrcs
[i
/ SrcNumElts
] >= 0 &&
3229 ConcatSrcs
[i
/ SrcNumElts
] != (int)(Idx
/ SrcNumElts
))) {
3233 // Remember which source this index came from.
3234 ConcatSrcs
[i
/ SrcNumElts
] = Idx
/ SrcNumElts
;
3237 // The shuffle is concatenating multiple vectors together. Just emit
3238 // a CONCAT_VECTORS operation.
3240 SmallVector
<SDValue
, 8> ConcatOps
;
3241 for (auto Src
: ConcatSrcs
) {
3243 ConcatOps
.push_back(DAG
.getUNDEF(SrcVT
));
3245 ConcatOps
.push_back(Src1
);
3247 ConcatOps
.push_back(Src2
);
3249 setValue(&I
, DAG
.getNode(ISD::CONCAT_VECTORS
, DL
, VT
, ConcatOps
));
3254 unsigned PaddedMaskNumElts
= alignTo(MaskNumElts
, SrcNumElts
);
3255 unsigned NumConcat
= PaddedMaskNumElts
/ SrcNumElts
;
3256 EVT PaddedVT
= EVT::getVectorVT(*DAG
.getContext(), VT
.getScalarType(),
3259 // Pad both vectors with undefs to make them the same length as the mask.
3260 SDValue UndefVal
= DAG
.getUNDEF(SrcVT
);
3262 SmallVector
<SDValue
, 8> MOps1(NumConcat
, UndefVal
);
3263 SmallVector
<SDValue
, 8> MOps2(NumConcat
, UndefVal
);
3267 Src1
= Src1
.isUndef()
3268 ? DAG
.getUNDEF(PaddedVT
)
3269 : DAG
.getNode(ISD::CONCAT_VECTORS
, DL
, PaddedVT
, MOps1
);
3270 Src2
= Src2
.isUndef()
3271 ? DAG
.getUNDEF(PaddedVT
)
3272 : DAG
.getNode(ISD::CONCAT_VECTORS
, DL
, PaddedVT
, MOps2
);
3274 // Readjust mask for new input vector length.
3275 SmallVector
<int, 8> MappedOps(PaddedMaskNumElts
, -1);
3276 for (unsigned i
= 0; i
!= MaskNumElts
; ++i
) {
3278 if (Idx
>= (int)SrcNumElts
)
3279 Idx
-= SrcNumElts
- PaddedMaskNumElts
;
3283 SDValue Result
= DAG
.getVectorShuffle(PaddedVT
, DL
, Src1
, Src2
, MappedOps
);
3285 // If the concatenated vector was padded, extract a subvector with the
3286 // correct number of elements.
3287 if (MaskNumElts
!= PaddedMaskNumElts
)
3288 Result
= DAG
.getNode(
3289 ISD::EXTRACT_SUBVECTOR
, DL
, VT
, Result
,
3290 DAG
.getConstant(0, DL
, TLI
.getVectorIdxTy(DAG
.getDataLayout())));
3292 setValue(&I
, Result
);
3296 if (SrcNumElts
> MaskNumElts
) {
3297 // Analyze the access pattern of the vector to see if we can extract
3298 // two subvectors and do the shuffle.
3299 int StartIdx
[2] = { -1, -1 }; // StartIdx to extract from
3300 bool CanExtract
= true;
3301 for (int Idx
: Mask
) {
3306 if (Idx
>= (int)SrcNumElts
) {
3311 // If all the indices come from the same MaskNumElts sized portion of
3312 // the sources we can use extract. Also make sure the extract wouldn't
3313 // extract past the end of the source.
3314 int NewStartIdx
= alignDown(Idx
, MaskNumElts
);
3315 if (NewStartIdx
+ MaskNumElts
> SrcNumElts
||
3316 (StartIdx
[Input
] >= 0 && StartIdx
[Input
] != NewStartIdx
))
3318 // Make sure we always update StartIdx as we use it to track if all
3319 // elements are undef.
3320 StartIdx
[Input
] = NewStartIdx
;
3323 if (StartIdx
[0] < 0 && StartIdx
[1] < 0) {
3324 setValue(&I
, DAG
.getUNDEF(VT
)); // Vectors are not used.
3328 // Extract appropriate subvector and generate a vector shuffle
3329 for (unsigned Input
= 0; Input
< 2; ++Input
) {
3330 SDValue
&Src
= Input
== 0 ? Src1
: Src2
;
3331 if (StartIdx
[Input
] < 0)
3332 Src
= DAG
.getUNDEF(VT
);
3335 ISD::EXTRACT_SUBVECTOR
, DL
, VT
, Src
,
3336 DAG
.getConstant(StartIdx
[Input
], DL
,
3337 TLI
.getVectorIdxTy(DAG
.getDataLayout())));
3341 // Calculate new mask.
3342 SmallVector
<int, 8> MappedOps(Mask
.begin(), Mask
.end());
3343 for (int &Idx
: MappedOps
) {
3344 if (Idx
>= (int)SrcNumElts
)
3345 Idx
-= SrcNumElts
+ StartIdx
[1] - MaskNumElts
;
3350 setValue(&I
, DAG
.getVectorShuffle(VT
, DL
, Src1
, Src2
, MappedOps
));
3355 // We can't use either concat vectors or extract subvectors so fall back to
3356 // replacing the shuffle with extract and build vector.
3357 // to insert and build vector.
3358 EVT EltVT
= VT
.getVectorElementType();
3359 EVT IdxVT
= TLI
.getVectorIdxTy(DAG
.getDataLayout());
3360 SmallVector
<SDValue
,8> Ops
;
3361 for (int Idx
: Mask
) {
3365 Res
= DAG
.getUNDEF(EltVT
);
3367 SDValue
&Src
= Idx
< (int)SrcNumElts
? Src1
: Src2
;
3368 if (Idx
>= (int)SrcNumElts
) Idx
-= SrcNumElts
;
3370 Res
= DAG
.getNode(ISD::EXTRACT_VECTOR_ELT
, DL
,
3371 EltVT
, Src
, DAG
.getConstant(Idx
, DL
, IdxVT
));
3377 setValue(&I
, DAG
.getBuildVector(VT
, DL
, Ops
));
3380 void SelectionDAGBuilder::visitInsertValue(const User
&I
) {
3381 ArrayRef
<unsigned> Indices
;
3382 if (const InsertValueInst
*IV
= dyn_cast
<InsertValueInst
>(&I
))
3383 Indices
= IV
->getIndices();
3385 Indices
= cast
<ConstantExpr
>(&I
)->getIndices();
3387 const Value
*Op0
= I
.getOperand(0);
3388 const Value
*Op1
= I
.getOperand(1);
3389 Type
*AggTy
= I
.getType();
3390 Type
*ValTy
= Op1
->getType();
3391 bool IntoUndef
= isa
<UndefValue
>(Op0
);
3392 bool FromUndef
= isa
<UndefValue
>(Op1
);
3394 unsigned LinearIndex
= ComputeLinearIndex(AggTy
, Indices
);
3396 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
3397 SmallVector
<EVT
, 4> AggValueVTs
;
3398 ComputeValueVTs(TLI
, DAG
.getDataLayout(), AggTy
, AggValueVTs
);
3399 SmallVector
<EVT
, 4> ValValueVTs
;
3400 ComputeValueVTs(TLI
, DAG
.getDataLayout(), ValTy
, ValValueVTs
);
3402 unsigned NumAggValues
= AggValueVTs
.size();
3403 unsigned NumValValues
= ValValueVTs
.size();
3404 SmallVector
<SDValue
, 4> Values(NumAggValues
);
3406 // Ignore an insertvalue that produces an empty object
3407 if (!NumAggValues
) {
3408 setValue(&I
, DAG
.getUNDEF(MVT(MVT::Other
)));
3412 SDValue Agg
= getValue(Op0
);
3414 // Copy the beginning value(s) from the original aggregate.
3415 for (; i
!= LinearIndex
; ++i
)
3416 Values
[i
] = IntoUndef
? DAG
.getUNDEF(AggValueVTs
[i
]) :
3417 SDValue(Agg
.getNode(), Agg
.getResNo() + i
);
3418 // Copy values from the inserted value(s).
3420 SDValue Val
= getValue(Op1
);
3421 for (; i
!= LinearIndex
+ NumValValues
; ++i
)
3422 Values
[i
] = FromUndef
? DAG
.getUNDEF(AggValueVTs
[i
]) :
3423 SDValue(Val
.getNode(), Val
.getResNo() + i
- LinearIndex
);
3425 // Copy remaining value(s) from the original aggregate.
3426 for (; i
!= NumAggValues
; ++i
)
3427 Values
[i
] = IntoUndef
? DAG
.getUNDEF(AggValueVTs
[i
]) :
3428 SDValue(Agg
.getNode(), Agg
.getResNo() + i
);
3430 setValue(&I
, DAG
.getNode(ISD::MERGE_VALUES
, getCurSDLoc(),
3431 DAG
.getVTList(AggValueVTs
), Values
));
3434 void SelectionDAGBuilder::visitExtractValue(const User
&I
) {
3435 ArrayRef
<unsigned> Indices
;
3436 if (const ExtractValueInst
*EV
= dyn_cast
<ExtractValueInst
>(&I
))
3437 Indices
= EV
->getIndices();
3439 Indices
= cast
<ConstantExpr
>(&I
)->getIndices();
3441 const Value
*Op0
= I
.getOperand(0);
3442 Type
*AggTy
= Op0
->getType();
3443 Type
*ValTy
= I
.getType();
3444 bool OutOfUndef
= isa
<UndefValue
>(Op0
);
3446 unsigned LinearIndex
= ComputeLinearIndex(AggTy
, Indices
);
3448 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
3449 SmallVector
<EVT
, 4> ValValueVTs
;
3450 ComputeValueVTs(TLI
, DAG
.getDataLayout(), ValTy
, ValValueVTs
);
3452 unsigned NumValValues
= ValValueVTs
.size();
3454 // Ignore a extractvalue that produces an empty object
3455 if (!NumValValues
) {
3456 setValue(&I
, DAG
.getUNDEF(MVT(MVT::Other
)));
3460 SmallVector
<SDValue
, 4> Values(NumValValues
);
3462 SDValue Agg
= getValue(Op0
);
3463 // Copy out the selected value(s).
3464 for (unsigned i
= LinearIndex
; i
!= LinearIndex
+ NumValValues
; ++i
)
3465 Values
[i
- LinearIndex
] =
3467 DAG
.getUNDEF(Agg
.getNode()->getValueType(Agg
.getResNo() + i
)) :
3468 SDValue(Agg
.getNode(), Agg
.getResNo() + i
);
3470 setValue(&I
, DAG
.getNode(ISD::MERGE_VALUES
, getCurSDLoc(),
3471 DAG
.getVTList(ValValueVTs
), Values
));
3474 void SelectionDAGBuilder::visitGetElementPtr(const User
&I
) {
3475 Value
*Op0
= I
.getOperand(0);
3476 // Note that the pointer operand may be a vector of pointers. Take the scalar
3477 // element which holds a pointer.
3478 unsigned AS
= Op0
->getType()->getScalarType()->getPointerAddressSpace();
3479 SDValue N
= getValue(Op0
);
3480 SDLoc dl
= getCurSDLoc();
3482 // Normalize Vector GEP - all scalar operands should be converted to the
3484 unsigned VectorWidth
= I
.getType()->isVectorTy() ?
3485 cast
<VectorType
>(I
.getType())->getVectorNumElements() : 0;
3487 if (VectorWidth
&& !N
.getValueType().isVector()) {
3488 LLVMContext
&Context
= *DAG
.getContext();
3489 EVT VT
= EVT::getVectorVT(Context
, N
.getValueType(), VectorWidth
);
3490 N
= DAG
.getSplatBuildVector(VT
, dl
, N
);
3493 for (gep_type_iterator GTI
= gep_type_begin(&I
), E
= gep_type_end(&I
);
3495 const Value
*Idx
= GTI
.getOperand();
3496 if (StructType
*StTy
= GTI
.getStructTypeOrNull()) {
3497 unsigned Field
= cast
<Constant
>(Idx
)->getUniqueInteger().getZExtValue();
3500 uint64_t Offset
= DL
->getStructLayout(StTy
)->getElementOffset(Field
);
3502 // In an inbounds GEP with an offset that is nonnegative even when
3503 // interpreted as signed, assume there is no unsigned overflow.
3505 if (int64_t(Offset
) >= 0 && cast
<GEPOperator
>(I
).isInBounds())
3506 Flags
.setNoUnsignedWrap(true);
3508 N
= DAG
.getNode(ISD::ADD
, dl
, N
.getValueType(), N
,
3509 DAG
.getConstant(Offset
, dl
, N
.getValueType()), Flags
);
3512 unsigned IdxSize
= DAG
.getDataLayout().getIndexSizeInBits(AS
);
3513 MVT IdxTy
= MVT::getIntegerVT(IdxSize
);
3514 APInt
ElementSize(IdxSize
, DL
->getTypeAllocSize(GTI
.getIndexedType()));
3516 // If this is a scalar constant or a splat vector of constants,
3517 // handle it quickly.
3518 const auto *CI
= dyn_cast
<ConstantInt
>(Idx
);
3519 if (!CI
&& isa
<ConstantDataVector
>(Idx
) &&
3520 cast
<ConstantDataVector
>(Idx
)->getSplatValue())
3521 CI
= cast
<ConstantInt
>(cast
<ConstantDataVector
>(Idx
)->getSplatValue());
3526 APInt Offs
= ElementSize
* CI
->getValue().sextOrTrunc(IdxSize
);
3527 LLVMContext
&Context
= *DAG
.getContext();
3528 SDValue OffsVal
= VectorWidth
?
3529 DAG
.getConstant(Offs
, dl
, EVT::getVectorVT(Context
, IdxTy
, VectorWidth
)) :
3530 DAG
.getConstant(Offs
, dl
, IdxTy
);
3532 // In an inbouds GEP with an offset that is nonnegative even when
3533 // interpreted as signed, assume there is no unsigned overflow.
3535 if (Offs
.isNonNegative() && cast
<GEPOperator
>(I
).isInBounds())
3536 Flags
.setNoUnsignedWrap(true);
3538 N
= DAG
.getNode(ISD::ADD
, dl
, N
.getValueType(), N
, OffsVal
, Flags
);
3542 // N = N + Idx * ElementSize;
3543 SDValue IdxN
= getValue(Idx
);
3545 if (!IdxN
.getValueType().isVector() && VectorWidth
) {
3546 EVT VT
= EVT::getVectorVT(*Context
, IdxN
.getValueType(), VectorWidth
);
3547 IdxN
= DAG
.getSplatBuildVector(VT
, dl
, IdxN
);
3550 // If the index is smaller or larger than intptr_t, truncate or extend
3552 IdxN
= DAG
.getSExtOrTrunc(IdxN
, dl
, N
.getValueType());
3554 // If this is a multiply by a power of two, turn it into a shl
3555 // immediately. This is a very common case.
3556 if (ElementSize
!= 1) {
3557 if (ElementSize
.isPowerOf2()) {
3558 unsigned Amt
= ElementSize
.logBase2();
3559 IdxN
= DAG
.getNode(ISD::SHL
, dl
,
3560 N
.getValueType(), IdxN
,
3561 DAG
.getConstant(Amt
, dl
, IdxN
.getValueType()));
3563 SDValue Scale
= DAG
.getConstant(ElementSize
, dl
, IdxN
.getValueType());
3564 IdxN
= DAG
.getNode(ISD::MUL
, dl
,
3565 N
.getValueType(), IdxN
, Scale
);
3569 N
= DAG
.getNode(ISD::ADD
, dl
,
3570 N
.getValueType(), N
, IdxN
);
3577 void SelectionDAGBuilder::visitAlloca(const AllocaInst
&I
) {
3578 // If this is a fixed sized alloca in the entry block of the function,
3579 // allocate it statically on the stack.
3580 if (FuncInfo
.StaticAllocaMap
.count(&I
))
3581 return; // getValue will auto-populate this.
3583 SDLoc dl
= getCurSDLoc();
3584 Type
*Ty
= I
.getAllocatedType();
3585 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
3586 auto &DL
= DAG
.getDataLayout();
3587 uint64_t TySize
= DL
.getTypeAllocSize(Ty
);
3589 std::max((unsigned)DL
.getPrefTypeAlignment(Ty
), I
.getAlignment());
3591 SDValue AllocSize
= getValue(I
.getArraySize());
3593 EVT IntPtr
= TLI
.getPointerTy(DAG
.getDataLayout(), DL
.getAllocaAddrSpace());
3594 if (AllocSize
.getValueType() != IntPtr
)
3595 AllocSize
= DAG
.getZExtOrTrunc(AllocSize
, dl
, IntPtr
);
3597 AllocSize
= DAG
.getNode(ISD::MUL
, dl
, IntPtr
,
3599 DAG
.getConstant(TySize
, dl
, IntPtr
));
3601 // Handle alignment. If the requested alignment is less than or equal to
3602 // the stack alignment, ignore it. If the size is greater than or equal to
3603 // the stack alignment, we note this in the DYNAMIC_STACKALLOC node.
3604 unsigned StackAlign
=
3605 DAG
.getSubtarget().getFrameLowering()->getStackAlignment();
3606 if (Align
<= StackAlign
)
3609 // Round the size of the allocation up to the stack alignment size
3610 // by add SA-1 to the size. This doesn't overflow because we're computing
3611 // an address inside an alloca.
3613 Flags
.setNoUnsignedWrap(true);
3614 AllocSize
= DAG
.getNode(ISD::ADD
, dl
, AllocSize
.getValueType(), AllocSize
,
3615 DAG
.getConstant(StackAlign
- 1, dl
, IntPtr
), Flags
);
3617 // Mask out the low bits for alignment purposes.
3619 DAG
.getNode(ISD::AND
, dl
, AllocSize
.getValueType(), AllocSize
,
3620 DAG
.getConstant(~(uint64_t)(StackAlign
- 1), dl
, IntPtr
));
3622 SDValue Ops
[] = {getRoot(), AllocSize
, DAG
.getConstant(Align
, dl
, IntPtr
)};
3623 SDVTList VTs
= DAG
.getVTList(AllocSize
.getValueType(), MVT::Other
);
3624 SDValue DSA
= DAG
.getNode(ISD::DYNAMIC_STACKALLOC
, dl
, VTs
, Ops
);
3626 DAG
.setRoot(DSA
.getValue(1));
3628 assert(FuncInfo
.MF
->getFrameInfo().hasVarSizedObjects());
3631 void SelectionDAGBuilder::visitLoad(const LoadInst
&I
) {
3633 return visitAtomicLoad(I
);
3635 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
3636 const Value
*SV
= I
.getOperand(0);
3637 if (TLI
.supportSwiftError()) {
3638 // Swifterror values can come from either a function parameter with
3639 // swifterror attribute or an alloca with swifterror attribute.
3640 if (const Argument
*Arg
= dyn_cast
<Argument
>(SV
)) {
3641 if (Arg
->hasSwiftErrorAttr())
3642 return visitLoadFromSwiftError(I
);
3645 if (const AllocaInst
*Alloca
= dyn_cast
<AllocaInst
>(SV
)) {
3646 if (Alloca
->isSwiftError())
3647 return visitLoadFromSwiftError(I
);
3651 SDValue Ptr
= getValue(SV
);
3653 Type
*Ty
= I
.getType();
3655 bool isVolatile
= I
.isVolatile();
3656 bool isNonTemporal
= I
.getMetadata(LLVMContext::MD_nontemporal
) != nullptr;
3657 bool isInvariant
= I
.getMetadata(LLVMContext::MD_invariant_load
) != nullptr;
3658 bool isDereferenceable
= isDereferenceablePointer(SV
, DAG
.getDataLayout());
3659 unsigned Alignment
= I
.getAlignment();
3662 I
.getAAMetadata(AAInfo
);
3663 const MDNode
*Ranges
= I
.getMetadata(LLVMContext::MD_range
);
3665 SmallVector
<EVT
, 4> ValueVTs
;
3666 SmallVector
<uint64_t, 4> Offsets
;
3667 ComputeValueVTs(TLI
, DAG
.getDataLayout(), Ty
, ValueVTs
, &Offsets
);
3668 unsigned NumValues
= ValueVTs
.size();
3673 bool ConstantMemory
= false;
3674 if (isVolatile
|| NumValues
> MaxParallelChains
)
3675 // Serialize volatile loads with other side effects.
3677 else if (AA
&& AA
->pointsToConstantMemory(MemoryLocation(
3678 SV
, DAG
.getDataLayout().getTypeStoreSize(Ty
), AAInfo
))) {
3679 // Do not serialize (non-volatile) loads of constant memory with anything.
3680 Root
= DAG
.getEntryNode();
3681 ConstantMemory
= true;
3683 // Do not serialize non-volatile loads against each other.
3684 Root
= DAG
.getRoot();
3687 SDLoc dl
= getCurSDLoc();
3690 Root
= TLI
.prepareVolatileOrAtomicLoad(Root
, dl
, DAG
);
3692 // An aggregate load cannot wrap around the address space, so offsets to its
3693 // parts don't wrap either.
3695 Flags
.setNoUnsignedWrap(true);
3697 SmallVector
<SDValue
, 4> Values(NumValues
);
3698 SmallVector
<SDValue
, 4> Chains(std::min(MaxParallelChains
, NumValues
));
3699 EVT PtrVT
= Ptr
.getValueType();
3700 unsigned ChainI
= 0;
3701 for (unsigned i
= 0; i
!= NumValues
; ++i
, ++ChainI
) {
3702 // Serializing loads here may result in excessive register pressure, and
3703 // TokenFactor places arbitrary choke points on the scheduler. SD scheduling
3704 // could recover a bit by hoisting nodes upward in the chain by recognizing
3705 // they are side-effect free or do not alias. The optimizer should really
3706 // avoid this case by converting large object/array copies to llvm.memcpy
3707 // (MaxParallelChains should always remain as failsafe).
3708 if (ChainI
== MaxParallelChains
) {
3709 assert(PendingLoads
.empty() && "PendingLoads must be serialized first");
3710 SDValue Chain
= DAG
.getNode(ISD::TokenFactor
, dl
, MVT::Other
,
3711 makeArrayRef(Chains
.data(), ChainI
));
3715 SDValue A
= DAG
.getNode(ISD::ADD
, dl
,
3717 DAG
.getConstant(Offsets
[i
], dl
, PtrVT
),
3719 auto MMOFlags
= MachineMemOperand::MONone
;
3721 MMOFlags
|= MachineMemOperand::MOVolatile
;
3723 MMOFlags
|= MachineMemOperand::MONonTemporal
;
3725 MMOFlags
|= MachineMemOperand::MOInvariant
;
3726 if (isDereferenceable
)
3727 MMOFlags
|= MachineMemOperand::MODereferenceable
;
3728 MMOFlags
|= TLI
.getMMOFlags(I
);
3730 SDValue L
= DAG
.getLoad(ValueVTs
[i
], dl
, Root
, A
,
3731 MachinePointerInfo(SV
, Offsets
[i
]), Alignment
,
3732 MMOFlags
, AAInfo
, Ranges
);
3735 Chains
[ChainI
] = L
.getValue(1);
3738 if (!ConstantMemory
) {
3739 SDValue Chain
= DAG
.getNode(ISD::TokenFactor
, dl
, MVT::Other
,
3740 makeArrayRef(Chains
.data(), ChainI
));
3744 PendingLoads
.push_back(Chain
);
3747 setValue(&I
, DAG
.getNode(ISD::MERGE_VALUES
, dl
,
3748 DAG
.getVTList(ValueVTs
), Values
));
3751 void SelectionDAGBuilder::visitStoreToSwiftError(const StoreInst
&I
) {
3752 assert(DAG
.getTargetLoweringInfo().supportSwiftError() &&
3753 "call visitStoreToSwiftError when backend supports swifterror");
3755 SmallVector
<EVT
, 4> ValueVTs
;
3756 SmallVector
<uint64_t, 4> Offsets
;
3757 const Value
*SrcV
= I
.getOperand(0);
3758 ComputeValueVTs(DAG
.getTargetLoweringInfo(), DAG
.getDataLayout(),
3759 SrcV
->getType(), ValueVTs
, &Offsets
);
3760 assert(ValueVTs
.size() == 1 && Offsets
[0] == 0 &&
3761 "expect a single EVT for swifterror");
3763 SDValue Src
= getValue(SrcV
);
3764 // Create a virtual register, then update the virtual register.
3765 unsigned VReg
; bool CreatedVReg
;
3766 std::tie(VReg
, CreatedVReg
) = FuncInfo
.getOrCreateSwiftErrorVRegDefAt(&I
);
3767 // Chain, DL, Reg, N or Chain, DL, Reg, N, Glue
3768 // Chain can be getRoot or getControlRoot.
3769 SDValue CopyNode
= DAG
.getCopyToReg(getRoot(), getCurSDLoc(), VReg
,
3770 SDValue(Src
.getNode(), Src
.getResNo()));
3771 DAG
.setRoot(CopyNode
);
3773 FuncInfo
.setCurrentSwiftErrorVReg(FuncInfo
.MBB
, I
.getOperand(1), VReg
);
3776 void SelectionDAGBuilder::visitLoadFromSwiftError(const LoadInst
&I
) {
3777 assert(DAG
.getTargetLoweringInfo().supportSwiftError() &&
3778 "call visitLoadFromSwiftError when backend supports swifterror");
3780 assert(!I
.isVolatile() &&
3781 I
.getMetadata(LLVMContext::MD_nontemporal
) == nullptr &&
3782 I
.getMetadata(LLVMContext::MD_invariant_load
) == nullptr &&
3783 "Support volatile, non temporal, invariant for load_from_swift_error");
3785 const Value
*SV
= I
.getOperand(0);
3786 Type
*Ty
= I
.getType();
3788 I
.getAAMetadata(AAInfo
);
3789 assert((!AA
|| !AA
->pointsToConstantMemory(MemoryLocation(
3790 SV
, DAG
.getDataLayout().getTypeStoreSize(Ty
), AAInfo
))) &&
3791 "load_from_swift_error should not be constant memory");
3793 SmallVector
<EVT
, 4> ValueVTs
;
3794 SmallVector
<uint64_t, 4> Offsets
;
3795 ComputeValueVTs(DAG
.getTargetLoweringInfo(), DAG
.getDataLayout(), Ty
,
3796 ValueVTs
, &Offsets
);
3797 assert(ValueVTs
.size() == 1 && Offsets
[0] == 0 &&
3798 "expect a single EVT for swifterror");
3800 // Chain, DL, Reg, VT, Glue or Chain, DL, Reg, VT
3801 SDValue L
= DAG
.getCopyFromReg(
3802 getRoot(), getCurSDLoc(),
3803 FuncInfo
.getOrCreateSwiftErrorVRegUseAt(&I
, FuncInfo
.MBB
, SV
).first
,
3809 void SelectionDAGBuilder::visitStore(const StoreInst
&I
) {
3811 return visitAtomicStore(I
);
3813 const Value
*SrcV
= I
.getOperand(0);
3814 const Value
*PtrV
= I
.getOperand(1);
3816 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
3817 if (TLI
.supportSwiftError()) {
3818 // Swifterror values can come from either a function parameter with
3819 // swifterror attribute or an alloca with swifterror attribute.
3820 if (const Argument
*Arg
= dyn_cast
<Argument
>(PtrV
)) {
3821 if (Arg
->hasSwiftErrorAttr())
3822 return visitStoreToSwiftError(I
);
3825 if (const AllocaInst
*Alloca
= dyn_cast
<AllocaInst
>(PtrV
)) {
3826 if (Alloca
->isSwiftError())
3827 return visitStoreToSwiftError(I
);
3831 SmallVector
<EVT
, 4> ValueVTs
;
3832 SmallVector
<uint64_t, 4> Offsets
;
3833 ComputeValueVTs(DAG
.getTargetLoweringInfo(), DAG
.getDataLayout(),
3834 SrcV
->getType(), ValueVTs
, &Offsets
);
3835 unsigned NumValues
= ValueVTs
.size();
3839 // Get the lowered operands. Note that we do this after
3840 // checking if NumResults is zero, because with zero results
3841 // the operands won't have values in the map.
3842 SDValue Src
= getValue(SrcV
);
3843 SDValue Ptr
= getValue(PtrV
);
3845 SDValue Root
= getRoot();
3846 SmallVector
<SDValue
, 4> Chains(std::min(MaxParallelChains
, NumValues
));
3847 SDLoc dl
= getCurSDLoc();
3848 EVT PtrVT
= Ptr
.getValueType();
3849 unsigned Alignment
= I
.getAlignment();
3851 I
.getAAMetadata(AAInfo
);
3853 auto MMOFlags
= MachineMemOperand::MONone
;
3855 MMOFlags
|= MachineMemOperand::MOVolatile
;
3856 if (I
.getMetadata(LLVMContext::MD_nontemporal
) != nullptr)
3857 MMOFlags
|= MachineMemOperand::MONonTemporal
;
3858 MMOFlags
|= TLI
.getMMOFlags(I
);
3860 // An aggregate load cannot wrap around the address space, so offsets to its
3861 // parts don't wrap either.
3863 Flags
.setNoUnsignedWrap(true);
3865 unsigned ChainI
= 0;
3866 for (unsigned i
= 0; i
!= NumValues
; ++i
, ++ChainI
) {
3867 // See visitLoad comments.
3868 if (ChainI
== MaxParallelChains
) {
3869 SDValue Chain
= DAG
.getNode(ISD::TokenFactor
, dl
, MVT::Other
,
3870 makeArrayRef(Chains
.data(), ChainI
));
3874 SDValue Add
= DAG
.getNode(ISD::ADD
, dl
, PtrVT
, Ptr
,
3875 DAG
.getConstant(Offsets
[i
], dl
, PtrVT
), Flags
);
3876 SDValue St
= DAG
.getStore(
3877 Root
, dl
, SDValue(Src
.getNode(), Src
.getResNo() + i
), Add
,
3878 MachinePointerInfo(PtrV
, Offsets
[i
]), Alignment
, MMOFlags
, AAInfo
);
3879 Chains
[ChainI
] = St
;
3882 SDValue StoreNode
= DAG
.getNode(ISD::TokenFactor
, dl
, MVT::Other
,
3883 makeArrayRef(Chains
.data(), ChainI
));
3884 DAG
.setRoot(StoreNode
);
3887 void SelectionDAGBuilder::visitMaskedStore(const CallInst
&I
,
3888 bool IsCompressing
) {
3889 SDLoc sdl
= getCurSDLoc();
3891 auto getMaskedStoreOps
= [&](Value
* &Ptr
, Value
* &Mask
, Value
* &Src0
,
3892 unsigned& Alignment
) {
3893 // llvm.masked.store.*(Src0, Ptr, alignment, Mask)
3894 Src0
= I
.getArgOperand(0);
3895 Ptr
= I
.getArgOperand(1);
3896 Alignment
= cast
<ConstantInt
>(I
.getArgOperand(2))->getZExtValue();
3897 Mask
= I
.getArgOperand(3);
3899 auto getCompressingStoreOps
= [&](Value
* &Ptr
, Value
* &Mask
, Value
* &Src0
,
3900 unsigned& Alignment
) {
3901 // llvm.masked.compressstore.*(Src0, Ptr, Mask)
3902 Src0
= I
.getArgOperand(0);
3903 Ptr
= I
.getArgOperand(1);
3904 Mask
= I
.getArgOperand(2);
3908 Value
*PtrOperand
, *MaskOperand
, *Src0Operand
;
3911 getCompressingStoreOps(PtrOperand
, MaskOperand
, Src0Operand
, Alignment
);
3913 getMaskedStoreOps(PtrOperand
, MaskOperand
, Src0Operand
, Alignment
);
3915 SDValue Ptr
= getValue(PtrOperand
);
3916 SDValue Src0
= getValue(Src0Operand
);
3917 SDValue Mask
= getValue(MaskOperand
);
3919 EVT VT
= Src0
.getValueType();
3921 Alignment
= DAG
.getEVTAlignment(VT
);
3924 I
.getAAMetadata(AAInfo
);
3926 MachineMemOperand
*MMO
=
3927 DAG
.getMachineFunction().
3928 getMachineMemOperand(MachinePointerInfo(PtrOperand
),
3929 MachineMemOperand::MOStore
, VT
.getStoreSize(),
3931 SDValue StoreNode
= DAG
.getMaskedStore(getRoot(), sdl
, Src0
, Ptr
, Mask
, VT
,
3932 MMO
, false /* Truncating */,
3934 DAG
.setRoot(StoreNode
);
3935 setValue(&I
, StoreNode
);
3938 // Get a uniform base for the Gather/Scatter intrinsic.
3939 // The first argument of the Gather/Scatter intrinsic is a vector of pointers.
3940 // We try to represent it as a base pointer + vector of indices.
3941 // Usually, the vector of pointers comes from a 'getelementptr' instruction.
3942 // The first operand of the GEP may be a single pointer or a vector of pointers
3944 // %gep.ptr = getelementptr i32, <8 x i32*> %vptr, <8 x i32> %ind
3946 // %gep.ptr = getelementptr i32, i32* %ptr, <8 x i32> %ind
3947 // %res = call <8 x i32> @llvm.masked.gather.v8i32(<8 x i32*> %gep.ptr, ..
3949 // When the first GEP operand is a single pointer - it is the uniform base we
3950 // are looking for. If first operand of the GEP is a splat vector - we
3951 // extract the splat value and use it as a uniform base.
3952 // In all other cases the function returns 'false'.
3953 static bool getUniformBase(const Value
* &Ptr
, SDValue
& Base
, SDValue
& Index
,
3954 SDValue
&Scale
, SelectionDAGBuilder
* SDB
) {
3955 SelectionDAG
& DAG
= SDB
->DAG
;
3956 LLVMContext
&Context
= *DAG
.getContext();
3958 assert(Ptr
->getType()->isVectorTy() && "Uexpected pointer type");
3959 const GetElementPtrInst
*GEP
= dyn_cast
<GetElementPtrInst
>(Ptr
);
3963 const Value
*GEPPtr
= GEP
->getPointerOperand();
3964 if (!GEPPtr
->getType()->isVectorTy())
3966 else if (!(Ptr
= getSplatValue(GEPPtr
)))
3969 unsigned FinalIndex
= GEP
->getNumOperands() - 1;
3970 Value
*IndexVal
= GEP
->getOperand(FinalIndex
);
3972 // Ensure all the other indices are 0.
3973 for (unsigned i
= 1; i
< FinalIndex
; ++i
) {
3974 auto *C
= dyn_cast
<ConstantInt
>(GEP
->getOperand(i
));
3975 if (!C
|| !C
->isZero())
3979 // The operands of the GEP may be defined in another basic block.
3980 // In this case we'll not find nodes for the operands.
3981 if (!SDB
->findValue(Ptr
) || !SDB
->findValue(IndexVal
))
3984 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
3985 const DataLayout
&DL
= DAG
.getDataLayout();
3986 Scale
= DAG
.getTargetConstant(DL
.getTypeAllocSize(GEP
->getResultElementType()),
3987 SDB
->getCurSDLoc(), TLI
.getPointerTy(DL
));
3988 Base
= SDB
->getValue(Ptr
);
3989 Index
= SDB
->getValue(IndexVal
);
3991 if (!Index
.getValueType().isVector()) {
3992 unsigned GEPWidth
= GEP
->getType()->getVectorNumElements();
3993 EVT VT
= EVT::getVectorVT(Context
, Index
.getValueType(), GEPWidth
);
3994 Index
= DAG
.getSplatBuildVector(VT
, SDLoc(Index
), Index
);
3999 void SelectionDAGBuilder::visitMaskedScatter(const CallInst
&I
) {
4000 SDLoc sdl
= getCurSDLoc();
4002 // llvm.masked.scatter.*(Src0, Ptrs, alignemt, Mask)
4003 const Value
*Ptr
= I
.getArgOperand(1);
4004 SDValue Src0
= getValue(I
.getArgOperand(0));
4005 SDValue Mask
= getValue(I
.getArgOperand(3));
4006 EVT VT
= Src0
.getValueType();
4007 unsigned Alignment
= (cast
<ConstantInt
>(I
.getArgOperand(2)))->getZExtValue();
4009 Alignment
= DAG
.getEVTAlignment(VT
);
4010 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
4013 I
.getAAMetadata(AAInfo
);
4018 const Value
*BasePtr
= Ptr
;
4019 bool UniformBase
= getUniformBase(BasePtr
, Base
, Index
, Scale
, this);
4021 const Value
*MemOpBasePtr
= UniformBase
? BasePtr
: nullptr;
4022 MachineMemOperand
*MMO
= DAG
.getMachineFunction().
4023 getMachineMemOperand(MachinePointerInfo(MemOpBasePtr
),
4024 MachineMemOperand::MOStore
, VT
.getStoreSize(),
4027 Base
= DAG
.getConstant(0, sdl
, TLI
.getPointerTy(DAG
.getDataLayout()));
4028 Index
= getValue(Ptr
);
4029 Scale
= DAG
.getTargetConstant(1, sdl
, TLI
.getPointerTy(DAG
.getDataLayout()));
4031 SDValue Ops
[] = { getRoot(), Src0
, Mask
, Base
, Index
, Scale
};
4032 SDValue Scatter
= DAG
.getMaskedScatter(DAG
.getVTList(MVT::Other
), VT
, sdl
,
4034 DAG
.setRoot(Scatter
);
4035 setValue(&I
, Scatter
);
4038 void SelectionDAGBuilder::visitMaskedLoad(const CallInst
&I
, bool IsExpanding
) {
4039 SDLoc sdl
= getCurSDLoc();
4041 auto getMaskedLoadOps
= [&](Value
* &Ptr
, Value
* &Mask
, Value
* &Src0
,
4042 unsigned& Alignment
) {
4043 // @llvm.masked.load.*(Ptr, alignment, Mask, Src0)
4044 Ptr
= I
.getArgOperand(0);
4045 Alignment
= cast
<ConstantInt
>(I
.getArgOperand(1))->getZExtValue();
4046 Mask
= I
.getArgOperand(2);
4047 Src0
= I
.getArgOperand(3);
4049 auto getExpandingLoadOps
= [&](Value
* &Ptr
, Value
* &Mask
, Value
* &Src0
,
4050 unsigned& Alignment
) {
4051 // @llvm.masked.expandload.*(Ptr, Mask, Src0)
4052 Ptr
= I
.getArgOperand(0);
4054 Mask
= I
.getArgOperand(1);
4055 Src0
= I
.getArgOperand(2);
4058 Value
*PtrOperand
, *MaskOperand
, *Src0Operand
;
4061 getExpandingLoadOps(PtrOperand
, MaskOperand
, Src0Operand
, Alignment
);
4063 getMaskedLoadOps(PtrOperand
, MaskOperand
, Src0Operand
, Alignment
);
4065 SDValue Ptr
= getValue(PtrOperand
);
4066 SDValue Src0
= getValue(Src0Operand
);
4067 SDValue Mask
= getValue(MaskOperand
);
4069 EVT VT
= Src0
.getValueType();
4071 Alignment
= DAG
.getEVTAlignment(VT
);
4074 I
.getAAMetadata(AAInfo
);
4075 const MDNode
*Ranges
= I
.getMetadata(LLVMContext::MD_range
);
4077 // Do not serialize masked loads of constant memory with anything.
4078 bool AddToChain
= !AA
|| !AA
->pointsToConstantMemory(MemoryLocation(
4079 PtrOperand
, DAG
.getDataLayout().getTypeStoreSize(I
.getType()), AAInfo
));
4080 SDValue InChain
= AddToChain
? DAG
.getRoot() : DAG
.getEntryNode();
4082 MachineMemOperand
*MMO
=
4083 DAG
.getMachineFunction().
4084 getMachineMemOperand(MachinePointerInfo(PtrOperand
),
4085 MachineMemOperand::MOLoad
, VT
.getStoreSize(),
4086 Alignment
, AAInfo
, Ranges
);
4088 SDValue Load
= DAG
.getMaskedLoad(VT
, sdl
, InChain
, Ptr
, Mask
, Src0
, VT
, MMO
,
4089 ISD::NON_EXTLOAD
, IsExpanding
);
4091 PendingLoads
.push_back(Load
.getValue(1));
4095 void SelectionDAGBuilder::visitMaskedGather(const CallInst
&I
) {
4096 SDLoc sdl
= getCurSDLoc();
4098 // @llvm.masked.gather.*(Ptrs, alignment, Mask, Src0)
4099 const Value
*Ptr
= I
.getArgOperand(0);
4100 SDValue Src0
= getValue(I
.getArgOperand(3));
4101 SDValue Mask
= getValue(I
.getArgOperand(2));
4103 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
4104 EVT VT
= TLI
.getValueType(DAG
.getDataLayout(), I
.getType());
4105 unsigned Alignment
= (cast
<ConstantInt
>(I
.getArgOperand(1)))->getZExtValue();
4107 Alignment
= DAG
.getEVTAlignment(VT
);
4110 I
.getAAMetadata(AAInfo
);
4111 const MDNode
*Ranges
= I
.getMetadata(LLVMContext::MD_range
);
4113 SDValue Root
= DAG
.getRoot();
4117 const Value
*BasePtr
= Ptr
;
4118 bool UniformBase
= getUniformBase(BasePtr
, Base
, Index
, Scale
, this);
4119 bool ConstantMemory
= false;
4121 AA
&& AA
->pointsToConstantMemory(MemoryLocation(
4122 BasePtr
, DAG
.getDataLayout().getTypeStoreSize(I
.getType()),
4124 // Do not serialize (non-volatile) loads of constant memory with anything.
4125 Root
= DAG
.getEntryNode();
4126 ConstantMemory
= true;
4129 MachineMemOperand
*MMO
=
4130 DAG
.getMachineFunction().
4131 getMachineMemOperand(MachinePointerInfo(UniformBase
? BasePtr
: nullptr),
4132 MachineMemOperand::MOLoad
, VT
.getStoreSize(),
4133 Alignment
, AAInfo
, Ranges
);
4136 Base
= DAG
.getConstant(0, sdl
, TLI
.getPointerTy(DAG
.getDataLayout()));
4137 Index
= getValue(Ptr
);
4138 Scale
= DAG
.getTargetConstant(1, sdl
, TLI
.getPointerTy(DAG
.getDataLayout()));
4140 SDValue Ops
[] = { Root
, Src0
, Mask
, Base
, Index
, Scale
};
4141 SDValue Gather
= DAG
.getMaskedGather(DAG
.getVTList(VT
, MVT::Other
), VT
, sdl
,
4144 SDValue OutChain
= Gather
.getValue(1);
4145 if (!ConstantMemory
)
4146 PendingLoads
.push_back(OutChain
);
4147 setValue(&I
, Gather
);
4150 void SelectionDAGBuilder::visitAtomicCmpXchg(const AtomicCmpXchgInst
&I
) {
4151 SDLoc dl
= getCurSDLoc();
4152 AtomicOrdering SuccessOrder
= I
.getSuccessOrdering();
4153 AtomicOrdering FailureOrder
= I
.getFailureOrdering();
4154 SyncScope::ID SSID
= I
.getSyncScopeID();
4156 SDValue InChain
= getRoot();
4158 MVT MemVT
= getValue(I
.getCompareOperand()).getSimpleValueType();
4159 SDVTList VTs
= DAG
.getVTList(MemVT
, MVT::i1
, MVT::Other
);
4160 SDValue L
= DAG
.getAtomicCmpSwap(
4161 ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS
, dl
, MemVT
, VTs
, InChain
,
4162 getValue(I
.getPointerOperand()), getValue(I
.getCompareOperand()),
4163 getValue(I
.getNewValOperand()), MachinePointerInfo(I
.getPointerOperand()),
4164 /*Alignment=*/ 0, SuccessOrder
, FailureOrder
, SSID
);
4166 SDValue OutChain
= L
.getValue(2);
4169 DAG
.setRoot(OutChain
);
4172 void SelectionDAGBuilder::visitAtomicRMW(const AtomicRMWInst
&I
) {
4173 SDLoc dl
= getCurSDLoc();
4175 switch (I
.getOperation()) {
4176 default: llvm_unreachable("Unknown atomicrmw operation");
4177 case AtomicRMWInst::Xchg
: NT
= ISD::ATOMIC_SWAP
; break;
4178 case AtomicRMWInst::Add
: NT
= ISD::ATOMIC_LOAD_ADD
; break;
4179 case AtomicRMWInst::Sub
: NT
= ISD::ATOMIC_LOAD_SUB
; break;
4180 case AtomicRMWInst::And
: NT
= ISD::ATOMIC_LOAD_AND
; break;
4181 case AtomicRMWInst::Nand
: NT
= ISD::ATOMIC_LOAD_NAND
; break;
4182 case AtomicRMWInst::Or
: NT
= ISD::ATOMIC_LOAD_OR
; break;
4183 case AtomicRMWInst::Xor
: NT
= ISD::ATOMIC_LOAD_XOR
; break;
4184 case AtomicRMWInst::Max
: NT
= ISD::ATOMIC_LOAD_MAX
; break;
4185 case AtomicRMWInst::Min
: NT
= ISD::ATOMIC_LOAD_MIN
; break;
4186 case AtomicRMWInst::UMax
: NT
= ISD::ATOMIC_LOAD_UMAX
; break;
4187 case AtomicRMWInst::UMin
: NT
= ISD::ATOMIC_LOAD_UMIN
; break;
4189 AtomicOrdering Order
= I
.getOrdering();
4190 SyncScope::ID SSID
= I
.getSyncScopeID();
4192 SDValue InChain
= getRoot();
4195 DAG
.getAtomic(NT
, dl
,
4196 getValue(I
.getValOperand()).getSimpleValueType(),
4198 getValue(I
.getPointerOperand()),
4199 getValue(I
.getValOperand()),
4200 I
.getPointerOperand(),
4201 /* Alignment=*/ 0, Order
, SSID
);
4203 SDValue OutChain
= L
.getValue(1);
4206 DAG
.setRoot(OutChain
);
4209 void SelectionDAGBuilder::visitFence(const FenceInst
&I
) {
4210 SDLoc dl
= getCurSDLoc();
4211 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
4214 Ops
[1] = DAG
.getConstant((unsigned)I
.getOrdering(), dl
,
4215 TLI
.getFenceOperandTy(DAG
.getDataLayout()));
4216 Ops
[2] = DAG
.getConstant(I
.getSyncScopeID(), dl
,
4217 TLI
.getFenceOperandTy(DAG
.getDataLayout()));
4218 DAG
.setRoot(DAG
.getNode(ISD::ATOMIC_FENCE
, dl
, MVT::Other
, Ops
));
4221 void SelectionDAGBuilder::visitAtomicLoad(const LoadInst
&I
) {
4222 SDLoc dl
= getCurSDLoc();
4223 AtomicOrdering Order
= I
.getOrdering();
4224 SyncScope::ID SSID
= I
.getSyncScopeID();
4226 SDValue InChain
= getRoot();
4228 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
4229 EVT VT
= TLI
.getValueType(DAG
.getDataLayout(), I
.getType());
4231 if (!TLI
.supportsUnalignedAtomics() &&
4232 I
.getAlignment() < VT
.getStoreSize())
4233 report_fatal_error("Cannot generate unaligned atomic load");
4235 MachineMemOperand
*MMO
=
4236 DAG
.getMachineFunction().
4237 getMachineMemOperand(MachinePointerInfo(I
.getPointerOperand()),
4238 MachineMemOperand::MOVolatile
|
4239 MachineMemOperand::MOLoad
,
4241 I
.getAlignment() ? I
.getAlignment() :
4242 DAG
.getEVTAlignment(VT
),
4243 AAMDNodes(), nullptr, SSID
, Order
);
4245 InChain
= TLI
.prepareVolatileOrAtomicLoad(InChain
, dl
, DAG
);
4247 DAG
.getAtomic(ISD::ATOMIC_LOAD
, dl
, VT
, VT
, InChain
,
4248 getValue(I
.getPointerOperand()), MMO
);
4250 SDValue OutChain
= L
.getValue(1);
4253 DAG
.setRoot(OutChain
);
4256 void SelectionDAGBuilder::visitAtomicStore(const StoreInst
&I
) {
4257 SDLoc dl
= getCurSDLoc();
4259 AtomicOrdering Order
= I
.getOrdering();
4260 SyncScope::ID SSID
= I
.getSyncScopeID();
4262 SDValue InChain
= getRoot();
4264 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
4266 TLI
.getValueType(DAG
.getDataLayout(), I
.getValueOperand()->getType());
4268 if (I
.getAlignment() < VT
.getStoreSize())
4269 report_fatal_error("Cannot generate unaligned atomic store");
4272 DAG
.getAtomic(ISD::ATOMIC_STORE
, dl
, VT
,
4274 getValue(I
.getPointerOperand()),
4275 getValue(I
.getValueOperand()),
4276 I
.getPointerOperand(), I
.getAlignment(),
4279 DAG
.setRoot(OutChain
);
4282 /// visitTargetIntrinsic - Lower a call of a target intrinsic to an INTRINSIC
4284 void SelectionDAGBuilder::visitTargetIntrinsic(const CallInst
&I
,
4285 unsigned Intrinsic
) {
4286 // Ignore the callsite's attributes. A specific call site may be marked with
4287 // readnone, but the lowering code will expect the chain based on the
4289 const Function
*F
= I
.getCalledFunction();
4290 bool HasChain
= !F
->doesNotAccessMemory();
4291 bool OnlyLoad
= HasChain
&& F
->onlyReadsMemory();
4293 // Build the operand list.
4294 SmallVector
<SDValue
, 8> Ops
;
4295 if (HasChain
) { // If this intrinsic has side-effects, chainify it.
4297 // We don't need to serialize loads against other loads.
4298 Ops
.push_back(DAG
.getRoot());
4300 Ops
.push_back(getRoot());
4304 // Info is set by getTgtMemInstrinsic
4305 TargetLowering::IntrinsicInfo Info
;
4306 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
4307 bool IsTgtIntrinsic
= TLI
.getTgtMemIntrinsic(Info
, I
,
4308 DAG
.getMachineFunction(),
4311 // Add the intrinsic ID as an integer operand if it's not a target intrinsic.
4312 if (!IsTgtIntrinsic
|| Info
.opc
== ISD::INTRINSIC_VOID
||
4313 Info
.opc
== ISD::INTRINSIC_W_CHAIN
)
4314 Ops
.push_back(DAG
.getTargetConstant(Intrinsic
, getCurSDLoc(),
4315 TLI
.getPointerTy(DAG
.getDataLayout())));
4317 // Add all operands of the call to the operand list.
4318 for (unsigned i
= 0, e
= I
.getNumArgOperands(); i
!= e
; ++i
) {
4319 SDValue Op
= getValue(I
.getArgOperand(i
));
4323 SmallVector
<EVT
, 4> ValueVTs
;
4324 ComputeValueVTs(TLI
, DAG
.getDataLayout(), I
.getType(), ValueVTs
);
4327 ValueVTs
.push_back(MVT::Other
);
4329 SDVTList VTs
= DAG
.getVTList(ValueVTs
);
4333 if (IsTgtIntrinsic
) {
4334 // This is target intrinsic that touches memory
4335 Result
= DAG
.getMemIntrinsicNode(Info
.opc
, getCurSDLoc(), VTs
,
4337 MachinePointerInfo(Info
.ptrVal
, Info
.offset
), Info
.align
,
4338 Info
.flags
, Info
.size
);
4339 } else if (!HasChain
) {
4340 Result
= DAG
.getNode(ISD::INTRINSIC_WO_CHAIN
, getCurSDLoc(), VTs
, Ops
);
4341 } else if (!I
.getType()->isVoidTy()) {
4342 Result
= DAG
.getNode(ISD::INTRINSIC_W_CHAIN
, getCurSDLoc(), VTs
, Ops
);
4344 Result
= DAG
.getNode(ISD::INTRINSIC_VOID
, getCurSDLoc(), VTs
, Ops
);
4348 SDValue Chain
= Result
.getValue(Result
.getNode()->getNumValues()-1);
4350 PendingLoads
.push_back(Chain
);
4355 if (!I
.getType()->isVoidTy()) {
4356 if (VectorType
*PTy
= dyn_cast
<VectorType
>(I
.getType())) {
4357 EVT VT
= TLI
.getValueType(DAG
.getDataLayout(), PTy
);
4358 Result
= DAG
.getNode(ISD::BITCAST
, getCurSDLoc(), VT
, Result
);
4360 Result
= lowerRangeToAssertZExt(DAG
, I
, Result
);
4362 setValue(&I
, Result
);
4366 /// GetSignificand - Get the significand and build it into a floating-point
4367 /// number with exponent of 1:
4369 /// Op = (Op & 0x007fffff) | 0x3f800000;
4371 /// where Op is the hexadecimal representation of floating point value.
4372 static SDValue
GetSignificand(SelectionDAG
&DAG
, SDValue Op
, const SDLoc
&dl
) {
4373 SDValue t1
= DAG
.getNode(ISD::AND
, dl
, MVT::i32
, Op
,
4374 DAG
.getConstant(0x007fffff, dl
, MVT::i32
));
4375 SDValue t2
= DAG
.getNode(ISD::OR
, dl
, MVT::i32
, t1
,
4376 DAG
.getConstant(0x3f800000, dl
, MVT::i32
));
4377 return DAG
.getNode(ISD::BITCAST
, dl
, MVT::f32
, t2
);
4380 /// GetExponent - Get the exponent:
4382 /// (float)(int)(((Op & 0x7f800000) >> 23) - 127);
4384 /// where Op is the hexadecimal representation of floating point value.
4385 static SDValue
GetExponent(SelectionDAG
&DAG
, SDValue Op
,
4386 const TargetLowering
&TLI
, const SDLoc
&dl
) {
4387 SDValue t0
= DAG
.getNode(ISD::AND
, dl
, MVT::i32
, Op
,
4388 DAG
.getConstant(0x7f800000, dl
, MVT::i32
));
4389 SDValue t1
= DAG
.getNode(
4390 ISD::SRL
, dl
, MVT::i32
, t0
,
4391 DAG
.getConstant(23, dl
, TLI
.getPointerTy(DAG
.getDataLayout())));
4392 SDValue t2
= DAG
.getNode(ISD::SUB
, dl
, MVT::i32
, t1
,
4393 DAG
.getConstant(127, dl
, MVT::i32
));
4394 return DAG
.getNode(ISD::SINT_TO_FP
, dl
, MVT::f32
, t2
);
4397 /// getF32Constant - Get 32-bit floating point constant.
4398 static SDValue
getF32Constant(SelectionDAG
&DAG
, unsigned Flt
,
4400 return DAG
.getConstantFP(APFloat(APFloat::IEEEsingle(), APInt(32, Flt
)), dl
,
4404 static SDValue
getLimitedPrecisionExp2(SDValue t0
, const SDLoc
&dl
,
4405 SelectionDAG
&DAG
) {
4406 // TODO: What fast-math-flags should be set on the floating-point nodes?
4408 // IntegerPartOfX = ((int32_t)(t0);
4409 SDValue IntegerPartOfX
= DAG
.getNode(ISD::FP_TO_SINT
, dl
, MVT::i32
, t0
);
4411 // FractionalPartOfX = t0 - (float)IntegerPartOfX;
4412 SDValue t1
= DAG
.getNode(ISD::SINT_TO_FP
, dl
, MVT::f32
, IntegerPartOfX
);
4413 SDValue X
= DAG
.getNode(ISD::FSUB
, dl
, MVT::f32
, t0
, t1
);
4415 // IntegerPartOfX <<= 23;
4416 IntegerPartOfX
= DAG
.getNode(
4417 ISD::SHL
, dl
, MVT::i32
, IntegerPartOfX
,
4418 DAG
.getConstant(23, dl
, DAG
.getTargetLoweringInfo().getPointerTy(
4419 DAG
.getDataLayout())));
4421 SDValue TwoToFractionalPartOfX
;
4422 if (LimitFloatPrecision
<= 6) {
4423 // For floating-point precision of 6:
4425 // TwoToFractionalPartOfX =
4427 // (0.735607626f + 0.252464424f * x) * x;
4429 // error 0.0144103317, which is 6 bits
4430 SDValue t2
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, X
,
4431 getF32Constant(DAG
, 0x3e814304, dl
));
4432 SDValue t3
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t2
,
4433 getF32Constant(DAG
, 0x3f3c50c8, dl
));
4434 SDValue t4
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t3
, X
);
4435 TwoToFractionalPartOfX
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t4
,
4436 getF32Constant(DAG
, 0x3f7f5e7e, dl
));
4437 } else if (LimitFloatPrecision
<= 12) {
4438 // For floating-point precision of 12:
4440 // TwoToFractionalPartOfX =
4443 // (0.224338339f + 0.792043434e-1f * x) * x) * x;
4445 // error 0.000107046256, which is 13 to 14 bits
4446 SDValue t2
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, X
,
4447 getF32Constant(DAG
, 0x3da235e3, dl
));
4448 SDValue t3
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t2
,
4449 getF32Constant(DAG
, 0x3e65b8f3, dl
));
4450 SDValue t4
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t3
, X
);
4451 SDValue t5
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t4
,
4452 getF32Constant(DAG
, 0x3f324b07, dl
));
4453 SDValue t6
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t5
, X
);
4454 TwoToFractionalPartOfX
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t6
,
4455 getF32Constant(DAG
, 0x3f7ff8fd, dl
));
4456 } else { // LimitFloatPrecision <= 18
4457 // For floating-point precision of 18:
4459 // TwoToFractionalPartOfX =
4463 // (0.554906021e-1f +
4464 // (0.961591928e-2f +
4465 // (0.136028312e-2f + 0.157059148e-3f *x)*x)*x)*x)*x)*x;
4466 // error 2.47208000*10^(-7), which is better than 18 bits
4467 SDValue t2
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, X
,
4468 getF32Constant(DAG
, 0x3924b03e, dl
));
4469 SDValue t3
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t2
,
4470 getF32Constant(DAG
, 0x3ab24b87, dl
));
4471 SDValue t4
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t3
, X
);
4472 SDValue t5
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t4
,
4473 getF32Constant(DAG
, 0x3c1d8c17, dl
));
4474 SDValue t6
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t5
, X
);
4475 SDValue t7
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t6
,
4476 getF32Constant(DAG
, 0x3d634a1d, dl
));
4477 SDValue t8
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t7
, X
);
4478 SDValue t9
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t8
,
4479 getF32Constant(DAG
, 0x3e75fe14, dl
));
4480 SDValue t10
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t9
, X
);
4481 SDValue t11
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t10
,
4482 getF32Constant(DAG
, 0x3f317234, dl
));
4483 SDValue t12
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t11
, X
);
4484 TwoToFractionalPartOfX
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t12
,
4485 getF32Constant(DAG
, 0x3f800000, dl
));
4488 // Add the exponent into the result in integer domain.
4489 SDValue t13
= DAG
.getNode(ISD::BITCAST
, dl
, MVT::i32
, TwoToFractionalPartOfX
);
4490 return DAG
.getNode(ISD::BITCAST
, dl
, MVT::f32
,
4491 DAG
.getNode(ISD::ADD
, dl
, MVT::i32
, t13
, IntegerPartOfX
));
4494 /// expandExp - Lower an exp intrinsic. Handles the special sequences for
4495 /// limited-precision mode.
4496 static SDValue
expandExp(const SDLoc
&dl
, SDValue Op
, SelectionDAG
&DAG
,
4497 const TargetLowering
&TLI
) {
4498 if (Op
.getValueType() == MVT::f32
&&
4499 LimitFloatPrecision
> 0 && LimitFloatPrecision
<= 18) {
4501 // Put the exponent in the right bit position for later addition to the
4504 // #define LOG2OFe 1.4426950f
4505 // t0 = Op * LOG2OFe
4507 // TODO: What fast-math-flags should be set here?
4508 SDValue t0
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, Op
,
4509 getF32Constant(DAG
, 0x3fb8aa3b, dl
));
4510 return getLimitedPrecisionExp2(t0
, dl
, DAG
);
4513 // No special expansion.
4514 return DAG
.getNode(ISD::FEXP
, dl
, Op
.getValueType(), Op
);
4517 /// expandLog - Lower a log intrinsic. Handles the special sequences for
4518 /// limited-precision mode.
4519 static SDValue
expandLog(const SDLoc
&dl
, SDValue Op
, SelectionDAG
&DAG
,
4520 const TargetLowering
&TLI
) {
4521 // TODO: What fast-math-flags should be set on the floating-point nodes?
4523 if (Op
.getValueType() == MVT::f32
&&
4524 LimitFloatPrecision
> 0 && LimitFloatPrecision
<= 18) {
4525 SDValue Op1
= DAG
.getNode(ISD::BITCAST
, dl
, MVT::i32
, Op
);
4527 // Scale the exponent by log(2) [0.69314718f].
4528 SDValue Exp
= GetExponent(DAG
, Op1
, TLI
, dl
);
4529 SDValue LogOfExponent
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, Exp
,
4530 getF32Constant(DAG
, 0x3f317218, dl
));
4532 // Get the significand and build it into a floating-point number with
4534 SDValue X
= GetSignificand(DAG
, Op1
, dl
);
4536 SDValue LogOfMantissa
;
4537 if (LimitFloatPrecision
<= 6) {
4538 // For floating-point precision of 6:
4542 // (1.4034025f - 0.23903021f * x) * x;
4544 // error 0.0034276066, which is better than 8 bits
4545 SDValue t0
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, X
,
4546 getF32Constant(DAG
, 0xbe74c456, dl
));
4547 SDValue t1
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t0
,
4548 getF32Constant(DAG
, 0x3fb3a2b1, dl
));
4549 SDValue t2
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t1
, X
);
4550 LogOfMantissa
= DAG
.getNode(ISD::FSUB
, dl
, MVT::f32
, t2
,
4551 getF32Constant(DAG
, 0x3f949a29, dl
));
4552 } else if (LimitFloatPrecision
<= 12) {
4553 // For floating-point precision of 12:
4559 // (0.44717955f - 0.56570851e-1f * x) * x) * x) * x;
4561 // error 0.000061011436, which is 14 bits
4562 SDValue t0
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, X
,
4563 getF32Constant(DAG
, 0xbd67b6d6, dl
));
4564 SDValue t1
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t0
,
4565 getF32Constant(DAG
, 0x3ee4f4b8, dl
));
4566 SDValue t2
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t1
, X
);
4567 SDValue t3
= DAG
.getNode(ISD::FSUB
, dl
, MVT::f32
, t2
,
4568 getF32Constant(DAG
, 0x3fbc278b, dl
));
4569 SDValue t4
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t3
, X
);
4570 SDValue t5
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t4
,
4571 getF32Constant(DAG
, 0x40348e95, dl
));
4572 SDValue t6
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t5
, X
);
4573 LogOfMantissa
= DAG
.getNode(ISD::FSUB
, dl
, MVT::f32
, t6
,
4574 getF32Constant(DAG
, 0x3fdef31a, dl
));
4575 } else { // LimitFloatPrecision <= 18
4576 // For floating-point precision of 18:
4584 // (0.19073739f - 0.17809712e-1f * x) * x) * x) * x) * x)*x;
4586 // error 0.0000023660568, which is better than 18 bits
4587 SDValue t0
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, X
,
4588 getF32Constant(DAG
, 0xbc91e5ac, dl
));
4589 SDValue t1
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t0
,
4590 getF32Constant(DAG
, 0x3e4350aa, dl
));
4591 SDValue t2
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t1
, X
);
4592 SDValue t3
= DAG
.getNode(ISD::FSUB
, dl
, MVT::f32
, t2
,
4593 getF32Constant(DAG
, 0x3f60d3e3, dl
));
4594 SDValue t4
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t3
, X
);
4595 SDValue t5
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t4
,
4596 getF32Constant(DAG
, 0x4011cdf0, dl
));
4597 SDValue t6
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t5
, X
);
4598 SDValue t7
= DAG
.getNode(ISD::FSUB
, dl
, MVT::f32
, t6
,
4599 getF32Constant(DAG
, 0x406cfd1c, dl
));
4600 SDValue t8
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t7
, X
);
4601 SDValue t9
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t8
,
4602 getF32Constant(DAG
, 0x408797cb, dl
));
4603 SDValue t10
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t9
, X
);
4604 LogOfMantissa
= DAG
.getNode(ISD::FSUB
, dl
, MVT::f32
, t10
,
4605 getF32Constant(DAG
, 0x4006dcab, dl
));
4608 return DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, LogOfExponent
, LogOfMantissa
);
4611 // No special expansion.
4612 return DAG
.getNode(ISD::FLOG
, dl
, Op
.getValueType(), Op
);
4615 /// expandLog2 - Lower a log2 intrinsic. Handles the special sequences for
4616 /// limited-precision mode.
4617 static SDValue
expandLog2(const SDLoc
&dl
, SDValue Op
, SelectionDAG
&DAG
,
4618 const TargetLowering
&TLI
) {
4619 // TODO: What fast-math-flags should be set on the floating-point nodes?
4621 if (Op
.getValueType() == MVT::f32
&&
4622 LimitFloatPrecision
> 0 && LimitFloatPrecision
<= 18) {
4623 SDValue Op1
= DAG
.getNode(ISD::BITCAST
, dl
, MVT::i32
, Op
);
4625 // Get the exponent.
4626 SDValue LogOfExponent
= GetExponent(DAG
, Op1
, TLI
, dl
);
4628 // Get the significand and build it into a floating-point number with
4630 SDValue X
= GetSignificand(DAG
, Op1
, dl
);
4632 // Different possible minimax approximations of significand in
4633 // floating-point for various degrees of accuracy over [1,2].
4634 SDValue Log2ofMantissa
;
4635 if (LimitFloatPrecision
<= 6) {
4636 // For floating-point precision of 6:
4638 // Log2ofMantissa = -1.6749035f + (2.0246817f - .34484768f * x) * x;
4640 // error 0.0049451742, which is more than 7 bits
4641 SDValue t0
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, X
,
4642 getF32Constant(DAG
, 0xbeb08fe0, dl
));
4643 SDValue t1
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t0
,
4644 getF32Constant(DAG
, 0x40019463, dl
));
4645 SDValue t2
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t1
, X
);
4646 Log2ofMantissa
= DAG
.getNode(ISD::FSUB
, dl
, MVT::f32
, t2
,
4647 getF32Constant(DAG
, 0x3fd6633d, dl
));
4648 } else if (LimitFloatPrecision
<= 12) {
4649 // For floating-point precision of 12:
4655 // (.645142248f - 0.816157886e-1f * x) * x) * x) * x;
4657 // error 0.0000876136000, which is better than 13 bits
4658 SDValue t0
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, X
,
4659 getF32Constant(DAG
, 0xbda7262e, dl
));
4660 SDValue t1
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t0
,
4661 getF32Constant(DAG
, 0x3f25280b, dl
));
4662 SDValue t2
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t1
, X
);
4663 SDValue t3
= DAG
.getNode(ISD::FSUB
, dl
, MVT::f32
, t2
,
4664 getF32Constant(DAG
, 0x4007b923, dl
));
4665 SDValue t4
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t3
, X
);
4666 SDValue t5
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t4
,
4667 getF32Constant(DAG
, 0x40823e2f, dl
));
4668 SDValue t6
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t5
, X
);
4669 Log2ofMantissa
= DAG
.getNode(ISD::FSUB
, dl
, MVT::f32
, t6
,
4670 getF32Constant(DAG
, 0x4020d29c, dl
));
4671 } else { // LimitFloatPrecision <= 18
4672 // For floating-point precision of 18:
4681 // 0.25691327e-1f * x) * x) * x) * x) * x) * x;
4683 // error 0.0000018516, which is better than 18 bits
4684 SDValue t0
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, X
,
4685 getF32Constant(DAG
, 0xbcd2769e, dl
));
4686 SDValue t1
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t0
,
4687 getF32Constant(DAG
, 0x3e8ce0b9, dl
));
4688 SDValue t2
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t1
, X
);
4689 SDValue t3
= DAG
.getNode(ISD::FSUB
, dl
, MVT::f32
, t2
,
4690 getF32Constant(DAG
, 0x3fa22ae7, dl
));
4691 SDValue t4
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t3
, X
);
4692 SDValue t5
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t4
,
4693 getF32Constant(DAG
, 0x40525723, dl
));
4694 SDValue t6
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t5
, X
);
4695 SDValue t7
= DAG
.getNode(ISD::FSUB
, dl
, MVT::f32
, t6
,
4696 getF32Constant(DAG
, 0x40aaf200, dl
));
4697 SDValue t8
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t7
, X
);
4698 SDValue t9
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t8
,
4699 getF32Constant(DAG
, 0x40c39dad, dl
));
4700 SDValue t10
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t9
, X
);
4701 Log2ofMantissa
= DAG
.getNode(ISD::FSUB
, dl
, MVT::f32
, t10
,
4702 getF32Constant(DAG
, 0x4042902c, dl
));
4705 return DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, LogOfExponent
, Log2ofMantissa
);
4708 // No special expansion.
4709 return DAG
.getNode(ISD::FLOG2
, dl
, Op
.getValueType(), Op
);
4712 /// expandLog10 - Lower a log10 intrinsic. Handles the special sequences for
4713 /// limited-precision mode.
4714 static SDValue
expandLog10(const SDLoc
&dl
, SDValue Op
, SelectionDAG
&DAG
,
4715 const TargetLowering
&TLI
) {
4716 // TODO: What fast-math-flags should be set on the floating-point nodes?
4718 if (Op
.getValueType() == MVT::f32
&&
4719 LimitFloatPrecision
> 0 && LimitFloatPrecision
<= 18) {
4720 SDValue Op1
= DAG
.getNode(ISD::BITCAST
, dl
, MVT::i32
, Op
);
4722 // Scale the exponent by log10(2) [0.30102999f].
4723 SDValue Exp
= GetExponent(DAG
, Op1
, TLI
, dl
);
4724 SDValue LogOfExponent
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, Exp
,
4725 getF32Constant(DAG
, 0x3e9a209a, dl
));
4727 // Get the significand and build it into a floating-point number with
4729 SDValue X
= GetSignificand(DAG
, Op1
, dl
);
4731 SDValue Log10ofMantissa
;
4732 if (LimitFloatPrecision
<= 6) {
4733 // For floating-point precision of 6:
4735 // Log10ofMantissa =
4737 // (0.60948995f - 0.10380950f * x) * x;
4739 // error 0.0014886165, which is 6 bits
4740 SDValue t0
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, X
,
4741 getF32Constant(DAG
, 0xbdd49a13, dl
));
4742 SDValue t1
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t0
,
4743 getF32Constant(DAG
, 0x3f1c0789, dl
));
4744 SDValue t2
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t1
, X
);
4745 Log10ofMantissa
= DAG
.getNode(ISD::FSUB
, dl
, MVT::f32
, t2
,
4746 getF32Constant(DAG
, 0x3f011300, dl
));
4747 } else if (LimitFloatPrecision
<= 12) {
4748 // For floating-point precision of 12:
4750 // Log10ofMantissa =
4753 // (-0.31664806f + 0.47637168e-1f * x) * x) * x;
4755 // error 0.00019228036, which is better than 12 bits
4756 SDValue t0
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, X
,
4757 getF32Constant(DAG
, 0x3d431f31, dl
));
4758 SDValue t1
= DAG
.getNode(ISD::FSUB
, dl
, MVT::f32
, t0
,
4759 getF32Constant(DAG
, 0x3ea21fb2, dl
));
4760 SDValue t2
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t1
, X
);
4761 SDValue t3
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t2
,
4762 getF32Constant(DAG
, 0x3f6ae232, dl
));
4763 SDValue t4
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t3
, X
);
4764 Log10ofMantissa
= DAG
.getNode(ISD::FSUB
, dl
, MVT::f32
, t4
,
4765 getF32Constant(DAG
, 0x3f25f7c3, dl
));
4766 } else { // LimitFloatPrecision <= 18
4767 // For floating-point precision of 18:
4769 // Log10ofMantissa =
4774 // (-0.12539807f + 0.13508273e-1f * x) * x) * x) * x) * x;
4776 // error 0.0000037995730, which is better than 18 bits
4777 SDValue t0
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, X
,
4778 getF32Constant(DAG
, 0x3c5d51ce, dl
));
4779 SDValue t1
= DAG
.getNode(ISD::FSUB
, dl
, MVT::f32
, t0
,
4780 getF32Constant(DAG
, 0x3e00685a, dl
));
4781 SDValue t2
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t1
, X
);
4782 SDValue t3
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t2
,
4783 getF32Constant(DAG
, 0x3efb6798, dl
));
4784 SDValue t4
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t3
, X
);
4785 SDValue t5
= DAG
.getNode(ISD::FSUB
, dl
, MVT::f32
, t4
,
4786 getF32Constant(DAG
, 0x3f88d192, dl
));
4787 SDValue t6
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t5
, X
);
4788 SDValue t7
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, t6
,
4789 getF32Constant(DAG
, 0x3fc4316c, dl
));
4790 SDValue t8
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, t7
, X
);
4791 Log10ofMantissa
= DAG
.getNode(ISD::FSUB
, dl
, MVT::f32
, t8
,
4792 getF32Constant(DAG
, 0x3f57ce70, dl
));
4795 return DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, LogOfExponent
, Log10ofMantissa
);
4798 // No special expansion.
4799 return DAG
.getNode(ISD::FLOG10
, dl
, Op
.getValueType(), Op
);
4802 /// expandExp2 - Lower an exp2 intrinsic. Handles the special sequences for
4803 /// limited-precision mode.
4804 static SDValue
expandExp2(const SDLoc
&dl
, SDValue Op
, SelectionDAG
&DAG
,
4805 const TargetLowering
&TLI
) {
4806 if (Op
.getValueType() == MVT::f32
&&
4807 LimitFloatPrecision
> 0 && LimitFloatPrecision
<= 18)
4808 return getLimitedPrecisionExp2(Op
, dl
, DAG
);
4810 // No special expansion.
4811 return DAG
.getNode(ISD::FEXP2
, dl
, Op
.getValueType(), Op
);
4814 /// visitPow - Lower a pow intrinsic. Handles the special sequences for
4815 /// limited-precision mode with x == 10.0f.
4816 static SDValue
expandPow(const SDLoc
&dl
, SDValue LHS
, SDValue RHS
,
4817 SelectionDAG
&DAG
, const TargetLowering
&TLI
) {
4818 bool IsExp10
= false;
4819 if (LHS
.getValueType() == MVT::f32
&& RHS
.getValueType() == MVT::f32
&&
4820 LimitFloatPrecision
> 0 && LimitFloatPrecision
<= 18) {
4821 if (ConstantFPSDNode
*LHSC
= dyn_cast
<ConstantFPSDNode
>(LHS
)) {
4823 IsExp10
= LHSC
->isExactlyValue(Ten
);
4827 // TODO: What fast-math-flags should be set on the FMUL node?
4829 // Put the exponent in the right bit position for later addition to the
4832 // #define LOG2OF10 3.3219281f
4833 // t0 = Op * LOG2OF10;
4834 SDValue t0
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f32
, RHS
,
4835 getF32Constant(DAG
, 0x40549a78, dl
));
4836 return getLimitedPrecisionExp2(t0
, dl
, DAG
);
4839 // No special expansion.
4840 return DAG
.getNode(ISD::FPOW
, dl
, LHS
.getValueType(), LHS
, RHS
);
4843 /// ExpandPowI - Expand a llvm.powi intrinsic.
4844 static SDValue
ExpandPowI(const SDLoc
&DL
, SDValue LHS
, SDValue RHS
,
4845 SelectionDAG
&DAG
) {
4846 // If RHS is a constant, we can expand this out to a multiplication tree,
4847 // otherwise we end up lowering to a call to __powidf2 (for example). When
4848 // optimizing for size, we only want to do this if the expansion would produce
4849 // a small number of multiplies, otherwise we do the full expansion.
4850 if (ConstantSDNode
*RHSC
= dyn_cast
<ConstantSDNode
>(RHS
)) {
4851 // Get the exponent as a positive value.
4852 unsigned Val
= RHSC
->getSExtValue();
4853 if ((int)Val
< 0) Val
= -Val
;
4855 // powi(x, 0) -> 1.0
4857 return DAG
.getConstantFP(1.0, DL
, LHS
.getValueType());
4859 const Function
&F
= DAG
.getMachineFunction().getFunction();
4860 if (!F
.optForSize() ||
4861 // If optimizing for size, don't insert too many multiplies.
4862 // This inserts up to 5 multiplies.
4863 countPopulation(Val
) + Log2_32(Val
) < 7) {
4864 // We use the simple binary decomposition method to generate the multiply
4865 // sequence. There are more optimal ways to do this (for example,
4866 // powi(x,15) generates one more multiply than it should), but this has
4867 // the benefit of being both really simple and much better than a libcall.
4868 SDValue Res
; // Logically starts equal to 1.0
4869 SDValue CurSquare
= LHS
;
4870 // TODO: Intrinsics should have fast-math-flags that propagate to these
4875 Res
= DAG
.getNode(ISD::FMUL
, DL
,Res
.getValueType(), Res
, CurSquare
);
4877 Res
= CurSquare
; // 1.0*CurSquare.
4880 CurSquare
= DAG
.getNode(ISD::FMUL
, DL
, CurSquare
.getValueType(),
4881 CurSquare
, CurSquare
);
4885 // If the original was negative, invert the result, producing 1/(x*x*x).
4886 if (RHSC
->getSExtValue() < 0)
4887 Res
= DAG
.getNode(ISD::FDIV
, DL
, LHS
.getValueType(),
4888 DAG
.getConstantFP(1.0, DL
, LHS
.getValueType()), Res
);
4893 // Otherwise, expand to a libcall.
4894 return DAG
.getNode(ISD::FPOWI
, DL
, LHS
.getValueType(), LHS
, RHS
);
4897 // getUnderlyingArgReg - Find underlying register used for a truncated or
4898 // bitcasted argument.
4899 static unsigned getUnderlyingArgReg(const SDValue
&N
) {
4900 switch (N
.getOpcode()) {
4901 case ISD::CopyFromReg
:
4902 return cast
<RegisterSDNode
>(N
.getOperand(1))->getReg();
4904 case ISD::AssertZext
:
4905 case ISD::AssertSext
:
4907 return getUnderlyingArgReg(N
.getOperand(0));
4913 /// If the DbgValueInst is a dbg_value of a function argument, create the
4914 /// corresponding DBG_VALUE machine instruction for it now. At the end of
4915 /// instruction selection, they will be inserted to the entry BB.
4916 bool SelectionDAGBuilder::EmitFuncArgumentDbgValue(
4917 const Value
*V
, DILocalVariable
*Variable
, DIExpression
*Expr
,
4918 DILocation
*DL
, bool IsDbgDeclare
, const SDValue
&N
) {
4919 const Argument
*Arg
= dyn_cast
<Argument
>(V
);
4923 MachineFunction
&MF
= DAG
.getMachineFunction();
4924 const TargetInstrInfo
*TII
= DAG
.getSubtarget().getInstrInfo();
4926 bool IsIndirect
= false;
4927 Optional
<MachineOperand
> Op
;
4928 // Some arguments' frame index is recorded during argument lowering.
4929 int FI
= FuncInfo
.getArgumentFrameIndex(Arg
);
4930 if (FI
!= std::numeric_limits
<int>::max())
4931 Op
= MachineOperand::CreateFI(FI
);
4933 if (!Op
&& N
.getNode()) {
4934 unsigned Reg
= getUnderlyingArgReg(N
);
4935 if (Reg
&& TargetRegisterInfo::isVirtualRegister(Reg
)) {
4936 MachineRegisterInfo
&RegInfo
= MF
.getRegInfo();
4937 unsigned PR
= RegInfo
.getLiveInPhysReg(Reg
);
4942 Op
= MachineOperand::CreateReg(Reg
, false);
4943 IsIndirect
= IsDbgDeclare
;
4947 if (!Op
&& N
.getNode())
4948 // Check if frame index is available.
4949 if (LoadSDNode
*LNode
= dyn_cast
<LoadSDNode
>(N
.getNode()))
4950 if (FrameIndexSDNode
*FINode
=
4951 dyn_cast
<FrameIndexSDNode
>(LNode
->getBasePtr().getNode()))
4952 Op
= MachineOperand::CreateFI(FINode
->getIndex());
4955 // Check if ValueMap has reg number.
4956 DenseMap
<const Value
*, unsigned>::iterator VMI
= FuncInfo
.ValueMap
.find(V
);
4957 if (VMI
!= FuncInfo
.ValueMap
.end()) {
4958 const auto &TLI
= DAG
.getTargetLoweringInfo();
4959 RegsForValue
RFV(V
->getContext(), TLI
, DAG
.getDataLayout(), VMI
->second
,
4960 V
->getType(), getABIRegCopyCC(V
));
4961 if (RFV
.occupiesMultipleRegs()) {
4962 unsigned Offset
= 0;
4963 for (auto RegAndSize
: RFV
.getRegsAndSizes()) {
4964 Op
= MachineOperand::CreateReg(RegAndSize
.first
, false);
4965 auto FragmentExpr
= DIExpression::createFragmentExpression(
4966 Expr
, Offset
, RegAndSize
.second
);
4969 FuncInfo
.ArgDbgValues
.push_back(
4970 BuildMI(MF
, DL
, TII
->get(TargetOpcode::DBG_VALUE
), IsDbgDeclare
,
4971 Op
->getReg(), Variable
, *FragmentExpr
));
4972 Offset
+= RegAndSize
.second
;
4976 Op
= MachineOperand::CreateReg(VMI
->second
, false);
4977 IsIndirect
= IsDbgDeclare
;
4984 assert(Variable
->isValidLocationForIntrinsic(DL
) &&
4985 "Expected inlined-at fields to agree");
4986 IsIndirect
= (Op
->isReg()) ? IsIndirect
: true;
4987 FuncInfo
.ArgDbgValues
.push_back(
4988 BuildMI(MF
, DL
, TII
->get(TargetOpcode::DBG_VALUE
), IsIndirect
,
4989 *Op
, Variable
, Expr
));
4994 /// Return the appropriate SDDbgValue based on N.
4995 SDDbgValue
*SelectionDAGBuilder::getDbgValue(SDValue N
,
4996 DILocalVariable
*Variable
,
4999 unsigned DbgSDNodeOrder
) {
5000 if (auto *FISDN
= dyn_cast
<FrameIndexSDNode
>(N
.getNode())) {
5001 // Construct a FrameIndexDbgValue for FrameIndexSDNodes so we can describe
5002 // stack slot locations.
5004 // Consider "int x = 0; int *px = &x;". There are two kinds of interesting
5005 // debug values here after optimization:
5007 // dbg.value(i32* %px, !"int *px", !DIExpression()), and
5008 // dbg.value(i32* %px, !"int x", !DIExpression(DW_OP_deref))
5010 // Both describe the direct values of their associated variables.
5011 return DAG
.getFrameIndexDbgValue(Variable
, Expr
, FISDN
->getIndex(),
5012 /*IsIndirect*/ false, dl
, DbgSDNodeOrder
);
5014 return DAG
.getDbgValue(Variable
, Expr
, N
.getNode(), N
.getResNo(),
5015 /*IsIndirect*/ false, dl
, DbgSDNodeOrder
);
5018 // VisualStudio defines setjmp as _setjmp
5019 #if defined(_MSC_VER) && defined(setjmp) && \
5020 !defined(setjmp_undefined_for_msvc)
5021 # pragma push_macro("setjmp")
5023 # define setjmp_undefined_for_msvc
5026 /// Lower the call to the specified intrinsic function. If we want to emit this
5027 /// as a call to a named external function, return the name. Otherwise, lower it
5028 /// and return null.
5030 SelectionDAGBuilder::visitIntrinsicCall(const CallInst
&I
, unsigned Intrinsic
) {
5031 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
5032 SDLoc sdl
= getCurSDLoc();
5033 DebugLoc dl
= getCurDebugLoc();
5036 switch (Intrinsic
) {
5038 // By default, turn this into a target intrinsic node.
5039 visitTargetIntrinsic(I
, Intrinsic
);
5041 case Intrinsic::vastart
: visitVAStart(I
); return nullptr;
5042 case Intrinsic::vaend
: visitVAEnd(I
); return nullptr;
5043 case Intrinsic::vacopy
: visitVACopy(I
); return nullptr;
5044 case Intrinsic::returnaddress
:
5045 setValue(&I
, DAG
.getNode(ISD::RETURNADDR
, sdl
,
5046 TLI
.getPointerTy(DAG
.getDataLayout()),
5047 getValue(I
.getArgOperand(0))));
5049 case Intrinsic::addressofreturnaddress
:
5050 setValue(&I
, DAG
.getNode(ISD::ADDROFRETURNADDR
, sdl
,
5051 TLI
.getPointerTy(DAG
.getDataLayout())));
5053 case Intrinsic::frameaddress
:
5054 setValue(&I
, DAG
.getNode(ISD::FRAMEADDR
, sdl
,
5055 TLI
.getPointerTy(DAG
.getDataLayout()),
5056 getValue(I
.getArgOperand(0))));
5058 case Intrinsic::read_register
: {
5059 Value
*Reg
= I
.getArgOperand(0);
5060 SDValue Chain
= getRoot();
5062 DAG
.getMDNode(cast
<MDNode
>(cast
<MetadataAsValue
>(Reg
)->getMetadata()));
5063 EVT VT
= TLI
.getValueType(DAG
.getDataLayout(), I
.getType());
5064 Res
= DAG
.getNode(ISD::READ_REGISTER
, sdl
,
5065 DAG
.getVTList(VT
, MVT::Other
), Chain
, RegName
);
5067 DAG
.setRoot(Res
.getValue(1));
5070 case Intrinsic::write_register
: {
5071 Value
*Reg
= I
.getArgOperand(0);
5072 Value
*RegValue
= I
.getArgOperand(1);
5073 SDValue Chain
= getRoot();
5075 DAG
.getMDNode(cast
<MDNode
>(cast
<MetadataAsValue
>(Reg
)->getMetadata()));
5076 DAG
.setRoot(DAG
.getNode(ISD::WRITE_REGISTER
, sdl
, MVT::Other
, Chain
,
5077 RegName
, getValue(RegValue
)));
5080 case Intrinsic::setjmp
:
5081 return &"_setjmp"[!TLI
.usesUnderscoreSetJmp()];
5082 case Intrinsic::longjmp
:
5083 return &"_longjmp"[!TLI
.usesUnderscoreLongJmp()];
5084 case Intrinsic::memcpy
: {
5085 const auto &MCI
= cast
<MemCpyInst
>(I
);
5086 SDValue Op1
= getValue(I
.getArgOperand(0));
5087 SDValue Op2
= getValue(I
.getArgOperand(1));
5088 SDValue Op3
= getValue(I
.getArgOperand(2));
5089 // @llvm.memcpy defines 0 and 1 to both mean no alignment.
5090 unsigned DstAlign
= std::max
<unsigned>(MCI
.getDestAlignment(), 1);
5091 unsigned SrcAlign
= std::max
<unsigned>(MCI
.getSourceAlignment(), 1);
5092 unsigned Align
= MinAlign(DstAlign
, SrcAlign
);
5093 bool isVol
= MCI
.isVolatile();
5094 bool isTC
= I
.isTailCall() && isInTailCallPosition(&I
, DAG
.getTarget());
5095 // FIXME: Support passing different dest/src alignments to the memcpy DAG
5097 SDValue MC
= DAG
.getMemcpy(getRoot(), sdl
, Op1
, Op2
, Op3
, Align
, isVol
,
5099 MachinePointerInfo(I
.getArgOperand(0)),
5100 MachinePointerInfo(I
.getArgOperand(1)));
5101 updateDAGForMaybeTailCall(MC
);
5104 case Intrinsic::memset
: {
5105 const auto &MSI
= cast
<MemSetInst
>(I
);
5106 SDValue Op1
= getValue(I
.getArgOperand(0));
5107 SDValue Op2
= getValue(I
.getArgOperand(1));
5108 SDValue Op3
= getValue(I
.getArgOperand(2));
5109 // @llvm.memset defines 0 and 1 to both mean no alignment.
5110 unsigned Align
= std::max
<unsigned>(MSI
.getDestAlignment(), 1);
5111 bool isVol
= MSI
.isVolatile();
5112 bool isTC
= I
.isTailCall() && isInTailCallPosition(&I
, DAG
.getTarget());
5113 SDValue MS
= DAG
.getMemset(getRoot(), sdl
, Op1
, Op2
, Op3
, Align
, isVol
,
5114 isTC
, MachinePointerInfo(I
.getArgOperand(0)));
5115 updateDAGForMaybeTailCall(MS
);
5118 case Intrinsic::memmove
: {
5119 const auto &MMI
= cast
<MemMoveInst
>(I
);
5120 SDValue Op1
= getValue(I
.getArgOperand(0));
5121 SDValue Op2
= getValue(I
.getArgOperand(1));
5122 SDValue Op3
= getValue(I
.getArgOperand(2));
5123 // @llvm.memmove defines 0 and 1 to both mean no alignment.
5124 unsigned DstAlign
= std::max
<unsigned>(MMI
.getDestAlignment(), 1);
5125 unsigned SrcAlign
= std::max
<unsigned>(MMI
.getSourceAlignment(), 1);
5126 unsigned Align
= MinAlign(DstAlign
, SrcAlign
);
5127 bool isVol
= MMI
.isVolatile();
5128 bool isTC
= I
.isTailCall() && isInTailCallPosition(&I
, DAG
.getTarget());
5129 // FIXME: Support passing different dest/src alignments to the memmove DAG
5131 SDValue MM
= DAG
.getMemmove(getRoot(), sdl
, Op1
, Op2
, Op3
, Align
, isVol
,
5132 isTC
, MachinePointerInfo(I
.getArgOperand(0)),
5133 MachinePointerInfo(I
.getArgOperand(1)));
5134 updateDAGForMaybeTailCall(MM
);
5137 case Intrinsic::memcpy_element_unordered_atomic
: {
5138 const AtomicMemCpyInst
&MI
= cast
<AtomicMemCpyInst
>(I
);
5139 SDValue Dst
= getValue(MI
.getRawDest());
5140 SDValue Src
= getValue(MI
.getRawSource());
5141 SDValue Length
= getValue(MI
.getLength());
5143 unsigned DstAlign
= MI
.getDestAlignment();
5144 unsigned SrcAlign
= MI
.getSourceAlignment();
5145 Type
*LengthTy
= MI
.getLength()->getType();
5146 unsigned ElemSz
= MI
.getElementSizeInBytes();
5147 bool isTC
= I
.isTailCall() && isInTailCallPosition(&I
, DAG
.getTarget());
5148 SDValue MC
= DAG
.getAtomicMemcpy(getRoot(), sdl
, Dst
, DstAlign
, Src
,
5149 SrcAlign
, Length
, LengthTy
, ElemSz
, isTC
,
5150 MachinePointerInfo(MI
.getRawDest()),
5151 MachinePointerInfo(MI
.getRawSource()));
5152 updateDAGForMaybeTailCall(MC
);
5155 case Intrinsic::memmove_element_unordered_atomic
: {
5156 auto &MI
= cast
<AtomicMemMoveInst
>(I
);
5157 SDValue Dst
= getValue(MI
.getRawDest());
5158 SDValue Src
= getValue(MI
.getRawSource());
5159 SDValue Length
= getValue(MI
.getLength());
5161 unsigned DstAlign
= MI
.getDestAlignment();
5162 unsigned SrcAlign
= MI
.getSourceAlignment();
5163 Type
*LengthTy
= MI
.getLength()->getType();
5164 unsigned ElemSz
= MI
.getElementSizeInBytes();
5165 bool isTC
= I
.isTailCall() && isInTailCallPosition(&I
, DAG
.getTarget());
5166 SDValue MC
= DAG
.getAtomicMemmove(getRoot(), sdl
, Dst
, DstAlign
, Src
,
5167 SrcAlign
, Length
, LengthTy
, ElemSz
, isTC
,
5168 MachinePointerInfo(MI
.getRawDest()),
5169 MachinePointerInfo(MI
.getRawSource()));
5170 updateDAGForMaybeTailCall(MC
);
5173 case Intrinsic::memset_element_unordered_atomic
: {
5174 auto &MI
= cast
<AtomicMemSetInst
>(I
);
5175 SDValue Dst
= getValue(MI
.getRawDest());
5176 SDValue Val
= getValue(MI
.getValue());
5177 SDValue Length
= getValue(MI
.getLength());
5179 unsigned DstAlign
= MI
.getDestAlignment();
5180 Type
*LengthTy
= MI
.getLength()->getType();
5181 unsigned ElemSz
= MI
.getElementSizeInBytes();
5182 bool isTC
= I
.isTailCall() && isInTailCallPosition(&I
, DAG
.getTarget());
5183 SDValue MC
= DAG
.getAtomicMemset(getRoot(), sdl
, Dst
, DstAlign
, Val
, Length
,
5184 LengthTy
, ElemSz
, isTC
,
5185 MachinePointerInfo(MI
.getRawDest()));
5186 updateDAGForMaybeTailCall(MC
);
5189 case Intrinsic::dbg_addr
:
5190 case Intrinsic::dbg_declare
: {
5191 const auto &DI
= cast
<DbgVariableIntrinsic
>(I
);
5192 DILocalVariable
*Variable
= DI
.getVariable();
5193 DIExpression
*Expression
= DI
.getExpression();
5194 dropDanglingDebugInfo(Variable
, Expression
);
5195 assert(Variable
&& "Missing variable");
5197 // Check if address has undef value.
5198 const Value
*Address
= DI
.getVariableLocation();
5199 if (!Address
|| isa
<UndefValue
>(Address
) ||
5200 (Address
->use_empty() && !isa
<Argument
>(Address
))) {
5201 LLVM_DEBUG(dbgs() << "Dropping debug info for " << DI
<< "\n");
5205 bool isParameter
= Variable
->isParameter() || isa
<Argument
>(Address
);
5207 // Check if this variable can be described by a frame index, typically
5208 // either as a static alloca or a byval parameter.
5209 int FI
= std::numeric_limits
<int>::max();
5210 if (const auto *AI
=
5211 dyn_cast
<AllocaInst
>(Address
->stripInBoundsConstantOffsets())) {
5212 if (AI
->isStaticAlloca()) {
5213 auto I
= FuncInfo
.StaticAllocaMap
.find(AI
);
5214 if (I
!= FuncInfo
.StaticAllocaMap
.end())
5217 } else if (const auto *Arg
= dyn_cast
<Argument
>(
5218 Address
->stripInBoundsConstantOffsets())) {
5219 FI
= FuncInfo
.getArgumentFrameIndex(Arg
);
5222 // llvm.dbg.addr is control dependent and always generates indirect
5223 // DBG_VALUE instructions. llvm.dbg.declare is handled as a frame index in
5224 // the MachineFunction variable table.
5225 if (FI
!= std::numeric_limits
<int>::max()) {
5226 if (Intrinsic
== Intrinsic::dbg_addr
) {
5227 SDDbgValue
*SDV
= DAG
.getFrameIndexDbgValue(
5228 Variable
, Expression
, FI
, /*IsIndirect*/ true, dl
, SDNodeOrder
);
5229 DAG
.AddDbgValue(SDV
, getRoot().getNode(), isParameter
);
5234 SDValue
&N
= NodeMap
[Address
];
5235 if (!N
.getNode() && isa
<Argument
>(Address
))
5236 // Check unused arguments map.
5237 N
= UnusedArgNodeMap
[Address
];
5240 if (const BitCastInst
*BCI
= dyn_cast
<BitCastInst
>(Address
))
5241 Address
= BCI
->getOperand(0);
5242 // Parameters are handled specially.
5243 auto FINode
= dyn_cast
<FrameIndexSDNode
>(N
.getNode());
5244 if (isParameter
&& FINode
) {
5245 // Byval parameter. We have a frame index at this point.
5247 DAG
.getFrameIndexDbgValue(Variable
, Expression
, FINode
->getIndex(),
5248 /*IsIndirect*/ true, dl
, SDNodeOrder
);
5249 } else if (isa
<Argument
>(Address
)) {
5250 // Address is an argument, so try to emit its dbg value using
5251 // virtual register info from the FuncInfo.ValueMap.
5252 EmitFuncArgumentDbgValue(Address
, Variable
, Expression
, dl
, true, N
);
5255 SDV
= DAG
.getDbgValue(Variable
, Expression
, N
.getNode(), N
.getResNo(),
5256 true, dl
, SDNodeOrder
);
5258 DAG
.AddDbgValue(SDV
, N
.getNode(), isParameter
);
5260 // If Address is an argument then try to emit its dbg value using
5261 // virtual register info from the FuncInfo.ValueMap.
5262 if (!EmitFuncArgumentDbgValue(Address
, Variable
, Expression
, dl
, true,
5264 LLVM_DEBUG(dbgs() << "Dropping debug info for " << DI
<< "\n");
5269 case Intrinsic::dbg_label
: {
5270 const DbgLabelInst
&DI
= cast
<DbgLabelInst
>(I
);
5271 DILabel
*Label
= DI
.getLabel();
5272 assert(Label
&& "Missing label");
5275 SDV
= DAG
.getDbgLabel(Label
, dl
, SDNodeOrder
);
5276 DAG
.AddDbgLabel(SDV
);
5279 case Intrinsic::dbg_value
: {
5280 const DbgValueInst
&DI
= cast
<DbgValueInst
>(I
);
5281 assert(DI
.getVariable() && "Missing variable");
5283 DILocalVariable
*Variable
= DI
.getVariable();
5284 DIExpression
*Expression
= DI
.getExpression();
5285 dropDanglingDebugInfo(Variable
, Expression
);
5286 const Value
*V
= DI
.getValue();
5291 if (isa
<ConstantInt
>(V
) || isa
<ConstantFP
>(V
) || isa
<UndefValue
>(V
)) {
5292 SDV
= DAG
.getConstantDbgValue(Variable
, Expression
, V
, dl
, SDNodeOrder
);
5293 DAG
.AddDbgValue(SDV
, nullptr, false);
5297 // Do not use getValue() in here; we don't want to generate code at
5298 // this point if it hasn't been done yet.
5299 SDValue N
= NodeMap
[V
];
5300 if (!N
.getNode() && isa
<Argument
>(V
)) // Check unused arguments map.
5301 N
= UnusedArgNodeMap
[V
];
5303 if (EmitFuncArgumentDbgValue(V
, Variable
, Expression
, dl
, false, N
))
5305 SDV
= getDbgValue(N
, Variable
, Expression
, dl
, SDNodeOrder
);
5306 DAG
.AddDbgValue(SDV
, N
.getNode(), false);
5310 // PHI nodes have already been selected, so we should know which VReg that
5311 // is assigns to already.
5312 if (isa
<PHINode
>(V
)) {
5313 auto VMI
= FuncInfo
.ValueMap
.find(V
);
5314 if (VMI
!= FuncInfo
.ValueMap
.end()) {
5315 unsigned Reg
= VMI
->second
;
5316 // The PHI node may be split up into several MI PHI nodes (in
5317 // FunctionLoweringInfo::set).
5318 RegsForValue
RFV(V
->getContext(), TLI
, DAG
.getDataLayout(), Reg
,
5319 V
->getType(), None
);
5320 if (RFV
.occupiesMultipleRegs()) {
5321 unsigned Offset
= 0;
5322 unsigned BitsToDescribe
= 0;
5323 if (auto VarSize
= Variable
->getSizeInBits())
5324 BitsToDescribe
= *VarSize
;
5325 if (auto Fragment
= Expression
->getFragmentInfo())
5326 BitsToDescribe
= Fragment
->SizeInBits
;
5327 for (auto RegAndSize
: RFV
.getRegsAndSizes()) {
5328 unsigned RegisterSize
= RegAndSize
.second
;
5329 // Bail out if all bits are described already.
5330 if (Offset
>= BitsToDescribe
)
5332 unsigned FragmentSize
= (Offset
+ RegisterSize
> BitsToDescribe
)
5333 ? BitsToDescribe
- Offset
5335 auto FragmentExpr
= DIExpression::createFragmentExpression(
5336 Expression
, Offset
, FragmentSize
);
5339 SDV
= DAG
.getVRegDbgValue(Variable
, *FragmentExpr
, RegAndSize
.first
,
5340 false, dl
, SDNodeOrder
);
5341 DAG
.AddDbgValue(SDV
, nullptr, false);
5342 Offset
+= RegisterSize
;
5345 SDV
= DAG
.getVRegDbgValue(Variable
, Expression
, Reg
, false, dl
,
5347 DAG
.AddDbgValue(SDV
, nullptr, false);
5353 // TODO: When we get here we will either drop the dbg.value completely, or
5354 // we try to move it forward by letting it dangle for awhile. So we should
5355 // probably add an extra DbgValue to the DAG here, with a reference to
5356 // "noreg", to indicate that we have lost the debug location for the
5359 if (!V
->use_empty() ) {
5360 // Do not call getValue(V) yet, as we don't want to generate code.
5361 // Remember it for later.
5362 DanglingDebugInfoMap
[V
].emplace_back(&DI
, dl
, SDNodeOrder
);
5366 LLVM_DEBUG(dbgs() << "Dropping debug location info for:\n " << DI
<< "\n");
5367 LLVM_DEBUG(dbgs() << " Last seen at:\n " << *V
<< "\n");
5371 case Intrinsic::eh_typeid_for
: {
5372 // Find the type id for the given typeinfo.
5373 GlobalValue
*GV
= ExtractTypeInfo(I
.getArgOperand(0));
5374 unsigned TypeID
= DAG
.getMachineFunction().getTypeIDFor(GV
);
5375 Res
= DAG
.getConstant(TypeID
, sdl
, MVT::i32
);
5380 case Intrinsic::eh_return_i32
:
5381 case Intrinsic::eh_return_i64
:
5382 DAG
.getMachineFunction().setCallsEHReturn(true);
5383 DAG
.setRoot(DAG
.getNode(ISD::EH_RETURN
, sdl
,
5386 getValue(I
.getArgOperand(0)),
5387 getValue(I
.getArgOperand(1))));
5389 case Intrinsic::eh_unwind_init
:
5390 DAG
.getMachineFunction().setCallsUnwindInit(true);
5392 case Intrinsic::eh_dwarf_cfa
:
5393 setValue(&I
, DAG
.getNode(ISD::EH_DWARF_CFA
, sdl
,
5394 TLI
.getPointerTy(DAG
.getDataLayout()),
5395 getValue(I
.getArgOperand(0))));
5397 case Intrinsic::eh_sjlj_callsite
: {
5398 MachineModuleInfo
&MMI
= DAG
.getMachineFunction().getMMI();
5399 ConstantInt
*CI
= dyn_cast
<ConstantInt
>(I
.getArgOperand(0));
5400 assert(CI
&& "Non-constant call site value in eh.sjlj.callsite!");
5401 assert(MMI
.getCurrentCallSite() == 0 && "Overlapping call sites!");
5403 MMI
.setCurrentCallSite(CI
->getZExtValue());
5406 case Intrinsic::eh_sjlj_functioncontext
: {
5407 // Get and store the index of the function context.
5408 MachineFrameInfo
&MFI
= DAG
.getMachineFunction().getFrameInfo();
5410 cast
<AllocaInst
>(I
.getArgOperand(0)->stripPointerCasts());
5411 int FI
= FuncInfo
.StaticAllocaMap
[FnCtx
];
5412 MFI
.setFunctionContextIndex(FI
);
5415 case Intrinsic::eh_sjlj_setjmp
: {
5418 Ops
[1] = getValue(I
.getArgOperand(0));
5419 SDValue Op
= DAG
.getNode(ISD::EH_SJLJ_SETJMP
, sdl
,
5420 DAG
.getVTList(MVT::i32
, MVT::Other
), Ops
);
5421 setValue(&I
, Op
.getValue(0));
5422 DAG
.setRoot(Op
.getValue(1));
5425 case Intrinsic::eh_sjlj_longjmp
:
5426 DAG
.setRoot(DAG
.getNode(ISD::EH_SJLJ_LONGJMP
, sdl
, MVT::Other
,
5427 getRoot(), getValue(I
.getArgOperand(0))));
5429 case Intrinsic::eh_sjlj_setup_dispatch
:
5430 DAG
.setRoot(DAG
.getNode(ISD::EH_SJLJ_SETUP_DISPATCH
, sdl
, MVT::Other
,
5433 case Intrinsic::masked_gather
:
5434 visitMaskedGather(I
);
5436 case Intrinsic::masked_load
:
5439 case Intrinsic::masked_scatter
:
5440 visitMaskedScatter(I
);
5442 case Intrinsic::masked_store
:
5443 visitMaskedStore(I
);
5445 case Intrinsic::masked_expandload
:
5446 visitMaskedLoad(I
, true /* IsExpanding */);
5448 case Intrinsic::masked_compressstore
:
5449 visitMaskedStore(I
, true /* IsCompressing */);
5451 case Intrinsic::x86_mmx_pslli_w
:
5452 case Intrinsic::x86_mmx_pslli_d
:
5453 case Intrinsic::x86_mmx_pslli_q
:
5454 case Intrinsic::x86_mmx_psrli_w
:
5455 case Intrinsic::x86_mmx_psrli_d
:
5456 case Intrinsic::x86_mmx_psrli_q
:
5457 case Intrinsic::x86_mmx_psrai_w
:
5458 case Intrinsic::x86_mmx_psrai_d
: {
5459 SDValue ShAmt
= getValue(I
.getArgOperand(1));
5460 if (isa
<ConstantSDNode
>(ShAmt
)) {
5461 visitTargetIntrinsic(I
, Intrinsic
);
5464 unsigned NewIntrinsic
= 0;
5465 EVT ShAmtVT
= MVT::v2i32
;
5466 switch (Intrinsic
) {
5467 case Intrinsic::x86_mmx_pslli_w
:
5468 NewIntrinsic
= Intrinsic::x86_mmx_psll_w
;
5470 case Intrinsic::x86_mmx_pslli_d
:
5471 NewIntrinsic
= Intrinsic::x86_mmx_psll_d
;
5473 case Intrinsic::x86_mmx_pslli_q
:
5474 NewIntrinsic
= Intrinsic::x86_mmx_psll_q
;
5476 case Intrinsic::x86_mmx_psrli_w
:
5477 NewIntrinsic
= Intrinsic::x86_mmx_psrl_w
;
5479 case Intrinsic::x86_mmx_psrli_d
:
5480 NewIntrinsic
= Intrinsic::x86_mmx_psrl_d
;
5482 case Intrinsic::x86_mmx_psrli_q
:
5483 NewIntrinsic
= Intrinsic::x86_mmx_psrl_q
;
5485 case Intrinsic::x86_mmx_psrai_w
:
5486 NewIntrinsic
= Intrinsic::x86_mmx_psra_w
;
5488 case Intrinsic::x86_mmx_psrai_d
:
5489 NewIntrinsic
= Intrinsic::x86_mmx_psra_d
;
5491 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
5494 // The vector shift intrinsics with scalars uses 32b shift amounts but
5495 // the sse2/mmx shift instructions reads 64 bits. Set the upper 32 bits
5497 // We must do this early because v2i32 is not a legal type.
5500 ShOps
[1] = DAG
.getConstant(0, sdl
, MVT::i32
);
5501 ShAmt
= DAG
.getBuildVector(ShAmtVT
, sdl
, ShOps
);
5502 EVT DestVT
= TLI
.getValueType(DAG
.getDataLayout(), I
.getType());
5503 ShAmt
= DAG
.getNode(ISD::BITCAST
, sdl
, DestVT
, ShAmt
);
5504 Res
= DAG
.getNode(ISD::INTRINSIC_WO_CHAIN
, sdl
, DestVT
,
5505 DAG
.getConstant(NewIntrinsic
, sdl
, MVT::i32
),
5506 getValue(I
.getArgOperand(0)), ShAmt
);
5510 case Intrinsic::powi
:
5511 setValue(&I
, ExpandPowI(sdl
, getValue(I
.getArgOperand(0)),
5512 getValue(I
.getArgOperand(1)), DAG
));
5514 case Intrinsic::log
:
5515 setValue(&I
, expandLog(sdl
, getValue(I
.getArgOperand(0)), DAG
, TLI
));
5517 case Intrinsic::log2
:
5518 setValue(&I
, expandLog2(sdl
, getValue(I
.getArgOperand(0)), DAG
, TLI
));
5520 case Intrinsic::log10
:
5521 setValue(&I
, expandLog10(sdl
, getValue(I
.getArgOperand(0)), DAG
, TLI
));
5523 case Intrinsic::exp
:
5524 setValue(&I
, expandExp(sdl
, getValue(I
.getArgOperand(0)), DAG
, TLI
));
5526 case Intrinsic::exp2
:
5527 setValue(&I
, expandExp2(sdl
, getValue(I
.getArgOperand(0)), DAG
, TLI
));
5529 case Intrinsic::pow
:
5530 setValue(&I
, expandPow(sdl
, getValue(I
.getArgOperand(0)),
5531 getValue(I
.getArgOperand(1)), DAG
, TLI
));
5533 case Intrinsic::sqrt
:
5534 case Intrinsic::fabs
:
5535 case Intrinsic::sin
:
5536 case Intrinsic::cos
:
5537 case Intrinsic::floor
:
5538 case Intrinsic::ceil
:
5539 case Intrinsic::trunc
:
5540 case Intrinsic::rint
:
5541 case Intrinsic::nearbyint
:
5542 case Intrinsic::round
:
5543 case Intrinsic::canonicalize
: {
5545 switch (Intrinsic
) {
5546 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
5547 case Intrinsic::sqrt
: Opcode
= ISD::FSQRT
; break;
5548 case Intrinsic::fabs
: Opcode
= ISD::FABS
; break;
5549 case Intrinsic::sin
: Opcode
= ISD::FSIN
; break;
5550 case Intrinsic::cos
: Opcode
= ISD::FCOS
; break;
5551 case Intrinsic::floor
: Opcode
= ISD::FFLOOR
; break;
5552 case Intrinsic::ceil
: Opcode
= ISD::FCEIL
; break;
5553 case Intrinsic::trunc
: Opcode
= ISD::FTRUNC
; break;
5554 case Intrinsic::rint
: Opcode
= ISD::FRINT
; break;
5555 case Intrinsic::nearbyint
: Opcode
= ISD::FNEARBYINT
; break;
5556 case Intrinsic::round
: Opcode
= ISD::FROUND
; break;
5557 case Intrinsic::canonicalize
: Opcode
= ISD::FCANONICALIZE
; break;
5560 setValue(&I
, DAG
.getNode(Opcode
, sdl
,
5561 getValue(I
.getArgOperand(0)).getValueType(),
5562 getValue(I
.getArgOperand(0))));
5565 case Intrinsic::minnum
: {
5566 auto VT
= getValue(I
.getArgOperand(0)).getValueType();
5568 I
.hasNoNaNs() && TLI
.isOperationLegalOrCustom(ISD::FMINNAN
, VT
)
5571 setValue(&I
, DAG
.getNode(Opc
, sdl
, VT
,
5572 getValue(I
.getArgOperand(0)),
5573 getValue(I
.getArgOperand(1))));
5576 case Intrinsic::maxnum
: {
5577 auto VT
= getValue(I
.getArgOperand(0)).getValueType();
5579 I
.hasNoNaNs() && TLI
.isOperationLegalOrCustom(ISD::FMAXNAN
, VT
)
5582 setValue(&I
, DAG
.getNode(Opc
, sdl
, VT
,
5583 getValue(I
.getArgOperand(0)),
5584 getValue(I
.getArgOperand(1))));
5587 case Intrinsic::copysign
:
5588 setValue(&I
, DAG
.getNode(ISD::FCOPYSIGN
, sdl
,
5589 getValue(I
.getArgOperand(0)).getValueType(),
5590 getValue(I
.getArgOperand(0)),
5591 getValue(I
.getArgOperand(1))));
5593 case Intrinsic::fma
:
5594 setValue(&I
, DAG
.getNode(ISD::FMA
, sdl
,
5595 getValue(I
.getArgOperand(0)).getValueType(),
5596 getValue(I
.getArgOperand(0)),
5597 getValue(I
.getArgOperand(1)),
5598 getValue(I
.getArgOperand(2))));
5600 case Intrinsic::experimental_constrained_fadd
:
5601 case Intrinsic::experimental_constrained_fsub
:
5602 case Intrinsic::experimental_constrained_fmul
:
5603 case Intrinsic::experimental_constrained_fdiv
:
5604 case Intrinsic::experimental_constrained_frem
:
5605 case Intrinsic::experimental_constrained_fma
:
5606 case Intrinsic::experimental_constrained_sqrt
:
5607 case Intrinsic::experimental_constrained_pow
:
5608 case Intrinsic::experimental_constrained_powi
:
5609 case Intrinsic::experimental_constrained_sin
:
5610 case Intrinsic::experimental_constrained_cos
:
5611 case Intrinsic::experimental_constrained_exp
:
5612 case Intrinsic::experimental_constrained_exp2
:
5613 case Intrinsic::experimental_constrained_log
:
5614 case Intrinsic::experimental_constrained_log10
:
5615 case Intrinsic::experimental_constrained_log2
:
5616 case Intrinsic::experimental_constrained_rint
:
5617 case Intrinsic::experimental_constrained_nearbyint
:
5618 visitConstrainedFPIntrinsic(cast
<ConstrainedFPIntrinsic
>(I
));
5620 case Intrinsic::fmuladd
: {
5621 EVT VT
= TLI
.getValueType(DAG
.getDataLayout(), I
.getType());
5622 if (TM
.Options
.AllowFPOpFusion
!= FPOpFusion::Strict
&&
5623 TLI
.isFMAFasterThanFMulAndFAdd(VT
)) {
5624 setValue(&I
, DAG
.getNode(ISD::FMA
, sdl
,
5625 getValue(I
.getArgOperand(0)).getValueType(),
5626 getValue(I
.getArgOperand(0)),
5627 getValue(I
.getArgOperand(1)),
5628 getValue(I
.getArgOperand(2))));
5630 // TODO: Intrinsic calls should have fast-math-flags.
5631 SDValue Mul
= DAG
.getNode(ISD::FMUL
, sdl
,
5632 getValue(I
.getArgOperand(0)).getValueType(),
5633 getValue(I
.getArgOperand(0)),
5634 getValue(I
.getArgOperand(1)));
5635 SDValue Add
= DAG
.getNode(ISD::FADD
, sdl
,
5636 getValue(I
.getArgOperand(0)).getValueType(),
5638 getValue(I
.getArgOperand(2)));
5643 case Intrinsic::convert_to_fp16
:
5644 setValue(&I
, DAG
.getNode(ISD::BITCAST
, sdl
, MVT::i16
,
5645 DAG
.getNode(ISD::FP_ROUND
, sdl
, MVT::f16
,
5646 getValue(I
.getArgOperand(0)),
5647 DAG
.getTargetConstant(0, sdl
,
5650 case Intrinsic::convert_from_fp16
:
5651 setValue(&I
, DAG
.getNode(ISD::FP_EXTEND
, sdl
,
5652 TLI
.getValueType(DAG
.getDataLayout(), I
.getType()),
5653 DAG
.getNode(ISD::BITCAST
, sdl
, MVT::f16
,
5654 getValue(I
.getArgOperand(0)))));
5656 case Intrinsic::pcmarker
: {
5657 SDValue Tmp
= getValue(I
.getArgOperand(0));
5658 DAG
.setRoot(DAG
.getNode(ISD::PCMARKER
, sdl
, MVT::Other
, getRoot(), Tmp
));
5661 case Intrinsic::readcyclecounter
: {
5662 SDValue Op
= getRoot();
5663 Res
= DAG
.getNode(ISD::READCYCLECOUNTER
, sdl
,
5664 DAG
.getVTList(MVT::i64
, MVT::Other
), Op
);
5666 DAG
.setRoot(Res
.getValue(1));
5669 case Intrinsic::bitreverse
:
5670 setValue(&I
, DAG
.getNode(ISD::BITREVERSE
, sdl
,
5671 getValue(I
.getArgOperand(0)).getValueType(),
5672 getValue(I
.getArgOperand(0))));
5674 case Intrinsic::bswap
:
5675 setValue(&I
, DAG
.getNode(ISD::BSWAP
, sdl
,
5676 getValue(I
.getArgOperand(0)).getValueType(),
5677 getValue(I
.getArgOperand(0))));
5679 case Intrinsic::cttz
: {
5680 SDValue Arg
= getValue(I
.getArgOperand(0));
5681 ConstantInt
*CI
= cast
<ConstantInt
>(I
.getArgOperand(1));
5682 EVT Ty
= Arg
.getValueType();
5683 setValue(&I
, DAG
.getNode(CI
->isZero() ? ISD::CTTZ
: ISD::CTTZ_ZERO_UNDEF
,
5687 case Intrinsic::ctlz
: {
5688 SDValue Arg
= getValue(I
.getArgOperand(0));
5689 ConstantInt
*CI
= cast
<ConstantInt
>(I
.getArgOperand(1));
5690 EVT Ty
= Arg
.getValueType();
5691 setValue(&I
, DAG
.getNode(CI
->isZero() ? ISD::CTLZ
: ISD::CTLZ_ZERO_UNDEF
,
5695 case Intrinsic::ctpop
: {
5696 SDValue Arg
= getValue(I
.getArgOperand(0));
5697 EVT Ty
= Arg
.getValueType();
5698 setValue(&I
, DAG
.getNode(ISD::CTPOP
, sdl
, Ty
, Arg
));
5701 case Intrinsic::fshl
:
5702 case Intrinsic::fshr
: {
5703 bool IsFSHL
= Intrinsic
== Intrinsic::fshl
;
5704 SDValue X
= getValue(I
.getArgOperand(0));
5705 SDValue Y
= getValue(I
.getArgOperand(1));
5706 SDValue Z
= getValue(I
.getArgOperand(2));
5707 EVT VT
= X
.getValueType();
5708 SDValue BitWidthC
= DAG
.getConstant(VT
.getScalarSizeInBits(), sdl
, VT
);
5709 SDValue Zero
= DAG
.getConstant(0, sdl
, VT
);
5710 SDValue ShAmt
= DAG
.getNode(ISD::UREM
, sdl
, VT
, Z
, BitWidthC
);
5712 // When X == Y, this is rotate. If the data type has a power-of-2 size, we
5713 // avoid the select that is necessary in the general case to filter out
5714 // the 0-shift possibility that leads to UB.
5715 if (X
== Y
&& isPowerOf2_32(VT
.getScalarSizeInBits())) {
5716 // TODO: This should also be done if the operation is custom, but we have
5717 // to make sure targets are handling the modulo shift amount as expected.
5718 auto RotateOpcode
= IsFSHL
? ISD::ROTL
: ISD::ROTR
;
5719 if (TLI
.isOperationLegal(RotateOpcode
, VT
)) {
5720 setValue(&I
, DAG
.getNode(RotateOpcode
, sdl
, VT
, X
, Z
));
5724 // Some targets only rotate one way. Try the opposite direction.
5725 RotateOpcode
= IsFSHL
? ISD::ROTR
: ISD::ROTL
;
5726 if (TLI
.isOperationLegal(RotateOpcode
, VT
)) {
5727 // Negate the shift amount because it is safe to ignore the high bits.
5728 SDValue NegShAmt
= DAG
.getNode(ISD::SUB
, sdl
, VT
, Zero
, Z
);
5729 setValue(&I
, DAG
.getNode(RotateOpcode
, sdl
, VT
, X
, NegShAmt
));
5733 // fshl (rotl): (X << (Z % BW)) | (X >> ((0 - Z) % BW))
5734 // fshr (rotr): (X << ((0 - Z) % BW)) | (X >> (Z % BW))
5735 SDValue NegZ
= DAG
.getNode(ISD::SUB
, sdl
, VT
, Zero
, Z
);
5736 SDValue NShAmt
= DAG
.getNode(ISD::UREM
, sdl
, VT
, NegZ
, BitWidthC
);
5737 SDValue ShX
= DAG
.getNode(ISD::SHL
, sdl
, VT
, X
, IsFSHL
? ShAmt
: NShAmt
);
5738 SDValue ShY
= DAG
.getNode(ISD::SRL
, sdl
, VT
, X
, IsFSHL
? NShAmt
: ShAmt
);
5739 setValue(&I
, DAG
.getNode(ISD::OR
, sdl
, VT
, ShX
, ShY
));
5743 // fshl: (X << (Z % BW)) | (Y >> (BW - (Z % BW)))
5744 // fshr: (X << (BW - (Z % BW))) | (Y >> (Z % BW))
5745 SDValue InvShAmt
= DAG
.getNode(ISD::SUB
, sdl
, VT
, BitWidthC
, ShAmt
);
5746 SDValue ShX
= DAG
.getNode(ISD::SHL
, sdl
, VT
, X
, IsFSHL
? ShAmt
: InvShAmt
);
5747 SDValue ShY
= DAG
.getNode(ISD::SRL
, sdl
, VT
, Y
, IsFSHL
? InvShAmt
: ShAmt
);
5748 SDValue Or
= DAG
.getNode(ISD::OR
, sdl
, VT
, ShX
, ShY
);
5750 // If (Z % BW == 0), then the opposite direction shift is shift-by-bitwidth,
5751 // and that is undefined. We must compare and select to avoid UB.
5754 CCVT
= EVT::getVectorVT(*Context
, CCVT
, VT
.getVectorNumElements());
5756 // For fshl, 0-shift returns the 1st arg (X).
5757 // For fshr, 0-shift returns the 2nd arg (Y).
5758 SDValue IsZeroShift
= DAG
.getSetCC(sdl
, CCVT
, ShAmt
, Zero
, ISD::SETEQ
);
5759 setValue(&I
, DAG
.getSelect(sdl
, VT
, IsZeroShift
, IsFSHL
? X
: Y
, Or
));
5762 case Intrinsic::stacksave
: {
5763 SDValue Op
= getRoot();
5765 ISD::STACKSAVE
, sdl
,
5766 DAG
.getVTList(TLI
.getPointerTy(DAG
.getDataLayout()), MVT::Other
), Op
);
5768 DAG
.setRoot(Res
.getValue(1));
5771 case Intrinsic::stackrestore
:
5772 Res
= getValue(I
.getArgOperand(0));
5773 DAG
.setRoot(DAG
.getNode(ISD::STACKRESTORE
, sdl
, MVT::Other
, getRoot(), Res
));
5775 case Intrinsic::get_dynamic_area_offset
: {
5776 SDValue Op
= getRoot();
5777 EVT PtrTy
= TLI
.getPointerTy(DAG
.getDataLayout());
5778 EVT ResTy
= TLI
.getValueType(DAG
.getDataLayout(), I
.getType());
5779 // Result type for @llvm.get.dynamic.area.offset should match PtrTy for
5782 report_fatal_error("Wrong result type for @llvm.get.dynamic.area.offset"
5784 Res
= DAG
.getNode(ISD::GET_DYNAMIC_AREA_OFFSET
, sdl
, DAG
.getVTList(ResTy
),
5790 case Intrinsic::stackguard
: {
5791 EVT PtrTy
= TLI
.getPointerTy(DAG
.getDataLayout());
5792 MachineFunction
&MF
= DAG
.getMachineFunction();
5793 const Module
&M
= *MF
.getFunction().getParent();
5794 SDValue Chain
= getRoot();
5795 if (TLI
.useLoadStackGuardNode()) {
5796 Res
= getLoadStackGuard(DAG
, sdl
, Chain
);
5798 const Value
*Global
= TLI
.getSDagStackGuard(M
);
5799 unsigned Align
= DL
->getPrefTypeAlignment(Global
->getType());
5800 Res
= DAG
.getLoad(PtrTy
, sdl
, Chain
, getValue(Global
),
5801 MachinePointerInfo(Global
, 0), Align
,
5802 MachineMemOperand::MOVolatile
);
5804 if (TLI
.useStackGuardXorFP())
5805 Res
= TLI
.emitStackGuardXorFP(DAG
, Res
, sdl
);
5810 case Intrinsic::stackprotector
: {
5811 // Emit code into the DAG to store the stack guard onto the stack.
5812 MachineFunction
&MF
= DAG
.getMachineFunction();
5813 MachineFrameInfo
&MFI
= MF
.getFrameInfo();
5814 EVT PtrTy
= TLI
.getPointerTy(DAG
.getDataLayout());
5815 SDValue Src
, Chain
= getRoot();
5817 if (TLI
.useLoadStackGuardNode())
5818 Src
= getLoadStackGuard(DAG
, sdl
, Chain
);
5820 Src
= getValue(I
.getArgOperand(0)); // The guard's value.
5822 AllocaInst
*Slot
= cast
<AllocaInst
>(I
.getArgOperand(1));
5824 int FI
= FuncInfo
.StaticAllocaMap
[Slot
];
5825 MFI
.setStackProtectorIndex(FI
);
5827 SDValue FIN
= DAG
.getFrameIndex(FI
, PtrTy
);
5829 // Store the stack protector onto the stack.
5830 Res
= DAG
.getStore(Chain
, sdl
, Src
, FIN
, MachinePointerInfo::getFixedStack(
5831 DAG
.getMachineFunction(), FI
),
5832 /* Alignment = */ 0, MachineMemOperand::MOVolatile
);
5837 case Intrinsic::objectsize
: {
5838 // If we don't know by now, we're never going to know.
5839 ConstantInt
*CI
= dyn_cast
<ConstantInt
>(I
.getArgOperand(1));
5841 assert(CI
&& "Non-constant type in __builtin_object_size?");
5843 SDValue Arg
= getValue(I
.getCalledValue());
5844 EVT Ty
= Arg
.getValueType();
5847 Res
= DAG
.getConstant(-1ULL, sdl
, Ty
);
5849 Res
= DAG
.getConstant(0, sdl
, Ty
);
5854 case Intrinsic::annotation
:
5855 case Intrinsic::ptr_annotation
:
5856 case Intrinsic::launder_invariant_group
:
5857 case Intrinsic::strip_invariant_group
:
5858 // Drop the intrinsic, but forward the value
5859 setValue(&I
, getValue(I
.getOperand(0)));
5861 case Intrinsic::assume
:
5862 case Intrinsic::var_annotation
:
5863 case Intrinsic::sideeffect
:
5864 // Discard annotate attributes, assumptions, and artificial side-effects.
5867 case Intrinsic::codeview_annotation
: {
5868 // Emit a label associated with this metadata.
5869 MachineFunction
&MF
= DAG
.getMachineFunction();
5871 MF
.getMMI().getContext().createTempSymbol("annotation", true);
5872 Metadata
*MD
= cast
<MetadataAsValue
>(I
.getArgOperand(0))->getMetadata();
5873 MF
.addCodeViewAnnotation(Label
, cast
<MDNode
>(MD
));
5874 Res
= DAG
.getLabelNode(ISD::ANNOTATION_LABEL
, sdl
, getRoot(), Label
);
5879 case Intrinsic::init_trampoline
: {
5880 const Function
*F
= cast
<Function
>(I
.getArgOperand(1)->stripPointerCasts());
5884 Ops
[1] = getValue(I
.getArgOperand(0));
5885 Ops
[2] = getValue(I
.getArgOperand(1));
5886 Ops
[3] = getValue(I
.getArgOperand(2));
5887 Ops
[4] = DAG
.getSrcValue(I
.getArgOperand(0));
5888 Ops
[5] = DAG
.getSrcValue(F
);
5890 Res
= DAG
.getNode(ISD::INIT_TRAMPOLINE
, sdl
, MVT::Other
, Ops
);
5895 case Intrinsic::adjust_trampoline
:
5896 setValue(&I
, DAG
.getNode(ISD::ADJUST_TRAMPOLINE
, sdl
,
5897 TLI
.getPointerTy(DAG
.getDataLayout()),
5898 getValue(I
.getArgOperand(0))));
5900 case Intrinsic::gcroot
: {
5901 assert(DAG
.getMachineFunction().getFunction().hasGC() &&
5902 "only valid in functions with gc specified, enforced by Verifier");
5903 assert(GFI
&& "implied by previous");
5904 const Value
*Alloca
= I
.getArgOperand(0)->stripPointerCasts();
5905 const Constant
*TypeMap
= cast
<Constant
>(I
.getArgOperand(1));
5907 FrameIndexSDNode
*FI
= cast
<FrameIndexSDNode
>(getValue(Alloca
).getNode());
5908 GFI
->addStackRoot(FI
->getIndex(), TypeMap
);
5911 case Intrinsic::gcread
:
5912 case Intrinsic::gcwrite
:
5913 llvm_unreachable("GC failed to lower gcread/gcwrite intrinsics!");
5914 case Intrinsic::flt_rounds
:
5915 setValue(&I
, DAG
.getNode(ISD::FLT_ROUNDS_
, sdl
, MVT::i32
));
5918 case Intrinsic::expect
:
5919 // Just replace __builtin_expect(exp, c) with EXP.
5920 setValue(&I
, getValue(I
.getArgOperand(0)));
5923 case Intrinsic::debugtrap
:
5924 case Intrinsic::trap
: {
5925 StringRef TrapFuncName
=
5927 .getAttribute(AttributeList::FunctionIndex
, "trap-func-name")
5928 .getValueAsString();
5929 if (TrapFuncName
.empty()) {
5930 ISD::NodeType Op
= (Intrinsic
== Intrinsic::trap
) ?
5931 ISD::TRAP
: ISD::DEBUGTRAP
;
5932 DAG
.setRoot(DAG
.getNode(Op
, sdl
,MVT::Other
, getRoot()));
5935 TargetLowering::ArgListTy Args
;
5937 TargetLowering::CallLoweringInfo
CLI(DAG
);
5938 CLI
.setDebugLoc(sdl
).setChain(getRoot()).setLibCallee(
5939 CallingConv::C
, I
.getType(),
5940 DAG
.getExternalSymbol(TrapFuncName
.data(),
5941 TLI
.getPointerTy(DAG
.getDataLayout())),
5944 std::pair
<SDValue
, SDValue
> Result
= TLI
.LowerCallTo(CLI
);
5945 DAG
.setRoot(Result
.second
);
5949 case Intrinsic::uadd_with_overflow
:
5950 case Intrinsic::sadd_with_overflow
:
5951 case Intrinsic::usub_with_overflow
:
5952 case Intrinsic::ssub_with_overflow
:
5953 case Intrinsic::umul_with_overflow
:
5954 case Intrinsic::smul_with_overflow
: {
5956 switch (Intrinsic
) {
5957 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
5958 case Intrinsic::uadd_with_overflow
: Op
= ISD::UADDO
; break;
5959 case Intrinsic::sadd_with_overflow
: Op
= ISD::SADDO
; break;
5960 case Intrinsic::usub_with_overflow
: Op
= ISD::USUBO
; break;
5961 case Intrinsic::ssub_with_overflow
: Op
= ISD::SSUBO
; break;
5962 case Intrinsic::umul_with_overflow
: Op
= ISD::UMULO
; break;
5963 case Intrinsic::smul_with_overflow
: Op
= ISD::SMULO
; break;
5965 SDValue Op1
= getValue(I
.getArgOperand(0));
5966 SDValue Op2
= getValue(I
.getArgOperand(1));
5968 SDVTList VTs
= DAG
.getVTList(Op1
.getValueType(), MVT::i1
);
5969 setValue(&I
, DAG
.getNode(Op
, sdl
, VTs
, Op1
, Op2
));
5972 case Intrinsic::prefetch
: {
5974 unsigned rw
= cast
<ConstantInt
>(I
.getArgOperand(1))->getZExtValue();
5975 auto Flags
= rw
== 0 ? MachineMemOperand::MOLoad
:MachineMemOperand::MOStore
;
5976 Ops
[0] = DAG
.getRoot();
5977 Ops
[1] = getValue(I
.getArgOperand(0));
5978 Ops
[2] = getValue(I
.getArgOperand(1));
5979 Ops
[3] = getValue(I
.getArgOperand(2));
5980 Ops
[4] = getValue(I
.getArgOperand(3));
5981 SDValue Result
= DAG
.getMemIntrinsicNode(ISD::PREFETCH
, sdl
,
5982 DAG
.getVTList(MVT::Other
), Ops
,
5983 EVT::getIntegerVT(*Context
, 8),
5984 MachinePointerInfo(I
.getArgOperand(0)),
5988 // Chain the prefetch in parallell with any pending loads, to stay out of
5989 // the way of later optimizations.
5990 PendingLoads
.push_back(Result
);
5992 DAG
.setRoot(Result
);
5995 case Intrinsic::lifetime_start
:
5996 case Intrinsic::lifetime_end
: {
5997 bool IsStart
= (Intrinsic
== Intrinsic::lifetime_start
);
5998 // Stack coloring is not enabled in O0, discard region information.
5999 if (TM
.getOptLevel() == CodeGenOpt::None
)
6002 SmallVector
<Value
*, 4> Allocas
;
6003 GetUnderlyingObjects(I
.getArgOperand(1), Allocas
, *DL
);
6005 for (SmallVectorImpl
<Value
*>::iterator Object
= Allocas
.begin(),
6006 E
= Allocas
.end(); Object
!= E
; ++Object
) {
6007 AllocaInst
*LifetimeObject
= dyn_cast_or_null
<AllocaInst
>(*Object
);
6009 // Could not find an Alloca.
6010 if (!LifetimeObject
)
6013 // First check that the Alloca is static, otherwise it won't have a
6014 // valid frame index.
6015 auto SI
= FuncInfo
.StaticAllocaMap
.find(LifetimeObject
);
6016 if (SI
== FuncInfo
.StaticAllocaMap
.end())
6019 int FI
= SI
->second
;
6024 DAG
.getFrameIndex(FI
, TLI
.getFrameIndexTy(DAG
.getDataLayout()), true);
6025 unsigned Opcode
= (IsStart
? ISD::LIFETIME_START
: ISD::LIFETIME_END
);
6027 Res
= DAG
.getNode(Opcode
, sdl
, MVT::Other
, Ops
);
6032 case Intrinsic::invariant_start
:
6033 // Discard region information.
6034 setValue(&I
, DAG
.getUNDEF(TLI
.getPointerTy(DAG
.getDataLayout())));
6036 case Intrinsic::invariant_end
:
6037 // Discard region information.
6039 case Intrinsic::clear_cache
:
6040 return TLI
.getClearCacheBuiltinName();
6041 case Intrinsic::donothing
:
6044 case Intrinsic::experimental_stackmap
:
6047 case Intrinsic::experimental_patchpoint_void
:
6048 case Intrinsic::experimental_patchpoint_i64
:
6049 visitPatchpoint(&I
);
6051 case Intrinsic::experimental_gc_statepoint
:
6052 LowerStatepoint(ImmutableStatepoint(&I
));
6054 case Intrinsic::experimental_gc_result
:
6055 visitGCResult(cast
<GCResultInst
>(I
));
6057 case Intrinsic::experimental_gc_relocate
:
6058 visitGCRelocate(cast
<GCRelocateInst
>(I
));
6060 case Intrinsic::instrprof_increment
:
6061 llvm_unreachable("instrprof failed to lower an increment");
6062 case Intrinsic::instrprof_value_profile
:
6063 llvm_unreachable("instrprof failed to lower a value profiling call");
6064 case Intrinsic::localescape
: {
6065 MachineFunction
&MF
= DAG
.getMachineFunction();
6066 const TargetInstrInfo
*TII
= DAG
.getSubtarget().getInstrInfo();
6068 // Directly emit some LOCAL_ESCAPE machine instrs. Label assignment emission
6069 // is the same on all targets.
6070 for (unsigned Idx
= 0, E
= I
.getNumArgOperands(); Idx
< E
; ++Idx
) {
6071 Value
*Arg
= I
.getArgOperand(Idx
)->stripPointerCasts();
6072 if (isa
<ConstantPointerNull
>(Arg
))
6073 continue; // Skip null pointers. They represent a hole in index space.
6074 AllocaInst
*Slot
= cast
<AllocaInst
>(Arg
);
6075 assert(FuncInfo
.StaticAllocaMap
.count(Slot
) &&
6076 "can only escape static allocas");
6077 int FI
= FuncInfo
.StaticAllocaMap
[Slot
];
6078 MCSymbol
*FrameAllocSym
=
6079 MF
.getMMI().getContext().getOrCreateFrameAllocSymbol(
6080 GlobalValue::dropLLVMManglingEscape(MF
.getName()), Idx
);
6081 BuildMI(*FuncInfo
.MBB
, FuncInfo
.InsertPt
, dl
,
6082 TII
->get(TargetOpcode::LOCAL_ESCAPE
))
6083 .addSym(FrameAllocSym
)
6090 case Intrinsic::localrecover
: {
6091 // i8* @llvm.localrecover(i8* %fn, i8* %fp, i32 %idx)
6092 MachineFunction
&MF
= DAG
.getMachineFunction();
6093 MVT PtrVT
= TLI
.getPointerTy(DAG
.getDataLayout(), 0);
6095 // Get the symbol that defines the frame offset.
6096 auto *Fn
= cast
<Function
>(I
.getArgOperand(0)->stripPointerCasts());
6097 auto *Idx
= cast
<ConstantInt
>(I
.getArgOperand(2));
6099 unsigned(Idx
->getLimitedValue(std::numeric_limits
<int>::max()));
6100 MCSymbol
*FrameAllocSym
=
6101 MF
.getMMI().getContext().getOrCreateFrameAllocSymbol(
6102 GlobalValue::dropLLVMManglingEscape(Fn
->getName()), IdxVal
);
6104 // Create a MCSymbol for the label to avoid any target lowering
6105 // that would make this PC relative.
6106 SDValue OffsetSym
= DAG
.getMCSymbol(FrameAllocSym
, PtrVT
);
6108 DAG
.getNode(ISD::LOCAL_RECOVER
, sdl
, PtrVT
, OffsetSym
);
6110 // Add the offset to the FP.
6111 Value
*FP
= I
.getArgOperand(1);
6112 SDValue FPVal
= getValue(FP
);
6113 SDValue Add
= DAG
.getNode(ISD::ADD
, sdl
, PtrVT
, FPVal
, OffsetVal
);
6119 case Intrinsic::eh_exceptionpointer
:
6120 case Intrinsic::eh_exceptioncode
: {
6121 // Get the exception pointer vreg, copy from it, and resize it to fit.
6122 const auto *CPI
= cast
<CatchPadInst
>(I
.getArgOperand(0));
6123 MVT PtrVT
= TLI
.getPointerTy(DAG
.getDataLayout());
6124 const TargetRegisterClass
*PtrRC
= TLI
.getRegClassFor(PtrVT
);
6125 unsigned VReg
= FuncInfo
.getCatchPadExceptionPointerVReg(CPI
, PtrRC
);
6127 DAG
.getCopyFromReg(DAG
.getEntryNode(), getCurSDLoc(), VReg
, PtrVT
);
6128 if (Intrinsic
== Intrinsic::eh_exceptioncode
)
6129 N
= DAG
.getZExtOrTrunc(N
, getCurSDLoc(), MVT::i32
);
6133 case Intrinsic::xray_customevent
: {
6134 // Here we want to make sure that the intrinsic behaves as if it has a
6135 // specific calling convention, and only for x86_64.
6136 // FIXME: Support other platforms later.
6137 const auto &Triple
= DAG
.getTarget().getTargetTriple();
6138 if (Triple
.getArch() != Triple::x86_64
|| !Triple
.isOSLinux())
6141 SDLoc DL
= getCurSDLoc();
6142 SmallVector
<SDValue
, 8> Ops
;
6144 // We want to say that we always want the arguments in registers.
6145 SDValue LogEntryVal
= getValue(I
.getArgOperand(0));
6146 SDValue StrSizeVal
= getValue(I
.getArgOperand(1));
6147 SDVTList NodeTys
= DAG
.getVTList(MVT::Other
, MVT::Glue
);
6148 SDValue Chain
= getRoot();
6149 Ops
.push_back(LogEntryVal
);
6150 Ops
.push_back(StrSizeVal
);
6151 Ops
.push_back(Chain
);
6153 // We need to enforce the calling convention for the callsite, so that
6154 // argument ordering is enforced correctly, and that register allocation can
6155 // see that some registers may be assumed clobbered and have to preserve
6156 // them across calls to the intrinsic.
6157 MachineSDNode
*MN
= DAG
.getMachineNode(TargetOpcode::PATCHABLE_EVENT_CALL
,
6159 SDValue patchableNode
= SDValue(MN
, 0);
6160 DAG
.setRoot(patchableNode
);
6161 setValue(&I
, patchableNode
);
6164 case Intrinsic::xray_typedevent
: {
6165 // Here we want to make sure that the intrinsic behaves as if it has a
6166 // specific calling convention, and only for x86_64.
6167 // FIXME: Support other platforms later.
6168 const auto &Triple
= DAG
.getTarget().getTargetTriple();
6169 if (Triple
.getArch() != Triple::x86_64
|| !Triple
.isOSLinux())
6172 SDLoc DL
= getCurSDLoc();
6173 SmallVector
<SDValue
, 8> Ops
;
6175 // We want to say that we always want the arguments in registers.
6176 // It's unclear to me how manipulating the selection DAG here forces callers
6177 // to provide arguments in registers instead of on the stack.
6178 SDValue LogTypeId
= getValue(I
.getArgOperand(0));
6179 SDValue LogEntryVal
= getValue(I
.getArgOperand(1));
6180 SDValue StrSizeVal
= getValue(I
.getArgOperand(2));
6181 SDVTList NodeTys
= DAG
.getVTList(MVT::Other
, MVT::Glue
);
6182 SDValue Chain
= getRoot();
6183 Ops
.push_back(LogTypeId
);
6184 Ops
.push_back(LogEntryVal
);
6185 Ops
.push_back(StrSizeVal
);
6186 Ops
.push_back(Chain
);
6188 // We need to enforce the calling convention for the callsite, so that
6189 // argument ordering is enforced correctly, and that register allocation can
6190 // see that some registers may be assumed clobbered and have to preserve
6191 // them across calls to the intrinsic.
6192 MachineSDNode
*MN
= DAG
.getMachineNode(
6193 TargetOpcode::PATCHABLE_TYPED_EVENT_CALL
, DL
, NodeTys
, Ops
);
6194 SDValue patchableNode
= SDValue(MN
, 0);
6195 DAG
.setRoot(patchableNode
);
6196 setValue(&I
, patchableNode
);
6199 case Intrinsic::experimental_deoptimize
:
6200 LowerDeoptimizeCall(&I
);
6203 case Intrinsic::experimental_vector_reduce_fadd
:
6204 case Intrinsic::experimental_vector_reduce_fmul
:
6205 case Intrinsic::experimental_vector_reduce_add
:
6206 case Intrinsic::experimental_vector_reduce_mul
:
6207 case Intrinsic::experimental_vector_reduce_and
:
6208 case Intrinsic::experimental_vector_reduce_or
:
6209 case Intrinsic::experimental_vector_reduce_xor
:
6210 case Intrinsic::experimental_vector_reduce_smax
:
6211 case Intrinsic::experimental_vector_reduce_smin
:
6212 case Intrinsic::experimental_vector_reduce_umax
:
6213 case Intrinsic::experimental_vector_reduce_umin
:
6214 case Intrinsic::experimental_vector_reduce_fmax
:
6215 case Intrinsic::experimental_vector_reduce_fmin
:
6216 visitVectorReduce(I
, Intrinsic
);
6219 case Intrinsic::icall_branch_funnel
: {
6220 SmallVector
<SDValue
, 16> Ops
;
6221 Ops
.push_back(DAG
.getRoot());
6222 Ops
.push_back(getValue(I
.getArgOperand(0)));
6225 auto *Base
= dyn_cast
<GlobalObject
>(GetPointerBaseWithConstantOffset(
6226 I
.getArgOperand(1), Offset
, DAG
.getDataLayout()));
6229 "llvm.icall.branch.funnel operand must be a GlobalValue");
6230 Ops
.push_back(DAG
.getTargetGlobalAddress(Base
, getCurSDLoc(), MVT::i64
, 0));
6232 struct BranchFunnelTarget
{
6236 SmallVector
<BranchFunnelTarget
, 8> Targets
;
6238 for (unsigned Op
= 1, N
= I
.getNumArgOperands(); Op
!= N
; Op
+= 2) {
6239 auto *ElemBase
= dyn_cast
<GlobalObject
>(GetPointerBaseWithConstantOffset(
6240 I
.getArgOperand(Op
), Offset
, DAG
.getDataLayout()));
6241 if (ElemBase
!= Base
)
6242 report_fatal_error("all llvm.icall.branch.funnel operands must refer "
6243 "to the same GlobalValue");
6245 SDValue Val
= getValue(I
.getArgOperand(Op
+ 1));
6246 auto *GA
= dyn_cast
<GlobalAddressSDNode
>(Val
);
6249 "llvm.icall.branch.funnel operand must be a GlobalValue");
6250 Targets
.push_back({Offset
, DAG
.getTargetGlobalAddress(
6251 GA
->getGlobal(), getCurSDLoc(),
6252 Val
.getValueType(), GA
->getOffset())});
6255 [](const BranchFunnelTarget
&T1
, const BranchFunnelTarget
&T2
) {
6256 return T1
.Offset
< T2
.Offset
;
6259 for (auto &T
: Targets
) {
6260 Ops
.push_back(DAG
.getTargetConstant(T
.Offset
, getCurSDLoc(), MVT::i32
));
6261 Ops
.push_back(T
.Target
);
6264 SDValue
N(DAG
.getMachineNode(TargetOpcode::ICALL_BRANCH_FUNNEL
,
6265 getCurSDLoc(), MVT::Other
, Ops
),
6273 case Intrinsic::wasm_landingpad_index
: {
6274 // TODO store landing pad index in a map, which will be used when generating
6281 void SelectionDAGBuilder::visitConstrainedFPIntrinsic(
6282 const ConstrainedFPIntrinsic
&FPI
) {
6283 SDLoc sdl
= getCurSDLoc();
6285 switch (FPI
.getIntrinsicID()) {
6286 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
6287 case Intrinsic::experimental_constrained_fadd
:
6288 Opcode
= ISD::STRICT_FADD
;
6290 case Intrinsic::experimental_constrained_fsub
:
6291 Opcode
= ISD::STRICT_FSUB
;
6293 case Intrinsic::experimental_constrained_fmul
:
6294 Opcode
= ISD::STRICT_FMUL
;
6296 case Intrinsic::experimental_constrained_fdiv
:
6297 Opcode
= ISD::STRICT_FDIV
;
6299 case Intrinsic::experimental_constrained_frem
:
6300 Opcode
= ISD::STRICT_FREM
;
6302 case Intrinsic::experimental_constrained_fma
:
6303 Opcode
= ISD::STRICT_FMA
;
6305 case Intrinsic::experimental_constrained_sqrt
:
6306 Opcode
= ISD::STRICT_FSQRT
;
6308 case Intrinsic::experimental_constrained_pow
:
6309 Opcode
= ISD::STRICT_FPOW
;
6311 case Intrinsic::experimental_constrained_powi
:
6312 Opcode
= ISD::STRICT_FPOWI
;
6314 case Intrinsic::experimental_constrained_sin
:
6315 Opcode
= ISD::STRICT_FSIN
;
6317 case Intrinsic::experimental_constrained_cos
:
6318 Opcode
= ISD::STRICT_FCOS
;
6320 case Intrinsic::experimental_constrained_exp
:
6321 Opcode
= ISD::STRICT_FEXP
;
6323 case Intrinsic::experimental_constrained_exp2
:
6324 Opcode
= ISD::STRICT_FEXP2
;
6326 case Intrinsic::experimental_constrained_log
:
6327 Opcode
= ISD::STRICT_FLOG
;
6329 case Intrinsic::experimental_constrained_log10
:
6330 Opcode
= ISD::STRICT_FLOG10
;
6332 case Intrinsic::experimental_constrained_log2
:
6333 Opcode
= ISD::STRICT_FLOG2
;
6335 case Intrinsic::experimental_constrained_rint
:
6336 Opcode
= ISD::STRICT_FRINT
;
6338 case Intrinsic::experimental_constrained_nearbyint
:
6339 Opcode
= ISD::STRICT_FNEARBYINT
;
6342 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
6343 SDValue Chain
= getRoot();
6344 SmallVector
<EVT
, 4> ValueVTs
;
6345 ComputeValueVTs(TLI
, DAG
.getDataLayout(), FPI
.getType(), ValueVTs
);
6346 ValueVTs
.push_back(MVT::Other
); // Out chain
6348 SDVTList VTs
= DAG
.getVTList(ValueVTs
);
6350 if (FPI
.isUnaryOp())
6351 Result
= DAG
.getNode(Opcode
, sdl
, VTs
,
6352 { Chain
, getValue(FPI
.getArgOperand(0)) });
6353 else if (FPI
.isTernaryOp())
6354 Result
= DAG
.getNode(Opcode
, sdl
, VTs
,
6355 { Chain
, getValue(FPI
.getArgOperand(0)),
6356 getValue(FPI
.getArgOperand(1)),
6357 getValue(FPI
.getArgOperand(2)) });
6359 Result
= DAG
.getNode(Opcode
, sdl
, VTs
,
6360 { Chain
, getValue(FPI
.getArgOperand(0)),
6361 getValue(FPI
.getArgOperand(1)) });
6363 assert(Result
.getNode()->getNumValues() == 2);
6364 SDValue OutChain
= Result
.getValue(1);
6365 DAG
.setRoot(OutChain
);
6366 SDValue FPResult
= Result
.getValue(0);
6367 setValue(&FPI
, FPResult
);
6370 std::pair
<SDValue
, SDValue
>
6371 SelectionDAGBuilder::lowerInvokable(TargetLowering::CallLoweringInfo
&CLI
,
6372 const BasicBlock
*EHPadBB
) {
6373 MachineFunction
&MF
= DAG
.getMachineFunction();
6374 MachineModuleInfo
&MMI
= MF
.getMMI();
6375 MCSymbol
*BeginLabel
= nullptr;
6378 // Insert a label before the invoke call to mark the try range. This can be
6379 // used to detect deletion of the invoke via the MachineModuleInfo.
6380 BeginLabel
= MMI
.getContext().createTempSymbol();
6382 // For SjLj, keep track of which landing pads go with which invokes
6383 // so as to maintain the ordering of pads in the LSDA.
6384 unsigned CallSiteIndex
= MMI
.getCurrentCallSite();
6385 if (CallSiteIndex
) {
6386 MF
.setCallSiteBeginLabel(BeginLabel
, CallSiteIndex
);
6387 LPadToCallSiteMap
[FuncInfo
.MBBMap
[EHPadBB
]].push_back(CallSiteIndex
);
6389 // Now that the call site is handled, stop tracking it.
6390 MMI
.setCurrentCallSite(0);
6393 // Both PendingLoads and PendingExports must be flushed here;
6394 // this call might not return.
6396 DAG
.setRoot(DAG
.getEHLabel(getCurSDLoc(), getControlRoot(), BeginLabel
));
6398 CLI
.setChain(getRoot());
6400 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
6401 std::pair
<SDValue
, SDValue
> Result
= TLI
.LowerCallTo(CLI
);
6403 assert((CLI
.IsTailCall
|| Result
.second
.getNode()) &&
6404 "Non-null chain expected with non-tail call!");
6405 assert((Result
.second
.getNode() || !Result
.first
.getNode()) &&
6406 "Null value expected with tail call!");
6408 if (!Result
.second
.getNode()) {
6409 // As a special case, a null chain means that a tail call has been emitted
6410 // and the DAG root is already updated.
6413 // Since there's no actual continuation from this block, nothing can be
6414 // relying on us setting vregs for them.
6415 PendingExports
.clear();
6417 DAG
.setRoot(Result
.second
);
6421 // Insert a label at the end of the invoke call to mark the try range. This
6422 // can be used to detect deletion of the invoke via the MachineModuleInfo.
6423 MCSymbol
*EndLabel
= MMI
.getContext().createTempSymbol();
6424 DAG
.setRoot(DAG
.getEHLabel(getCurSDLoc(), getRoot(), EndLabel
));
6426 // Inform MachineModuleInfo of range.
6427 auto Pers
= classifyEHPersonality(FuncInfo
.Fn
->getPersonalityFn());
6428 // There is a platform (e.g. wasm) that uses funclet style IR but does not
6429 // actually use outlined funclets and their LSDA info style.
6430 if (MF
.hasEHFunclets() && isFuncletEHPersonality(Pers
)) {
6432 WinEHFuncInfo
*EHInfo
= DAG
.getMachineFunction().getWinEHFuncInfo();
6433 EHInfo
->addIPToStateRange(cast
<InvokeInst
>(CLI
.CS
.getInstruction()),
6434 BeginLabel
, EndLabel
);
6436 MF
.addInvoke(FuncInfo
.MBBMap
[EHPadBB
], BeginLabel
, EndLabel
);
6443 void SelectionDAGBuilder::LowerCallTo(ImmutableCallSite CS
, SDValue Callee
,
6445 const BasicBlock
*EHPadBB
) {
6446 auto &DL
= DAG
.getDataLayout();
6447 FunctionType
*FTy
= CS
.getFunctionType();
6448 Type
*RetTy
= CS
.getType();
6450 TargetLowering::ArgListTy Args
;
6451 Args
.reserve(CS
.arg_size());
6453 const Value
*SwiftErrorVal
= nullptr;
6454 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
6456 // We can't tail call inside a function with a swifterror argument. Lowering
6457 // does not support this yet. It would have to move into the swifterror
6458 // register before the call.
6459 auto *Caller
= CS
.getInstruction()->getParent()->getParent();
6460 if (TLI
.supportSwiftError() &&
6461 Caller
->getAttributes().hasAttrSomewhere(Attribute::SwiftError
))
6464 for (ImmutableCallSite::arg_iterator i
= CS
.arg_begin(), e
= CS
.arg_end();
6466 TargetLowering::ArgListEntry Entry
;
6467 const Value
*V
= *i
;
6470 if (V
->getType()->isEmptyTy())
6473 SDValue ArgNode
= getValue(V
);
6474 Entry
.Node
= ArgNode
; Entry
.Ty
= V
->getType();
6476 Entry
.setAttributes(&CS
, i
- CS
.arg_begin());
6478 // Use swifterror virtual register as input to the call.
6479 if (Entry
.IsSwiftError
&& TLI
.supportSwiftError()) {
6481 // We find the virtual register for the actual swifterror argument.
6482 // Instead of using the Value, we use the virtual register instead.
6483 Entry
.Node
= DAG
.getRegister(FuncInfo
6484 .getOrCreateSwiftErrorVRegUseAt(
6485 CS
.getInstruction(), FuncInfo
.MBB
, V
)
6487 EVT(TLI
.getPointerTy(DL
)));
6490 Args
.push_back(Entry
);
6492 // If we have an explicit sret argument that is an Instruction, (i.e., it
6493 // might point to function-local memory), we can't meaningfully tail-call.
6494 if (Entry
.IsSRet
&& isa
<Instruction
>(V
))
6498 // Check if target-independent constraints permit a tail call here.
6499 // Target-dependent constraints are checked within TLI->LowerCallTo.
6500 if (isTailCall
&& !isInTailCallPosition(CS
, DAG
.getTarget()))
6503 // Disable tail calls if there is an swifterror argument. Targets have not
6504 // been updated to support tail calls.
6505 if (TLI
.supportSwiftError() && SwiftErrorVal
)
6508 TargetLowering::CallLoweringInfo
CLI(DAG
);
6509 CLI
.setDebugLoc(getCurSDLoc())
6510 .setChain(getRoot())
6511 .setCallee(RetTy
, FTy
, Callee
, std::move(Args
), CS
)
6512 .setTailCall(isTailCall
)
6513 .setConvergent(CS
.isConvergent());
6514 std::pair
<SDValue
, SDValue
> Result
= lowerInvokable(CLI
, EHPadBB
);
6516 if (Result
.first
.getNode()) {
6517 const Instruction
*Inst
= CS
.getInstruction();
6518 Result
.first
= lowerRangeToAssertZExt(DAG
, *Inst
, Result
.first
);
6519 setValue(Inst
, Result
.first
);
6522 // The last element of CLI.InVals has the SDValue for swifterror return.
6523 // Here we copy it to a virtual register and update SwiftErrorMap for
6525 if (SwiftErrorVal
&& TLI
.supportSwiftError()) {
6526 // Get the last element of InVals.
6527 SDValue Src
= CLI
.InVals
.back();
6528 unsigned VReg
; bool CreatedVReg
;
6529 std::tie(VReg
, CreatedVReg
) =
6530 FuncInfo
.getOrCreateSwiftErrorVRegDefAt(CS
.getInstruction());
6531 SDValue CopyNode
= CLI
.DAG
.getCopyToReg(Result
.second
, CLI
.DL
, VReg
, Src
);
6532 // We update the virtual register for the actual swifterror argument.
6534 FuncInfo
.setCurrentSwiftErrorVReg(FuncInfo
.MBB
, SwiftErrorVal
, VReg
);
6535 DAG
.setRoot(CopyNode
);
6539 static SDValue
getMemCmpLoad(const Value
*PtrVal
, MVT LoadVT
,
6540 SelectionDAGBuilder
&Builder
) {
6541 // Check to see if this load can be trivially constant folded, e.g. if the
6542 // input is from a string literal.
6543 if (const Constant
*LoadInput
= dyn_cast
<Constant
>(PtrVal
)) {
6544 // Cast pointer to the type we really want to load.
6546 Type::getIntNTy(PtrVal
->getContext(), LoadVT
.getScalarSizeInBits());
6547 if (LoadVT
.isVector())
6548 LoadTy
= VectorType::get(LoadTy
, LoadVT
.getVectorNumElements());
6550 LoadInput
= ConstantExpr::getBitCast(const_cast<Constant
*>(LoadInput
),
6551 PointerType::getUnqual(LoadTy
));
6553 if (const Constant
*LoadCst
= ConstantFoldLoadFromConstPtr(
6554 const_cast<Constant
*>(LoadInput
), LoadTy
, *Builder
.DL
))
6555 return Builder
.getValue(LoadCst
);
6558 // Otherwise, we have to emit the load. If the pointer is to unfoldable but
6559 // still constant memory, the input chain can be the entry node.
6561 bool ConstantMemory
= false;
6563 // Do not serialize (non-volatile) loads of constant memory with anything.
6564 if (Builder
.AA
&& Builder
.AA
->pointsToConstantMemory(PtrVal
)) {
6565 Root
= Builder
.DAG
.getEntryNode();
6566 ConstantMemory
= true;
6568 // Do not serialize non-volatile loads against each other.
6569 Root
= Builder
.DAG
.getRoot();
6572 SDValue Ptr
= Builder
.getValue(PtrVal
);
6573 SDValue LoadVal
= Builder
.DAG
.getLoad(LoadVT
, Builder
.getCurSDLoc(), Root
,
6574 Ptr
, MachinePointerInfo(PtrVal
),
6575 /* Alignment = */ 1);
6577 if (!ConstantMemory
)
6578 Builder
.PendingLoads
.push_back(LoadVal
.getValue(1));
6582 /// Record the value for an instruction that produces an integer result,
6583 /// converting the type where necessary.
6584 void SelectionDAGBuilder::processIntegerCallValue(const Instruction
&I
,
6587 EVT VT
= DAG
.getTargetLoweringInfo().getValueType(DAG
.getDataLayout(),
6590 Value
= DAG
.getSExtOrTrunc(Value
, getCurSDLoc(), VT
);
6592 Value
= DAG
.getZExtOrTrunc(Value
, getCurSDLoc(), VT
);
6593 setValue(&I
, Value
);
6596 /// See if we can lower a memcmp call into an optimized form. If so, return
6597 /// true and lower it. Otherwise return false, and it will be lowered like a
6599 /// The caller already checked that \p I calls the appropriate LibFunc with a
6600 /// correct prototype.
6601 bool SelectionDAGBuilder::visitMemCmpCall(const CallInst
&I
) {
6602 const Value
*LHS
= I
.getArgOperand(0), *RHS
= I
.getArgOperand(1);
6603 const Value
*Size
= I
.getArgOperand(2);
6604 const ConstantInt
*CSize
= dyn_cast
<ConstantInt
>(Size
);
6605 if (CSize
&& CSize
->getZExtValue() == 0) {
6606 EVT CallVT
= DAG
.getTargetLoweringInfo().getValueType(DAG
.getDataLayout(),
6608 setValue(&I
, DAG
.getConstant(0, getCurSDLoc(), CallVT
));
6612 const SelectionDAGTargetInfo
&TSI
= DAG
.getSelectionDAGInfo();
6613 std::pair
<SDValue
, SDValue
> Res
= TSI
.EmitTargetCodeForMemcmp(
6614 DAG
, getCurSDLoc(), DAG
.getRoot(), getValue(LHS
), getValue(RHS
),
6615 getValue(Size
), MachinePointerInfo(LHS
), MachinePointerInfo(RHS
));
6616 if (Res
.first
.getNode()) {
6617 processIntegerCallValue(I
, Res
.first
, true);
6618 PendingLoads
.push_back(Res
.second
);
6622 // memcmp(S1,S2,2) != 0 -> (*(short*)LHS != *(short*)RHS) != 0
6623 // memcmp(S1,S2,4) != 0 -> (*(int*)LHS != *(int*)RHS) != 0
6624 if (!CSize
|| !isOnlyUsedInZeroEqualityComparison(&I
))
6627 // If the target has a fast compare for the given size, it will return a
6628 // preferred load type for that size. Require that the load VT is legal and
6629 // that the target supports unaligned loads of that type. Otherwise, return
6631 auto hasFastLoadsAndCompare
= [&](unsigned NumBits
) {
6632 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
6633 MVT LVT
= TLI
.hasFastEqualityCompare(NumBits
);
6634 if (LVT
!= MVT::INVALID_SIMPLE_VALUE_TYPE
) {
6635 // TODO: Handle 5 byte compare as 4-byte + 1 byte.
6636 // TODO: Handle 8 byte compare on x86-32 as two 32-bit loads.
6637 // TODO: Check alignment of src and dest ptrs.
6638 unsigned DstAS
= LHS
->getType()->getPointerAddressSpace();
6639 unsigned SrcAS
= RHS
->getType()->getPointerAddressSpace();
6640 if (!TLI
.isTypeLegal(LVT
) ||
6641 !TLI
.allowsMisalignedMemoryAccesses(LVT
, SrcAS
) ||
6642 !TLI
.allowsMisalignedMemoryAccesses(LVT
, DstAS
))
6643 LVT
= MVT::INVALID_SIMPLE_VALUE_TYPE
;
6649 // This turns into unaligned loads. We only do this if the target natively
6650 // supports the MVT we'll be loading or if it is small enough (<= 4) that
6651 // we'll only produce a small number of byte loads.
6653 unsigned NumBitsToCompare
= CSize
->getZExtValue() * 8;
6654 switch (NumBitsToCompare
) {
6666 LoadVT
= hasFastLoadsAndCompare(NumBitsToCompare
);
6670 if (LoadVT
== MVT::INVALID_SIMPLE_VALUE_TYPE
)
6673 SDValue LoadL
= getMemCmpLoad(LHS
, LoadVT
, *this);
6674 SDValue LoadR
= getMemCmpLoad(RHS
, LoadVT
, *this);
6676 // Bitcast to a wide integer type if the loads are vectors.
6677 if (LoadVT
.isVector()) {
6678 EVT CmpVT
= EVT::getIntegerVT(LHS
->getContext(), LoadVT
.getSizeInBits());
6679 LoadL
= DAG
.getBitcast(CmpVT
, LoadL
);
6680 LoadR
= DAG
.getBitcast(CmpVT
, LoadR
);
6683 SDValue Cmp
= DAG
.getSetCC(getCurSDLoc(), MVT::i1
, LoadL
, LoadR
, ISD::SETNE
);
6684 processIntegerCallValue(I
, Cmp
, false);
6688 /// See if we can lower a memchr call into an optimized form. If so, return
6689 /// true and lower it. Otherwise return false, and it will be lowered like a
6691 /// The caller already checked that \p I calls the appropriate LibFunc with a
6692 /// correct prototype.
6693 bool SelectionDAGBuilder::visitMemChrCall(const CallInst
&I
) {
6694 const Value
*Src
= I
.getArgOperand(0);
6695 const Value
*Char
= I
.getArgOperand(1);
6696 const Value
*Length
= I
.getArgOperand(2);
6698 const SelectionDAGTargetInfo
&TSI
= DAG
.getSelectionDAGInfo();
6699 std::pair
<SDValue
, SDValue
> Res
=
6700 TSI
.EmitTargetCodeForMemchr(DAG
, getCurSDLoc(), DAG
.getRoot(),
6701 getValue(Src
), getValue(Char
), getValue(Length
),
6702 MachinePointerInfo(Src
));
6703 if (Res
.first
.getNode()) {
6704 setValue(&I
, Res
.first
);
6705 PendingLoads
.push_back(Res
.second
);
6712 /// See if we can lower a mempcpy call into an optimized form. If so, return
6713 /// true and lower it. Otherwise return false, and it will be lowered like a
6715 /// The caller already checked that \p I calls the appropriate LibFunc with a
6716 /// correct prototype.
6717 bool SelectionDAGBuilder::visitMemPCpyCall(const CallInst
&I
) {
6718 SDValue Dst
= getValue(I
.getArgOperand(0));
6719 SDValue Src
= getValue(I
.getArgOperand(1));
6720 SDValue Size
= getValue(I
.getArgOperand(2));
6722 unsigned DstAlign
= DAG
.InferPtrAlignment(Dst
);
6723 unsigned SrcAlign
= DAG
.InferPtrAlignment(Src
);
6724 unsigned Align
= std::min(DstAlign
, SrcAlign
);
6725 if (Align
== 0) // Alignment of one or both could not be inferred.
6726 Align
= 1; // 0 and 1 both specify no alignment, but 0 is reserved.
6729 SDLoc sdl
= getCurSDLoc();
6731 // In the mempcpy context we need to pass in a false value for isTailCall
6732 // because the return pointer needs to be adjusted by the size of
6733 // the copied memory.
6734 SDValue MC
= DAG
.getMemcpy(getRoot(), sdl
, Dst
, Src
, Size
, Align
, isVol
,
6735 false, /*isTailCall=*/false,
6736 MachinePointerInfo(I
.getArgOperand(0)),
6737 MachinePointerInfo(I
.getArgOperand(1)));
6738 assert(MC
.getNode() != nullptr &&
6739 "** memcpy should not be lowered as TailCall in mempcpy context **");
6742 // Check if Size needs to be truncated or extended.
6743 Size
= DAG
.getSExtOrTrunc(Size
, sdl
, Dst
.getValueType());
6745 // Adjust return pointer to point just past the last dst byte.
6746 SDValue DstPlusSize
= DAG
.getNode(ISD::ADD
, sdl
, Dst
.getValueType(),
6748 setValue(&I
, DstPlusSize
);
6752 /// See if we can lower a strcpy call into an optimized form. If so, return
6753 /// true and lower it, otherwise return false and it will be lowered like a
6755 /// The caller already checked that \p I calls the appropriate LibFunc with a
6756 /// correct prototype.
6757 bool SelectionDAGBuilder::visitStrCpyCall(const CallInst
&I
, bool isStpcpy
) {
6758 const Value
*Arg0
= I
.getArgOperand(0), *Arg1
= I
.getArgOperand(1);
6760 const SelectionDAGTargetInfo
&TSI
= DAG
.getSelectionDAGInfo();
6761 std::pair
<SDValue
, SDValue
> Res
=
6762 TSI
.EmitTargetCodeForStrcpy(DAG
, getCurSDLoc(), getRoot(),
6763 getValue(Arg0
), getValue(Arg1
),
6764 MachinePointerInfo(Arg0
),
6765 MachinePointerInfo(Arg1
), isStpcpy
);
6766 if (Res
.first
.getNode()) {
6767 setValue(&I
, Res
.first
);
6768 DAG
.setRoot(Res
.second
);
6775 /// See if we can lower a strcmp call into an optimized form. If so, return
6776 /// true and lower it, otherwise return false and it will be lowered like a
6778 /// The caller already checked that \p I calls the appropriate LibFunc with a
6779 /// correct prototype.
6780 bool SelectionDAGBuilder::visitStrCmpCall(const CallInst
&I
) {
6781 const Value
*Arg0
= I
.getArgOperand(0), *Arg1
= I
.getArgOperand(1);
6783 const SelectionDAGTargetInfo
&TSI
= DAG
.getSelectionDAGInfo();
6784 std::pair
<SDValue
, SDValue
> Res
=
6785 TSI
.EmitTargetCodeForStrcmp(DAG
, getCurSDLoc(), DAG
.getRoot(),
6786 getValue(Arg0
), getValue(Arg1
),
6787 MachinePointerInfo(Arg0
),
6788 MachinePointerInfo(Arg1
));
6789 if (Res
.first
.getNode()) {
6790 processIntegerCallValue(I
, Res
.first
, true);
6791 PendingLoads
.push_back(Res
.second
);
6798 /// See if we can lower a strlen call into an optimized form. If so, return
6799 /// true and lower it, otherwise return false and it will be lowered like a
6801 /// The caller already checked that \p I calls the appropriate LibFunc with a
6802 /// correct prototype.
6803 bool SelectionDAGBuilder::visitStrLenCall(const CallInst
&I
) {
6804 const Value
*Arg0
= I
.getArgOperand(0);
6806 const SelectionDAGTargetInfo
&TSI
= DAG
.getSelectionDAGInfo();
6807 std::pair
<SDValue
, SDValue
> Res
=
6808 TSI
.EmitTargetCodeForStrlen(DAG
, getCurSDLoc(), DAG
.getRoot(),
6809 getValue(Arg0
), MachinePointerInfo(Arg0
));
6810 if (Res
.first
.getNode()) {
6811 processIntegerCallValue(I
, Res
.first
, false);
6812 PendingLoads
.push_back(Res
.second
);
6819 /// See if we can lower a strnlen call into an optimized form. If so, return
6820 /// true and lower it, otherwise return false and it will be lowered like a
6822 /// The caller already checked that \p I calls the appropriate LibFunc with a
6823 /// correct prototype.
6824 bool SelectionDAGBuilder::visitStrNLenCall(const CallInst
&I
) {
6825 const Value
*Arg0
= I
.getArgOperand(0), *Arg1
= I
.getArgOperand(1);
6827 const SelectionDAGTargetInfo
&TSI
= DAG
.getSelectionDAGInfo();
6828 std::pair
<SDValue
, SDValue
> Res
=
6829 TSI
.EmitTargetCodeForStrnlen(DAG
, getCurSDLoc(), DAG
.getRoot(),
6830 getValue(Arg0
), getValue(Arg1
),
6831 MachinePointerInfo(Arg0
));
6832 if (Res
.first
.getNode()) {
6833 processIntegerCallValue(I
, Res
.first
, false);
6834 PendingLoads
.push_back(Res
.second
);
6841 /// See if we can lower a unary floating-point operation into an SDNode with
6842 /// the specified Opcode. If so, return true and lower it, otherwise return
6843 /// false and it will be lowered like a normal call.
6844 /// The caller already checked that \p I calls the appropriate LibFunc with a
6845 /// correct prototype.
6846 bool SelectionDAGBuilder::visitUnaryFloatCall(const CallInst
&I
,
6848 // We already checked this call's prototype; verify it doesn't modify errno.
6849 if (!I
.onlyReadsMemory())
6852 SDValue Tmp
= getValue(I
.getArgOperand(0));
6853 setValue(&I
, DAG
.getNode(Opcode
, getCurSDLoc(), Tmp
.getValueType(), Tmp
));
6857 /// See if we can lower a binary floating-point operation into an SDNode with
6858 /// the specified Opcode. If so, return true and lower it. Otherwise return
6859 /// false, and it will be lowered like a normal call.
6860 /// The caller already checked that \p I calls the appropriate LibFunc with a
6861 /// correct prototype.
6862 bool SelectionDAGBuilder::visitBinaryFloatCall(const CallInst
&I
,
6864 // We already checked this call's prototype; verify it doesn't modify errno.
6865 if (!I
.onlyReadsMemory())
6868 SDValue Tmp0
= getValue(I
.getArgOperand(0));
6869 SDValue Tmp1
= getValue(I
.getArgOperand(1));
6870 EVT VT
= Tmp0
.getValueType();
6871 setValue(&I
, DAG
.getNode(Opcode
, getCurSDLoc(), VT
, Tmp0
, Tmp1
));
6875 void SelectionDAGBuilder::visitCall(const CallInst
&I
) {
6876 // Handle inline assembly differently.
6877 if (isa
<InlineAsm
>(I
.getCalledValue())) {
6882 MachineModuleInfo
&MMI
= DAG
.getMachineFunction().getMMI();
6883 computeUsesVAFloatArgument(I
, MMI
);
6885 const char *RenameFn
= nullptr;
6886 if (Function
*F
= I
.getCalledFunction()) {
6887 if (F
->isDeclaration()) {
6888 // Is this an LLVM intrinsic or a target-specific intrinsic?
6889 unsigned IID
= F
->getIntrinsicID();
6891 if (const TargetIntrinsicInfo
*II
= TM
.getIntrinsicInfo())
6892 IID
= II
->getIntrinsicID(F
);
6895 RenameFn
= visitIntrinsicCall(I
, IID
);
6901 // Check for well-known libc/libm calls. If the function is internal, it
6902 // can't be a library call. Don't do the check if marked as nobuiltin for
6903 // some reason or the call site requires strict floating point semantics.
6905 if (!I
.isNoBuiltin() && !I
.isStrictFP() && !F
->hasLocalLinkage() &&
6906 F
->hasName() && LibInfo
->getLibFunc(*F
, Func
) &&
6907 LibInfo
->hasOptimizedCodeGen(Func
)) {
6910 case LibFunc_copysign
:
6911 case LibFunc_copysignf
:
6912 case LibFunc_copysignl
:
6913 // We already checked this call's prototype; verify it doesn't modify
6915 if (I
.onlyReadsMemory()) {
6916 SDValue LHS
= getValue(I
.getArgOperand(0));
6917 SDValue RHS
= getValue(I
.getArgOperand(1));
6918 setValue(&I
, DAG
.getNode(ISD::FCOPYSIGN
, getCurSDLoc(),
6919 LHS
.getValueType(), LHS
, RHS
));
6926 if (visitUnaryFloatCall(I
, ISD::FABS
))
6932 if (visitBinaryFloatCall(I
, ISD::FMINNUM
))
6938 if (visitBinaryFloatCall(I
, ISD::FMAXNUM
))
6944 if (visitUnaryFloatCall(I
, ISD::FSIN
))
6950 if (visitUnaryFloatCall(I
, ISD::FCOS
))
6956 case LibFunc_sqrt_finite
:
6957 case LibFunc_sqrtf_finite
:
6958 case LibFunc_sqrtl_finite
:
6959 if (visitUnaryFloatCall(I
, ISD::FSQRT
))
6963 case LibFunc_floorf
:
6964 case LibFunc_floorl
:
6965 if (visitUnaryFloatCall(I
, ISD::FFLOOR
))
6968 case LibFunc_nearbyint
:
6969 case LibFunc_nearbyintf
:
6970 case LibFunc_nearbyintl
:
6971 if (visitUnaryFloatCall(I
, ISD::FNEARBYINT
))
6977 if (visitUnaryFloatCall(I
, ISD::FCEIL
))
6983 if (visitUnaryFloatCall(I
, ISD::FRINT
))
6987 case LibFunc_roundf
:
6988 case LibFunc_roundl
:
6989 if (visitUnaryFloatCall(I
, ISD::FROUND
))
6993 case LibFunc_truncf
:
6994 case LibFunc_truncl
:
6995 if (visitUnaryFloatCall(I
, ISD::FTRUNC
))
7001 if (visitUnaryFloatCall(I
, ISD::FLOG2
))
7007 if (visitUnaryFloatCall(I
, ISD::FEXP2
))
7010 case LibFunc_memcmp
:
7011 if (visitMemCmpCall(I
))
7014 case LibFunc_mempcpy
:
7015 if (visitMemPCpyCall(I
))
7018 case LibFunc_memchr
:
7019 if (visitMemChrCall(I
))
7022 case LibFunc_strcpy
:
7023 if (visitStrCpyCall(I
, false))
7026 case LibFunc_stpcpy
:
7027 if (visitStrCpyCall(I
, true))
7030 case LibFunc_strcmp
:
7031 if (visitStrCmpCall(I
))
7034 case LibFunc_strlen
:
7035 if (visitStrLenCall(I
))
7038 case LibFunc_strnlen
:
7039 if (visitStrNLenCall(I
))
7048 Callee
= getValue(I
.getCalledValue());
7050 Callee
= DAG
.getExternalSymbol(
7052 DAG
.getTargetLoweringInfo().getPointerTy(DAG
.getDataLayout()));
7054 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
7055 // have to do anything here to lower funclet bundles.
7056 assert(!I
.hasOperandBundlesOtherThan(
7057 {LLVMContext::OB_deopt
, LLVMContext::OB_funclet
}) &&
7058 "Cannot lower calls with arbitrary operand bundles!");
7060 if (I
.countOperandBundlesOfType(LLVMContext::OB_deopt
))
7061 LowerCallSiteWithDeoptBundle(&I
, Callee
, nullptr);
7063 // Check if we can potentially perform a tail call. More detailed checking
7064 // is be done within LowerCallTo, after more information about the call is
7066 LowerCallTo(&I
, Callee
, I
.isTailCall());
7071 /// AsmOperandInfo - This contains information for each constraint that we are
7073 class SDISelAsmOperandInfo
: public TargetLowering::AsmOperandInfo
{
7075 /// CallOperand - If this is the result output operand or a clobber
7076 /// this is null, otherwise it is the incoming operand to the CallInst.
7077 /// This gets modified as the asm is processed.
7078 SDValue CallOperand
;
7080 /// AssignedRegs - If this is a register or register class operand, this
7081 /// contains the set of register corresponding to the operand.
7082 RegsForValue AssignedRegs
;
7084 explicit SDISelAsmOperandInfo(const TargetLowering::AsmOperandInfo
&info
)
7085 : TargetLowering::AsmOperandInfo(info
), CallOperand(nullptr, 0) {
7088 /// Whether or not this operand accesses memory
7089 bool hasMemory(const TargetLowering
&TLI
) const {
7090 // Indirect operand accesses access memory.
7094 for (const auto &Code
: Codes
)
7095 if (TLI
.getConstraintType(Code
) == TargetLowering::C_Memory
)
7101 /// getCallOperandValEVT - Return the EVT of the Value* that this operand
7102 /// corresponds to. If there is no Value* for this operand, it returns
7104 EVT
getCallOperandValEVT(LLVMContext
&Context
, const TargetLowering
&TLI
,
7105 const DataLayout
&DL
) const {
7106 if (!CallOperandVal
) return MVT::Other
;
7108 if (isa
<BasicBlock
>(CallOperandVal
))
7109 return TLI
.getPointerTy(DL
);
7111 llvm::Type
*OpTy
= CallOperandVal
->getType();
7113 // FIXME: code duplicated from TargetLowering::ParseConstraints().
7114 // If this is an indirect operand, the operand is a pointer to the
7117 PointerType
*PtrTy
= dyn_cast
<PointerType
>(OpTy
);
7119 report_fatal_error("Indirect operand for inline asm not a pointer!");
7120 OpTy
= PtrTy
->getElementType();
7123 // Look for vector wrapped in a struct. e.g. { <16 x i8> }.
7124 if (StructType
*STy
= dyn_cast
<StructType
>(OpTy
))
7125 if (STy
->getNumElements() == 1)
7126 OpTy
= STy
->getElementType(0);
7128 // If OpTy is not a single value, it may be a struct/union that we
7129 // can tile with integers.
7130 if (!OpTy
->isSingleValueType() && OpTy
->isSized()) {
7131 unsigned BitSize
= DL
.getTypeSizeInBits(OpTy
);
7140 OpTy
= IntegerType::get(Context
, BitSize
);
7145 return TLI
.getValueType(DL
, OpTy
, true);
7149 using SDISelAsmOperandInfoVector
= SmallVector
<SDISelAsmOperandInfo
, 16>;
7151 } // end anonymous namespace
7153 /// Make sure that the output operand \p OpInfo and its corresponding input
7154 /// operand \p MatchingOpInfo have compatible constraint types (otherwise error
7156 static void patchMatchingInput(const SDISelAsmOperandInfo
&OpInfo
,
7157 SDISelAsmOperandInfo
&MatchingOpInfo
,
7158 SelectionDAG
&DAG
) {
7159 if (OpInfo
.ConstraintVT
== MatchingOpInfo
.ConstraintVT
)
7162 const TargetRegisterInfo
*TRI
= DAG
.getSubtarget().getRegisterInfo();
7163 const auto &TLI
= DAG
.getTargetLoweringInfo();
7165 std::pair
<unsigned, const TargetRegisterClass
*> MatchRC
=
7166 TLI
.getRegForInlineAsmConstraint(TRI
, OpInfo
.ConstraintCode
,
7167 OpInfo
.ConstraintVT
);
7168 std::pair
<unsigned, const TargetRegisterClass
*> InputRC
=
7169 TLI
.getRegForInlineAsmConstraint(TRI
, MatchingOpInfo
.ConstraintCode
,
7170 MatchingOpInfo
.ConstraintVT
);
7171 if ((OpInfo
.ConstraintVT
.isInteger() !=
7172 MatchingOpInfo
.ConstraintVT
.isInteger()) ||
7173 (MatchRC
.second
!= InputRC
.second
)) {
7174 // FIXME: error out in a more elegant fashion
7175 report_fatal_error("Unsupported asm: input constraint"
7176 " with a matching output constraint of"
7177 " incompatible type!");
7179 MatchingOpInfo
.ConstraintVT
= OpInfo
.ConstraintVT
;
7182 /// Get a direct memory input to behave well as an indirect operand.
7183 /// This may introduce stores, hence the need for a \p Chain.
7184 /// \return The (possibly updated) chain.
7185 static SDValue
getAddressForMemoryInput(SDValue Chain
, const SDLoc
&Location
,
7186 SDISelAsmOperandInfo
&OpInfo
,
7187 SelectionDAG
&DAG
) {
7188 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
7190 // If we don't have an indirect input, put it in the constpool if we can,
7191 // otherwise spill it to a stack slot.
7192 // TODO: This isn't quite right. We need to handle these according to
7193 // the addressing mode that the constraint wants. Also, this may take
7194 // an additional register for the computation and we don't want that
7197 // If the operand is a float, integer, or vector constant, spill to a
7198 // constant pool entry to get its address.
7199 const Value
*OpVal
= OpInfo
.CallOperandVal
;
7200 if (isa
<ConstantFP
>(OpVal
) || isa
<ConstantInt
>(OpVal
) ||
7201 isa
<ConstantVector
>(OpVal
) || isa
<ConstantDataVector
>(OpVal
)) {
7202 OpInfo
.CallOperand
= DAG
.getConstantPool(
7203 cast
<Constant
>(OpVal
), TLI
.getPointerTy(DAG
.getDataLayout()));
7207 // Otherwise, create a stack slot and emit a store to it before the asm.
7208 Type
*Ty
= OpVal
->getType();
7209 auto &DL
= DAG
.getDataLayout();
7210 uint64_t TySize
= DL
.getTypeAllocSize(Ty
);
7211 unsigned Align
= DL
.getPrefTypeAlignment(Ty
);
7212 MachineFunction
&MF
= DAG
.getMachineFunction();
7213 int SSFI
= MF
.getFrameInfo().CreateStackObject(TySize
, Align
, false);
7214 SDValue StackSlot
= DAG
.getFrameIndex(SSFI
, TLI
.getFrameIndexTy(DL
));
7215 Chain
= DAG
.getStore(Chain
, Location
, OpInfo
.CallOperand
, StackSlot
,
7216 MachinePointerInfo::getFixedStack(MF
, SSFI
));
7217 OpInfo
.CallOperand
= StackSlot
;
7222 /// GetRegistersForValue - Assign registers (virtual or physical) for the
7223 /// specified operand. We prefer to assign virtual registers, to allow the
7224 /// register allocator to handle the assignment process. However, if the asm
7225 /// uses features that we can't model on machineinstrs, we have SDISel do the
7226 /// allocation. This produces generally horrible, but correct, code.
7228 /// OpInfo describes the operand
7229 /// RefOpInfo describes the matching operand if any, the operand otherwise
7230 static void GetRegistersForValue(SelectionDAG
&DAG
, const TargetLowering
&TLI
,
7231 const SDLoc
&DL
, SDISelAsmOperandInfo
&OpInfo
,
7232 SDISelAsmOperandInfo
&RefOpInfo
) {
7233 LLVMContext
&Context
= *DAG
.getContext();
7235 MachineFunction
&MF
= DAG
.getMachineFunction();
7236 SmallVector
<unsigned, 4> Regs
;
7237 const TargetRegisterInfo
&TRI
= *MF
.getSubtarget().getRegisterInfo();
7239 // If this is a constraint for a single physreg, or a constraint for a
7240 // register class, find it.
7241 std::pair
<unsigned, const TargetRegisterClass
*> PhysReg
=
7242 TLI
.getRegForInlineAsmConstraint(&TRI
, RefOpInfo
.ConstraintCode
,
7243 RefOpInfo
.ConstraintVT
);
7245 unsigned NumRegs
= 1;
7246 if (OpInfo
.ConstraintVT
!= MVT::Other
) {
7247 // If this is an FP operand in an integer register (or visa versa), or more
7248 // generally if the operand value disagrees with the register class we plan
7249 // to stick it in, fix the operand type.
7251 // If this is an input value, the bitcast to the new type is done now.
7252 // Bitcast for output value is done at the end of visitInlineAsm().
7253 if ((OpInfo
.Type
== InlineAsm::isOutput
||
7254 OpInfo
.Type
== InlineAsm::isInput
) &&
7256 !TRI
.isTypeLegalForClass(*PhysReg
.second
, OpInfo
.ConstraintVT
)) {
7257 // Try to convert to the first EVT that the reg class contains. If the
7258 // types are identical size, use a bitcast to convert (e.g. two differing
7259 // vector types). Note: output bitcast is done at the end of
7260 // visitInlineAsm().
7261 MVT RegVT
= *TRI
.legalclasstypes_begin(*PhysReg
.second
);
7262 if (RegVT
.getSizeInBits() == OpInfo
.ConstraintVT
.getSizeInBits()) {
7263 // Exclude indirect inputs while they are unsupported because the code
7264 // to perform the load is missing and thus OpInfo.CallOperand still
7265 // refers to the input address rather than the pointed-to value.
7266 if (OpInfo
.Type
== InlineAsm::isInput
&& !OpInfo
.isIndirect
)
7267 OpInfo
.CallOperand
=
7268 DAG
.getNode(ISD::BITCAST
, DL
, RegVT
, OpInfo
.CallOperand
);
7269 OpInfo
.ConstraintVT
= RegVT
;
7270 // If the operand is an FP value and we want it in integer registers,
7271 // use the corresponding integer type. This turns an f64 value into
7272 // i64, which can be passed with two i32 values on a 32-bit machine.
7273 } else if (RegVT
.isInteger() && OpInfo
.ConstraintVT
.isFloatingPoint()) {
7274 RegVT
= MVT::getIntegerVT(OpInfo
.ConstraintVT
.getSizeInBits());
7275 if (OpInfo
.Type
== InlineAsm::isInput
)
7276 OpInfo
.CallOperand
=
7277 DAG
.getNode(ISD::BITCAST
, DL
, RegVT
, OpInfo
.CallOperand
);
7278 OpInfo
.ConstraintVT
= RegVT
;
7282 NumRegs
= TLI
.getNumRegisters(Context
, OpInfo
.ConstraintVT
);
7285 // No need to allocate a matching input constraint since the constraint it's
7286 // matching to has already been allocated.
7287 if (OpInfo
.isMatchingInputConstraint())
7291 EVT ValueVT
= OpInfo
.ConstraintVT
;
7293 // If this is a constraint for a specific physical register, like {r17},
7295 if (unsigned AssignedReg
= PhysReg
.first
) {
7296 const TargetRegisterClass
*RC
= PhysReg
.second
;
7297 if (OpInfo
.ConstraintVT
== MVT::Other
)
7298 ValueVT
= *TRI
.legalclasstypes_begin(*RC
);
7300 // Get the actual register value type. This is important, because the user
7301 // may have asked for (e.g.) the AX register in i32 type. We need to
7302 // remember that AX is actually i16 to get the right extension.
7303 RegVT
= *TRI
.legalclasstypes_begin(*RC
);
7305 // This is an explicit reference to a physical register.
7306 Regs
.push_back(AssignedReg
);
7308 // If this is an expanded reference, add the rest of the regs to Regs.
7310 TargetRegisterClass::iterator I
= RC
->begin();
7311 for (; *I
!= AssignedReg
; ++I
)
7312 assert(I
!= RC
->end() && "Didn't find reg!");
7314 // Already added the first reg.
7316 for (; NumRegs
; --NumRegs
, ++I
) {
7317 assert(I
!= RC
->end() && "Ran out of registers to allocate!");
7322 OpInfo
.AssignedRegs
= RegsForValue(Regs
, RegVT
, ValueVT
);
7326 // Otherwise, if this was a reference to an LLVM register class, create vregs
7327 // for this reference.
7328 if (const TargetRegisterClass
*RC
= PhysReg
.second
) {
7329 RegVT
= *TRI
.legalclasstypes_begin(*RC
);
7330 if (OpInfo
.ConstraintVT
== MVT::Other
)
7333 // Create the appropriate number of virtual registers.
7334 MachineRegisterInfo
&RegInfo
= MF
.getRegInfo();
7335 for (; NumRegs
; --NumRegs
)
7336 Regs
.push_back(RegInfo
.createVirtualRegister(RC
));
7338 OpInfo
.AssignedRegs
= RegsForValue(Regs
, RegVT
, ValueVT
);
7342 // Otherwise, we couldn't allocate enough registers for this.
7346 findMatchingInlineAsmOperand(unsigned OperandNo
,
7347 const std::vector
<SDValue
> &AsmNodeOperands
) {
7348 // Scan until we find the definition we already emitted of this operand.
7349 unsigned CurOp
= InlineAsm::Op_FirstOperand
;
7350 for (; OperandNo
; --OperandNo
) {
7351 // Advance to the next operand.
7353 cast
<ConstantSDNode
>(AsmNodeOperands
[CurOp
])->getZExtValue();
7354 assert((InlineAsm::isRegDefKind(OpFlag
) ||
7355 InlineAsm::isRegDefEarlyClobberKind(OpFlag
) ||
7356 InlineAsm::isMemKind(OpFlag
)) &&
7357 "Skipped past definitions?");
7358 CurOp
+= InlineAsm::getNumOperandRegisters(OpFlag
) + 1;
7363 /// Fill \p Regs with \p NumRegs new virtual registers of type \p RegVT
7364 /// \return true if it has succeeded, false otherwise
7365 static bool createVirtualRegs(SmallVector
<unsigned, 4> &Regs
, unsigned NumRegs
,
7366 MVT RegVT
, SelectionDAG
&DAG
) {
7367 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
7368 MachineRegisterInfo
&RegInfo
= DAG
.getMachineFunction().getRegInfo();
7369 for (unsigned i
= 0, e
= NumRegs
; i
!= e
; ++i
) {
7370 if (const TargetRegisterClass
*RC
= TLI
.getRegClassFor(RegVT
))
7371 Regs
.push_back(RegInfo
.createVirtualRegister(RC
));
7384 explicit ExtraFlags(ImmutableCallSite CS
) {
7385 const InlineAsm
*IA
= cast
<InlineAsm
>(CS
.getCalledValue());
7386 if (IA
->hasSideEffects())
7387 Flags
|= InlineAsm::Extra_HasSideEffects
;
7388 if (IA
->isAlignStack())
7389 Flags
|= InlineAsm::Extra_IsAlignStack
;
7390 if (CS
.isConvergent())
7391 Flags
|= InlineAsm::Extra_IsConvergent
;
7392 Flags
|= IA
->getDialect() * InlineAsm::Extra_AsmDialect
;
7395 void update(const TargetLowering::AsmOperandInfo
&OpInfo
) {
7396 // Ideally, we would only check against memory constraints. However, the
7397 // meaning of an Other constraint can be target-specific and we can't easily
7398 // reason about it. Therefore, be conservative and set MayLoad/MayStore
7399 // for Other constraints as well.
7400 if (OpInfo
.ConstraintType
== TargetLowering::C_Memory
||
7401 OpInfo
.ConstraintType
== TargetLowering::C_Other
) {
7402 if (OpInfo
.Type
== InlineAsm::isInput
)
7403 Flags
|= InlineAsm::Extra_MayLoad
;
7404 else if (OpInfo
.Type
== InlineAsm::isOutput
)
7405 Flags
|= InlineAsm::Extra_MayStore
;
7406 else if (OpInfo
.Type
== InlineAsm::isClobber
)
7407 Flags
|= (InlineAsm::Extra_MayLoad
| InlineAsm::Extra_MayStore
);
7411 unsigned get() const { return Flags
; }
7414 } // end anonymous namespace
7416 /// visitInlineAsm - Handle a call to an InlineAsm object.
7417 void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS
) {
7418 const InlineAsm
*IA
= cast
<InlineAsm
>(CS
.getCalledValue());
7420 /// ConstraintOperands - Information about all of the constraints.
7421 SDISelAsmOperandInfoVector ConstraintOperands
;
7423 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
7424 TargetLowering::AsmOperandInfoVector TargetConstraints
= TLI
.ParseConstraints(
7425 DAG
.getDataLayout(), DAG
.getSubtarget().getRegisterInfo(), CS
);
7427 bool hasMemory
= false;
7429 // Remember the HasSideEffect, AlignStack, AsmDialect, MayLoad and MayStore
7430 ExtraFlags
ExtraInfo(CS
);
7432 unsigned ArgNo
= 0; // ArgNo - The argument of the CallInst.
7433 unsigned ResNo
= 0; // ResNo - The result number of the next output.
7434 for (unsigned i
= 0, e
= TargetConstraints
.size(); i
!= e
; ++i
) {
7435 ConstraintOperands
.push_back(SDISelAsmOperandInfo(TargetConstraints
[i
]));
7436 SDISelAsmOperandInfo
&OpInfo
= ConstraintOperands
.back();
7438 MVT OpVT
= MVT::Other
;
7440 // Compute the value type for each operand.
7441 if (OpInfo
.Type
== InlineAsm::isInput
||
7442 (OpInfo
.Type
== InlineAsm::isOutput
&& OpInfo
.isIndirect
)) {
7443 OpInfo
.CallOperandVal
= const_cast<Value
*>(CS
.getArgument(ArgNo
++));
7445 // Process the call argument. BasicBlocks are labels, currently appearing
7447 if (const BasicBlock
*BB
= dyn_cast
<BasicBlock
>(OpInfo
.CallOperandVal
)) {
7448 OpInfo
.CallOperand
= DAG
.getBasicBlock(FuncInfo
.MBBMap
[BB
]);
7450 OpInfo
.CallOperand
= getValue(OpInfo
.CallOperandVal
);
7455 .getCallOperandValEVT(*DAG
.getContext(), TLI
, DAG
.getDataLayout())
7459 if (OpInfo
.Type
== InlineAsm::isOutput
&& !OpInfo
.isIndirect
) {
7460 // The return value of the call is this value. As such, there is no
7461 // corresponding argument.
7462 assert(!CS
.getType()->isVoidTy() && "Bad inline asm!");
7463 if (StructType
*STy
= dyn_cast
<StructType
>(CS
.getType())) {
7464 OpVT
= TLI
.getSimpleValueType(DAG
.getDataLayout(),
7465 STy
->getElementType(ResNo
));
7467 assert(ResNo
== 0 && "Asm only has one result!");
7468 OpVT
= TLI
.getSimpleValueType(DAG
.getDataLayout(), CS
.getType());
7473 OpInfo
.ConstraintVT
= OpVT
;
7476 hasMemory
= OpInfo
.hasMemory(TLI
);
7478 // Determine if this InlineAsm MayLoad or MayStore based on the constraints.
7479 // FIXME: Could we compute this on OpInfo rather than TargetConstraints[i]?
7480 auto TargetConstraint
= TargetConstraints
[i
];
7482 // Compute the constraint code and ConstraintType to use.
7483 TLI
.ComputeConstraintToUse(TargetConstraint
, SDValue());
7485 ExtraInfo
.update(TargetConstraint
);
7488 SDValue Chain
, Flag
;
7490 // We won't need to flush pending loads if this asm doesn't touch
7491 // memory and is nonvolatile.
7492 if (hasMemory
|| IA
->hasSideEffects())
7495 Chain
= DAG
.getRoot();
7497 // Second pass over the constraints: compute which constraint option to use
7498 // and assign registers to constraints that want a specific physreg.
7499 for (unsigned i
= 0, e
= ConstraintOperands
.size(); i
!= e
; ++i
) {
7500 SDISelAsmOperandInfo
&OpInfo
= ConstraintOperands
[i
];
7502 // If this is an output operand with a matching input operand, look up the
7503 // matching input. If their types mismatch, e.g. one is an integer, the
7504 // other is floating point, or their sizes are different, flag it as an
7506 if (OpInfo
.hasMatchingInput()) {
7507 SDISelAsmOperandInfo
&Input
= ConstraintOperands
[OpInfo
.MatchingInput
];
7508 patchMatchingInput(OpInfo
, Input
, DAG
);
7511 // Compute the constraint code and ConstraintType to use.
7512 TLI
.ComputeConstraintToUse(OpInfo
, OpInfo
.CallOperand
, &DAG
);
7514 if (OpInfo
.ConstraintType
== TargetLowering::C_Memory
&&
7515 OpInfo
.Type
== InlineAsm::isClobber
)
7518 // If this is a memory input, and if the operand is not indirect, do what we
7519 // need to provide an address for the memory input.
7520 if (OpInfo
.ConstraintType
== TargetLowering::C_Memory
&&
7521 !OpInfo
.isIndirect
) {
7522 assert((OpInfo
.isMultipleAlternative
||
7523 (OpInfo
.Type
== InlineAsm::isInput
)) &&
7524 "Can only indirectify direct input operands!");
7526 // Memory operands really want the address of the value.
7527 Chain
= getAddressForMemoryInput(Chain
, getCurSDLoc(), OpInfo
, DAG
);
7529 // There is no longer a Value* corresponding to this operand.
7530 OpInfo
.CallOperandVal
= nullptr;
7532 // It is now an indirect operand.
7533 OpInfo
.isIndirect
= true;
7536 // If this constraint is for a specific register, allocate it before
7538 SDISelAsmOperandInfo
&RefOpInfo
=
7539 OpInfo
.isMatchingInputConstraint()
7540 ? ConstraintOperands
[OpInfo
.getMatchedOperand()]
7541 : ConstraintOperands
[i
];
7542 if (RefOpInfo
.ConstraintType
== TargetLowering::C_Register
)
7543 GetRegistersForValue(DAG
, TLI
, getCurSDLoc(), OpInfo
, RefOpInfo
);
7546 // Third pass - Loop over all of the operands, assigning virtual or physregs
7547 // to register class operands.
7548 for (unsigned i
= 0, e
= ConstraintOperands
.size(); i
!= e
; ++i
) {
7549 SDISelAsmOperandInfo
&OpInfo
= ConstraintOperands
[i
];
7550 SDISelAsmOperandInfo
&RefOpInfo
=
7551 OpInfo
.isMatchingInputConstraint()
7552 ? ConstraintOperands
[OpInfo
.getMatchedOperand()]
7553 : ConstraintOperands
[i
];
7555 // C_Register operands have already been allocated, Other/Memory don't need
7557 if (RefOpInfo
.ConstraintType
== TargetLowering::C_RegisterClass
)
7558 GetRegistersForValue(DAG
, TLI
, getCurSDLoc(), OpInfo
, RefOpInfo
);
7561 // AsmNodeOperands - The operands for the ISD::INLINEASM node.
7562 std::vector
<SDValue
> AsmNodeOperands
;
7563 AsmNodeOperands
.push_back(SDValue()); // reserve space for input chain
7564 AsmNodeOperands
.push_back(DAG
.getTargetExternalSymbol(
7565 IA
->getAsmString().c_str(), TLI
.getPointerTy(DAG
.getDataLayout())));
7567 // If we have a !srcloc metadata node associated with it, we want to attach
7568 // this to the ultimately generated inline asm machineinstr. To do this, we
7569 // pass in the third operand as this (potentially null) inline asm MDNode.
7570 const MDNode
*SrcLoc
= CS
.getInstruction()->getMetadata("srcloc");
7571 AsmNodeOperands
.push_back(DAG
.getMDNode(SrcLoc
));
7573 // Remember the HasSideEffect, AlignStack, AsmDialect, MayLoad and MayStore
7574 // bits as operand 3.
7575 AsmNodeOperands
.push_back(DAG
.getTargetConstant(
7576 ExtraInfo
.get(), getCurSDLoc(), TLI
.getPointerTy(DAG
.getDataLayout())));
7578 // Loop over all of the inputs, copying the operand values into the
7579 // appropriate registers and processing the output regs.
7580 RegsForValue RetValRegs
;
7582 // IndirectStoresToEmit - The set of stores to emit after the inline asm node.
7583 std::vector
<std::pair
<RegsForValue
, Value
*>> IndirectStoresToEmit
;
7585 for (unsigned i
= 0, e
= ConstraintOperands
.size(); i
!= e
; ++i
) {
7586 SDISelAsmOperandInfo
&OpInfo
= ConstraintOperands
[i
];
7588 switch (OpInfo
.Type
) {
7589 case InlineAsm::isOutput
:
7590 if (OpInfo
.ConstraintType
!= TargetLowering::C_RegisterClass
&&
7591 OpInfo
.ConstraintType
!= TargetLowering::C_Register
) {
7592 // Memory output, or 'other' output (e.g. 'X' constraint).
7593 assert(OpInfo
.isIndirect
&& "Memory output must be indirect operand");
7595 unsigned ConstraintID
=
7596 TLI
.getInlineAsmMemConstraint(OpInfo
.ConstraintCode
);
7597 assert(ConstraintID
!= InlineAsm::Constraint_Unknown
&&
7598 "Failed to convert memory constraint code to constraint id.");
7600 // Add information to the INLINEASM node to know about this output.
7601 unsigned OpFlags
= InlineAsm::getFlagWord(InlineAsm::Kind_Mem
, 1);
7602 OpFlags
= InlineAsm::getFlagWordForMem(OpFlags
, ConstraintID
);
7603 AsmNodeOperands
.push_back(DAG
.getTargetConstant(OpFlags
, getCurSDLoc(),
7605 AsmNodeOperands
.push_back(OpInfo
.CallOperand
);
7609 // Otherwise, this is a register or register class output.
7611 // Copy the output from the appropriate register. Find a register that
7613 if (OpInfo
.AssignedRegs
.Regs
.empty()) {
7615 CS
, "couldn't allocate output register for constraint '" +
7616 Twine(OpInfo
.ConstraintCode
) + "'");
7620 // If this is an indirect operand, store through the pointer after the
7622 if (OpInfo
.isIndirect
) {
7623 IndirectStoresToEmit
.push_back(std::make_pair(OpInfo
.AssignedRegs
,
7624 OpInfo
.CallOperandVal
));
7626 // This is the result value of the call.
7627 assert(!CS
.getType()->isVoidTy() && "Bad inline asm!");
7628 // Concatenate this output onto the outputs list.
7629 RetValRegs
.append(OpInfo
.AssignedRegs
);
7632 // Add information to the INLINEASM node to know that this register is
7635 .AddInlineAsmOperands(OpInfo
.isEarlyClobber
7636 ? InlineAsm::Kind_RegDefEarlyClobber
7637 : InlineAsm::Kind_RegDef
,
7638 false, 0, getCurSDLoc(), DAG
, AsmNodeOperands
);
7641 case InlineAsm::isInput
: {
7642 SDValue InOperandVal
= OpInfo
.CallOperand
;
7644 if (OpInfo
.isMatchingInputConstraint()) {
7645 // If this is required to match an output register we have already set,
7646 // just use its register.
7647 auto CurOp
= findMatchingInlineAsmOperand(OpInfo
.getMatchedOperand(),
7650 cast
<ConstantSDNode
>(AsmNodeOperands
[CurOp
])->getZExtValue();
7651 if (InlineAsm::isRegDefKind(OpFlag
) ||
7652 InlineAsm::isRegDefEarlyClobberKind(OpFlag
)) {
7653 // Add (OpFlag&0xffff)>>3 registers to MatchedRegs.
7654 if (OpInfo
.isIndirect
) {
7655 // This happens on gcc/testsuite/gcc.dg/pr8788-1.c
7656 emitInlineAsmError(CS
, "inline asm not supported yet:"
7657 " don't know how to handle tied "
7658 "indirect register inputs");
7662 MVT RegVT
= AsmNodeOperands
[CurOp
+1].getSimpleValueType();
7663 SmallVector
<unsigned, 4> Regs
;
7665 if (!createVirtualRegs(Regs
,
7666 InlineAsm::getNumOperandRegisters(OpFlag
),
7668 emitInlineAsmError(CS
, "inline asm error: This value type register "
7669 "class is not natively supported!");
7673 RegsForValue
MatchedRegs(Regs
, RegVT
, InOperandVal
.getValueType());
7675 SDLoc dl
= getCurSDLoc();
7676 // Use the produced MatchedRegs object to
7677 MatchedRegs
.getCopyToRegs(InOperandVal
, DAG
, dl
, Chain
, &Flag
,
7678 CS
.getInstruction());
7679 MatchedRegs
.AddInlineAsmOperands(InlineAsm::Kind_RegUse
,
7680 true, OpInfo
.getMatchedOperand(), dl
,
7681 DAG
, AsmNodeOperands
);
7685 assert(InlineAsm::isMemKind(OpFlag
) && "Unknown matching constraint!");
7686 assert(InlineAsm::getNumOperandRegisters(OpFlag
) == 1 &&
7687 "Unexpected number of operands");
7688 // Add information to the INLINEASM node to know about this input.
7689 // See InlineAsm.h isUseOperandTiedToDef.
7690 OpFlag
= InlineAsm::convertMemFlagWordToMatchingFlagWord(OpFlag
);
7691 OpFlag
= InlineAsm::getFlagWordForMatchingOp(OpFlag
,
7692 OpInfo
.getMatchedOperand());
7693 AsmNodeOperands
.push_back(DAG
.getTargetConstant(
7694 OpFlag
, getCurSDLoc(), TLI
.getPointerTy(DAG
.getDataLayout())));
7695 AsmNodeOperands
.push_back(AsmNodeOperands
[CurOp
+1]);
7699 // Treat indirect 'X' constraint as memory.
7700 if (OpInfo
.ConstraintType
== TargetLowering::C_Other
&&
7702 OpInfo
.ConstraintType
= TargetLowering::C_Memory
;
7704 if (OpInfo
.ConstraintType
== TargetLowering::C_Other
) {
7705 std::vector
<SDValue
> Ops
;
7706 TLI
.LowerAsmOperandForConstraint(InOperandVal
, OpInfo
.ConstraintCode
,
7709 emitInlineAsmError(CS
, "invalid operand for inline asm constraint '" +
7710 Twine(OpInfo
.ConstraintCode
) + "'");
7714 // Add information to the INLINEASM node to know about this input.
7715 unsigned ResOpType
=
7716 InlineAsm::getFlagWord(InlineAsm::Kind_Imm
, Ops
.size());
7717 AsmNodeOperands
.push_back(DAG
.getTargetConstant(
7718 ResOpType
, getCurSDLoc(), TLI
.getPointerTy(DAG
.getDataLayout())));
7719 AsmNodeOperands
.insert(AsmNodeOperands
.end(), Ops
.begin(), Ops
.end());
7723 if (OpInfo
.ConstraintType
== TargetLowering::C_Memory
) {
7724 assert(OpInfo
.isIndirect
&& "Operand must be indirect to be a mem!");
7725 assert(InOperandVal
.getValueType() ==
7726 TLI
.getPointerTy(DAG
.getDataLayout()) &&
7727 "Memory operands expect pointer values");
7729 unsigned ConstraintID
=
7730 TLI
.getInlineAsmMemConstraint(OpInfo
.ConstraintCode
);
7731 assert(ConstraintID
!= InlineAsm::Constraint_Unknown
&&
7732 "Failed to convert memory constraint code to constraint id.");
7734 // Add information to the INLINEASM node to know about this input.
7735 unsigned ResOpType
= InlineAsm::getFlagWord(InlineAsm::Kind_Mem
, 1);
7736 ResOpType
= InlineAsm::getFlagWordForMem(ResOpType
, ConstraintID
);
7737 AsmNodeOperands
.push_back(DAG
.getTargetConstant(ResOpType
,
7740 AsmNodeOperands
.push_back(InOperandVal
);
7744 assert((OpInfo
.ConstraintType
== TargetLowering::C_RegisterClass
||
7745 OpInfo
.ConstraintType
== TargetLowering::C_Register
) &&
7746 "Unknown constraint type!");
7748 // TODO: Support this.
7749 if (OpInfo
.isIndirect
) {
7751 CS
, "Don't know how to handle indirect register inputs yet "
7752 "for constraint '" +
7753 Twine(OpInfo
.ConstraintCode
) + "'");
7757 // Copy the input into the appropriate registers.
7758 if (OpInfo
.AssignedRegs
.Regs
.empty()) {
7759 emitInlineAsmError(CS
, "couldn't allocate input reg for constraint '" +
7760 Twine(OpInfo
.ConstraintCode
) + "'");
7764 SDLoc dl
= getCurSDLoc();
7766 OpInfo
.AssignedRegs
.getCopyToRegs(InOperandVal
, DAG
, dl
,
7767 Chain
, &Flag
, CS
.getInstruction());
7769 OpInfo
.AssignedRegs
.AddInlineAsmOperands(InlineAsm::Kind_RegUse
, false, 0,
7770 dl
, DAG
, AsmNodeOperands
);
7773 case InlineAsm::isClobber
:
7774 // Add the clobbered value to the operand list, so that the register
7775 // allocator is aware that the physreg got clobbered.
7776 if (!OpInfo
.AssignedRegs
.Regs
.empty())
7777 OpInfo
.AssignedRegs
.AddInlineAsmOperands(InlineAsm::Kind_Clobber
,
7778 false, 0, getCurSDLoc(), DAG
,
7784 // Finish up input operands. Set the input chain and add the flag last.
7785 AsmNodeOperands
[InlineAsm::Op_InputChain
] = Chain
;
7786 if (Flag
.getNode()) AsmNodeOperands
.push_back(Flag
);
7788 Chain
= DAG
.getNode(ISD::INLINEASM
, getCurSDLoc(),
7789 DAG
.getVTList(MVT::Other
, MVT::Glue
), AsmNodeOperands
);
7790 Flag
= Chain
.getValue(1);
7792 // If this asm returns a register value, copy the result from that register
7793 // and set it as the value of the call.
7794 if (!RetValRegs
.Regs
.empty()) {
7795 SDValue Val
= RetValRegs
.getCopyFromRegs(DAG
, FuncInfo
, getCurSDLoc(),
7796 Chain
, &Flag
, CS
.getInstruction());
7798 llvm::Type
*CSResultType
= CS
.getType();
7800 ArrayRef
<Type
*> ResultTypes
;
7801 SmallVector
<SDValue
, 1> ResultValues(1);
7802 if (CSResultType
->isSingleValueType()) {
7804 ResultValues
[0] = Val
;
7805 ResultTypes
= makeArrayRef(CSResultType
);
7807 numRet
= CSResultType
->getNumContainedTypes();
7808 assert(Val
->getNumOperands() == numRet
&&
7809 "Mismatch in number of output operands in asm result");
7810 ResultTypes
= CSResultType
->subtypes();
7811 ArrayRef
<SDUse
> ValueUses
= Val
->ops();
7812 ResultValues
.resize(numRet
);
7813 std::transform(ValueUses
.begin(), ValueUses
.end(), ResultValues
.begin(),
7814 [](const SDUse
&u
) -> SDValue
{ return u
.get(); });
7816 SmallVector
<EVT
, 1> ResultVTs(numRet
);
7817 for (unsigned i
= 0; i
< numRet
; i
++) {
7818 EVT ResultVT
= TLI
.getValueType(DAG
.getDataLayout(), ResultTypes
[i
]);
7819 SDValue Val
= ResultValues
[i
];
7820 assert(ResultTypes
[i
]->isSized() && "Unexpected unsized type");
7821 // If the type of the inline asm call site return value is different but
7822 // has same size as the type of the asm output bitcast it. One example
7823 // of this is for vectors with different width / number of elements.
7824 // This can happen for register classes that can contain multiple
7825 // different value types. The preg or vreg allocated may not have the
7826 // same VT as was expected.
7828 // This can also happen for a return value that disagrees with the
7829 // register class it is put in, eg. a double in a general-purpose
7830 // register on a 32-bit machine.
7831 if (ResultVT
!= Val
.getValueType() &&
7832 ResultVT
.getSizeInBits() == Val
.getValueSizeInBits())
7833 Val
= DAG
.getNode(ISD::BITCAST
, getCurSDLoc(), ResultVT
, Val
);
7834 else if (ResultVT
!= Val
.getValueType() && ResultVT
.isInteger() &&
7835 Val
.getValueType().isInteger()) {
7836 // If a result value was tied to an input value, the computed result
7837 // may have a wider width than the expected result. Extract the
7838 // relevant portion.
7839 Val
= DAG
.getNode(ISD::TRUNCATE
, getCurSDLoc(), ResultVT
, Val
);
7842 assert(ResultVT
== Val
.getValueType() && "Asm result value mismatch!");
7843 ResultVTs
[i
] = ResultVT
;
7844 ResultValues
[i
] = Val
;
7847 Val
= DAG
.getNode(ISD::MERGE_VALUES
, getCurSDLoc(),
7848 DAG
.getVTList(ResultVTs
), ResultValues
);
7849 setValue(CS
.getInstruction(), Val
);
7850 // Don't need to use this as a chain in this case.
7851 if (!IA
->hasSideEffects() && !hasMemory
&& IndirectStoresToEmit
.empty())
7855 std::vector
<std::pair
<SDValue
, const Value
*>> StoresToEmit
;
7857 // Process indirect outputs, first output all of the flagged copies out of
7859 for (unsigned i
= 0, e
= IndirectStoresToEmit
.size(); i
!= e
; ++i
) {
7860 RegsForValue
&OutRegs
= IndirectStoresToEmit
[i
].first
;
7861 const Value
*Ptr
= IndirectStoresToEmit
[i
].second
;
7862 SDValue OutVal
= OutRegs
.getCopyFromRegs(DAG
, FuncInfo
, getCurSDLoc(),
7864 StoresToEmit
.push_back(std::make_pair(OutVal
, Ptr
));
7867 // Emit the non-flagged stores from the physregs.
7868 SmallVector
<SDValue
, 8> OutChains
;
7869 for (unsigned i
= 0, e
= StoresToEmit
.size(); i
!= e
; ++i
) {
7870 SDValue Val
= DAG
.getStore(Chain
, getCurSDLoc(), StoresToEmit
[i
].first
,
7871 getValue(StoresToEmit
[i
].second
),
7872 MachinePointerInfo(StoresToEmit
[i
].second
));
7873 OutChains
.push_back(Val
);
7876 if (!OutChains
.empty())
7877 Chain
= DAG
.getNode(ISD::TokenFactor
, getCurSDLoc(), MVT::Other
, OutChains
);
7882 void SelectionDAGBuilder::emitInlineAsmError(ImmutableCallSite CS
,
7883 const Twine
&Message
) {
7884 LLVMContext
&Ctx
= *DAG
.getContext();
7885 Ctx
.emitError(CS
.getInstruction(), Message
);
7887 // Make sure we leave the DAG in a valid state
7888 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
7889 SmallVector
<EVT
, 1> ValueVTs
;
7890 ComputeValueVTs(TLI
, DAG
.getDataLayout(), CS
->getType(), ValueVTs
);
7892 if (ValueVTs
.empty())
7895 SmallVector
<SDValue
, 1> Ops
;
7896 for (unsigned i
= 0, e
= ValueVTs
.size(); i
!= e
; ++i
)
7897 Ops
.push_back(DAG
.getUNDEF(ValueVTs
[i
]));
7899 setValue(CS
.getInstruction(), DAG
.getMergeValues(Ops
, getCurSDLoc()));
7902 void SelectionDAGBuilder::visitVAStart(const CallInst
&I
) {
7903 DAG
.setRoot(DAG
.getNode(ISD::VASTART
, getCurSDLoc(),
7904 MVT::Other
, getRoot(),
7905 getValue(I
.getArgOperand(0)),
7906 DAG
.getSrcValue(I
.getArgOperand(0))));
7909 void SelectionDAGBuilder::visitVAArg(const VAArgInst
&I
) {
7910 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
7911 const DataLayout
&DL
= DAG
.getDataLayout();
7912 SDValue V
= DAG
.getVAArg(TLI
.getValueType(DAG
.getDataLayout(), I
.getType()),
7913 getCurSDLoc(), getRoot(), getValue(I
.getOperand(0)),
7914 DAG
.getSrcValue(I
.getOperand(0)),
7915 DL
.getABITypeAlignment(I
.getType()));
7917 DAG
.setRoot(V
.getValue(1));
7920 void SelectionDAGBuilder::visitVAEnd(const CallInst
&I
) {
7921 DAG
.setRoot(DAG
.getNode(ISD::VAEND
, getCurSDLoc(),
7922 MVT::Other
, getRoot(),
7923 getValue(I
.getArgOperand(0)),
7924 DAG
.getSrcValue(I
.getArgOperand(0))));
7927 void SelectionDAGBuilder::visitVACopy(const CallInst
&I
) {
7928 DAG
.setRoot(DAG
.getNode(ISD::VACOPY
, getCurSDLoc(),
7929 MVT::Other
, getRoot(),
7930 getValue(I
.getArgOperand(0)),
7931 getValue(I
.getArgOperand(1)),
7932 DAG
.getSrcValue(I
.getArgOperand(0)),
7933 DAG
.getSrcValue(I
.getArgOperand(1))));
7936 SDValue
SelectionDAGBuilder::lowerRangeToAssertZExt(SelectionDAG
&DAG
,
7937 const Instruction
&I
,
7939 const MDNode
*Range
= I
.getMetadata(LLVMContext::MD_range
);
7943 ConstantRange CR
= getConstantRangeFromMetadata(*Range
);
7944 if (CR
.isFullSet() || CR
.isEmptySet() || CR
.isWrappedSet())
7947 APInt Lo
= CR
.getUnsignedMin();
7948 if (!Lo
.isMinValue())
7951 APInt Hi
= CR
.getUnsignedMax();
7952 unsigned Bits
= Hi
.getActiveBits();
7954 EVT SmallVT
= EVT::getIntegerVT(*DAG
.getContext(), Bits
);
7956 SDLoc SL
= getCurSDLoc();
7958 SDValue ZExt
= DAG
.getNode(ISD::AssertZext
, SL
, Op
.getValueType(), Op
,
7959 DAG
.getValueType(SmallVT
));
7960 unsigned NumVals
= Op
.getNode()->getNumValues();
7964 SmallVector
<SDValue
, 4> Ops
;
7966 Ops
.push_back(ZExt
);
7967 for (unsigned I
= 1; I
!= NumVals
; ++I
)
7968 Ops
.push_back(Op
.getValue(I
));
7970 return DAG
.getMergeValues(Ops
, SL
);
7973 /// Populate a CallLowerinInfo (into \p CLI) based on the properties of
7974 /// the call being lowered.
7976 /// This is a helper for lowering intrinsics that follow a target calling
7977 /// convention or require stack pointer adjustment. Only a subset of the
7978 /// intrinsic's operands need to participate in the calling convention.
7979 void SelectionDAGBuilder::populateCallLoweringInfo(
7980 TargetLowering::CallLoweringInfo
&CLI
, ImmutableCallSite CS
,
7981 unsigned ArgIdx
, unsigned NumArgs
, SDValue Callee
, Type
*ReturnTy
,
7982 bool IsPatchPoint
) {
7983 TargetLowering::ArgListTy Args
;
7984 Args
.reserve(NumArgs
);
7986 // Populate the argument list.
7987 // Attributes for args start at offset 1, after the return attribute.
7988 for (unsigned ArgI
= ArgIdx
, ArgE
= ArgIdx
+ NumArgs
;
7989 ArgI
!= ArgE
; ++ArgI
) {
7990 const Value
*V
= CS
->getOperand(ArgI
);
7992 assert(!V
->getType()->isEmptyTy() && "Empty type passed to intrinsic.");
7994 TargetLowering::ArgListEntry Entry
;
7995 Entry
.Node
= getValue(V
);
7996 Entry
.Ty
= V
->getType();
7997 Entry
.setAttributes(&CS
, ArgI
);
7998 Args
.push_back(Entry
);
8001 CLI
.setDebugLoc(getCurSDLoc())
8002 .setChain(getRoot())
8003 .setCallee(CS
.getCallingConv(), ReturnTy
, Callee
, std::move(Args
))
8004 .setDiscardResult(CS
->use_empty())
8005 .setIsPatchPoint(IsPatchPoint
);
8008 /// Add a stack map intrinsic call's live variable operands to a stackmap
8009 /// or patchpoint target node's operand list.
8011 /// Constants are converted to TargetConstants purely as an optimization to
8012 /// avoid constant materialization and register allocation.
8014 /// FrameIndex operands are converted to TargetFrameIndex so that ISEL does not
8015 /// generate addess computation nodes, and so ExpandISelPseudo can convert the
8016 /// TargetFrameIndex into a DirectMemRefOp StackMap location. This avoids
8017 /// address materialization and register allocation, but may also be required
8018 /// for correctness. If a StackMap (or PatchPoint) intrinsic directly uses an
8019 /// alloca in the entry block, then the runtime may assume that the alloca's
8020 /// StackMap location can be read immediately after compilation and that the
8021 /// location is valid at any point during execution (this is similar to the
8022 /// assumption made by the llvm.gcroot intrinsic). If the alloca's location were
8023 /// only available in a register, then the runtime would need to trap when
8024 /// execution reaches the StackMap in order to read the alloca's location.
8025 static void addStackMapLiveVars(ImmutableCallSite CS
, unsigned StartIdx
,
8026 const SDLoc
&DL
, SmallVectorImpl
<SDValue
> &Ops
,
8027 SelectionDAGBuilder
&Builder
) {
8028 for (unsigned i
= StartIdx
, e
= CS
.arg_size(); i
!= e
; ++i
) {
8029 SDValue OpVal
= Builder
.getValue(CS
.getArgument(i
));
8030 if (ConstantSDNode
*C
= dyn_cast
<ConstantSDNode
>(OpVal
)) {
8032 Builder
.DAG
.getTargetConstant(StackMaps::ConstantOp
, DL
, MVT::i64
));
8034 Builder
.DAG
.getTargetConstant(C
->getSExtValue(), DL
, MVT::i64
));
8035 } else if (FrameIndexSDNode
*FI
= dyn_cast
<FrameIndexSDNode
>(OpVal
)) {
8036 const TargetLowering
&TLI
= Builder
.DAG
.getTargetLoweringInfo();
8037 Ops
.push_back(Builder
.DAG
.getTargetFrameIndex(
8038 FI
->getIndex(), TLI
.getFrameIndexTy(Builder
.DAG
.getDataLayout())));
8040 Ops
.push_back(OpVal
);
8044 /// Lower llvm.experimental.stackmap directly to its target opcode.
8045 void SelectionDAGBuilder::visitStackmap(const CallInst
&CI
) {
8046 // void @llvm.experimental.stackmap(i32 <id>, i32 <numShadowBytes>,
8047 // [live variables...])
8049 assert(CI
.getType()->isVoidTy() && "Stackmap cannot return a value.");
8051 SDValue Chain
, InFlag
, Callee
, NullPtr
;
8052 SmallVector
<SDValue
, 32> Ops
;
8054 SDLoc DL
= getCurSDLoc();
8055 Callee
= getValue(CI
.getCalledValue());
8056 NullPtr
= DAG
.getIntPtrConstant(0, DL
, true);
8058 // The stackmap intrinsic only records the live variables (the arguemnts
8059 // passed to it) and emits NOPS (if requested). Unlike the patchpoint
8060 // intrinsic, this won't be lowered to a function call. This means we don't
8061 // have to worry about calling conventions and target specific lowering code.
8062 // Instead we perform the call lowering right here.
8064 // chain, flag = CALLSEQ_START(chain, 0, 0)
8065 // chain, flag = STACKMAP(id, nbytes, ..., chain, flag)
8066 // chain, flag = CALLSEQ_END(chain, 0, 0, flag)
8068 Chain
= DAG
.getCALLSEQ_START(getRoot(), 0, 0, DL
);
8069 InFlag
= Chain
.getValue(1);
8071 // Add the <id> and <numBytes> constants.
8072 SDValue IDVal
= getValue(CI
.getOperand(PatchPointOpers::IDPos
));
8073 Ops
.push_back(DAG
.getTargetConstant(
8074 cast
<ConstantSDNode
>(IDVal
)->getZExtValue(), DL
, MVT::i64
));
8075 SDValue NBytesVal
= getValue(CI
.getOperand(PatchPointOpers::NBytesPos
));
8076 Ops
.push_back(DAG
.getTargetConstant(
8077 cast
<ConstantSDNode
>(NBytesVal
)->getZExtValue(), DL
,
8080 // Push live variables for the stack map.
8081 addStackMapLiveVars(&CI
, 2, DL
, Ops
, *this);
8083 // We are not pushing any register mask info here on the operands list,
8084 // because the stackmap doesn't clobber anything.
8086 // Push the chain and the glue flag.
8087 Ops
.push_back(Chain
);
8088 Ops
.push_back(InFlag
);
8090 // Create the STACKMAP node.
8091 SDVTList NodeTys
= DAG
.getVTList(MVT::Other
, MVT::Glue
);
8092 SDNode
*SM
= DAG
.getMachineNode(TargetOpcode::STACKMAP
, DL
, NodeTys
, Ops
);
8093 Chain
= SDValue(SM
, 0);
8094 InFlag
= Chain
.getValue(1);
8096 Chain
= DAG
.getCALLSEQ_END(Chain
, NullPtr
, NullPtr
, InFlag
, DL
);
8098 // Stackmaps don't generate values, so nothing goes into the NodeMap.
8100 // Set the root to the target-lowered call chain.
8103 // Inform the Frame Information that we have a stackmap in this function.
8104 FuncInfo
.MF
->getFrameInfo().setHasStackMap();
8107 /// Lower llvm.experimental.patchpoint directly to its target opcode.
8108 void SelectionDAGBuilder::visitPatchpoint(ImmutableCallSite CS
,
8109 const BasicBlock
*EHPadBB
) {
8110 // void|i64 @llvm.experimental.patchpoint.void|i64(i64 <id>,
8115 // [live variables...])
8117 CallingConv::ID CC
= CS
.getCallingConv();
8118 bool IsAnyRegCC
= CC
== CallingConv::AnyReg
;
8119 bool HasDef
= !CS
->getType()->isVoidTy();
8120 SDLoc dl
= getCurSDLoc();
8121 SDValue Callee
= getValue(CS
->getOperand(PatchPointOpers::TargetPos
));
8123 // Handle immediate and symbolic callees.
8124 if (auto* ConstCallee
= dyn_cast
<ConstantSDNode
>(Callee
))
8125 Callee
= DAG
.getIntPtrConstant(ConstCallee
->getZExtValue(), dl
,
8127 else if (auto* SymbolicCallee
= dyn_cast
<GlobalAddressSDNode
>(Callee
))
8128 Callee
= DAG
.getTargetGlobalAddress(SymbolicCallee
->getGlobal(),
8129 SDLoc(SymbolicCallee
),
8130 SymbolicCallee
->getValueType(0));
8132 // Get the real number of arguments participating in the call <numArgs>
8133 SDValue NArgVal
= getValue(CS
.getArgument(PatchPointOpers::NArgPos
));
8134 unsigned NumArgs
= cast
<ConstantSDNode
>(NArgVal
)->getZExtValue();
8136 // Skip the four meta args: <id>, <numNopBytes>, <target>, <numArgs>
8137 // Intrinsics include all meta-operands up to but not including CC.
8138 unsigned NumMetaOpers
= PatchPointOpers::CCPos
;
8139 assert(CS
.arg_size() >= NumMetaOpers
+ NumArgs
&&
8140 "Not enough arguments provided to the patchpoint intrinsic");
8142 // For AnyRegCC the arguments are lowered later on manually.
8143 unsigned NumCallArgs
= IsAnyRegCC
? 0 : NumArgs
;
8145 IsAnyRegCC
? Type::getVoidTy(*DAG
.getContext()) : CS
->getType();
8147 TargetLowering::CallLoweringInfo
CLI(DAG
);
8148 populateCallLoweringInfo(CLI
, CS
, NumMetaOpers
, NumCallArgs
, Callee
, ReturnTy
,
8150 std::pair
<SDValue
, SDValue
> Result
= lowerInvokable(CLI
, EHPadBB
);
8152 SDNode
*CallEnd
= Result
.second
.getNode();
8153 if (HasDef
&& (CallEnd
->getOpcode() == ISD::CopyFromReg
))
8154 CallEnd
= CallEnd
->getOperand(0).getNode();
8156 /// Get a call instruction from the call sequence chain.
8157 /// Tail calls are not allowed.
8158 assert(CallEnd
->getOpcode() == ISD::CALLSEQ_END
&&
8159 "Expected a callseq node.");
8160 SDNode
*Call
= CallEnd
->getOperand(0).getNode();
8161 bool HasGlue
= Call
->getGluedNode();
8163 // Replace the target specific call node with the patchable intrinsic.
8164 SmallVector
<SDValue
, 8> Ops
;
8166 // Add the <id> and <numBytes> constants.
8167 SDValue IDVal
= getValue(CS
->getOperand(PatchPointOpers::IDPos
));
8168 Ops
.push_back(DAG
.getTargetConstant(
8169 cast
<ConstantSDNode
>(IDVal
)->getZExtValue(), dl
, MVT::i64
));
8170 SDValue NBytesVal
= getValue(CS
->getOperand(PatchPointOpers::NBytesPos
));
8171 Ops
.push_back(DAG
.getTargetConstant(
8172 cast
<ConstantSDNode
>(NBytesVal
)->getZExtValue(), dl
,
8176 Ops
.push_back(Callee
);
8178 // Adjust <numArgs> to account for any arguments that have been passed on the
8180 // Call Node: Chain, Target, {Args}, RegMask, [Glue]
8181 unsigned NumCallRegArgs
= Call
->getNumOperands() - (HasGlue
? 4 : 3);
8182 NumCallRegArgs
= IsAnyRegCC
? NumArgs
: NumCallRegArgs
;
8183 Ops
.push_back(DAG
.getTargetConstant(NumCallRegArgs
, dl
, MVT::i32
));
8185 // Add the calling convention
8186 Ops
.push_back(DAG
.getTargetConstant((unsigned)CC
, dl
, MVT::i32
));
8188 // Add the arguments we omitted previously. The register allocator should
8189 // place these in any free register.
8191 for (unsigned i
= NumMetaOpers
, e
= NumMetaOpers
+ NumArgs
; i
!= e
; ++i
)
8192 Ops
.push_back(getValue(CS
.getArgument(i
)));
8194 // Push the arguments from the call instruction up to the register mask.
8195 SDNode::op_iterator e
= HasGlue
? Call
->op_end()-2 : Call
->op_end()-1;
8196 Ops
.append(Call
->op_begin() + 2, e
);
8198 // Push live variables for the stack map.
8199 addStackMapLiveVars(CS
, NumMetaOpers
+ NumArgs
, dl
, Ops
, *this);
8201 // Push the register mask info.
8203 Ops
.push_back(*(Call
->op_end()-2));
8205 Ops
.push_back(*(Call
->op_end()-1));
8207 // Push the chain (this is originally the first operand of the call, but
8208 // becomes now the last or second to last operand).
8209 Ops
.push_back(*(Call
->op_begin()));
8211 // Push the glue flag (last operand).
8213 Ops
.push_back(*(Call
->op_end()-1));
8216 if (IsAnyRegCC
&& HasDef
) {
8217 // Create the return types based on the intrinsic definition
8218 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
8219 SmallVector
<EVT
, 3> ValueVTs
;
8220 ComputeValueVTs(TLI
, DAG
.getDataLayout(), CS
->getType(), ValueVTs
);
8221 assert(ValueVTs
.size() == 1 && "Expected only one return value type.");
8223 // There is always a chain and a glue type at the end
8224 ValueVTs
.push_back(MVT::Other
);
8225 ValueVTs
.push_back(MVT::Glue
);
8226 NodeTys
= DAG
.getVTList(ValueVTs
);
8228 NodeTys
= DAG
.getVTList(MVT::Other
, MVT::Glue
);
8230 // Replace the target specific call node with a PATCHPOINT node.
8231 MachineSDNode
*MN
= DAG
.getMachineNode(TargetOpcode::PATCHPOINT
,
8234 // Update the NodeMap.
8237 setValue(CS
.getInstruction(), SDValue(MN
, 0));
8239 setValue(CS
.getInstruction(), Result
.first
);
8242 // Fixup the consumers of the intrinsic. The chain and glue may be used in the
8243 // call sequence. Furthermore the location of the chain and glue can change
8244 // when the AnyReg calling convention is used and the intrinsic returns a
8246 if (IsAnyRegCC
&& HasDef
) {
8247 SDValue From
[] = {SDValue(Call
, 0), SDValue(Call
, 1)};
8248 SDValue To
[] = {SDValue(MN
, 1), SDValue(MN
, 2)};
8249 DAG
.ReplaceAllUsesOfValuesWith(From
, To
, 2);
8251 DAG
.ReplaceAllUsesWith(Call
, MN
);
8252 DAG
.DeleteNode(Call
);
8254 // Inform the Frame Information that we have a patchpoint in this function.
8255 FuncInfo
.MF
->getFrameInfo().setHasPatchPoint();
8258 void SelectionDAGBuilder::visitVectorReduce(const CallInst
&I
,
8259 unsigned Intrinsic
) {
8260 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
8261 SDValue Op1
= getValue(I
.getArgOperand(0));
8263 if (I
.getNumArgOperands() > 1)
8264 Op2
= getValue(I
.getArgOperand(1));
8265 SDLoc dl
= getCurSDLoc();
8266 EVT VT
= TLI
.getValueType(DAG
.getDataLayout(), I
.getType());
8269 if (isa
<FPMathOperator
>(I
))
8270 FMF
= I
.getFastMathFlags();
8272 switch (Intrinsic
) {
8273 case Intrinsic::experimental_vector_reduce_fadd
:
8275 Res
= DAG
.getNode(ISD::VECREDUCE_FADD
, dl
, VT
, Op2
);
8277 Res
= DAG
.getNode(ISD::VECREDUCE_STRICT_FADD
, dl
, VT
, Op1
, Op2
);
8279 case Intrinsic::experimental_vector_reduce_fmul
:
8281 Res
= DAG
.getNode(ISD::VECREDUCE_FMUL
, dl
, VT
, Op2
);
8283 Res
= DAG
.getNode(ISD::VECREDUCE_STRICT_FMUL
, dl
, VT
, Op1
, Op2
);
8285 case Intrinsic::experimental_vector_reduce_add
:
8286 Res
= DAG
.getNode(ISD::VECREDUCE_ADD
, dl
, VT
, Op1
);
8288 case Intrinsic::experimental_vector_reduce_mul
:
8289 Res
= DAG
.getNode(ISD::VECREDUCE_MUL
, dl
, VT
, Op1
);
8291 case Intrinsic::experimental_vector_reduce_and
:
8292 Res
= DAG
.getNode(ISD::VECREDUCE_AND
, dl
, VT
, Op1
);
8294 case Intrinsic::experimental_vector_reduce_or
:
8295 Res
= DAG
.getNode(ISD::VECREDUCE_OR
, dl
, VT
, Op1
);
8297 case Intrinsic::experimental_vector_reduce_xor
:
8298 Res
= DAG
.getNode(ISD::VECREDUCE_XOR
, dl
, VT
, Op1
);
8300 case Intrinsic::experimental_vector_reduce_smax
:
8301 Res
= DAG
.getNode(ISD::VECREDUCE_SMAX
, dl
, VT
, Op1
);
8303 case Intrinsic::experimental_vector_reduce_smin
:
8304 Res
= DAG
.getNode(ISD::VECREDUCE_SMIN
, dl
, VT
, Op1
);
8306 case Intrinsic::experimental_vector_reduce_umax
:
8307 Res
= DAG
.getNode(ISD::VECREDUCE_UMAX
, dl
, VT
, Op1
);
8309 case Intrinsic::experimental_vector_reduce_umin
:
8310 Res
= DAG
.getNode(ISD::VECREDUCE_UMIN
, dl
, VT
, Op1
);
8312 case Intrinsic::experimental_vector_reduce_fmax
:
8313 Res
= DAG
.getNode(ISD::VECREDUCE_FMAX
, dl
, VT
, Op1
);
8315 case Intrinsic::experimental_vector_reduce_fmin
:
8316 Res
= DAG
.getNode(ISD::VECREDUCE_FMIN
, dl
, VT
, Op1
);
8319 llvm_unreachable("Unhandled vector reduce intrinsic");
8324 /// Returns an AttributeList representing the attributes applied to the return
8325 /// value of the given call.
8326 static AttributeList
getReturnAttrs(TargetLowering::CallLoweringInfo
&CLI
) {
8327 SmallVector
<Attribute::AttrKind
, 2> Attrs
;
8329 Attrs
.push_back(Attribute::SExt
);
8331 Attrs
.push_back(Attribute::ZExt
);
8333 Attrs
.push_back(Attribute::InReg
);
8335 return AttributeList::get(CLI
.RetTy
->getContext(), AttributeList::ReturnIndex
,
8339 /// TargetLowering::LowerCallTo - This is the default LowerCallTo
8340 /// implementation, which just calls LowerCall.
8341 /// FIXME: When all targets are
8342 /// migrated to using LowerCall, this hook should be integrated into SDISel.
8343 std::pair
<SDValue
, SDValue
>
8344 TargetLowering::LowerCallTo(TargetLowering::CallLoweringInfo
&CLI
) const {
8345 // Handle the incoming return values from the call.
8347 Type
*OrigRetTy
= CLI
.RetTy
;
8348 SmallVector
<EVT
, 4> RetTys
;
8349 SmallVector
<uint64_t, 4> Offsets
;
8350 auto &DL
= CLI
.DAG
.getDataLayout();
8351 ComputeValueVTs(*this, DL
, CLI
.RetTy
, RetTys
, &Offsets
);
8353 if (CLI
.IsPostTypeLegalization
) {
8354 // If we are lowering a libcall after legalization, split the return type.
8355 SmallVector
<EVT
, 4> OldRetTys
= std::move(RetTys
);
8356 SmallVector
<uint64_t, 4> OldOffsets
= std::move(Offsets
);
8357 for (size_t i
= 0, e
= OldRetTys
.size(); i
!= e
; ++i
) {
8358 EVT RetVT
= OldRetTys
[i
];
8359 uint64_t Offset
= OldOffsets
[i
];
8360 MVT RegisterVT
= getRegisterType(CLI
.RetTy
->getContext(), RetVT
);
8361 unsigned NumRegs
= getNumRegisters(CLI
.RetTy
->getContext(), RetVT
);
8362 unsigned RegisterVTByteSZ
= RegisterVT
.getSizeInBits() / 8;
8363 RetTys
.append(NumRegs
, RegisterVT
);
8364 for (unsigned j
= 0; j
!= NumRegs
; ++j
)
8365 Offsets
.push_back(Offset
+ j
* RegisterVTByteSZ
);
8369 SmallVector
<ISD::OutputArg
, 4> Outs
;
8370 GetReturnInfo(CLI
.CallConv
, CLI
.RetTy
, getReturnAttrs(CLI
), Outs
, *this, DL
);
8372 bool CanLowerReturn
=
8373 this->CanLowerReturn(CLI
.CallConv
, CLI
.DAG
.getMachineFunction(),
8374 CLI
.IsVarArg
, Outs
, CLI
.RetTy
->getContext());
8376 SDValue DemoteStackSlot
;
8377 int DemoteStackIdx
= -100;
8378 if (!CanLowerReturn
) {
8379 // FIXME: equivalent assert?
8380 // assert(!CS.hasInAllocaArgument() &&
8381 // "sret demotion is incompatible with inalloca");
8382 uint64_t TySize
= DL
.getTypeAllocSize(CLI
.RetTy
);
8383 unsigned Align
= DL
.getPrefTypeAlignment(CLI
.RetTy
);
8384 MachineFunction
&MF
= CLI
.DAG
.getMachineFunction();
8385 DemoteStackIdx
= MF
.getFrameInfo().CreateStackObject(TySize
, Align
, false);
8386 Type
*StackSlotPtrType
= PointerType::get(CLI
.RetTy
,
8387 DL
.getAllocaAddrSpace());
8389 DemoteStackSlot
= CLI
.DAG
.getFrameIndex(DemoteStackIdx
, getFrameIndexTy(DL
));
8391 Entry
.Node
= DemoteStackSlot
;
8392 Entry
.Ty
= StackSlotPtrType
;
8393 Entry
.IsSExt
= false;
8394 Entry
.IsZExt
= false;
8395 Entry
.IsInReg
= false;
8396 Entry
.IsSRet
= true;
8397 Entry
.IsNest
= false;
8398 Entry
.IsByVal
= false;
8399 Entry
.IsReturned
= false;
8400 Entry
.IsSwiftSelf
= false;
8401 Entry
.IsSwiftError
= false;
8402 Entry
.Alignment
= Align
;
8403 CLI
.getArgs().insert(CLI
.getArgs().begin(), Entry
);
8404 CLI
.NumFixedArgs
+= 1;
8405 CLI
.RetTy
= Type::getVoidTy(CLI
.RetTy
->getContext());
8407 // sret demotion isn't compatible with tail-calls, since the sret argument
8408 // points into the callers stack frame.
8409 CLI
.IsTailCall
= false;
8411 for (unsigned I
= 0, E
= RetTys
.size(); I
!= E
; ++I
) {
8413 MVT RegisterVT
= getRegisterTypeForCallingConv(CLI
.RetTy
->getContext(),
8415 unsigned NumRegs
= getNumRegistersForCallingConv(CLI
.RetTy
->getContext(),
8417 for (unsigned i
= 0; i
!= NumRegs
; ++i
) {
8418 ISD::InputArg MyFlags
;
8419 MyFlags
.VT
= RegisterVT
;
8421 MyFlags
.Used
= CLI
.IsReturnValueUsed
;
8423 MyFlags
.Flags
.setSExt();
8425 MyFlags
.Flags
.setZExt();
8427 MyFlags
.Flags
.setInReg();
8428 CLI
.Ins
.push_back(MyFlags
);
8433 // We push in swifterror return as the last element of CLI.Ins.
8434 ArgListTy
&Args
= CLI
.getArgs();
8435 if (supportSwiftError()) {
8436 for (unsigned i
= 0, e
= Args
.size(); i
!= e
; ++i
) {
8437 if (Args
[i
].IsSwiftError
) {
8438 ISD::InputArg MyFlags
;
8439 MyFlags
.VT
= getPointerTy(DL
);
8440 MyFlags
.ArgVT
= EVT(getPointerTy(DL
));
8441 MyFlags
.Flags
.setSwiftError();
8442 CLI
.Ins
.push_back(MyFlags
);
8447 // Handle all of the outgoing arguments.
8449 CLI
.OutVals
.clear();
8450 for (unsigned i
= 0, e
= Args
.size(); i
!= e
; ++i
) {
8451 SmallVector
<EVT
, 4> ValueVTs
;
8452 ComputeValueVTs(*this, DL
, Args
[i
].Ty
, ValueVTs
);
8453 // FIXME: Split arguments if CLI.IsPostTypeLegalization
8454 Type
*FinalType
= Args
[i
].Ty
;
8455 if (Args
[i
].IsByVal
)
8456 FinalType
= cast
<PointerType
>(Args
[i
].Ty
)->getElementType();
8457 bool NeedsRegBlock
= functionArgumentNeedsConsecutiveRegisters(
8458 FinalType
, CLI
.CallConv
, CLI
.IsVarArg
);
8459 for (unsigned Value
= 0, NumValues
= ValueVTs
.size(); Value
!= NumValues
;
8461 EVT VT
= ValueVTs
[Value
];
8462 Type
*ArgTy
= VT
.getTypeForEVT(CLI
.RetTy
->getContext());
8463 SDValue Op
= SDValue(Args
[i
].Node
.getNode(),
8464 Args
[i
].Node
.getResNo() + Value
);
8465 ISD::ArgFlagsTy Flags
;
8467 // Certain targets (such as MIPS), may have a different ABI alignment
8468 // for a type depending on the context. Give the target a chance to
8469 // specify the alignment it wants.
8470 unsigned OriginalAlignment
= getABIAlignmentForCallingConv(ArgTy
, DL
);
8476 if (Args
[i
].IsInReg
) {
8477 // If we are using vectorcall calling convention, a structure that is
8478 // passed InReg - is surely an HVA
8479 if (CLI
.CallConv
== CallingConv::X86_VectorCall
&&
8480 isa
<StructType
>(FinalType
)) {
8481 // The first value of a structure is marked
8483 Flags
.setHvaStart();
8491 if (Args
[i
].IsSwiftSelf
)
8492 Flags
.setSwiftSelf();
8493 if (Args
[i
].IsSwiftError
)
8494 Flags
.setSwiftError();
8495 if (Args
[i
].IsByVal
)
8497 if (Args
[i
].IsInAlloca
) {
8498 Flags
.setInAlloca();
8499 // Set the byval flag for CCAssignFn callbacks that don't know about
8500 // inalloca. This way we can know how many bytes we should've allocated
8501 // and how many bytes a callee cleanup function will pop. If we port
8502 // inalloca to more targets, we'll have to add custom inalloca handling
8503 // in the various CC lowering callbacks.
8506 if (Args
[i
].IsByVal
|| Args
[i
].IsInAlloca
) {
8507 PointerType
*Ty
= cast
<PointerType
>(Args
[i
].Ty
);
8508 Type
*ElementTy
= Ty
->getElementType();
8509 Flags
.setByValSize(DL
.getTypeAllocSize(ElementTy
));
8510 // For ByVal, alignment should come from FE. BE will guess if this
8511 // info is not there but there are cases it cannot get right.
8512 unsigned FrameAlign
;
8513 if (Args
[i
].Alignment
)
8514 FrameAlign
= Args
[i
].Alignment
;
8516 FrameAlign
= getByValTypeAlignment(ElementTy
, DL
);
8517 Flags
.setByValAlign(FrameAlign
);
8522 Flags
.setInConsecutiveRegs();
8523 Flags
.setOrigAlign(OriginalAlignment
);
8525 MVT PartVT
= getRegisterTypeForCallingConv(CLI
.RetTy
->getContext(),
8527 unsigned NumParts
= getNumRegistersForCallingConv(CLI
.RetTy
->getContext(),
8529 SmallVector
<SDValue
, 4> Parts(NumParts
);
8530 ISD::NodeType ExtendKind
= ISD::ANY_EXTEND
;
8533 ExtendKind
= ISD::SIGN_EXTEND
;
8534 else if (Args
[i
].IsZExt
)
8535 ExtendKind
= ISD::ZERO_EXTEND
;
8537 // Conservatively only handle 'returned' on non-vectors that can be lowered,
8539 if (Args
[i
].IsReturned
&& !Op
.getValueType().isVector() &&
8541 assert(CLI
.RetTy
== Args
[i
].Ty
&& RetTys
.size() == NumValues
&&
8542 "unexpected use of 'returned'");
8543 // Before passing 'returned' to the target lowering code, ensure that
8544 // either the register MVT and the actual EVT are the same size or that
8545 // the return value and argument are extended in the same way; in these
8546 // cases it's safe to pass the argument register value unchanged as the
8547 // return register value (although it's at the target's option whether
8549 // TODO: allow code generation to take advantage of partially preserved
8550 // registers rather than clobbering the entire register when the
8551 // parameter extension method is not compatible with the return
8553 if ((NumParts
* PartVT
.getSizeInBits() == VT
.getSizeInBits()) ||
8554 (ExtendKind
!= ISD::ANY_EXTEND
&& CLI
.RetSExt
== Args
[i
].IsSExt
&&
8555 CLI
.RetZExt
== Args
[i
].IsZExt
))
8556 Flags
.setReturned();
8559 getCopyToParts(CLI
.DAG
, CLI
.DL
, Op
, &Parts
[0], NumParts
, PartVT
,
8560 CLI
.CS
.getInstruction(), CLI
.CallConv
, ExtendKind
);
8562 for (unsigned j
= 0; j
!= NumParts
; ++j
) {
8563 // if it isn't first piece, alignment must be 1
8564 ISD::OutputArg
MyFlags(Flags
, Parts
[j
].getValueType(), VT
,
8565 i
< CLI
.NumFixedArgs
,
8566 i
, j
*Parts
[j
].getValueType().getStoreSize());
8567 if (NumParts
> 1 && j
== 0)
8568 MyFlags
.Flags
.setSplit();
8570 MyFlags
.Flags
.setOrigAlign(1);
8571 if (j
== NumParts
- 1)
8572 MyFlags
.Flags
.setSplitEnd();
8575 CLI
.Outs
.push_back(MyFlags
);
8576 CLI
.OutVals
.push_back(Parts
[j
]);
8579 if (NeedsRegBlock
&& Value
== NumValues
- 1)
8580 CLI
.Outs
[CLI
.Outs
.size() - 1].Flags
.setInConsecutiveRegsLast();
8584 SmallVector
<SDValue
, 4> InVals
;
8585 CLI
.Chain
= LowerCall(CLI
, InVals
);
8587 // Update CLI.InVals to use outside of this function.
8588 CLI
.InVals
= InVals
;
8590 // Verify that the target's LowerCall behaved as expected.
8591 assert(CLI
.Chain
.getNode() && CLI
.Chain
.getValueType() == MVT::Other
&&
8592 "LowerCall didn't return a valid chain!");
8593 assert((!CLI
.IsTailCall
|| InVals
.empty()) &&
8594 "LowerCall emitted a return value for a tail call!");
8595 assert((CLI
.IsTailCall
|| InVals
.size() == CLI
.Ins
.size()) &&
8596 "LowerCall didn't emit the correct number of values!");
8598 // For a tail call, the return value is merely live-out and there aren't
8599 // any nodes in the DAG representing it. Return a special value to
8600 // indicate that a tail call has been emitted and no more Instructions
8601 // should be processed in the current block.
8602 if (CLI
.IsTailCall
) {
8603 CLI
.DAG
.setRoot(CLI
.Chain
);
8604 return std::make_pair(SDValue(), SDValue());
8608 for (unsigned i
= 0, e
= CLI
.Ins
.size(); i
!= e
; ++i
) {
8609 assert(InVals
[i
].getNode() && "LowerCall emitted a null value!");
8610 assert(EVT(CLI
.Ins
[i
].VT
) == InVals
[i
].getValueType() &&
8611 "LowerCall emitted a value with the wrong type!");
8615 SmallVector
<SDValue
, 4> ReturnValues
;
8616 if (!CanLowerReturn
) {
8617 // The instruction result is the result of loading from the
8618 // hidden sret parameter.
8619 SmallVector
<EVT
, 1> PVTs
;
8620 Type
*PtrRetTy
= OrigRetTy
->getPointerTo(DL
.getAllocaAddrSpace());
8622 ComputeValueVTs(*this, DL
, PtrRetTy
, PVTs
);
8623 assert(PVTs
.size() == 1 && "Pointers should fit in one register");
8624 EVT PtrVT
= PVTs
[0];
8626 unsigned NumValues
= RetTys
.size();
8627 ReturnValues
.resize(NumValues
);
8628 SmallVector
<SDValue
, 4> Chains(NumValues
);
8630 // An aggregate return value cannot wrap around the address space, so
8631 // offsets to its parts don't wrap either.
8633 Flags
.setNoUnsignedWrap(true);
8635 for (unsigned i
= 0; i
< NumValues
; ++i
) {
8636 SDValue Add
= CLI
.DAG
.getNode(ISD::ADD
, CLI
.DL
, PtrVT
, DemoteStackSlot
,
8637 CLI
.DAG
.getConstant(Offsets
[i
], CLI
.DL
,
8639 SDValue L
= CLI
.DAG
.getLoad(
8640 RetTys
[i
], CLI
.DL
, CLI
.Chain
, Add
,
8641 MachinePointerInfo::getFixedStack(CLI
.DAG
.getMachineFunction(),
8642 DemoteStackIdx
, Offsets
[i
]),
8643 /* Alignment = */ 1);
8644 ReturnValues
[i
] = L
;
8645 Chains
[i
] = L
.getValue(1);
8648 CLI
.Chain
= CLI
.DAG
.getNode(ISD::TokenFactor
, CLI
.DL
, MVT::Other
, Chains
);
8650 // Collect the legal value parts into potentially illegal values
8651 // that correspond to the original function's return values.
8652 Optional
<ISD::NodeType
> AssertOp
;
8654 AssertOp
= ISD::AssertSext
;
8655 else if (CLI
.RetZExt
)
8656 AssertOp
= ISD::AssertZext
;
8657 unsigned CurReg
= 0;
8658 for (unsigned I
= 0, E
= RetTys
.size(); I
!= E
; ++I
) {
8660 MVT RegisterVT
= getRegisterTypeForCallingConv(CLI
.RetTy
->getContext(),
8662 unsigned NumRegs
= getNumRegistersForCallingConv(CLI
.RetTy
->getContext(),
8665 ReturnValues
.push_back(getCopyFromParts(CLI
.DAG
, CLI
.DL
, &InVals
[CurReg
],
8666 NumRegs
, RegisterVT
, VT
, nullptr,
8667 CLI
.CallConv
, AssertOp
));
8671 // For a function returning void, there is no return value. We can't create
8672 // such a node, so we just return a null return value in that case. In
8673 // that case, nothing will actually look at the value.
8674 if (ReturnValues
.empty())
8675 return std::make_pair(SDValue(), CLI
.Chain
);
8678 SDValue Res
= CLI
.DAG
.getNode(ISD::MERGE_VALUES
, CLI
.DL
,
8679 CLI
.DAG
.getVTList(RetTys
), ReturnValues
);
8680 return std::make_pair(Res
, CLI
.Chain
);
8683 void TargetLowering::LowerOperationWrapper(SDNode
*N
,
8684 SmallVectorImpl
<SDValue
> &Results
,
8685 SelectionDAG
&DAG
) const {
8686 if (SDValue Res
= LowerOperation(SDValue(N
, 0), DAG
))
8687 Results
.push_back(Res
);
8690 SDValue
TargetLowering::LowerOperation(SDValue Op
, SelectionDAG
&DAG
) const {
8691 llvm_unreachable("LowerOperation not implemented for this target!");
8695 SelectionDAGBuilder::CopyValueToVirtualRegister(const Value
*V
, unsigned Reg
) {
8696 SDValue Op
= getNonRegisterValue(V
);
8697 assert((Op
.getOpcode() != ISD::CopyFromReg
||
8698 cast
<RegisterSDNode
>(Op
.getOperand(1))->getReg() != Reg
) &&
8699 "Copy from a reg to the same reg!");
8700 assert(!TargetRegisterInfo::isPhysicalRegister(Reg
) && "Is a physreg");
8702 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
8703 // If this is an InlineAsm we have to match the registers required, not the
8704 // notional registers required by the type.
8706 RegsForValue
RFV(V
->getContext(), TLI
, DAG
.getDataLayout(), Reg
, V
->getType(),
8707 None
); // This is not an ABI copy.
8708 SDValue Chain
= DAG
.getEntryNode();
8710 ISD::NodeType ExtendType
= (FuncInfo
.PreferredExtendType
.find(V
) ==
8711 FuncInfo
.PreferredExtendType
.end())
8713 : FuncInfo
.PreferredExtendType
[V
];
8714 RFV
.getCopyToRegs(Op
, DAG
, getCurSDLoc(), Chain
, nullptr, V
, ExtendType
);
8715 PendingExports
.push_back(Chain
);
8718 #include "llvm/CodeGen/SelectionDAGISel.h"
8720 /// isOnlyUsedInEntryBlock - If the specified argument is only used in the
8721 /// entry block, return true. This includes arguments used by switches, since
8722 /// the switch may expand into multiple basic blocks.
8723 static bool isOnlyUsedInEntryBlock(const Argument
*A
, bool FastISel
) {
8724 // With FastISel active, we may be splitting blocks, so force creation
8725 // of virtual registers for all non-dead arguments.
8727 return A
->use_empty();
8729 const BasicBlock
&Entry
= A
->getParent()->front();
8730 for (const User
*U
: A
->users())
8731 if (cast
<Instruction
>(U
)->getParent() != &Entry
|| isa
<SwitchInst
>(U
))
8732 return false; // Use not in entry block.
8737 using ArgCopyElisionMapTy
=
8738 DenseMap
<const Argument
*,
8739 std::pair
<const AllocaInst
*, const StoreInst
*>>;
8741 /// Scan the entry block of the function in FuncInfo for arguments that look
8742 /// like copies into a local alloca. Record any copied arguments in
8743 /// ArgCopyElisionCandidates.
8745 findArgumentCopyElisionCandidates(const DataLayout
&DL
,
8746 FunctionLoweringInfo
*FuncInfo
,
8747 ArgCopyElisionMapTy
&ArgCopyElisionCandidates
) {
8748 // Record the state of every static alloca used in the entry block. Argument
8749 // allocas are all used in the entry block, so we need approximately as many
8750 // entries as we have arguments.
8751 enum StaticAllocaInfo
{ Unknown
, Clobbered
, Elidable
};
8752 SmallDenseMap
<const AllocaInst
*, StaticAllocaInfo
, 8> StaticAllocas
;
8753 unsigned NumArgs
= FuncInfo
->Fn
->arg_size();
8754 StaticAllocas
.reserve(NumArgs
* 2);
8756 auto GetInfoIfStaticAlloca
= [&](const Value
*V
) -> StaticAllocaInfo
* {
8759 V
= V
->stripPointerCasts();
8760 const auto *AI
= dyn_cast
<AllocaInst
>(V
);
8761 if (!AI
|| !AI
->isStaticAlloca() || !FuncInfo
->StaticAllocaMap
.count(AI
))
8763 auto Iter
= StaticAllocas
.insert({AI
, Unknown
});
8764 return &Iter
.first
->second
;
8767 // Look for stores of arguments to static allocas. Look through bitcasts and
8768 // GEPs to handle type coercions, as long as the alloca is fully initialized
8769 // by the store. Any non-store use of an alloca escapes it and any subsequent
8770 // unanalyzed store might write it.
8771 // FIXME: Handle structs initialized with multiple stores.
8772 for (const Instruction
&I
: FuncInfo
->Fn
->getEntryBlock()) {
8773 // Look for stores, and handle non-store uses conservatively.
8774 const auto *SI
= dyn_cast
<StoreInst
>(&I
);
8776 // We will look through cast uses, so ignore them completely.
8779 // Ignore debug info intrinsics, they don't escape or store to allocas.
8780 if (isa
<DbgInfoIntrinsic
>(I
))
8782 // This is an unknown instruction. Assume it escapes or writes to all
8783 // static alloca operands.
8784 for (const Use
&U
: I
.operands()) {
8785 if (StaticAllocaInfo
*Info
= GetInfoIfStaticAlloca(U
))
8786 *Info
= StaticAllocaInfo::Clobbered
;
8791 // If the stored value is a static alloca, mark it as escaped.
8792 if (StaticAllocaInfo
*Info
= GetInfoIfStaticAlloca(SI
->getValueOperand()))
8793 *Info
= StaticAllocaInfo::Clobbered
;
8795 // Check if the destination is a static alloca.
8796 const Value
*Dst
= SI
->getPointerOperand()->stripPointerCasts();
8797 StaticAllocaInfo
*Info
= GetInfoIfStaticAlloca(Dst
);
8800 const AllocaInst
*AI
= cast
<AllocaInst
>(Dst
);
8802 // Skip allocas that have been initialized or clobbered.
8803 if (*Info
!= StaticAllocaInfo::Unknown
)
8806 // Check if the stored value is an argument, and that this store fully
8807 // initializes the alloca. Don't elide copies from the same argument twice.
8808 const Value
*Val
= SI
->getValueOperand()->stripPointerCasts();
8809 const auto *Arg
= dyn_cast
<Argument
>(Val
);
8810 if (!Arg
|| Arg
->hasInAllocaAttr() || Arg
->hasByValAttr() ||
8811 Arg
->getType()->isEmptyTy() ||
8812 DL
.getTypeStoreSize(Arg
->getType()) !=
8813 DL
.getTypeAllocSize(AI
->getAllocatedType()) ||
8814 ArgCopyElisionCandidates
.count(Arg
)) {
8815 *Info
= StaticAllocaInfo::Clobbered
;
8819 LLVM_DEBUG(dbgs() << "Found argument copy elision candidate: " << *AI
8822 // Mark this alloca and store for argument copy elision.
8823 *Info
= StaticAllocaInfo::Elidable
;
8824 ArgCopyElisionCandidates
.insert({Arg
, {AI
, SI
}});
8826 // Stop scanning if we've seen all arguments. This will happen early in -O0
8827 // builds, which is useful, because -O0 builds have large entry blocks and
8829 if (ArgCopyElisionCandidates
.size() == NumArgs
)
8834 /// Try to elide argument copies from memory into a local alloca. Succeeds if
8835 /// ArgVal is a load from a suitable fixed stack object.
8836 static void tryToElideArgumentCopy(
8837 FunctionLoweringInfo
*FuncInfo
, SmallVectorImpl
<SDValue
> &Chains
,
8838 DenseMap
<int, int> &ArgCopyElisionFrameIndexMap
,
8839 SmallPtrSetImpl
<const Instruction
*> &ElidedArgCopyInstrs
,
8840 ArgCopyElisionMapTy
&ArgCopyElisionCandidates
, const Argument
&Arg
,
8841 SDValue ArgVal
, bool &ArgHasUses
) {
8842 // Check if this is a load from a fixed stack object.
8843 auto *LNode
= dyn_cast
<LoadSDNode
>(ArgVal
);
8846 auto *FINode
= dyn_cast
<FrameIndexSDNode
>(LNode
->getBasePtr().getNode());
8850 // Check that the fixed stack object is the right size and alignment.
8851 // Look at the alignment that the user wrote on the alloca instead of looking
8852 // at the stack object.
8853 auto ArgCopyIter
= ArgCopyElisionCandidates
.find(&Arg
);
8854 assert(ArgCopyIter
!= ArgCopyElisionCandidates
.end());
8855 const AllocaInst
*AI
= ArgCopyIter
->second
.first
;
8856 int FixedIndex
= FINode
->getIndex();
8857 int &AllocaIndex
= FuncInfo
->StaticAllocaMap
[AI
];
8858 int OldIndex
= AllocaIndex
;
8859 MachineFrameInfo
&MFI
= FuncInfo
->MF
->getFrameInfo();
8860 if (MFI
.getObjectSize(FixedIndex
) != MFI
.getObjectSize(OldIndex
)) {
8862 dbgs() << " argument copy elision failed due to bad fixed stack "
8866 unsigned RequiredAlignment
= AI
->getAlignment();
8867 if (!RequiredAlignment
) {
8868 RequiredAlignment
= FuncInfo
->MF
->getDataLayout().getABITypeAlignment(
8869 AI
->getAllocatedType());
8871 if (MFI
.getObjectAlignment(FixedIndex
) < RequiredAlignment
) {
8872 LLVM_DEBUG(dbgs() << " argument copy elision failed: alignment of alloca "
8873 "greater than stack argument alignment ("
8874 << RequiredAlignment
<< " vs "
8875 << MFI
.getObjectAlignment(FixedIndex
) << ")\n");
8879 // Perform the elision. Delete the old stack object and replace its only use
8880 // in the variable info map. Mark the stack object as mutable.
8882 dbgs() << "Eliding argument copy from " << Arg
<< " to " << *AI
<< '\n'
8883 << " Replacing frame index " << OldIndex
<< " with " << FixedIndex
8886 MFI
.RemoveStackObject(OldIndex
);
8887 MFI
.setIsImmutableObjectIndex(FixedIndex
, false);
8888 AllocaIndex
= FixedIndex
;
8889 ArgCopyElisionFrameIndexMap
.insert({OldIndex
, FixedIndex
});
8890 Chains
.push_back(ArgVal
.getValue(1));
8892 // Avoid emitting code for the store implementing the copy.
8893 const StoreInst
*SI
= ArgCopyIter
->second
.second
;
8894 ElidedArgCopyInstrs
.insert(SI
);
8896 // Check for uses of the argument again so that we can avoid exporting ArgVal
8897 // if it is't used by anything other than the store.
8898 for (const Value
*U
: Arg
.users()) {
8906 void SelectionDAGISel::LowerArguments(const Function
&F
) {
8907 SelectionDAG
&DAG
= SDB
->DAG
;
8908 SDLoc dl
= SDB
->getCurSDLoc();
8909 const DataLayout
&DL
= DAG
.getDataLayout();
8910 SmallVector
<ISD::InputArg
, 16> Ins
;
8912 if (!FuncInfo
->CanLowerReturn
) {
8913 // Put in an sret pointer parameter before all the other parameters.
8914 SmallVector
<EVT
, 1> ValueVTs
;
8915 ComputeValueVTs(*TLI
, DAG
.getDataLayout(),
8916 F
.getReturnType()->getPointerTo(
8917 DAG
.getDataLayout().getAllocaAddrSpace()),
8920 // NOTE: Assuming that a pointer will never break down to more than one VT
8922 ISD::ArgFlagsTy Flags
;
8924 MVT RegisterVT
= TLI
->getRegisterType(*DAG
.getContext(), ValueVTs
[0]);
8925 ISD::InputArg
RetArg(Flags
, RegisterVT
, ValueVTs
[0], true,
8926 ISD::InputArg::NoArgIndex
, 0);
8927 Ins
.push_back(RetArg
);
8930 // Look for stores of arguments to static allocas. Mark such arguments with a
8931 // flag to ask the target to give us the memory location of that argument if
8933 ArgCopyElisionMapTy ArgCopyElisionCandidates
;
8934 findArgumentCopyElisionCandidates(DL
, FuncInfo
, ArgCopyElisionCandidates
);
8936 // Set up the incoming argument description vector.
8937 for (const Argument
&Arg
: F
.args()) {
8938 unsigned ArgNo
= Arg
.getArgNo();
8939 SmallVector
<EVT
, 4> ValueVTs
;
8940 ComputeValueVTs(*TLI
, DAG
.getDataLayout(), Arg
.getType(), ValueVTs
);
8941 bool isArgValueUsed
= !Arg
.use_empty();
8942 unsigned PartBase
= 0;
8943 Type
*FinalType
= Arg
.getType();
8944 if (Arg
.hasAttribute(Attribute::ByVal
))
8945 FinalType
= cast
<PointerType
>(FinalType
)->getElementType();
8946 bool NeedsRegBlock
= TLI
->functionArgumentNeedsConsecutiveRegisters(
8947 FinalType
, F
.getCallingConv(), F
.isVarArg());
8948 for (unsigned Value
= 0, NumValues
= ValueVTs
.size();
8949 Value
!= NumValues
; ++Value
) {
8950 EVT VT
= ValueVTs
[Value
];
8951 Type
*ArgTy
= VT
.getTypeForEVT(*DAG
.getContext());
8952 ISD::ArgFlagsTy Flags
;
8954 // Certain targets (such as MIPS), may have a different ABI alignment
8955 // for a type depending on the context. Give the target a chance to
8956 // specify the alignment it wants.
8957 unsigned OriginalAlignment
=
8958 TLI
->getABIAlignmentForCallingConv(ArgTy
, DL
);
8960 if (Arg
.hasAttribute(Attribute::ZExt
))
8962 if (Arg
.hasAttribute(Attribute::SExt
))
8964 if (Arg
.hasAttribute(Attribute::InReg
)) {
8965 // If we are using vectorcall calling convention, a structure that is
8966 // passed InReg - is surely an HVA
8967 if (F
.getCallingConv() == CallingConv::X86_VectorCall
&&
8968 isa
<StructType
>(Arg
.getType())) {
8969 // The first value of a structure is marked
8971 Flags
.setHvaStart();
8977 if (Arg
.hasAttribute(Attribute::StructRet
))
8979 if (Arg
.hasAttribute(Attribute::SwiftSelf
))
8980 Flags
.setSwiftSelf();
8981 if (Arg
.hasAttribute(Attribute::SwiftError
))
8982 Flags
.setSwiftError();
8983 if (Arg
.hasAttribute(Attribute::ByVal
))
8985 if (Arg
.hasAttribute(Attribute::InAlloca
)) {
8986 Flags
.setInAlloca();
8987 // Set the byval flag for CCAssignFn callbacks that don't know about
8988 // inalloca. This way we can know how many bytes we should've allocated
8989 // and how many bytes a callee cleanup function will pop. If we port
8990 // inalloca to more targets, we'll have to add custom inalloca handling
8991 // in the various CC lowering callbacks.
8994 if (F
.getCallingConv() == CallingConv::X86_INTR
) {
8995 // IA Interrupt passes frame (1st parameter) by value in the stack.
8999 if (Flags
.isByVal() || Flags
.isInAlloca()) {
9000 PointerType
*Ty
= cast
<PointerType
>(Arg
.getType());
9001 Type
*ElementTy
= Ty
->getElementType();
9002 Flags
.setByValSize(DL
.getTypeAllocSize(ElementTy
));
9003 // For ByVal, alignment should be passed from FE. BE will guess if
9004 // this info is not there but there are cases it cannot get right.
9005 unsigned FrameAlign
;
9006 if (Arg
.getParamAlignment())
9007 FrameAlign
= Arg
.getParamAlignment();
9009 FrameAlign
= TLI
->getByValTypeAlignment(ElementTy
, DL
);
9010 Flags
.setByValAlign(FrameAlign
);
9012 if (Arg
.hasAttribute(Attribute::Nest
))
9015 Flags
.setInConsecutiveRegs();
9016 Flags
.setOrigAlign(OriginalAlignment
);
9017 if (ArgCopyElisionCandidates
.count(&Arg
))
9018 Flags
.setCopyElisionCandidate();
9020 MVT RegisterVT
= TLI
->getRegisterTypeForCallingConv(
9021 *CurDAG
->getContext(), F
.getCallingConv(), VT
);
9022 unsigned NumRegs
= TLI
->getNumRegistersForCallingConv(
9023 *CurDAG
->getContext(), F
.getCallingConv(), VT
);
9024 for (unsigned i
= 0; i
!= NumRegs
; ++i
) {
9025 ISD::InputArg
MyFlags(Flags
, RegisterVT
, VT
, isArgValueUsed
,
9026 ArgNo
, PartBase
+i
*RegisterVT
.getStoreSize());
9027 if (NumRegs
> 1 && i
== 0)
9028 MyFlags
.Flags
.setSplit();
9029 // if it isn't first piece, alignment must be 1
9031 MyFlags
.Flags
.setOrigAlign(1);
9032 if (i
== NumRegs
- 1)
9033 MyFlags
.Flags
.setSplitEnd();
9035 Ins
.push_back(MyFlags
);
9037 if (NeedsRegBlock
&& Value
== NumValues
- 1)
9038 Ins
[Ins
.size() - 1].Flags
.setInConsecutiveRegsLast();
9039 PartBase
+= VT
.getStoreSize();
9043 // Call the target to set up the argument values.
9044 SmallVector
<SDValue
, 8> InVals
;
9045 SDValue NewRoot
= TLI
->LowerFormalArguments(
9046 DAG
.getRoot(), F
.getCallingConv(), F
.isVarArg(), Ins
, dl
, DAG
, InVals
);
9048 // Verify that the target's LowerFormalArguments behaved as expected.
9049 assert(NewRoot
.getNode() && NewRoot
.getValueType() == MVT::Other
&&
9050 "LowerFormalArguments didn't return a valid chain!");
9051 assert(InVals
.size() == Ins
.size() &&
9052 "LowerFormalArguments didn't emit the correct number of values!");
9054 for (unsigned i
= 0, e
= Ins
.size(); i
!= e
; ++i
) {
9055 assert(InVals
[i
].getNode() &&
9056 "LowerFormalArguments emitted a null value!");
9057 assert(EVT(Ins
[i
].VT
) == InVals
[i
].getValueType() &&
9058 "LowerFormalArguments emitted a value with the wrong type!");
9062 // Update the DAG with the new chain value resulting from argument lowering.
9063 DAG
.setRoot(NewRoot
);
9065 // Set up the argument values.
9067 if (!FuncInfo
->CanLowerReturn
) {
9068 // Create a virtual register for the sret pointer, and put in a copy
9069 // from the sret argument into it.
9070 SmallVector
<EVT
, 1> ValueVTs
;
9071 ComputeValueVTs(*TLI
, DAG
.getDataLayout(),
9072 F
.getReturnType()->getPointerTo(
9073 DAG
.getDataLayout().getAllocaAddrSpace()),
9075 MVT VT
= ValueVTs
[0].getSimpleVT();
9076 MVT RegVT
= TLI
->getRegisterType(*CurDAG
->getContext(), VT
);
9077 Optional
<ISD::NodeType
> AssertOp
= None
;
9078 SDValue ArgValue
= getCopyFromParts(DAG
, dl
, &InVals
[0], 1, RegVT
, VT
,
9079 nullptr, F
.getCallingConv(), AssertOp
);
9081 MachineFunction
& MF
= SDB
->DAG
.getMachineFunction();
9082 MachineRegisterInfo
& RegInfo
= MF
.getRegInfo();
9083 unsigned SRetReg
= RegInfo
.createVirtualRegister(TLI
->getRegClassFor(RegVT
));
9084 FuncInfo
->DemoteRegister
= SRetReg
;
9086 SDB
->DAG
.getCopyToReg(NewRoot
, SDB
->getCurSDLoc(), SRetReg
, ArgValue
);
9087 DAG
.setRoot(NewRoot
);
9089 // i indexes lowered arguments. Bump it past the hidden sret argument.
9093 SmallVector
<SDValue
, 4> Chains
;
9094 DenseMap
<int, int> ArgCopyElisionFrameIndexMap
;
9095 for (const Argument
&Arg
: F
.args()) {
9096 SmallVector
<SDValue
, 4> ArgValues
;
9097 SmallVector
<EVT
, 4> ValueVTs
;
9098 ComputeValueVTs(*TLI
, DAG
.getDataLayout(), Arg
.getType(), ValueVTs
);
9099 unsigned NumValues
= ValueVTs
.size();
9103 bool ArgHasUses
= !Arg
.use_empty();
9105 // Elide the copying store if the target loaded this argument from a
9106 // suitable fixed stack object.
9107 if (Ins
[i
].Flags
.isCopyElisionCandidate()) {
9108 tryToElideArgumentCopy(FuncInfo
, Chains
, ArgCopyElisionFrameIndexMap
,
9109 ElidedArgCopyInstrs
, ArgCopyElisionCandidates
, Arg
,
9110 InVals
[i
], ArgHasUses
);
9113 // If this argument is unused then remember its value. It is used to generate
9114 // debugging information.
9115 bool isSwiftErrorArg
=
9116 TLI
->supportSwiftError() &&
9117 Arg
.hasAttribute(Attribute::SwiftError
);
9118 if (!ArgHasUses
&& !isSwiftErrorArg
) {
9119 SDB
->setUnusedArgValue(&Arg
, InVals
[i
]);
9121 // Also remember any frame index for use in FastISel.
9122 if (FrameIndexSDNode
*FI
=
9123 dyn_cast
<FrameIndexSDNode
>(InVals
[i
].getNode()))
9124 FuncInfo
->setArgumentFrameIndex(&Arg
, FI
->getIndex());
9127 for (unsigned Val
= 0; Val
!= NumValues
; ++Val
) {
9128 EVT VT
= ValueVTs
[Val
];
9129 MVT PartVT
= TLI
->getRegisterTypeForCallingConv(*CurDAG
->getContext(),
9130 F
.getCallingConv(), VT
);
9131 unsigned NumParts
= TLI
->getNumRegistersForCallingConv(
9132 *CurDAG
->getContext(), F
.getCallingConv(), VT
);
9134 // Even an apparant 'unused' swifterror argument needs to be returned. So
9135 // we do generate a copy for it that can be used on return from the
9137 if (ArgHasUses
|| isSwiftErrorArg
) {
9138 Optional
<ISD::NodeType
> AssertOp
;
9139 if (Arg
.hasAttribute(Attribute::SExt
))
9140 AssertOp
= ISD::AssertSext
;
9141 else if (Arg
.hasAttribute(Attribute::ZExt
))
9142 AssertOp
= ISD::AssertZext
;
9144 ArgValues
.push_back(getCopyFromParts(DAG
, dl
, &InVals
[i
], NumParts
,
9145 PartVT
, VT
, nullptr,
9146 F
.getCallingConv(), AssertOp
));
9152 // We don't need to do anything else for unused arguments.
9153 if (ArgValues
.empty())
9156 // Note down frame index.
9157 if (FrameIndexSDNode
*FI
=
9158 dyn_cast
<FrameIndexSDNode
>(ArgValues
[0].getNode()))
9159 FuncInfo
->setArgumentFrameIndex(&Arg
, FI
->getIndex());
9161 SDValue Res
= DAG
.getMergeValues(makeArrayRef(ArgValues
.data(), NumValues
),
9162 SDB
->getCurSDLoc());
9164 SDB
->setValue(&Arg
, Res
);
9165 if (!TM
.Options
.EnableFastISel
&& Res
.getOpcode() == ISD::BUILD_PAIR
) {
9166 // We want to associate the argument with the frame index, among
9167 // involved operands, that correspond to the lowest address. The
9168 // getCopyFromParts function, called earlier, is swapping the order of
9169 // the operands to BUILD_PAIR depending on endianness. The result of
9170 // that swapping is that the least significant bits of the argument will
9171 // be in the first operand of the BUILD_PAIR node, and the most
9172 // significant bits will be in the second operand.
9173 unsigned LowAddressOp
= DAG
.getDataLayout().isBigEndian() ? 1 : 0;
9174 if (LoadSDNode
*LNode
=
9175 dyn_cast
<LoadSDNode
>(Res
.getOperand(LowAddressOp
).getNode()))
9176 if (FrameIndexSDNode
*FI
=
9177 dyn_cast
<FrameIndexSDNode
>(LNode
->getBasePtr().getNode()))
9178 FuncInfo
->setArgumentFrameIndex(&Arg
, FI
->getIndex());
9181 // Update the SwiftErrorVRegDefMap.
9182 if (Res
.getOpcode() == ISD::CopyFromReg
&& isSwiftErrorArg
) {
9183 unsigned Reg
= cast
<RegisterSDNode
>(Res
.getOperand(1))->getReg();
9184 if (TargetRegisterInfo::isVirtualRegister(Reg
))
9185 FuncInfo
->setCurrentSwiftErrorVReg(FuncInfo
->MBB
,
9186 FuncInfo
->SwiftErrorArg
, Reg
);
9189 // If this argument is live outside of the entry block, insert a copy from
9190 // wherever we got it to the vreg that other BB's will reference it as.
9191 if (!TM
.Options
.EnableFastISel
&& Res
.getOpcode() == ISD::CopyFromReg
) {
9192 // If we can, though, try to skip creating an unnecessary vreg.
9193 // FIXME: This isn't very clean... it would be nice to make this more
9194 // general. It's also subtly incompatible with the hacks FastISel
9196 unsigned Reg
= cast
<RegisterSDNode
>(Res
.getOperand(1))->getReg();
9197 if (TargetRegisterInfo::isVirtualRegister(Reg
)) {
9198 FuncInfo
->ValueMap
[&Arg
] = Reg
;
9202 if (!isOnlyUsedInEntryBlock(&Arg
, TM
.Options
.EnableFastISel
)) {
9203 FuncInfo
->InitializeRegForValue(&Arg
);
9204 SDB
->CopyToExportRegsIfNeeded(&Arg
);
9208 if (!Chains
.empty()) {
9209 Chains
.push_back(NewRoot
);
9210 NewRoot
= DAG
.getNode(ISD::TokenFactor
, dl
, MVT::Other
, Chains
);
9213 DAG
.setRoot(NewRoot
);
9215 assert(i
== InVals
.size() && "Argument register count mismatch!");
9217 // If any argument copy elisions occurred and we have debug info, update the
9218 // stale frame indices used in the dbg.declare variable info table.
9219 MachineFunction::VariableDbgInfoMapTy
&DbgDeclareInfo
= MF
->getVariableDbgInfo();
9220 if (!DbgDeclareInfo
.empty() && !ArgCopyElisionFrameIndexMap
.empty()) {
9221 for (MachineFunction::VariableDbgInfo
&VI
: DbgDeclareInfo
) {
9222 auto I
= ArgCopyElisionFrameIndexMap
.find(VI
.Slot
);
9223 if (I
!= ArgCopyElisionFrameIndexMap
.end())
9224 VI
.Slot
= I
->second
;
9228 // Finally, if the target has anything special to do, allow it to do so.
9229 EmitFunctionEntryCode();
9232 /// Handle PHI nodes in successor blocks. Emit code into the SelectionDAG to
9233 /// ensure constants are generated when needed. Remember the virtual registers
9234 /// that need to be added to the Machine PHI nodes as input. We cannot just
9235 /// directly add them, because expansion might result in multiple MBB's for one
9236 /// BB. As such, the start of the BB might correspond to a different MBB than
9239 SelectionDAGBuilder::HandlePHINodesInSuccessorBlocks(const BasicBlock
*LLVMBB
) {
9240 const TerminatorInst
*TI
= LLVMBB
->getTerminator();
9242 SmallPtrSet
<MachineBasicBlock
*, 4> SuccsHandled
;
9244 // Check PHI nodes in successors that expect a value to be available from this
9246 for (unsigned succ
= 0, e
= TI
->getNumSuccessors(); succ
!= e
; ++succ
) {
9247 const BasicBlock
*SuccBB
= TI
->getSuccessor(succ
);
9248 if (!isa
<PHINode
>(SuccBB
->begin())) continue;
9249 MachineBasicBlock
*SuccMBB
= FuncInfo
.MBBMap
[SuccBB
];
9251 // If this terminator has multiple identical successors (common for
9252 // switches), only handle each succ once.
9253 if (!SuccsHandled
.insert(SuccMBB
).second
)
9256 MachineBasicBlock::iterator MBBI
= SuccMBB
->begin();
9258 // At this point we know that there is a 1-1 correspondence between LLVM PHI
9259 // nodes and Machine PHI nodes, but the incoming operands have not been
9261 for (const PHINode
&PN
: SuccBB
->phis()) {
9262 // Ignore dead phi's.
9267 if (PN
.getType()->isEmptyTy())
9271 const Value
*PHIOp
= PN
.getIncomingValueForBlock(LLVMBB
);
9273 if (const Constant
*C
= dyn_cast
<Constant
>(PHIOp
)) {
9274 unsigned &RegOut
= ConstantsOut
[C
];
9276 RegOut
= FuncInfo
.CreateRegs(C
->getType());
9277 CopyValueToVirtualRegister(C
, RegOut
);
9281 DenseMap
<const Value
*, unsigned>::iterator I
=
9282 FuncInfo
.ValueMap
.find(PHIOp
);
9283 if (I
!= FuncInfo
.ValueMap
.end())
9286 assert(isa
<AllocaInst
>(PHIOp
) &&
9287 FuncInfo
.StaticAllocaMap
.count(cast
<AllocaInst
>(PHIOp
)) &&
9288 "Didn't codegen value into a register!??");
9289 Reg
= FuncInfo
.CreateRegs(PHIOp
->getType());
9290 CopyValueToVirtualRegister(PHIOp
, Reg
);
9294 // Remember that this register needs to added to the machine PHI node as
9295 // the input for this MBB.
9296 SmallVector
<EVT
, 4> ValueVTs
;
9297 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
9298 ComputeValueVTs(TLI
, DAG
.getDataLayout(), PN
.getType(), ValueVTs
);
9299 for (unsigned vti
= 0, vte
= ValueVTs
.size(); vti
!= vte
; ++vti
) {
9300 EVT VT
= ValueVTs
[vti
];
9301 unsigned NumRegisters
= TLI
.getNumRegisters(*DAG
.getContext(), VT
);
9302 for (unsigned i
= 0, e
= NumRegisters
; i
!= e
; ++i
)
9303 FuncInfo
.PHINodesToUpdate
.push_back(
9304 std::make_pair(&*MBBI
++, Reg
+ i
));
9305 Reg
+= NumRegisters
;
9310 ConstantsOut
.clear();
9313 /// Add a successor MBB to ParentMBB< creating a new MachineBB for BB if SuccMBB
9316 SelectionDAGBuilder::StackProtectorDescriptor::
9317 AddSuccessorMBB(const BasicBlock
*BB
,
9318 MachineBasicBlock
*ParentMBB
,
9320 MachineBasicBlock
*SuccMBB
) {
9321 // If SuccBB has not been created yet, create it.
9323 MachineFunction
*MF
= ParentMBB
->getParent();
9324 MachineFunction::iterator
BBI(ParentMBB
);
9325 SuccMBB
= MF
->CreateMachineBasicBlock(BB
);
9326 MF
->insert(++BBI
, SuccMBB
);
9328 // Add it as a successor of ParentMBB.
9329 ParentMBB
->addSuccessor(
9330 SuccMBB
, BranchProbabilityInfo::getBranchProbStackProtector(IsLikely
));
9334 MachineBasicBlock
*SelectionDAGBuilder::NextBlock(MachineBasicBlock
*MBB
) {
9335 MachineFunction::iterator
I(MBB
);
9336 if (++I
== FuncInfo
.MF
->end())
9341 /// During lowering new call nodes can be created (such as memset, etc.).
9342 /// Those will become new roots of the current DAG, but complications arise
9343 /// when they are tail calls. In such cases, the call lowering will update
9344 /// the root, but the builder still needs to know that a tail call has been
9345 /// lowered in order to avoid generating an additional return.
9346 void SelectionDAGBuilder::updateDAGForMaybeTailCall(SDValue MaybeTC
) {
9347 // If the node is null, we do have a tail call.
9348 if (MaybeTC
.getNode() != nullptr)
9349 DAG
.setRoot(MaybeTC
);
9355 SelectionDAGBuilder::getJumpTableRange(const CaseClusterVector
&Clusters
,
9356 unsigned First
, unsigned Last
) const {
9357 assert(Last
>= First
);
9358 const APInt
&LowCase
= Clusters
[First
].Low
->getValue();
9359 const APInt
&HighCase
= Clusters
[Last
].High
->getValue();
9360 assert(LowCase
.getBitWidth() == HighCase
.getBitWidth());
9362 // FIXME: A range of consecutive cases has 100% density, but only requires one
9363 // comparison to lower. We should discriminate against such consecutive ranges
9366 return (HighCase
- LowCase
).getLimitedValue((UINT64_MAX
- 1) / 100) + 1;
9369 uint64_t SelectionDAGBuilder::getJumpTableNumCases(
9370 const SmallVectorImpl
<unsigned> &TotalCases
, unsigned First
,
9371 unsigned Last
) const {
9372 assert(Last
>= First
);
9373 assert(TotalCases
[Last
] >= TotalCases
[First
]);
9375 TotalCases
[Last
] - (First
== 0 ? 0 : TotalCases
[First
- 1]);
9379 bool SelectionDAGBuilder::buildJumpTable(const CaseClusterVector
&Clusters
,
9380 unsigned First
, unsigned Last
,
9381 const SwitchInst
*SI
,
9382 MachineBasicBlock
*DefaultMBB
,
9383 CaseCluster
&JTCluster
) {
9384 assert(First
<= Last
);
9386 auto Prob
= BranchProbability::getZero();
9387 unsigned NumCmps
= 0;
9388 std::vector
<MachineBasicBlock
*> Table
;
9389 DenseMap
<MachineBasicBlock
*, BranchProbability
> JTProbs
;
9391 // Initialize probabilities in JTProbs.
9392 for (unsigned I
= First
; I
<= Last
; ++I
)
9393 JTProbs
[Clusters
[I
].MBB
] = BranchProbability::getZero();
9395 for (unsigned I
= First
; I
<= Last
; ++I
) {
9396 assert(Clusters
[I
].Kind
== CC_Range
);
9397 Prob
+= Clusters
[I
].Prob
;
9398 const APInt
&Low
= Clusters
[I
].Low
->getValue();
9399 const APInt
&High
= Clusters
[I
].High
->getValue();
9400 NumCmps
+= (Low
== High
) ? 1 : 2;
9402 // Fill the gap between this and the previous cluster.
9403 const APInt
&PreviousHigh
= Clusters
[I
- 1].High
->getValue();
9404 assert(PreviousHigh
.slt(Low
));
9405 uint64_t Gap
= (Low
- PreviousHigh
).getLimitedValue() - 1;
9406 for (uint64_t J
= 0; J
< Gap
; J
++)
9407 Table
.push_back(DefaultMBB
);
9409 uint64_t ClusterSize
= (High
- Low
).getLimitedValue() + 1;
9410 for (uint64_t J
= 0; J
< ClusterSize
; ++J
)
9411 Table
.push_back(Clusters
[I
].MBB
);
9412 JTProbs
[Clusters
[I
].MBB
] += Clusters
[I
].Prob
;
9415 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
9416 unsigned NumDests
= JTProbs
.size();
9417 if (TLI
.isSuitableForBitTests(
9418 NumDests
, NumCmps
, Clusters
[First
].Low
->getValue(),
9419 Clusters
[Last
].High
->getValue(), DAG
.getDataLayout())) {
9420 // Clusters[First..Last] should be lowered as bit tests instead.
9424 // Create the MBB that will load from and jump through the table.
9425 // Note: We create it here, but it's not inserted into the function yet.
9426 MachineFunction
*CurMF
= FuncInfo
.MF
;
9427 MachineBasicBlock
*JumpTableMBB
=
9428 CurMF
->CreateMachineBasicBlock(SI
->getParent());
9430 // Add successors. Note: use table order for determinism.
9431 SmallPtrSet
<MachineBasicBlock
*, 8> Done
;
9432 for (MachineBasicBlock
*Succ
: Table
) {
9433 if (Done
.count(Succ
))
9435 addSuccessorWithProb(JumpTableMBB
, Succ
, JTProbs
[Succ
]);
9438 JumpTableMBB
->normalizeSuccProbs();
9440 unsigned JTI
= CurMF
->getOrCreateJumpTableInfo(TLI
.getJumpTableEncoding())
9441 ->createJumpTableIndex(Table
);
9443 // Set up the jump table info.
9444 JumpTable
JT(-1U, JTI
, JumpTableMBB
, nullptr);
9445 JumpTableHeader
JTH(Clusters
[First
].Low
->getValue(),
9446 Clusters
[Last
].High
->getValue(), SI
->getCondition(),
9448 JTCases
.emplace_back(std::move(JTH
), std::move(JT
));
9450 JTCluster
= CaseCluster::jumpTable(Clusters
[First
].Low
, Clusters
[Last
].High
,
9451 JTCases
.size() - 1, Prob
);
9455 void SelectionDAGBuilder::findJumpTables(CaseClusterVector
&Clusters
,
9456 const SwitchInst
*SI
,
9457 MachineBasicBlock
*DefaultMBB
) {
9459 // Clusters must be non-empty, sorted, and only contain Range clusters.
9460 assert(!Clusters
.empty());
9461 for (CaseCluster
&C
: Clusters
)
9462 assert(C
.Kind
== CC_Range
);
9463 for (unsigned i
= 1, e
= Clusters
.size(); i
< e
; ++i
)
9464 assert(Clusters
[i
- 1].High
->getValue().slt(Clusters
[i
].Low
->getValue()));
9467 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
9468 if (!TLI
.areJTsAllowed(SI
->getParent()->getParent()))
9471 const int64_t N
= Clusters
.size();
9472 const unsigned MinJumpTableEntries
= TLI
.getMinimumJumpTableEntries();
9473 const unsigned SmallNumberOfEntries
= MinJumpTableEntries
/ 2;
9475 if (N
< 2 || N
< MinJumpTableEntries
)
9478 // TotalCases[i]: Total nbr of cases in Clusters[0..i].
9479 SmallVector
<unsigned, 8> TotalCases(N
);
9480 for (unsigned i
= 0; i
< N
; ++i
) {
9481 const APInt
&Hi
= Clusters
[i
].High
->getValue();
9482 const APInt
&Lo
= Clusters
[i
].Low
->getValue();
9483 TotalCases
[i
] = (Hi
- Lo
).getLimitedValue() + 1;
9485 TotalCases
[i
] += TotalCases
[i
- 1];
9488 // Cheap case: the whole range may be suitable for jump table.
9489 uint64_t Range
= getJumpTableRange(Clusters
,0, N
- 1);
9490 uint64_t NumCases
= getJumpTableNumCases(TotalCases
, 0, N
- 1);
9491 assert(NumCases
< UINT64_MAX
/ 100);
9492 assert(Range
>= NumCases
);
9493 if (TLI
.isSuitableForJumpTable(SI
, NumCases
, Range
)) {
9494 CaseCluster JTCluster
;
9495 if (buildJumpTable(Clusters
, 0, N
- 1, SI
, DefaultMBB
, JTCluster
)) {
9496 Clusters
[0] = JTCluster
;
9502 // The algorithm below is not suitable for -O0.
9503 if (TM
.getOptLevel() == CodeGenOpt::None
)
9506 // Split Clusters into minimum number of dense partitions. The algorithm uses
9507 // the same idea as Kannan & Proebsting "Correction to 'Producing Good Code
9508 // for the Case Statement'" (1994), but builds the MinPartitions array in
9509 // reverse order to make it easier to reconstruct the partitions in ascending
9510 // order. In the choice between two optimal partitionings, it picks the one
9511 // which yields more jump tables.
9513 // MinPartitions[i] is the minimum nbr of partitions of Clusters[i..N-1].
9514 SmallVector
<unsigned, 8> MinPartitions(N
);
9515 // LastElement[i] is the last element of the partition starting at i.
9516 SmallVector
<unsigned, 8> LastElement(N
);
9517 // PartitionsScore[i] is used to break ties when choosing between two
9518 // partitionings resulting in the same number of partitions.
9519 SmallVector
<unsigned, 8> PartitionsScore(N
);
9520 // For PartitionsScore, a small number of comparisons is considered as good as
9521 // a jump table and a single comparison is considered better than a jump
9523 enum PartitionScores
: unsigned {
9530 // Base case: There is only one way to partition Clusters[N-1].
9531 MinPartitions
[N
- 1] = 1;
9532 LastElement
[N
- 1] = N
- 1;
9533 PartitionsScore
[N
- 1] = PartitionScores::SingleCase
;
9535 // Note: loop indexes are signed to avoid underflow.
9536 for (int64_t i
= N
- 2; i
>= 0; i
--) {
9537 // Find optimal partitioning of Clusters[i..N-1].
9538 // Baseline: Put Clusters[i] into a partition on its own.
9539 MinPartitions
[i
] = MinPartitions
[i
+ 1] + 1;
9541 PartitionsScore
[i
] = PartitionsScore
[i
+ 1] + PartitionScores::SingleCase
;
9543 // Search for a solution that results in fewer partitions.
9544 for (int64_t j
= N
- 1; j
> i
; j
--) {
9545 // Try building a partition from Clusters[i..j].
9546 uint64_t Range
= getJumpTableRange(Clusters
, i
, j
);
9547 uint64_t NumCases
= getJumpTableNumCases(TotalCases
, i
, j
);
9548 assert(NumCases
< UINT64_MAX
/ 100);
9549 assert(Range
>= NumCases
);
9550 if (TLI
.isSuitableForJumpTable(SI
, NumCases
, Range
)) {
9551 unsigned NumPartitions
= 1 + (j
== N
- 1 ? 0 : MinPartitions
[j
+ 1]);
9552 unsigned Score
= j
== N
- 1 ? 0 : PartitionsScore
[j
+ 1];
9553 int64_t NumEntries
= j
- i
+ 1;
9555 if (NumEntries
== 1)
9556 Score
+= PartitionScores::SingleCase
;
9557 else if (NumEntries
<= SmallNumberOfEntries
)
9558 Score
+= PartitionScores::FewCases
;
9559 else if (NumEntries
>= MinJumpTableEntries
)
9560 Score
+= PartitionScores::Table
;
9562 // If this leads to fewer partitions, or to the same number of
9563 // partitions with better score, it is a better partitioning.
9564 if (NumPartitions
< MinPartitions
[i
] ||
9565 (NumPartitions
== MinPartitions
[i
] && Score
> PartitionsScore
[i
])) {
9566 MinPartitions
[i
] = NumPartitions
;
9568 PartitionsScore
[i
] = Score
;
9574 // Iterate over the partitions, replacing some with jump tables in-place.
9575 unsigned DstIndex
= 0;
9576 for (unsigned First
= 0, Last
; First
< N
; First
= Last
+ 1) {
9577 Last
= LastElement
[First
];
9578 assert(Last
>= First
);
9579 assert(DstIndex
<= First
);
9580 unsigned NumClusters
= Last
- First
+ 1;
9582 CaseCluster JTCluster
;
9583 if (NumClusters
>= MinJumpTableEntries
&&
9584 buildJumpTable(Clusters
, First
, Last
, SI
, DefaultMBB
, JTCluster
)) {
9585 Clusters
[DstIndex
++] = JTCluster
;
9587 for (unsigned I
= First
; I
<= Last
; ++I
)
9588 std::memmove(&Clusters
[DstIndex
++], &Clusters
[I
], sizeof(Clusters
[I
]));
9591 Clusters
.resize(DstIndex
);
9594 bool SelectionDAGBuilder::buildBitTests(CaseClusterVector
&Clusters
,
9595 unsigned First
, unsigned Last
,
9596 const SwitchInst
*SI
,
9597 CaseCluster
&BTCluster
) {
9598 assert(First
<= Last
);
9602 BitVector
Dests(FuncInfo
.MF
->getNumBlockIDs());
9603 unsigned NumCmps
= 0;
9604 for (int64_t I
= First
; I
<= Last
; ++I
) {
9605 assert(Clusters
[I
].Kind
== CC_Range
);
9606 Dests
.set(Clusters
[I
].MBB
->getNumber());
9607 NumCmps
+= (Clusters
[I
].Low
== Clusters
[I
].High
) ? 1 : 2;
9609 unsigned NumDests
= Dests
.count();
9611 APInt Low
= Clusters
[First
].Low
->getValue();
9612 APInt High
= Clusters
[Last
].High
->getValue();
9613 assert(Low
.slt(High
));
9615 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
9616 const DataLayout
&DL
= DAG
.getDataLayout();
9617 if (!TLI
.isSuitableForBitTests(NumDests
, NumCmps
, Low
, High
, DL
))
9623 const int BitWidth
= TLI
.getPointerTy(DL
).getSizeInBits();
9624 assert(TLI
.rangeFitsInWord(Low
, High
, DL
) &&
9625 "Case range must fit in bit mask!");
9627 // Check if the clusters cover a contiguous range such that no value in the
9628 // range will jump to the default statement.
9629 bool ContiguousRange
= true;
9630 for (int64_t I
= First
+ 1; I
<= Last
; ++I
) {
9631 if (Clusters
[I
].Low
->getValue() != Clusters
[I
- 1].High
->getValue() + 1) {
9632 ContiguousRange
= false;
9637 if (Low
.isStrictlyPositive() && High
.slt(BitWidth
)) {
9638 // Optimize the case where all the case values fit in a word without having
9639 // to subtract minValue. In this case, we can optimize away the subtraction.
9640 LowBound
= APInt::getNullValue(Low
.getBitWidth());
9642 ContiguousRange
= false;
9645 CmpRange
= High
- Low
;
9649 auto TotalProb
= BranchProbability::getZero();
9650 for (unsigned i
= First
; i
<= Last
; ++i
) {
9651 // Find the CaseBits for this destination.
9653 for (j
= 0; j
< CBV
.size(); ++j
)
9654 if (CBV
[j
].BB
== Clusters
[i
].MBB
)
9656 if (j
== CBV
.size())
9658 CaseBits(0, Clusters
[i
].MBB
, 0, BranchProbability::getZero()));
9659 CaseBits
*CB
= &CBV
[j
];
9661 // Update Mask, Bits and ExtraProb.
9662 uint64_t Lo
= (Clusters
[i
].Low
->getValue() - LowBound
).getZExtValue();
9663 uint64_t Hi
= (Clusters
[i
].High
->getValue() - LowBound
).getZExtValue();
9664 assert(Hi
>= Lo
&& Hi
< 64 && "Invalid bit case!");
9665 CB
->Mask
|= (-1ULL >> (63 - (Hi
- Lo
))) << Lo
;
9666 CB
->Bits
+= Hi
- Lo
+ 1;
9667 CB
->ExtraProb
+= Clusters
[i
].Prob
;
9668 TotalProb
+= Clusters
[i
].Prob
;
9672 llvm::sort(CBV
, [](const CaseBits
&a
, const CaseBits
&b
) {
9673 // Sort by probability first, number of bits second, bit mask third.
9674 if (a
.ExtraProb
!= b
.ExtraProb
)
9675 return a
.ExtraProb
> b
.ExtraProb
;
9676 if (a
.Bits
!= b
.Bits
)
9677 return a
.Bits
> b
.Bits
;
9678 return a
.Mask
< b
.Mask
;
9681 for (auto &CB
: CBV
) {
9682 MachineBasicBlock
*BitTestBB
=
9683 FuncInfo
.MF
->CreateMachineBasicBlock(SI
->getParent());
9684 BTI
.push_back(BitTestCase(CB
.Mask
, BitTestBB
, CB
.BB
, CB
.ExtraProb
));
9686 BitTestCases
.emplace_back(std::move(LowBound
), std::move(CmpRange
),
9687 SI
->getCondition(), -1U, MVT::Other
, false,
9688 ContiguousRange
, nullptr, nullptr, std::move(BTI
),
9691 BTCluster
= CaseCluster::bitTests(Clusters
[First
].Low
, Clusters
[Last
].High
,
9692 BitTestCases
.size() - 1, TotalProb
);
9696 void SelectionDAGBuilder::findBitTestClusters(CaseClusterVector
&Clusters
,
9697 const SwitchInst
*SI
) {
9698 // Partition Clusters into as few subsets as possible, where each subset has a
9699 // range that fits in a machine word and has <= 3 unique destinations.
9702 // Clusters must be sorted and contain Range or JumpTable clusters.
9703 assert(!Clusters
.empty());
9704 assert(Clusters
[0].Kind
== CC_Range
|| Clusters
[0].Kind
== CC_JumpTable
);
9705 for (const CaseCluster
&C
: Clusters
)
9706 assert(C
.Kind
== CC_Range
|| C
.Kind
== CC_JumpTable
);
9707 for (unsigned i
= 1; i
< Clusters
.size(); ++i
)
9708 assert(Clusters
[i
-1].High
->getValue().slt(Clusters
[i
].Low
->getValue()));
9711 // The algorithm below is not suitable for -O0.
9712 if (TM
.getOptLevel() == CodeGenOpt::None
)
9715 // If target does not have legal shift left, do not emit bit tests at all.
9716 const TargetLowering
&TLI
= DAG
.getTargetLoweringInfo();
9717 const DataLayout
&DL
= DAG
.getDataLayout();
9719 EVT PTy
= TLI
.getPointerTy(DL
);
9720 if (!TLI
.isOperationLegal(ISD::SHL
, PTy
))
9723 int BitWidth
= PTy
.getSizeInBits();
9724 const int64_t N
= Clusters
.size();
9726 // MinPartitions[i] is the minimum nbr of partitions of Clusters[i..N-1].
9727 SmallVector
<unsigned, 8> MinPartitions(N
);
9728 // LastElement[i] is the last element of the partition starting at i.
9729 SmallVector
<unsigned, 8> LastElement(N
);
9731 // FIXME: This might not be the best algorithm for finding bit test clusters.
9733 // Base case: There is only one way to partition Clusters[N-1].
9734 MinPartitions
[N
- 1] = 1;
9735 LastElement
[N
- 1] = N
- 1;
9737 // Note: loop indexes are signed to avoid underflow.
9738 for (int64_t i
= N
- 2; i
>= 0; --i
) {
9739 // Find optimal partitioning of Clusters[i..N-1].
9740 // Baseline: Put Clusters[i] into a partition on its own.
9741 MinPartitions
[i
] = MinPartitions
[i
+ 1] + 1;
9744 // Search for a solution that results in fewer partitions.
9745 // Note: the search is limited by BitWidth, reducing time complexity.
9746 for (int64_t j
= std::min(N
- 1, i
+ BitWidth
- 1); j
> i
; --j
) {
9747 // Try building a partition from Clusters[i..j].
9750 if (!TLI
.rangeFitsInWord(Clusters
[i
].Low
->getValue(),
9751 Clusters
[j
].High
->getValue(), DL
))
9754 // Check nbr of destinations and cluster types.
9755 // FIXME: This works, but doesn't seem very efficient.
9756 bool RangesOnly
= true;
9757 BitVector
Dests(FuncInfo
.MF
->getNumBlockIDs());
9758 for (int64_t k
= i
; k
<= j
; k
++) {
9759 if (Clusters
[k
].Kind
!= CC_Range
) {
9763 Dests
.set(Clusters
[k
].MBB
->getNumber());
9765 if (!RangesOnly
|| Dests
.count() > 3)
9768 // Check if it's a better partition.
9769 unsigned NumPartitions
= 1 + (j
== N
- 1 ? 0 : MinPartitions
[j
+ 1]);
9770 if (NumPartitions
< MinPartitions
[i
]) {
9771 // Found a better partition.
9772 MinPartitions
[i
] = NumPartitions
;
9778 // Iterate over the partitions, replacing with bit-test clusters in-place.
9779 unsigned DstIndex
= 0;
9780 for (unsigned First
= 0, Last
; First
< N
; First
= Last
+ 1) {
9781 Last
= LastElement
[First
];
9782 assert(First
<= Last
);
9783 assert(DstIndex
<= First
);
9785 CaseCluster BitTestCluster
;
9786 if (buildBitTests(Clusters
, First
, Last
, SI
, BitTestCluster
)) {
9787 Clusters
[DstIndex
++] = BitTestCluster
;
9789 size_t NumClusters
= Last
- First
+ 1;
9790 std::memmove(&Clusters
[DstIndex
], &Clusters
[First
],
9791 sizeof(Clusters
[0]) * NumClusters
);
9792 DstIndex
+= NumClusters
;
9795 Clusters
.resize(DstIndex
);
9798 void SelectionDAGBuilder::lowerWorkItem(SwitchWorkListItem W
, Value
*Cond
,
9799 MachineBasicBlock
*SwitchMBB
,
9800 MachineBasicBlock
*DefaultMBB
) {
9801 MachineFunction
*CurMF
= FuncInfo
.MF
;
9802 MachineBasicBlock
*NextMBB
= nullptr;
9803 MachineFunction::iterator
BBI(W
.MBB
);
9804 if (++BBI
!= FuncInfo
.MF
->end())
9807 unsigned Size
= W
.LastCluster
- W
.FirstCluster
+ 1;
9809 BranchProbabilityInfo
*BPI
= FuncInfo
.BPI
;
9811 if (Size
== 2 && W
.MBB
== SwitchMBB
) {
9812 // If any two of the cases has the same destination, and if one value
9813 // is the same as the other, but has one bit unset that the other has set,
9814 // use bit manipulation to do two compares at once. For example:
9815 // "if (X == 6 || X == 4)" -> "if ((X|2) == 6)"
9816 // TODO: This could be extended to merge any 2 cases in switches with 3
9818 // TODO: Handle cases where W.CaseBB != SwitchBB.
9819 CaseCluster
&Small
= *W
.FirstCluster
;
9820 CaseCluster
&Big
= *W
.LastCluster
;
9822 if (Small
.Low
== Small
.High
&& Big
.Low
== Big
.High
&&
9823 Small
.MBB
== Big
.MBB
) {
9824 const APInt
&SmallValue
= Small
.Low
->getValue();
9825 const APInt
&BigValue
= Big
.Low
->getValue();
9827 // Check that there is only one bit different.
9828 APInt CommonBit
= BigValue
^ SmallValue
;
9829 if (CommonBit
.isPowerOf2()) {
9830 SDValue CondLHS
= getValue(Cond
);
9831 EVT VT
= CondLHS
.getValueType();
9832 SDLoc DL
= getCurSDLoc();
9834 SDValue Or
= DAG
.getNode(ISD::OR
, DL
, VT
, CondLHS
,
9835 DAG
.getConstant(CommonBit
, DL
, VT
));
9836 SDValue Cond
= DAG
.getSetCC(
9837 DL
, MVT::i1
, Or
, DAG
.getConstant(BigValue
| SmallValue
, DL
, VT
),
9840 // Update successor info.
9841 // Both Small and Big will jump to Small.BB, so we sum up the
9843 addSuccessorWithProb(SwitchMBB
, Small
.MBB
, Small
.Prob
+ Big
.Prob
);
9845 addSuccessorWithProb(
9846 SwitchMBB
, DefaultMBB
,
9847 // The default destination is the first successor in IR.
9848 BPI
->getEdgeProbability(SwitchMBB
->getBasicBlock(), (unsigned)0));
9850 addSuccessorWithProb(SwitchMBB
, DefaultMBB
);
9852 // Insert the true branch.
9854 DAG
.getNode(ISD::BRCOND
, DL
, MVT::Other
, getControlRoot(), Cond
,
9855 DAG
.getBasicBlock(Small
.MBB
));
9856 // Insert the false branch.
9857 BrCond
= DAG
.getNode(ISD::BR
, DL
, MVT::Other
, BrCond
,
9858 DAG
.getBasicBlock(DefaultMBB
));
9860 DAG
.setRoot(BrCond
);
9866 if (TM
.getOptLevel() != CodeGenOpt::None
) {
9867 // Here, we order cases by probability so the most likely case will be
9868 // checked first. However, two clusters can have the same probability in
9869 // which case their relative ordering is non-deterministic. So we use Low
9870 // as a tie-breaker as clusters are guaranteed to never overlap.
9871 llvm::sort(W
.FirstCluster
, W
.LastCluster
+ 1,
9872 [](const CaseCluster
&a
, const CaseCluster
&b
) {
9873 return a
.Prob
!= b
.Prob
?
9875 a
.Low
->getValue().slt(b
.Low
->getValue());
9878 // Rearrange the case blocks so that the last one falls through if possible
9879 // without changing the order of probabilities.
9880 for (CaseClusterIt I
= W
.LastCluster
; I
> W
.FirstCluster
; ) {
9882 if (I
->Prob
> W
.LastCluster
->Prob
)
9884 if (I
->Kind
== CC_Range
&& I
->MBB
== NextMBB
) {
9885 std::swap(*I
, *W
.LastCluster
);
9891 // Compute total probability.
9892 BranchProbability DefaultProb
= W
.DefaultProb
;
9893 BranchProbability UnhandledProbs
= DefaultProb
;
9894 for (CaseClusterIt I
= W
.FirstCluster
; I
<= W
.LastCluster
; ++I
)
9895 UnhandledProbs
+= I
->Prob
;
9897 MachineBasicBlock
*CurMBB
= W
.MBB
;
9898 for (CaseClusterIt I
= W
.FirstCluster
, E
= W
.LastCluster
; I
<= E
; ++I
) {
9899 MachineBasicBlock
*Fallthrough
;
9900 if (I
== W
.LastCluster
) {
9901 // For the last cluster, fall through to the default destination.
9902 Fallthrough
= DefaultMBB
;
9904 Fallthrough
= CurMF
->CreateMachineBasicBlock(CurMBB
->getBasicBlock());
9905 CurMF
->insert(BBI
, Fallthrough
);
9906 // Put Cond in a virtual register to make it available from the new blocks.
9907 ExportFromCurrentBlock(Cond
);
9909 UnhandledProbs
-= I
->Prob
;
9912 case CC_JumpTable
: {
9913 // FIXME: Optimize away range check based on pivot comparisons.
9914 JumpTableHeader
*JTH
= &JTCases
[I
->JTCasesIndex
].first
;
9915 JumpTable
*JT
= &JTCases
[I
->JTCasesIndex
].second
;
9917 // The jump block hasn't been inserted yet; insert it here.
9918 MachineBasicBlock
*JumpMBB
= JT
->MBB
;
9919 CurMF
->insert(BBI
, JumpMBB
);
9921 auto JumpProb
= I
->Prob
;
9922 auto FallthroughProb
= UnhandledProbs
;
9924 // If the default statement is a target of the jump table, we evenly
9925 // distribute the default probability to successors of CurMBB. Also
9926 // update the probability on the edge from JumpMBB to Fallthrough.
9927 for (MachineBasicBlock::succ_iterator SI
= JumpMBB
->succ_begin(),
9928 SE
= JumpMBB
->succ_end();
9930 if (*SI
== DefaultMBB
) {
9931 JumpProb
+= DefaultProb
/ 2;
9932 FallthroughProb
-= DefaultProb
/ 2;
9933 JumpMBB
->setSuccProbability(SI
, DefaultProb
/ 2);
9934 JumpMBB
->normalizeSuccProbs();
9939 addSuccessorWithProb(CurMBB
, Fallthrough
, FallthroughProb
);
9940 addSuccessorWithProb(CurMBB
, JumpMBB
, JumpProb
);
9941 CurMBB
->normalizeSuccProbs();
9943 // The jump table header will be inserted in our current block, do the
9944 // range check, and fall through to our fallthrough block.
9945 JTH
->HeaderBB
= CurMBB
;
9946 JT
->Default
= Fallthrough
; // FIXME: Move Default to JumpTableHeader.
9948 // If we're in the right place, emit the jump table header right now.
9949 if (CurMBB
== SwitchMBB
) {
9950 visitJumpTableHeader(*JT
, *JTH
, SwitchMBB
);
9951 JTH
->Emitted
= true;
9956 // FIXME: Optimize away range check based on pivot comparisons.
9957 BitTestBlock
*BTB
= &BitTestCases
[I
->BTCasesIndex
];
9959 // The bit test blocks haven't been inserted yet; insert them here.
9960 for (BitTestCase
&BTC
: BTB
->Cases
)
9961 CurMF
->insert(BBI
, BTC
.ThisBB
);
9963 // Fill in fields of the BitTestBlock.
9964 BTB
->Parent
= CurMBB
;
9965 BTB
->Default
= Fallthrough
;
9967 BTB
->DefaultProb
= UnhandledProbs
;
9968 // If the cases in bit test don't form a contiguous range, we evenly
9969 // distribute the probability on the edge to Fallthrough to two
9970 // successors of CurMBB.
9971 if (!BTB
->ContiguousRange
) {
9972 BTB
->Prob
+= DefaultProb
/ 2;
9973 BTB
->DefaultProb
-= DefaultProb
/ 2;
9976 // If we're in the right place, emit the bit test header right now.
9977 if (CurMBB
== SwitchMBB
) {
9978 visitBitTestHeader(*BTB
, SwitchMBB
);
9979 BTB
->Emitted
= true;
9984 const Value
*RHS
, *LHS
, *MHS
;
9986 if (I
->Low
== I
->High
) {
9987 // Check Cond == I->Low.
9993 // Check I->Low <= Cond <= I->High.
10000 // The false probability is the sum of all unhandled cases.
10001 CaseBlock
CB(CC
, LHS
, RHS
, MHS
, I
->MBB
, Fallthrough
, CurMBB
,
10002 getCurSDLoc(), I
->Prob
, UnhandledProbs
);
10004 if (CurMBB
== SwitchMBB
)
10005 visitSwitchCase(CB
, SwitchMBB
);
10007 SwitchCases
.push_back(CB
);
10012 CurMBB
= Fallthrough
;
10016 unsigned SelectionDAGBuilder::caseClusterRank(const CaseCluster
&CC
,
10017 CaseClusterIt First
,
10018 CaseClusterIt Last
) {
10019 return std::count_if(First
, Last
+ 1, [&](const CaseCluster
&X
) {
10020 if (X
.Prob
!= CC
.Prob
)
10021 return X
.Prob
> CC
.Prob
;
10023 // Ties are broken by comparing the case value.
10024 return X
.Low
->getValue().slt(CC
.Low
->getValue());
10028 void SelectionDAGBuilder::splitWorkItem(SwitchWorkList
&WorkList
,
10029 const SwitchWorkListItem
&W
,
10031 MachineBasicBlock
*SwitchMBB
) {
10032 assert(W
.FirstCluster
->Low
->getValue().slt(W
.LastCluster
->Low
->getValue()) &&
10033 "Clusters not sorted?");
10035 assert(W
.LastCluster
- W
.FirstCluster
+ 1 >= 2 && "Too small to split!");
10037 // Balance the tree based on branch probabilities to create a near-optimal (in
10038 // terms of search time given key frequency) binary search tree. See e.g. Kurt
10039 // Mehlhorn "Nearly Optimal Binary Search Trees" (1975).
10040 CaseClusterIt LastLeft
= W
.FirstCluster
;
10041 CaseClusterIt FirstRight
= W
.LastCluster
;
10042 auto LeftProb
= LastLeft
->Prob
+ W
.DefaultProb
/ 2;
10043 auto RightProb
= FirstRight
->Prob
+ W
.DefaultProb
/ 2;
10045 // Move LastLeft and FirstRight towards each other from opposite directions to
10046 // find a partitioning of the clusters which balances the probability on both
10047 // sides. If LeftProb and RightProb are equal, alternate which side is
10048 // taken to ensure 0-probability nodes are distributed evenly.
10050 while (LastLeft
+ 1 < FirstRight
) {
10051 if (LeftProb
< RightProb
|| (LeftProb
== RightProb
&& (I
& 1)))
10052 LeftProb
+= (++LastLeft
)->Prob
;
10054 RightProb
+= (--FirstRight
)->Prob
;
10059 // Our binary search tree differs from a typical BST in that ours can have up
10060 // to three values in each leaf. The pivot selection above doesn't take that
10061 // into account, which means the tree might require more nodes and be less
10062 // efficient. We compensate for this here.
10064 unsigned NumLeft
= LastLeft
- W
.FirstCluster
+ 1;
10065 unsigned NumRight
= W
.LastCluster
- FirstRight
+ 1;
10067 if (std::min(NumLeft
, NumRight
) < 3 && std::max(NumLeft
, NumRight
) > 3) {
10068 // If one side has less than 3 clusters, and the other has more than 3,
10069 // consider taking a cluster from the other side.
10071 if (NumLeft
< NumRight
) {
10072 // Consider moving the first cluster on the right to the left side.
10073 CaseCluster
&CC
= *FirstRight
;
10074 unsigned RightSideRank
= caseClusterRank(CC
, FirstRight
, W
.LastCluster
);
10075 unsigned LeftSideRank
= caseClusterRank(CC
, W
.FirstCluster
, LastLeft
);
10076 if (LeftSideRank
<= RightSideRank
) {
10077 // Moving the cluster to the left does not demote it.
10083 assert(NumRight
< NumLeft
);
10084 // Consider moving the last element on the left to the right side.
10085 CaseCluster
&CC
= *LastLeft
;
10086 unsigned LeftSideRank
= caseClusterRank(CC
, W
.FirstCluster
, LastLeft
);
10087 unsigned RightSideRank
= caseClusterRank(CC
, FirstRight
, W
.LastCluster
);
10088 if (RightSideRank
<= LeftSideRank
) {
10089 // Moving the cluster to the right does not demot it.
10099 assert(LastLeft
+ 1 == FirstRight
);
10100 assert(LastLeft
>= W
.FirstCluster
);
10101 assert(FirstRight
<= W
.LastCluster
);
10103 // Use the first element on the right as pivot since we will make less-than
10104 // comparisons against it.
10105 CaseClusterIt PivotCluster
= FirstRight
;
10106 assert(PivotCluster
> W
.FirstCluster
);
10107 assert(PivotCluster
<= W
.LastCluster
);
10109 CaseClusterIt FirstLeft
= W
.FirstCluster
;
10110 CaseClusterIt LastRight
= W
.LastCluster
;
10112 const ConstantInt
*Pivot
= PivotCluster
->Low
;
10114 // New blocks will be inserted immediately after the current one.
10115 MachineFunction::iterator
BBI(W
.MBB
);
10118 // We will branch to the LHS if Value < Pivot. If LHS is a single cluster,
10119 // we can branch to its destination directly if it's squeezed exactly in
10120 // between the known lower bound and Pivot - 1.
10121 MachineBasicBlock
*LeftMBB
;
10122 if (FirstLeft
== LastLeft
&& FirstLeft
->Kind
== CC_Range
&&
10123 FirstLeft
->Low
== W
.GE
&&
10124 (FirstLeft
->High
->getValue() + 1LL) == Pivot
->getValue()) {
10125 LeftMBB
= FirstLeft
->MBB
;
10127 LeftMBB
= FuncInfo
.MF
->CreateMachineBasicBlock(W
.MBB
->getBasicBlock());
10128 FuncInfo
.MF
->insert(BBI
, LeftMBB
);
10129 WorkList
.push_back(
10130 {LeftMBB
, FirstLeft
, LastLeft
, W
.GE
, Pivot
, W
.DefaultProb
/ 2});
10131 // Put Cond in a virtual register to make it available from the new blocks.
10132 ExportFromCurrentBlock(Cond
);
10135 // Similarly, we will branch to the RHS if Value >= Pivot. If RHS is a
10136 // single cluster, RHS.Low == Pivot, and we can branch to its destination
10137 // directly if RHS.High equals the current upper bound.
10138 MachineBasicBlock
*RightMBB
;
10139 if (FirstRight
== LastRight
&& FirstRight
->Kind
== CC_Range
&&
10140 W
.LT
&& (FirstRight
->High
->getValue() + 1ULL) == W
.LT
->getValue()) {
10141 RightMBB
= FirstRight
->MBB
;
10143 RightMBB
= FuncInfo
.MF
->CreateMachineBasicBlock(W
.MBB
->getBasicBlock());
10144 FuncInfo
.MF
->insert(BBI
, RightMBB
);
10145 WorkList
.push_back(
10146 {RightMBB
, FirstRight
, LastRight
, Pivot
, W
.LT
, W
.DefaultProb
/ 2});
10147 // Put Cond in a virtual register to make it available from the new blocks.
10148 ExportFromCurrentBlock(Cond
);
10151 // Create the CaseBlock record that will be used to lower the branch.
10152 CaseBlock
CB(ISD::SETLT
, Cond
, Pivot
, nullptr, LeftMBB
, RightMBB
, W
.MBB
,
10153 getCurSDLoc(), LeftProb
, RightProb
);
10155 if (W
.MBB
== SwitchMBB
)
10156 visitSwitchCase(CB
, SwitchMBB
);
10158 SwitchCases
.push_back(CB
);
10161 // Scale CaseProb after peeling a case with the probablity of PeeledCaseProb
10162 // from the swith statement.
10163 static BranchProbability
scaleCaseProbality(BranchProbability CaseProb
,
10164 BranchProbability PeeledCaseProb
) {
10165 if (PeeledCaseProb
== BranchProbability::getOne())
10166 return BranchProbability::getZero();
10167 BranchProbability SwitchProb
= PeeledCaseProb
.getCompl();
10169 uint32_t Numerator
= CaseProb
.getNumerator();
10170 uint32_t Denominator
= SwitchProb
.scale(CaseProb
.getDenominator());
10171 return BranchProbability(Numerator
, std::max(Numerator
, Denominator
));
10174 // Try to peel the top probability case if it exceeds the threshold.
10175 // Return current MachineBasicBlock for the switch statement if the peeling
10177 // If the peeling is performed, return the newly created MachineBasicBlock
10178 // for the peeled switch statement. Also update Clusters to remove the peeled
10179 // case. PeeledCaseProb is the BranchProbability for the peeled case.
10180 MachineBasicBlock
*SelectionDAGBuilder::peelDominantCaseCluster(
10181 const SwitchInst
&SI
, CaseClusterVector
&Clusters
,
10182 BranchProbability
&PeeledCaseProb
) {
10183 MachineBasicBlock
*SwitchMBB
= FuncInfo
.MBB
;
10184 // Don't perform if there is only one cluster or optimizing for size.
10185 if (SwitchPeelThreshold
> 100 || !FuncInfo
.BPI
|| Clusters
.size() < 2 ||
10186 TM
.getOptLevel() == CodeGenOpt::None
||
10187 SwitchMBB
->getParent()->getFunction().optForMinSize())
10190 BranchProbability TopCaseProb
= BranchProbability(SwitchPeelThreshold
, 100);
10191 unsigned PeeledCaseIndex
= 0;
10192 bool SwitchPeeled
= false;
10193 for (unsigned Index
= 0; Index
< Clusters
.size(); ++Index
) {
10194 CaseCluster
&CC
= Clusters
[Index
];
10195 if (CC
.Prob
< TopCaseProb
)
10197 TopCaseProb
= CC
.Prob
;
10198 PeeledCaseIndex
= Index
;
10199 SwitchPeeled
= true;
10204 LLVM_DEBUG(dbgs() << "Peeled one top case in switch stmt, prob: "
10205 << TopCaseProb
<< "\n");
10207 // Record the MBB for the peeled switch statement.
10208 MachineFunction::iterator
BBI(SwitchMBB
);
10210 MachineBasicBlock
*PeeledSwitchMBB
=
10211 FuncInfo
.MF
->CreateMachineBasicBlock(SwitchMBB
->getBasicBlock());
10212 FuncInfo
.MF
->insert(BBI
, PeeledSwitchMBB
);
10214 ExportFromCurrentBlock(SI
.getCondition());
10215 auto PeeledCaseIt
= Clusters
.begin() + PeeledCaseIndex
;
10216 SwitchWorkListItem W
= {SwitchMBB
, PeeledCaseIt
, PeeledCaseIt
,
10217 nullptr, nullptr, TopCaseProb
.getCompl()};
10218 lowerWorkItem(W
, SI
.getCondition(), SwitchMBB
, PeeledSwitchMBB
);
10220 Clusters
.erase(PeeledCaseIt
);
10221 for (CaseCluster
&CC
: Clusters
) {
10223 dbgs() << "Scale the probablity for one cluster, before scaling: "
10224 << CC
.Prob
<< "\n");
10225 CC
.Prob
= scaleCaseProbality(CC
.Prob
, TopCaseProb
);
10226 LLVM_DEBUG(dbgs() << "After scaling: " << CC
.Prob
<< "\n");
10228 PeeledCaseProb
= TopCaseProb
;
10229 return PeeledSwitchMBB
;
10232 void SelectionDAGBuilder::visitSwitch(const SwitchInst
&SI
) {
10233 // Extract cases from the switch.
10234 BranchProbabilityInfo
*BPI
= FuncInfo
.BPI
;
10235 CaseClusterVector Clusters
;
10236 Clusters
.reserve(SI
.getNumCases());
10237 for (auto I
: SI
.cases()) {
10238 MachineBasicBlock
*Succ
= FuncInfo
.MBBMap
[I
.getCaseSuccessor()];
10239 const ConstantInt
*CaseVal
= I
.getCaseValue();
10240 BranchProbability Prob
=
10241 BPI
? BPI
->getEdgeProbability(SI
.getParent(), I
.getSuccessorIndex())
10242 : BranchProbability(1, SI
.getNumCases() + 1);
10243 Clusters
.push_back(CaseCluster::range(CaseVal
, CaseVal
, Succ
, Prob
));
10246 MachineBasicBlock
*DefaultMBB
= FuncInfo
.MBBMap
[SI
.getDefaultDest()];
10248 // Cluster adjacent cases with the same destination. We do this at all
10249 // optimization levels because it's cheap to do and will make codegen faster
10250 // if there are many clusters.
10251 sortAndRangeify(Clusters
);
10253 if (TM
.getOptLevel() != CodeGenOpt::None
) {
10254 // Replace an unreachable default with the most popular destination.
10255 // FIXME: Exploit unreachable default more aggressively.
10256 bool UnreachableDefault
=
10257 isa
<UnreachableInst
>(SI
.getDefaultDest()->getFirstNonPHIOrDbg());
10258 if (UnreachableDefault
&& !Clusters
.empty()) {
10259 DenseMap
<const BasicBlock
*, unsigned> Popularity
;
10260 unsigned MaxPop
= 0;
10261 const BasicBlock
*MaxBB
= nullptr;
10262 for (auto I
: SI
.cases()) {
10263 const BasicBlock
*BB
= I
.getCaseSuccessor();
10264 if (++Popularity
[BB
] > MaxPop
) {
10265 MaxPop
= Popularity
[BB
];
10269 // Set new default.
10270 assert(MaxPop
> 0 && MaxBB
);
10271 DefaultMBB
= FuncInfo
.MBBMap
[MaxBB
];
10273 // Remove cases that were pointing to the destination that is now the
10275 CaseClusterVector New
;
10276 New
.reserve(Clusters
.size());
10277 for (CaseCluster
&CC
: Clusters
) {
10278 if (CC
.MBB
!= DefaultMBB
)
10281 Clusters
= std::move(New
);
10285 // The branch probablity of the peeled case.
10286 BranchProbability PeeledCaseProb
= BranchProbability::getZero();
10287 MachineBasicBlock
*PeeledSwitchMBB
=
10288 peelDominantCaseCluster(SI
, Clusters
, PeeledCaseProb
);
10290 // If there is only the default destination, jump there directly.
10291 MachineBasicBlock
*SwitchMBB
= FuncInfo
.MBB
;
10292 if (Clusters
.empty()) {
10293 assert(PeeledSwitchMBB
== SwitchMBB
);
10294 SwitchMBB
->addSuccessor(DefaultMBB
);
10295 if (DefaultMBB
!= NextBlock(SwitchMBB
)) {
10296 DAG
.setRoot(DAG
.getNode(ISD::BR
, getCurSDLoc(), MVT::Other
,
10297 getControlRoot(), DAG
.getBasicBlock(DefaultMBB
)));
10302 findJumpTables(Clusters
, &SI
, DefaultMBB
);
10303 findBitTestClusters(Clusters
, &SI
);
10306 dbgs() << "Case clusters: ";
10307 for (const CaseCluster
&C
: Clusters
) {
10308 if (C
.Kind
== CC_JumpTable
)
10310 if (C
.Kind
== CC_BitTests
)
10313 C
.Low
->getValue().print(dbgs(), true);
10314 if (C
.Low
!= C
.High
) {
10316 C
.High
->getValue().print(dbgs(), true);
10323 assert(!Clusters
.empty());
10324 SwitchWorkList WorkList
;
10325 CaseClusterIt First
= Clusters
.begin();
10326 CaseClusterIt Last
= Clusters
.end() - 1;
10327 auto DefaultProb
= getEdgeProbability(PeeledSwitchMBB
, DefaultMBB
);
10328 // Scale the branchprobability for DefaultMBB if the peel occurs and
10329 // DefaultMBB is not replaced.
10330 if (PeeledCaseProb
!= BranchProbability::getZero() &&
10331 DefaultMBB
== FuncInfo
.MBBMap
[SI
.getDefaultDest()])
10332 DefaultProb
= scaleCaseProbality(DefaultProb
, PeeledCaseProb
);
10333 WorkList
.push_back(
10334 {PeeledSwitchMBB
, First
, Last
, nullptr, nullptr, DefaultProb
});
10336 while (!WorkList
.empty()) {
10337 SwitchWorkListItem W
= WorkList
.back();
10338 WorkList
.pop_back();
10339 unsigned NumClusters
= W
.LastCluster
- W
.FirstCluster
+ 1;
10341 if (NumClusters
> 3 && TM
.getOptLevel() != CodeGenOpt::None
&&
10342 !DefaultMBB
->getParent()->getFunction().optForMinSize()) {
10343 // For optimized builds, lower large range as a balanced binary tree.
10344 splitWorkItem(WorkList
, W
, SI
.getCondition(), SwitchMBB
);
10348 lowerWorkItem(W
, SI
.getCondition(), SwitchMBB
, DefaultMBB
);