LLVM 20.0.0git
SelectionDAGBuilder.cpp
Go to the documentation of this file.
1//===- SelectionDAGBuilder.cpp - Selection-DAG building -------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This implements routines for translating from LLVM IR into SelectionDAG IR.
10//
11//===----------------------------------------------------------------------===//
12
13#include "SelectionDAGBuilder.h"
14#include "SDNodeDbgValue.h"
15#include "llvm/ADT/APFloat.h"
16#include "llvm/ADT/APInt.h"
17#include "llvm/ADT/BitVector.h"
18#include "llvm/ADT/STLExtras.h"
20#include "llvm/ADT/SmallSet.h"
21#include "llvm/ADT/StringRef.h"
22#include "llvm/ADT/Twine.h"
26#include "llvm/Analysis/Loads.h"
58#include "llvm/IR/Argument.h"
59#include "llvm/IR/Attributes.h"
60#include "llvm/IR/BasicBlock.h"
61#include "llvm/IR/CFG.h"
62#include "llvm/IR/CallingConv.h"
63#include "llvm/IR/Constant.h"
65#include "llvm/IR/Constants.h"
66#include "llvm/IR/DataLayout.h"
67#include "llvm/IR/DebugInfo.h"
72#include "llvm/IR/Function.h"
74#include "llvm/IR/InlineAsm.h"
75#include "llvm/IR/InstrTypes.h"
78#include "llvm/IR/Intrinsics.h"
79#include "llvm/IR/IntrinsicsAArch64.h"
80#include "llvm/IR/IntrinsicsAMDGPU.h"
81#include "llvm/IR/IntrinsicsWebAssembly.h"
82#include "llvm/IR/LLVMContext.h"
84#include "llvm/IR/Metadata.h"
85#include "llvm/IR/Module.h"
86#include "llvm/IR/Operator.h"
88#include "llvm/IR/Statepoint.h"
89#include "llvm/IR/Type.h"
90#include "llvm/IR/User.h"
91#include "llvm/IR/Value.h"
92#include "llvm/MC/MCContext.h"
97#include "llvm/Support/Debug.h"
106#include <cstddef>
107#include <deque>
108#include <iterator>
109#include <limits>
110#include <optional>
111#include <tuple>
112
113using namespace llvm;
114using namespace PatternMatch;
115using namespace SwitchCG;
116
117#define DEBUG_TYPE "isel"
118
119/// LimitFloatPrecision - Generate low-precision inline sequences for
120/// some float libcalls (6, 8 or 12 bits).
121static unsigned LimitFloatPrecision;
122
123static cl::opt<bool>
124 InsertAssertAlign("insert-assert-align", cl::init(true),
125 cl::desc("Insert the experimental `assertalign` node."),
127
129 LimitFPPrecision("limit-float-precision",
130 cl::desc("Generate low-precision inline sequences "
131 "for some float libcalls"),
133 cl::init(0));
134
136 "switch-peel-threshold", cl::Hidden, cl::init(66),
137 cl::desc("Set the case probability threshold for peeling the case from a "
138 "switch statement. A value greater than 100 will void this "
139 "optimization"));
140
141// Limit the width of DAG chains. This is important in general to prevent
142// DAG-based analysis from blowing up. For example, alias analysis and
143// load clustering may not complete in reasonable time. It is difficult to
144// recognize and avoid this situation within each individual analysis, and
145// future analyses are likely to have the same behavior. Limiting DAG width is
146// the safe approach and will be especially important with global DAGs.
147//
148// MaxParallelChains default is arbitrarily high to avoid affecting
149// optimization, but could be lowered to improve compile time. Any ld-ld-st-st
150// sequence over this should have been converted to llvm.memcpy by the
151// frontend. It is easy to induce this behavior with .ll code such as:
152// %buffer = alloca [4096 x i8]
153// %data = load [4096 x i8]* %argPtr
154// store [4096 x i8] %data, [4096 x i8]* %buffer
155static const unsigned MaxParallelChains = 64;
156
158 const SDValue *Parts, unsigned NumParts,
159 MVT PartVT, EVT ValueVT, const Value *V,
160 SDValue InChain,
161 std::optional<CallingConv::ID> CC);
162
163/// getCopyFromParts - Create a value that contains the specified legal parts
164/// combined into the value they represent. If the parts combine to a type
165/// larger than ValueVT then AssertOp can be used to specify whether the extra
166/// bits are known to be zero (ISD::AssertZext) or sign extended from ValueVT
167/// (ISD::AssertSext).
168static SDValue
169getCopyFromParts(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts,
170 unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V,
171 SDValue InChain,
172 std::optional<CallingConv::ID> CC = std::nullopt,
173 std::optional<ISD::NodeType> AssertOp = std::nullopt) {
174 // Let the target assemble the parts if it wants to
175 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
176 if (SDValue Val = TLI.joinRegisterPartsIntoValue(DAG, DL, Parts, NumParts,
177 PartVT, ValueVT, CC))
178 return Val;
179
180 if (ValueVT.isVector())
181 return getCopyFromPartsVector(DAG, DL, Parts, NumParts, PartVT, ValueVT, V,
182 InChain, CC);
183
184 assert(NumParts > 0 && "No parts to assemble!");
185 SDValue Val = Parts[0];
186
187 if (NumParts > 1) {
188 // Assemble the value from multiple parts.
189 if (ValueVT.isInteger()) {
190 unsigned PartBits = PartVT.getSizeInBits();
191 unsigned ValueBits = ValueVT.getSizeInBits();
192
193 // Assemble the power of 2 part.
194 unsigned RoundParts = llvm::bit_floor(NumParts);
195 unsigned RoundBits = PartBits * RoundParts;
196 EVT RoundVT = RoundBits == ValueBits ?
197 ValueVT : EVT::getIntegerVT(*DAG.getContext(), RoundBits);
198 SDValue Lo, Hi;
199
200 EVT HalfVT = EVT::getIntegerVT(*DAG.getContext(), RoundBits/2);
201
202 if (RoundParts > 2) {
203 Lo = getCopyFromParts(DAG, DL, Parts, RoundParts / 2, PartVT, HalfVT, V,
204 InChain);
205 Hi = getCopyFromParts(DAG, DL, Parts + RoundParts / 2, RoundParts / 2,
206 PartVT, HalfVT, V, InChain);
207 } else {
208 Lo = DAG.getNode(ISD::BITCAST, DL, HalfVT, Parts[0]);
209 Hi = DAG.getNode(ISD::BITCAST, DL, HalfVT, Parts[1]);
210 }
211
212 if (DAG.getDataLayout().isBigEndian())
213 std::swap(Lo, Hi);
214
215 Val = DAG.getNode(ISD::BUILD_PAIR, DL, RoundVT, Lo, Hi);
216
217 if (RoundParts < NumParts) {
218 // Assemble the trailing non-power-of-2 part.
219 unsigned OddParts = NumParts - RoundParts;
220 EVT OddVT = EVT::getIntegerVT(*DAG.getContext(), OddParts * PartBits);
221 Hi = getCopyFromParts(DAG, DL, Parts + RoundParts, OddParts, PartVT,
222 OddVT, V, InChain, CC);
223
224 // Combine the round and odd parts.
225 Lo = Val;
226 if (DAG.getDataLayout().isBigEndian())
227 std::swap(Lo, Hi);
228 EVT TotalVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
229 Hi = DAG.getNode(ISD::ANY_EXTEND, DL, TotalVT, Hi);
230 Hi = DAG.getNode(ISD::SHL, DL, TotalVT, Hi,
231 DAG.getConstant(Lo.getValueSizeInBits(), DL,
233 TotalVT, DAG.getDataLayout())));
234 Lo = DAG.getNode(ISD::ZERO_EXTEND, DL, TotalVT, Lo);
235 Val = DAG.getNode(ISD::OR, DL, TotalVT, Lo, Hi);
236 }
237 } else if (PartVT.isFloatingPoint()) {
238 // FP split into multiple FP parts (for ppcf128)
239 assert(ValueVT == EVT(MVT::ppcf128) && PartVT == MVT::f64 &&
240 "Unexpected split");
241 SDValue Lo, Hi;
242 Lo = DAG.getNode(ISD::BITCAST, DL, EVT(MVT::f64), Parts[0]);
243 Hi = DAG.getNode(ISD::BITCAST, DL, EVT(MVT::f64), Parts[1]);
244 if (TLI.hasBigEndianPartOrdering(ValueVT, DAG.getDataLayout()))
245 std::swap(Lo, Hi);
246 Val = DAG.getNode(ISD::BUILD_PAIR, DL, ValueVT, Lo, Hi);
247 } else {
248 // FP split into integer parts (soft fp)
249 assert(ValueVT.isFloatingPoint() && PartVT.isInteger() &&
250 !PartVT.isVector() && "Unexpected split");
251 EVT IntVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
252 Val = getCopyFromParts(DAG, DL, Parts, NumParts, PartVT, IntVT, V,
253 InChain, CC);
254 }
255 }
256
257 // There is now one part, held in Val. Correct it to match ValueVT.
258 // PartEVT is the type of the register class that holds the value.
259 // ValueVT is the type of the inline asm operation.
260 EVT PartEVT = Val.getValueType();
261
262 if (PartEVT == ValueVT)
263 return Val;
264
265 if (PartEVT.isInteger() && ValueVT.isFloatingPoint() &&
266 ValueVT.bitsLT(PartEVT)) {
267 // For an FP value in an integer part, we need to truncate to the right
268 // width first.
269 PartEVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
270 Val = DAG.getNode(ISD::TRUNCATE, DL, PartEVT, Val);
271 }
272
273 // Handle types that have the same size.
274 if (PartEVT.getSizeInBits() == ValueVT.getSizeInBits())
275 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
276
277 // Handle types with different sizes.
278 if (PartEVT.isInteger() && ValueVT.isInteger()) {
279 if (ValueVT.bitsLT(PartEVT)) {
280 // For a truncate, see if we have any information to
281 // indicate whether the truncated bits will always be
282 // zero or sign-extension.
283 if (AssertOp)
284 Val = DAG.getNode(*AssertOp, DL, PartEVT, Val,
285 DAG.getValueType(ValueVT));
286 return DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
287 }
288 return DAG.getNode(ISD::ANY_EXTEND, DL, ValueVT, Val);
289 }
290
291 if (PartEVT.isFloatingPoint() && ValueVT.isFloatingPoint()) {
292 // FP_ROUND's are always exact here.
293 if (ValueVT.bitsLT(Val.getValueType())) {
294
295 SDValue NoChange =
297
299 llvm::Attribute::StrictFP)) {
300 return DAG.getNode(ISD::STRICT_FP_ROUND, DL,
301 DAG.getVTList(ValueVT, MVT::Other), InChain, Val,
302 NoChange);
303 }
304
305 return DAG.getNode(ISD::FP_ROUND, DL, ValueVT, Val, NoChange);
306 }
307
308 return DAG.getNode(ISD::FP_EXTEND, DL, ValueVT, Val);
309 }
310
311 // Handle MMX to a narrower integer type by bitcasting MMX to integer and
312 // then truncating.
313 if (PartEVT == MVT::x86mmx && ValueVT.isInteger() &&
314 ValueVT.bitsLT(PartEVT)) {
315 Val = DAG.getNode(ISD::BITCAST, DL, MVT::i64, Val);
316 return DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
317 }
318
319 report_fatal_error("Unknown mismatch in getCopyFromParts!");
320}
321
323 const Twine &ErrMsg) {
324 const Instruction *I = dyn_cast_or_null<Instruction>(V);
325 if (!V)
326 return Ctx.emitError(ErrMsg);
327
328 const char *AsmError = ", possible invalid constraint for vector type";
329 if (const CallInst *CI = dyn_cast<CallInst>(I))
330 if (CI->isInlineAsm())
331 return Ctx.emitError(I, ErrMsg + AsmError);
332
333 return Ctx.emitError(I, ErrMsg);
334}
335
336/// getCopyFromPartsVector - Create a value that contains the specified legal
337/// parts combined into the value they represent. If the parts combine to a
338/// type larger than ValueVT then AssertOp can be used to specify whether the
339/// extra bits are known to be zero (ISD::AssertZext) or sign extended from
340/// ValueVT (ISD::AssertSext).
342 const SDValue *Parts, unsigned NumParts,
343 MVT PartVT, EVT ValueVT, const Value *V,
344 SDValue InChain,
345 std::optional<CallingConv::ID> CallConv) {
346 assert(ValueVT.isVector() && "Not a vector value");
347 assert(NumParts > 0 && "No parts to assemble!");
348 const bool IsABIRegCopy = CallConv.has_value();
349
350 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
351 SDValue Val = Parts[0];
352
353 // Handle a multi-element vector.
354 if (NumParts > 1) {
355 EVT IntermediateVT;
356 MVT RegisterVT;
357 unsigned NumIntermediates;
358 unsigned NumRegs;
359
360 if (IsABIRegCopy) {
362 *DAG.getContext(), *CallConv, ValueVT, IntermediateVT,
363 NumIntermediates, RegisterVT);
364 } else {
365 NumRegs =
366 TLI.getVectorTypeBreakdown(*DAG.getContext(), ValueVT, IntermediateVT,
367 NumIntermediates, RegisterVT);
368 }
369
370 assert(NumRegs == NumParts && "Part count doesn't match vector breakdown!");
371 NumParts = NumRegs; // Silence a compiler warning.
372 assert(RegisterVT == PartVT && "Part type doesn't match vector breakdown!");
373 assert(RegisterVT.getSizeInBits() ==
374 Parts[0].getSimpleValueType().getSizeInBits() &&
375 "Part type sizes don't match!");
376
377 // Assemble the parts into intermediate operands.
378 SmallVector<SDValue, 8> Ops(NumIntermediates);
379 if (NumIntermediates == NumParts) {
380 // If the register was not expanded, truncate or copy the value,
381 // as appropriate.
382 for (unsigned i = 0; i != NumParts; ++i)
383 Ops[i] = getCopyFromParts(DAG, DL, &Parts[i], 1, PartVT, IntermediateVT,
384 V, InChain, CallConv);
385 } else if (NumParts > 0) {
386 // If the intermediate type was expanded, build the intermediate
387 // operands from the parts.
388 assert(NumParts % NumIntermediates == 0 &&
389 "Must expand into a divisible number of parts!");
390 unsigned Factor = NumParts / NumIntermediates;
391 for (unsigned i = 0; i != NumIntermediates; ++i)
392 Ops[i] = getCopyFromParts(DAG, DL, &Parts[i * Factor], Factor, PartVT,
393 IntermediateVT, V, InChain, CallConv);
394 }
395
396 // Build a vector with BUILD_VECTOR or CONCAT_VECTORS from the
397 // intermediate operands.
398 EVT BuiltVectorTy =
399 IntermediateVT.isVector()
401 *DAG.getContext(), IntermediateVT.getScalarType(),
402 IntermediateVT.getVectorElementCount() * NumParts)
404 IntermediateVT.getScalarType(),
405 NumIntermediates);
406 Val = DAG.getNode(IntermediateVT.isVector() ? ISD::CONCAT_VECTORS
408 DL, BuiltVectorTy, Ops);
409 }
410
411 // There is now one part, held in Val. Correct it to match ValueVT.
412 EVT PartEVT = Val.getValueType();
413
414 if (PartEVT == ValueVT)
415 return Val;
416
417 if (PartEVT.isVector()) {
418 // Vector/Vector bitcast.
419 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits())
420 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
421
422 // If the parts vector has more elements than the value vector, then we
423 // have a vector widening case (e.g. <2 x float> -> <4 x float>).
424 // Extract the elements we want.
425 if (PartEVT.getVectorElementCount() != ValueVT.getVectorElementCount()) {
428 (PartEVT.getVectorElementCount().isScalable() ==
429 ValueVT.getVectorElementCount().isScalable()) &&
430 "Cannot narrow, it would be a lossy transformation");
431 PartEVT =
433 ValueVT.getVectorElementCount());
434 Val = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, PartEVT, Val,
435 DAG.getVectorIdxConstant(0, DL));
436 if (PartEVT == ValueVT)
437 return Val;
438 if (PartEVT.isInteger() && ValueVT.isFloatingPoint())
439 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
440
441 // Vector/Vector bitcast (e.g. <2 x bfloat> -> <2 x half>).
442 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits())
443 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
444 }
445
446 // Promoted vector extract
447 return DAG.getAnyExtOrTrunc(Val, DL, ValueVT);
448 }
449
450 // Trivial bitcast if the types are the same size and the destination
451 // vector type is legal.
452 if (PartEVT.getSizeInBits() == ValueVT.getSizeInBits() &&
453 TLI.isTypeLegal(ValueVT))
454 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
455
456 if (ValueVT.getVectorNumElements() != 1) {
457 // Certain ABIs require that vectors are passed as integers. For vectors
458 // are the same size, this is an obvious bitcast.
459 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits()) {
460 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
461 } else if (ValueVT.bitsLT(PartEVT)) {
462 const uint64_t ValueSize = ValueVT.getFixedSizeInBits();
463 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
464 // Drop the extra bits.
465 Val = DAG.getNode(ISD::TRUNCATE, DL, IntermediateType, Val);
466 return DAG.getBitcast(ValueVT, Val);
467 }
468
470 *DAG.getContext(), V, "non-trivial scalar-to-vector conversion");
471 return DAG.getUNDEF(ValueVT);
472 }
473
474 // Handle cases such as i8 -> <1 x i1>
475 EVT ValueSVT = ValueVT.getVectorElementType();
476 if (ValueVT.getVectorNumElements() == 1 && ValueSVT != PartEVT) {
477 unsigned ValueSize = ValueSVT.getSizeInBits();
478 if (ValueSize == PartEVT.getSizeInBits()) {
479 Val = DAG.getNode(ISD::BITCAST, DL, ValueSVT, Val);
480 } else if (ValueSVT.isFloatingPoint() && PartEVT.isInteger()) {
481 // It's possible a scalar floating point type gets softened to integer and
482 // then promoted to a larger integer. If PartEVT is the larger integer
483 // we need to truncate it and then bitcast to the FP type.
484 assert(ValueSVT.bitsLT(PartEVT) && "Unexpected types");
485 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
486 Val = DAG.getNode(ISD::TRUNCATE, DL, IntermediateType, Val);
487 Val = DAG.getBitcast(ValueSVT, Val);
488 } else {
489 Val = ValueVT.isFloatingPoint()
490 ? DAG.getFPExtendOrRound(Val, DL, ValueSVT)
491 : DAG.getAnyExtOrTrunc(Val, DL, ValueSVT);
492 }
493 }
494
495 return DAG.getBuildVector(ValueVT, DL, Val);
496}
497
498static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &dl,
499 SDValue Val, SDValue *Parts, unsigned NumParts,
500 MVT PartVT, const Value *V,
501 std::optional<CallingConv::ID> CallConv);
502
503/// getCopyToParts - Create a series of nodes that contain the specified value
504/// split into legal parts. If the parts contain more bits than Val, then, for
505/// integers, ExtendKind can be used to specify how to generate the extra bits.
506static void
508 unsigned NumParts, MVT PartVT, const Value *V,
509 std::optional<CallingConv::ID> CallConv = std::nullopt,
510 ISD::NodeType ExtendKind = ISD::ANY_EXTEND) {
511 // Let the target split the parts if it wants to
512 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
513 if (TLI.splitValueIntoRegisterParts(DAG, DL, Val, Parts, NumParts, PartVT,
514 CallConv))
515 return;
516 EVT ValueVT = Val.getValueType();
517
518 // Handle the vector case separately.
519 if (ValueVT.isVector())
520 return getCopyToPartsVector(DAG, DL, Val, Parts, NumParts, PartVT, V,
521 CallConv);
522
523 unsigned OrigNumParts = NumParts;
525 "Copying to an illegal type!");
526
527 if (NumParts == 0)
528 return;
529
530 assert(!ValueVT.isVector() && "Vector case handled elsewhere");
531 EVT PartEVT = PartVT;
532 if (PartEVT == ValueVT) {
533 assert(NumParts == 1 && "No-op copy with multiple parts!");
534 Parts[0] = Val;
535 return;
536 }
537
538 unsigned PartBits = PartVT.getSizeInBits();
539 if (NumParts * PartBits > ValueVT.getSizeInBits()) {
540 // If the parts cover more bits than the value has, promote the value.
541 if (PartVT.isFloatingPoint() && ValueVT.isFloatingPoint()) {
542 assert(NumParts == 1 && "Do not know what to promote to!");
543 Val = DAG.getNode(ISD::FP_EXTEND, DL, PartVT, Val);
544 } else {
545 if (ValueVT.isFloatingPoint()) {
546 // FP values need to be bitcast, then extended if they are being put
547 // into a larger container.
548 ValueVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
549 Val = DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
550 }
551 assert((PartVT.isInteger() || PartVT == MVT::x86mmx) &&
552 ValueVT.isInteger() &&
553 "Unknown mismatch!");
554 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
555 Val = DAG.getNode(ExtendKind, DL, ValueVT, Val);
556 if (PartVT == MVT::x86mmx)
557 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
558 }
559 } else if (PartBits == ValueVT.getSizeInBits()) {
560 // Different types of the same size.
561 assert(NumParts == 1 && PartEVT != ValueVT);
562 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
563 } else if (NumParts * PartBits < ValueVT.getSizeInBits()) {
564 // If the parts cover less bits than value has, truncate the value.
565 assert((PartVT.isInteger() || PartVT == MVT::x86mmx) &&
566 ValueVT.isInteger() &&
567 "Unknown mismatch!");
568 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
569 Val = DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
570 if (PartVT == MVT::x86mmx)
571 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
572 }
573
574 // The value may have changed - recompute ValueVT.
575 ValueVT = Val.getValueType();
576 assert(NumParts * PartBits == ValueVT.getSizeInBits() &&
577 "Failed to tile the value with PartVT!");
578
579 if (NumParts == 1) {
580 if (PartEVT != ValueVT) {
582 "scalar-to-vector conversion failed");
583 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
584 }
585
586 Parts[0] = Val;
587 return;
588 }
589
590 // Expand the value into multiple parts.
591 if (NumParts & (NumParts - 1)) {
592 // The number of parts is not a power of 2. Split off and copy the tail.
593 assert(PartVT.isInteger() && ValueVT.isInteger() &&
594 "Do not know what to expand to!");
595 unsigned RoundParts = llvm::bit_floor(NumParts);
596 unsigned RoundBits = RoundParts * PartBits;
597 unsigned OddParts = NumParts - RoundParts;
598 SDValue OddVal = DAG.getNode(ISD::SRL, DL, ValueVT, Val,
599 DAG.getShiftAmountConstant(RoundBits, ValueVT, DL));
600
601 getCopyToParts(DAG, DL, OddVal, Parts + RoundParts, OddParts, PartVT, V,
602 CallConv);
603
604 if (DAG.getDataLayout().isBigEndian())
605 // The odd parts were reversed by getCopyToParts - unreverse them.
606 std::reverse(Parts + RoundParts, Parts + NumParts);
607
608 NumParts = RoundParts;
609 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
610 Val = DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
611 }
612
613 // The number of parts is a power of 2. Repeatedly bisect the value using
614 // EXTRACT_ELEMENT.
615 Parts[0] = DAG.getNode(ISD::BITCAST, DL,
617 ValueVT.getSizeInBits()),
618 Val);
619
620 for (unsigned StepSize = NumParts; StepSize > 1; StepSize /= 2) {
621 for (unsigned i = 0; i < NumParts; i += StepSize) {
622 unsigned ThisBits = StepSize * PartBits / 2;
623 EVT ThisVT = EVT::getIntegerVT(*DAG.getContext(), ThisBits);
624 SDValue &Part0 = Parts[i];
625 SDValue &Part1 = Parts[i+StepSize/2];
626
627 Part1 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL,
628 ThisVT, Part0, DAG.getIntPtrConstant(1, DL));
629 Part0 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL,
630 ThisVT, Part0, DAG.getIntPtrConstant(0, DL));
631
632 if (ThisBits == PartBits && ThisVT != PartVT) {
633 Part0 = DAG.getNode(ISD::BITCAST, DL, PartVT, Part0);
634 Part1 = DAG.getNode(ISD::BITCAST, DL, PartVT, Part1);
635 }
636 }
637 }
638
639 if (DAG.getDataLayout().isBigEndian())
640 std::reverse(Parts, Parts + OrigNumParts);
641}
642
644 const SDLoc &DL, EVT PartVT) {
645 if (!PartVT.isVector())
646 return SDValue();
647
648 EVT ValueVT = Val.getValueType();
649 EVT PartEVT = PartVT.getVectorElementType();
650 EVT ValueEVT = ValueVT.getVectorElementType();
651 ElementCount PartNumElts = PartVT.getVectorElementCount();
652 ElementCount ValueNumElts = ValueVT.getVectorElementCount();
653
654 // We only support widening vectors with equivalent element types and
655 // fixed/scalable properties. If a target needs to widen a fixed-length type
656 // to a scalable one, it should be possible to use INSERT_SUBVECTOR below.
657 if (ElementCount::isKnownLE(PartNumElts, ValueNumElts) ||
658 PartNumElts.isScalable() != ValueNumElts.isScalable())
659 return SDValue();
660
661 // Have a try for bf16 because some targets share its ABI with fp16.
662 if (ValueEVT == MVT::bf16 && PartEVT == MVT::f16) {
664 "Cannot widen to illegal type");
665 Val = DAG.getNode(ISD::BITCAST, DL,
666 ValueVT.changeVectorElementType(MVT::f16), Val);
667 } else if (PartEVT != ValueEVT) {
668 return SDValue();
669 }
670
671 // Widening a scalable vector to another scalable vector is done by inserting
672 // the vector into a larger undef one.
673 if (PartNumElts.isScalable())
674 return DAG.getNode(ISD::INSERT_SUBVECTOR, DL, PartVT, DAG.getUNDEF(PartVT),
675 Val, DAG.getVectorIdxConstant(0, DL));
676
677 // Vector widening case, e.g. <2 x float> -> <4 x float>. Shuffle in
678 // undef elements.
680 DAG.ExtractVectorElements(Val, Ops);
681 SDValue EltUndef = DAG.getUNDEF(PartEVT);
682 Ops.append((PartNumElts - ValueNumElts).getFixedValue(), EltUndef);
683
684 // FIXME: Use CONCAT for 2x -> 4x.
685 return DAG.getBuildVector(PartVT, DL, Ops);
686}
687
688/// getCopyToPartsVector - Create a series of nodes that contain the specified
689/// value split into legal parts.
690static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &DL,
691 SDValue Val, SDValue *Parts, unsigned NumParts,
692 MVT PartVT, const Value *V,
693 std::optional<CallingConv::ID> CallConv) {
694 EVT ValueVT = Val.getValueType();
695 assert(ValueVT.isVector() && "Not a vector");
696 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
697 const bool IsABIRegCopy = CallConv.has_value();
698
699 if (NumParts == 1) {
700 EVT PartEVT = PartVT;
701 if (PartEVT == ValueVT) {
702 // Nothing to do.
703 } else if (PartVT.getSizeInBits() == ValueVT.getSizeInBits()) {
704 // Bitconvert vector->vector case.
705 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
706 } else if (SDValue Widened = widenVectorToPartType(DAG, Val, DL, PartVT)) {
707 Val = Widened;
708 } else if (PartVT.isVector() &&
710 ValueVT.getVectorElementType()) &&
711 PartEVT.getVectorElementCount() ==
712 ValueVT.getVectorElementCount()) {
713
714 // Promoted vector extract
715 Val = DAG.getAnyExtOrTrunc(Val, DL, PartVT);
716 } else if (PartEVT.isVector() &&
717 PartEVT.getVectorElementType() !=
718 ValueVT.getVectorElementType() &&
719 TLI.getTypeAction(*DAG.getContext(), ValueVT) ==
720 TargetLowering::TypeWidenVector) {
721 // Combination of widening and promotion.
722 EVT WidenVT =
724 PartVT.getVectorElementCount());
725 SDValue Widened = widenVectorToPartType(DAG, Val, DL, WidenVT);
726 Val = DAG.getAnyExtOrTrunc(Widened, DL, PartVT);
727 } else {
728 // Don't extract an integer from a float vector. This can happen if the
729 // FP type gets softened to integer and then promoted. The promotion
730 // prevents it from being picked up by the earlier bitcast case.
731 if (ValueVT.getVectorElementCount().isScalar() &&
732 (!ValueVT.isFloatingPoint() || !PartVT.isInteger())) {
733 // If we reach this condition and PartVT is FP, this means that
734 // ValueVT is also FP and both have a different size, otherwise we
735 // would have bitcasted them. Producing an EXTRACT_VECTOR_ELT here
736 // would be invalid since that would mean the smaller FP type has to
737 // be extended to the larger one.
738 if (PartVT.isFloatingPoint()) {
739 Val = DAG.getBitcast(ValueVT.getScalarType(), Val);
740 Val = DAG.getNode(ISD::FP_EXTEND, DL, PartVT, Val);
741 } else
742 Val = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, PartVT, Val,
743 DAG.getVectorIdxConstant(0, DL));
744 } else {
745 uint64_t ValueSize = ValueVT.getFixedSizeInBits();
746 assert(PartVT.getFixedSizeInBits() > ValueSize &&
747 "lossy conversion of vector to scalar type");
748 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
749 Val = DAG.getBitcast(IntermediateType, Val);
750 Val = DAG.getAnyExtOrTrunc(Val, DL, PartVT);
751 }
752 }
753
754 assert(Val.getValueType() == PartVT && "Unexpected vector part value type");
755 Parts[0] = Val;
756 return;
757 }
758
759 // Handle a multi-element vector.
760 EVT IntermediateVT;
761 MVT RegisterVT;
762 unsigned NumIntermediates;
763 unsigned NumRegs;
764 if (IsABIRegCopy) {
766 *DAG.getContext(), *CallConv, ValueVT, IntermediateVT, NumIntermediates,
767 RegisterVT);
768 } else {
769 NumRegs =
770 TLI.getVectorTypeBreakdown(*DAG.getContext(), ValueVT, IntermediateVT,
771 NumIntermediates, RegisterVT);
772 }
773
774 assert(NumRegs == NumParts && "Part count doesn't match vector breakdown!");
775 NumParts = NumRegs; // Silence a compiler warning.
776 assert(RegisterVT == PartVT && "Part type doesn't match vector breakdown!");
777
778 assert(IntermediateVT.isScalableVector() == ValueVT.isScalableVector() &&
779 "Mixing scalable and fixed vectors when copying in parts");
780
781 std::optional<ElementCount> DestEltCnt;
782
783 if (IntermediateVT.isVector())
784 DestEltCnt = IntermediateVT.getVectorElementCount() * NumIntermediates;
785 else
786 DestEltCnt = ElementCount::getFixed(NumIntermediates);
787
788 EVT BuiltVectorTy = EVT::getVectorVT(
789 *DAG.getContext(), IntermediateVT.getScalarType(), *DestEltCnt);
790
791 if (ValueVT == BuiltVectorTy) {
792 // Nothing to do.
793 } else if (ValueVT.getSizeInBits() == BuiltVectorTy.getSizeInBits()) {
794 // Bitconvert vector->vector case.
795 Val = DAG.getNode(ISD::BITCAST, DL, BuiltVectorTy, Val);
796 } else {
797 if (BuiltVectorTy.getVectorElementType().bitsGT(
798 ValueVT.getVectorElementType())) {
799 // Integer promotion.
800 ValueVT = EVT::getVectorVT(*DAG.getContext(),
801 BuiltVectorTy.getVectorElementType(),
802 ValueVT.getVectorElementCount());
803 Val = DAG.getNode(ISD::ANY_EXTEND, DL, ValueVT, Val);
804 }
805
806 if (SDValue Widened = widenVectorToPartType(DAG, Val, DL, BuiltVectorTy)) {
807 Val = Widened;
808 }
809 }
810
811 assert(Val.getValueType() == BuiltVectorTy && "Unexpected vector value type");
812
813 // Split the vector into intermediate operands.
814 SmallVector<SDValue, 8> Ops(NumIntermediates);
815 for (unsigned i = 0; i != NumIntermediates; ++i) {
816 if (IntermediateVT.isVector()) {
817 // This does something sensible for scalable vectors - see the
818 // definition of EXTRACT_SUBVECTOR for further details.
819 unsigned IntermediateNumElts = IntermediateVT.getVectorMinNumElements();
820 Ops[i] =
821 DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, IntermediateVT, Val,
822 DAG.getVectorIdxConstant(i * IntermediateNumElts, DL));
823 } else {
824 Ops[i] = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, IntermediateVT, Val,
825 DAG.getVectorIdxConstant(i, DL));
826 }
827 }
828
829 // Split the intermediate operands into legal parts.
830 if (NumParts == NumIntermediates) {
831 // If the register was not expanded, promote or copy the value,
832 // as appropriate.
833 for (unsigned i = 0; i != NumParts; ++i)
834 getCopyToParts(DAG, DL, Ops[i], &Parts[i], 1, PartVT, V, CallConv);
835 } else if (NumParts > 0) {
836 // If the intermediate type was expanded, split each the value into
837 // legal parts.
838 assert(NumIntermediates != 0 && "division by zero");
839 assert(NumParts % NumIntermediates == 0 &&
840 "Must expand into a divisible number of parts!");
841 unsigned Factor = NumParts / NumIntermediates;
842 for (unsigned i = 0; i != NumIntermediates; ++i)
843 getCopyToParts(DAG, DL, Ops[i], &Parts[i * Factor], Factor, PartVT, V,
844 CallConv);
845 }
846}
847
849 EVT valuevt, std::optional<CallingConv::ID> CC)
850 : ValueVTs(1, valuevt), RegVTs(1, regvt), Regs(regs),
851 RegCount(1, regs.size()), CallConv(CC) {}
852
854 const DataLayout &DL, unsigned Reg, Type *Ty,
855 std::optional<CallingConv::ID> CC) {
856 ComputeValueVTs(TLI, DL, Ty, ValueVTs);
857
858 CallConv = CC;
859
860 for (EVT ValueVT : ValueVTs) {
861 unsigned NumRegs =
863 ? TLI.getNumRegistersForCallingConv(Context, *CC, ValueVT)
864 : TLI.getNumRegisters(Context, ValueVT);
865 MVT RegisterVT =
867 ? TLI.getRegisterTypeForCallingConv(Context, *CC, ValueVT)
868 : TLI.getRegisterType(Context, ValueVT);
869 for (unsigned i = 0; i != NumRegs; ++i)
870 Regs.push_back(Reg + i);
871 RegVTs.push_back(RegisterVT);
872 RegCount.push_back(NumRegs);
873 Reg += NumRegs;
874 }
875}
876
878 FunctionLoweringInfo &FuncInfo,
879 const SDLoc &dl, SDValue &Chain,
880 SDValue *Glue, const Value *V) const {
881 // A Value with type {} or [0 x %t] needs no registers.
882 if (ValueVTs.empty())
883 return SDValue();
884
885 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
886
887 // Assemble the legal parts into the final values.
888 SmallVector<SDValue, 4> Values(ValueVTs.size());
890 for (unsigned Value = 0, Part = 0, e = ValueVTs.size(); Value != e; ++Value) {
891 // Copy the legal parts from the registers.
892 EVT ValueVT = ValueVTs[Value];
893 unsigned NumRegs = RegCount[Value];
894 MVT RegisterVT = isABIMangled()
896 *DAG.getContext(), *CallConv, RegVTs[Value])
897 : RegVTs[Value];
898
899 Parts.resize(NumRegs);
900 for (unsigned i = 0; i != NumRegs; ++i) {
901 SDValue P;
902 if (!Glue) {
903 P = DAG.getCopyFromReg(Chain, dl, Regs[Part+i], RegisterVT);
904 } else {
905 P = DAG.getCopyFromReg(Chain, dl, Regs[Part+i], RegisterVT, *Glue);
906 *Glue = P.getValue(2);
907 }
908
909 Chain = P.getValue(1);
910 Parts[i] = P;
911
912 // If the source register was virtual and if we know something about it,
913 // add an assert node.
914 if (!Register::isVirtualRegister(Regs[Part + i]) ||
915 !RegisterVT.isInteger())
916 continue;
917
919 FuncInfo.GetLiveOutRegInfo(Regs[Part+i]);
920 if (!LOI)
921 continue;
922
923 unsigned RegSize = RegisterVT.getScalarSizeInBits();
924 unsigned NumSignBits = LOI->NumSignBits;
925 unsigned NumZeroBits = LOI->Known.countMinLeadingZeros();
926
927 if (NumZeroBits == RegSize) {
928 // The current value is a zero.
929 // Explicitly express that as it would be easier for
930 // optimizations to kick in.
931 Parts[i] = DAG.getConstant(0, dl, RegisterVT);
932 continue;
933 }
934
935 // FIXME: We capture more information than the dag can represent. For
936 // now, just use the tightest assertzext/assertsext possible.
937 bool isSExt;
938 EVT FromVT(MVT::Other);
939 if (NumZeroBits) {
940 FromVT = EVT::getIntegerVT(*DAG.getContext(), RegSize - NumZeroBits);
941 isSExt = false;
942 } else if (NumSignBits > 1) {
943 FromVT =
944 EVT::getIntegerVT(*DAG.getContext(), RegSize - NumSignBits + 1);
945 isSExt = true;
946 } else {
947 continue;
948 }
949 // Add an assertion node.
950 assert(FromVT != MVT::Other);
951 Parts[i] = DAG.getNode(isSExt ? ISD::AssertSext : ISD::AssertZext, dl,
952 RegisterVT, P, DAG.getValueType(FromVT));
953 }
954
955 Values[Value] = getCopyFromParts(DAG, dl, Parts.begin(), NumRegs,
956 RegisterVT, ValueVT, V, Chain, CallConv);
957 Part += NumRegs;
958 Parts.clear();
959 }
960
961 return DAG.getNode(ISD::MERGE_VALUES, dl, DAG.getVTList(ValueVTs), Values);
962}
963
965 const SDLoc &dl, SDValue &Chain, SDValue *Glue,
966 const Value *V,
967 ISD::NodeType PreferredExtendType) const {
968 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
969 ISD::NodeType ExtendKind = PreferredExtendType;
970
971 // Get the list of the values's legal parts.
972 unsigned NumRegs = Regs.size();
973 SmallVector<SDValue, 8> Parts(NumRegs);
974 for (unsigned Value = 0, Part = 0, e = ValueVTs.size(); Value != e; ++Value) {
975 unsigned NumParts = RegCount[Value];
976
977 MVT RegisterVT = isABIMangled()
979 *DAG.getContext(), *CallConv, RegVTs[Value])
980 : RegVTs[Value];
981
982 if (ExtendKind == ISD::ANY_EXTEND && TLI.isZExtFree(Val, RegisterVT))
983 ExtendKind = ISD::ZERO_EXTEND;
984
985 getCopyToParts(DAG, dl, Val.getValue(Val.getResNo() + Value), &Parts[Part],
986 NumParts, RegisterVT, V, CallConv, ExtendKind);
987 Part += NumParts;
988 }
989
990 // Copy the parts into the registers.
991 SmallVector<SDValue, 8> Chains(NumRegs);
992 for (unsigned i = 0; i != NumRegs; ++i) {
993 SDValue Part;
994 if (!Glue) {
995 Part = DAG.getCopyToReg(Chain, dl, Regs[i], Parts[i]);
996 } else {
997 Part = DAG.getCopyToReg(Chain, dl, Regs[i], Parts[i], *Glue);
998 *Glue = Part.getValue(1);
999 }
1000
1001 Chains[i] = Part.getValue(0);
1002 }
1003
1004 if (NumRegs == 1 || Glue)
1005 // If NumRegs > 1 && Glue is used then the use of the last CopyToReg is
1006 // flagged to it. That is the CopyToReg nodes and the user are considered
1007 // a single scheduling unit. If we create a TokenFactor and return it as
1008 // chain, then the TokenFactor is both a predecessor (operand) of the
1009 // user as well as a successor (the TF operands are flagged to the user).
1010 // c1, f1 = CopyToReg
1011 // c2, f2 = CopyToReg
1012 // c3 = TokenFactor c1, c2
1013 // ...
1014 // = op c3, ..., f2
1015 Chain = Chains[NumRegs-1];
1016 else
1017 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chains);
1018}
1019
1021 unsigned MatchingIdx, const SDLoc &dl,
1022 SelectionDAG &DAG,
1023 std::vector<SDValue> &Ops) const {
1024 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1025
1026 InlineAsm::Flag Flag(Code, Regs.size());
1027 if (HasMatching)
1028 Flag.setMatchingOp(MatchingIdx);
1029 else if (!Regs.empty() && Register::isVirtualRegister(Regs.front())) {
1030 // Put the register class of the virtual registers in the flag word. That
1031 // way, later passes can recompute register class constraints for inline
1032 // assembly as well as normal instructions.
1033 // Don't do this for tied operands that can use the regclass information
1034 // from the def.
1036 const TargetRegisterClass *RC = MRI.getRegClass(Regs.front());
1037 Flag.setRegClass(RC->getID());
1038 }
1039
1040 SDValue Res = DAG.getTargetConstant(Flag, dl, MVT::i32);
1041 Ops.push_back(Res);
1042
1043 if (Code == InlineAsm::Kind::Clobber) {
1044 // Clobbers should always have a 1:1 mapping with registers, and may
1045 // reference registers that have illegal (e.g. vector) types. Hence, we
1046 // shouldn't try to apply any sort of splitting logic to them.
1047 assert(Regs.size() == RegVTs.size() && Regs.size() == ValueVTs.size() &&
1048 "No 1:1 mapping from clobbers to regs?");
1050 (void)SP;
1051 for (unsigned I = 0, E = ValueVTs.size(); I != E; ++I) {
1052 Ops.push_back(DAG.getRegister(Regs[I], RegVTs[I]));
1053 assert(
1054 (Regs[I] != SP ||
1056 "If we clobbered the stack pointer, MFI should know about it.");
1057 }
1058 return;
1059 }
1060
1061 for (unsigned Value = 0, Reg = 0, e = ValueVTs.size(); Value != e; ++Value) {
1062 MVT RegisterVT = RegVTs[Value];
1063 unsigned NumRegs = TLI.getNumRegisters(*DAG.getContext(), ValueVTs[Value],
1064 RegisterVT);
1065 for (unsigned i = 0; i != NumRegs; ++i) {
1066 assert(Reg < Regs.size() && "Mismatch in # registers expected");
1067 unsigned TheReg = Regs[Reg++];
1068 Ops.push_back(DAG.getRegister(TheReg, RegisterVT));
1069 }
1070 }
1071}
1072
1076 unsigned I = 0;
1077 for (auto CountAndVT : zip_first(RegCount, RegVTs)) {
1078 unsigned RegCount = std::get<0>(CountAndVT);
1079 MVT RegisterVT = std::get<1>(CountAndVT);
1080 TypeSize RegisterSize = RegisterVT.getSizeInBits();
1081 for (unsigned E = I + RegCount; I != E; ++I)
1082 OutVec.push_back(std::make_pair(Regs[I], RegisterSize));
1083 }
1084 return OutVec;
1085}
1086
1088 AssumptionCache *ac,
1089 const TargetLibraryInfo *li) {
1090 AA = aa;
1091 AC = ac;
1092 GFI = gfi;
1093 LibInfo = li;
1095 LPadToCallSiteMap.clear();
1097 AssignmentTrackingEnabled = isAssignmentTrackingEnabled(
1099}
1100
1102 NodeMap.clear();
1103 UnusedArgNodeMap.clear();
1104 PendingLoads.clear();
1105 PendingExports.clear();
1106 PendingConstrainedFP.clear();
1107 PendingConstrainedFPStrict.clear();
1108 CurInst = nullptr;
1109 HasTailCall = false;
1110 SDNodeOrder = LowestSDNodeOrder;
1112}
1113
1115 DanglingDebugInfoMap.clear();
1116}
1117
1118// Update DAG root to include dependencies on Pending chains.
1119SDValue SelectionDAGBuilder::updateRoot(SmallVectorImpl<SDValue> &Pending) {
1120 SDValue Root = DAG.getRoot();
1121
1122 if (Pending.empty())
1123 return Root;
1124
1125 // Add current root to PendingChains, unless we already indirectly
1126 // depend on it.
1127 if (Root.getOpcode() != ISD::EntryToken) {
1128 unsigned i = 0, e = Pending.size();
1129 for (; i != e; ++i) {
1130 assert(Pending[i].getNode()->getNumOperands() > 1);
1131 if (Pending[i].getNode()->getOperand(0) == Root)
1132 break; // Don't add the root if we already indirectly depend on it.
1133 }
1134
1135 if (i == e)
1136 Pending.push_back(Root);
1137 }
1138
1139 if (Pending.size() == 1)
1140 Root = Pending[0];
1141 else
1142 Root = DAG.getTokenFactor(getCurSDLoc(), Pending);
1143
1144 DAG.setRoot(Root);
1145 Pending.clear();
1146 return Root;
1147}
1148
1150 return updateRoot(PendingLoads);
1151}
1152
1154 // Chain up all pending constrained intrinsics together with all
1155 // pending loads, by simply appending them to PendingLoads and
1156 // then calling getMemoryRoot().
1157 PendingLoads.reserve(PendingLoads.size() +
1158 PendingConstrainedFP.size() +
1159 PendingConstrainedFPStrict.size());
1160 PendingLoads.append(PendingConstrainedFP.begin(),
1161 PendingConstrainedFP.end());
1162 PendingLoads.append(PendingConstrainedFPStrict.begin(),
1163 PendingConstrainedFPStrict.end());
1164 PendingConstrainedFP.clear();
1165 PendingConstrainedFPStrict.clear();
1166 return getMemoryRoot();
1167}
1168
1170 // We need to emit pending fpexcept.strict constrained intrinsics,
1171 // so append them to the PendingExports list.
1172 PendingExports.append(PendingConstrainedFPStrict.begin(),
1173 PendingConstrainedFPStrict.end());
1174 PendingConstrainedFPStrict.clear();
1175 return updateRoot(PendingExports);
1176}
1177
1179 DILocalVariable *Variable,
1181 DebugLoc DL) {
1182 assert(Variable && "Missing variable");
1183
1184 // Check if address has undef value.
1185 if (!Address || isa<UndefValue>(Address) ||
1186 (Address->use_empty() && !isa<Argument>(Address))) {
1187 LLVM_DEBUG(
1188 dbgs()
1189 << "dbg_declare: Dropping debug info (bad/undef/unused-arg address)\n");
1190 return;
1191 }
1192
1193 bool IsParameter = Variable->isParameter() || isa<Argument>(Address);
1194
1195 SDValue &N = NodeMap[Address];
1196 if (!N.getNode() && isa<Argument>(Address))
1197 // Check unused arguments map.
1198 N = UnusedArgNodeMap[Address];
1199 SDDbgValue *SDV;
1200 if (N.getNode()) {
1201 if (const BitCastInst *BCI = dyn_cast<BitCastInst>(Address))
1202 Address = BCI->getOperand(0);
1203 // Parameters are handled specially.
1204 auto *FINode = dyn_cast<FrameIndexSDNode>(N.getNode());
1205 if (IsParameter && FINode) {
1206 // Byval parameter. We have a frame index at this point.
1207 SDV = DAG.getFrameIndexDbgValue(Variable, Expression, FINode->getIndex(),
1208 /*IsIndirect*/ true, DL, SDNodeOrder);
1209 } else if (isa<Argument>(Address)) {
1210 // Address is an argument, so try to emit its dbg value using
1211 // virtual register info from the FuncInfo.ValueMap.
1212 EmitFuncArgumentDbgValue(Address, Variable, Expression, DL,
1213 FuncArgumentDbgValueKind::Declare, N);
1214 return;
1215 } else {
1216 SDV = DAG.getDbgValue(Variable, Expression, N.getNode(), N.getResNo(),
1217 true, DL, SDNodeOrder);
1218 }
1219 DAG.AddDbgValue(SDV, IsParameter);
1220 } else {
1221 // If Address is an argument then try to emit its dbg value using
1222 // virtual register info from the FuncInfo.ValueMap.
1223 if (!EmitFuncArgumentDbgValue(Address, Variable, Expression, DL,
1224 FuncArgumentDbgValueKind::Declare, N)) {
1225 LLVM_DEBUG(dbgs() << "dbg_declare: Dropping debug info"
1226 << " (could not emit func-arg dbg_value)\n");
1227 }
1228 }
1229 return;
1230}
1231
1233 // Add SDDbgValue nodes for any var locs here. Do so before updating
1234 // SDNodeOrder, as this mapping is {Inst -> Locs BEFORE Inst}.
1235 if (FunctionVarLocs const *FnVarLocs = DAG.getFunctionVarLocs()) {
1236 // Add SDDbgValue nodes for any var locs here. Do so before updating
1237 // SDNodeOrder, as this mapping is {Inst -> Locs BEFORE Inst}.
1238 for (auto It = FnVarLocs->locs_begin(&I), End = FnVarLocs->locs_end(&I);
1239 It != End; ++It) {
1240 auto *Var = FnVarLocs->getDILocalVariable(It->VariableID);
1241 dropDanglingDebugInfo(Var, It->Expr);
1242 if (It->Values.isKillLocation(It->Expr)) {
1243 handleKillDebugValue(Var, It->Expr, It->DL, SDNodeOrder);
1244 continue;
1245 }
1246 SmallVector<Value *> Values(It->Values.location_ops());
1247 if (!handleDebugValue(Values, Var, It->Expr, It->DL, SDNodeOrder,
1248 It->Values.hasArgList())) {
1250 for (Value *V : It->Values.location_ops())
1251 Vals.push_back(V);
1253 FnVarLocs->getDILocalVariable(It->VariableID),
1254 It->Expr, Vals.size() > 1, It->DL, SDNodeOrder);
1255 }
1256 }
1257 }
1258
1259 // We must skip DbgVariableRecords if they've already been processed above as
1260 // we have just emitted the debug values resulting from assignment tracking
1261 // analysis, making any existing DbgVariableRecords redundant (and probably
1262 // less correct). We still need to process DbgLabelRecords. This does sink
1263 // DbgLabelRecords to the bottom of the group of debug records. That sholdn't
1264 // be important as it does so deterministcally and ordering between
1265 // DbgLabelRecords and DbgVariableRecords is immaterial (other than for MIR/IR
1266 // printing).
1267 bool SkipDbgVariableRecords = DAG.getFunctionVarLocs();
1268 // Is there is any debug-info attached to this instruction, in the form of
1269 // DbgRecord non-instruction debug-info records.
1270 for (DbgRecord &DR : I.getDbgRecordRange()) {
1271 if (DbgLabelRecord *DLR = dyn_cast<DbgLabelRecord>(&DR)) {
1272 assert(DLR->getLabel() && "Missing label");
1273 SDDbgLabel *SDV =
1274 DAG.getDbgLabel(DLR->getLabel(), DLR->getDebugLoc(), SDNodeOrder);
1275 DAG.AddDbgLabel(SDV);
1276 continue;
1277 }
1278
1279 if (SkipDbgVariableRecords)
1280 continue;
1281 DbgVariableRecord &DVR = cast<DbgVariableRecord>(DR);
1282 DILocalVariable *Variable = DVR.getVariable();
1285
1287 if (FuncInfo.PreprocessedDVRDeclares.contains(&DVR))
1288 continue;
1289 LLVM_DEBUG(dbgs() << "SelectionDAG visiting dbg_declare: " << DVR
1290 << "\n");
1292 DVR.getDebugLoc());
1293 continue;
1294 }
1295
1296 // A DbgVariableRecord with no locations is a kill location.
1298 if (Values.empty()) {
1300 SDNodeOrder);
1301 continue;
1302 }
1303
1304 // A DbgVariableRecord with an undef or absent location is also a kill
1305 // location.
1306 if (llvm::any_of(Values,
1307 [](Value *V) { return !V || isa<UndefValue>(V); })) {
1309 SDNodeOrder);
1310 continue;
1311 }
1312
1313 bool IsVariadic = DVR.hasArgList();
1314 if (!handleDebugValue(Values, Variable, Expression, DVR.getDebugLoc(),
1315 SDNodeOrder, IsVariadic)) {
1316 addDanglingDebugInfo(Values, Variable, Expression, IsVariadic,
1317 DVR.getDebugLoc(), SDNodeOrder);
1318 }
1319 }
1320}
1321
1323 visitDbgInfo(I);
1324
1325 // Set up outgoing PHI node register values before emitting the terminator.
1326 if (I.isTerminator()) {
1327 HandlePHINodesInSuccessorBlocks(I.getParent());
1328 }
1329
1330 // Increase the SDNodeOrder if dealing with a non-debug instruction.
1331 if (!isa<DbgInfoIntrinsic>(I))
1332 ++SDNodeOrder;
1333
1334 CurInst = &I;
1335
1336 // Set inserted listener only if required.
1337 bool NodeInserted = false;
1338 std::unique_ptr<SelectionDAG::DAGNodeInsertedListener> InsertedListener;
1339 MDNode *PCSectionsMD = I.getMetadata(LLVMContext::MD_pcsections);
1340 MDNode *MMRA = I.getMetadata(LLVMContext::MD_mmra);
1341 if (PCSectionsMD || MMRA) {
1342 InsertedListener = std::make_unique<SelectionDAG::DAGNodeInsertedListener>(
1343 DAG, [&](SDNode *) { NodeInserted = true; });
1344 }
1345
1346 visit(I.getOpcode(), I);
1347
1348 if (!I.isTerminator() && !HasTailCall &&
1349 !isa<GCStatepointInst>(I)) // statepoints handle their exports internally
1351
1352 // Handle metadata.
1353 if (PCSectionsMD || MMRA) {
1354 auto It = NodeMap.find(&I);
1355 if (It != NodeMap.end()) {
1356 if (PCSectionsMD)
1357 DAG.addPCSections(It->second.getNode(), PCSectionsMD);
1358 if (MMRA)
1359 DAG.addMMRAMetadata(It->second.getNode(), MMRA);
1360 } else if (NodeInserted) {
1361 // This should not happen; if it does, don't let it go unnoticed so we can
1362 // fix it. Relevant visit*() function is probably missing a setValue().
1363 errs() << "warning: loosing !pcsections and/or !mmra metadata ["
1364 << I.getModule()->getName() << "]\n";
1365 LLVM_DEBUG(I.dump());
1366 assert(false);
1367 }
1368 }
1369
1370 CurInst = nullptr;
1371}
1372
1373void SelectionDAGBuilder::visitPHI(const PHINode &) {
1374 llvm_unreachable("SelectionDAGBuilder shouldn't visit PHI nodes!");
1375}
1376
1377void SelectionDAGBuilder::visit(unsigned Opcode, const User &I) {
1378 // Note: this doesn't use InstVisitor, because it has to work with
1379 // ConstantExpr's in addition to instructions.
1380 switch (Opcode) {
1381 default: llvm_unreachable("Unknown instruction type encountered!");
1382 // Build the switch statement using the Instruction.def file.
1383#define HANDLE_INST(NUM, OPCODE, CLASS) \
1384 case Instruction::OPCODE: visit##OPCODE((const CLASS&)I); break;
1385#include "llvm/IR/Instruction.def"
1386 }
1387}
1388
1390 DILocalVariable *Variable,
1391 DebugLoc DL, unsigned Order,
1394 // For variadic dbg_values we will now insert an undef.
1395 // FIXME: We can potentially recover these!
1397 for (const Value *V : Values) {
1398 auto *Undef = UndefValue::get(V->getType());
1400 }
1401 SDDbgValue *SDV = DAG.getDbgValueList(Variable, Expression, Locs, {},
1402 /*IsIndirect=*/false, DL, Order,
1403 /*IsVariadic=*/true);
1404 DAG.AddDbgValue(SDV, /*isParameter=*/false);
1405 return true;
1406}
1407
1409 DILocalVariable *Var,
1410 DIExpression *Expr,
1411 bool IsVariadic, DebugLoc DL,
1412 unsigned Order) {
1413 if (IsVariadic) {
1414 handleDanglingVariadicDebugInfo(DAG, Var, DL, Order, Values, Expr);
1415 return;
1416 }
1417 // TODO: Dangling debug info will eventually either be resolved or produce
1418 // an Undef DBG_VALUE. However in the resolution case, a gap may appear
1419 // between the original dbg.value location and its resolved DBG_VALUE,
1420 // which we should ideally fill with an extra Undef DBG_VALUE.
1421 assert(Values.size() == 1);
1422 DanglingDebugInfoMap[Values[0]].emplace_back(Var, Expr, DL, Order);
1423}
1424
1426 const DIExpression *Expr) {
1427 auto isMatchingDbgValue = [&](DanglingDebugInfo &DDI) {
1428 DIVariable *DanglingVariable = DDI.getVariable();
1429 DIExpression *DanglingExpr = DDI.getExpression();
1430 if (DanglingVariable == Variable && Expr->fragmentsOverlap(DanglingExpr)) {
1431 LLVM_DEBUG(dbgs() << "Dropping dangling debug info for "
1432 << printDDI(nullptr, DDI) << "\n");
1433 return true;
1434 }
1435 return false;
1436 };
1437
1438 for (auto &DDIMI : DanglingDebugInfoMap) {
1439 DanglingDebugInfoVector &DDIV = DDIMI.second;
1440
1441 // If debug info is to be dropped, run it through final checks to see
1442 // whether it can be salvaged.
1443 for (auto &DDI : DDIV)
1444 if (isMatchingDbgValue(DDI))
1445 salvageUnresolvedDbgValue(DDIMI.first, DDI);
1446
1447 erase_if(DDIV, isMatchingDbgValue);
1448 }
1449}
1450
1451// resolveDanglingDebugInfo - if we saw an earlier dbg_value referring to V,
1452// generate the debug data structures now that we've seen its definition.
1454 SDValue Val) {
1455 auto DanglingDbgInfoIt = DanglingDebugInfoMap.find(V);
1456 if (DanglingDbgInfoIt == DanglingDebugInfoMap.end())
1457 return;
1458
1459 DanglingDebugInfoVector &DDIV = DanglingDbgInfoIt->second;
1460 for (auto &DDI : DDIV) {
1461 DebugLoc DL = DDI.getDebugLoc();
1462 unsigned ValSDNodeOrder = Val.getNode()->getIROrder();
1463 unsigned DbgSDNodeOrder = DDI.getSDNodeOrder();
1464 DILocalVariable *Variable = DDI.getVariable();
1465 DIExpression *Expr = DDI.getExpression();
1467 "Expected inlined-at fields to agree");
1468 SDDbgValue *SDV;
1469 if (Val.getNode()) {
1470 // FIXME: I doubt that it is correct to resolve a dangling DbgValue as a
1471 // FuncArgumentDbgValue (it would be hoisted to the function entry, and if
1472 // we couldn't resolve it directly when examining the DbgValue intrinsic
1473 // in the first place we should not be more successful here). Unless we
1474 // have some test case that prove this to be correct we should avoid
1475 // calling EmitFuncArgumentDbgValue here.
1476 if (!EmitFuncArgumentDbgValue(V, Variable, Expr, DL,
1477 FuncArgumentDbgValueKind::Value, Val)) {
1478 LLVM_DEBUG(dbgs() << "Resolve dangling debug info for "
1479 << printDDI(V, DDI) << "\n");
1480 LLVM_DEBUG(dbgs() << " By mapping to:\n "; Val.dump());
1481 // Increase the SDNodeOrder for the DbgValue here to make sure it is
1482 // inserted after the definition of Val when emitting the instructions
1483 // after ISel. An alternative could be to teach
1484 // ScheduleDAGSDNodes::EmitSchedule to delay the insertion properly.
1485 LLVM_DEBUG(if (ValSDNodeOrder > DbgSDNodeOrder) dbgs()
1486 << "changing SDNodeOrder from " << DbgSDNodeOrder << " to "
1487 << ValSDNodeOrder << "\n");
1488 SDV = getDbgValue(Val, Variable, Expr, DL,
1489 std::max(DbgSDNodeOrder, ValSDNodeOrder));
1490 DAG.AddDbgValue(SDV, false);
1491 } else
1492 LLVM_DEBUG(dbgs() << "Resolved dangling debug info for "
1493 << printDDI(V, DDI)
1494 << " in EmitFuncArgumentDbgValue\n");
1495 } else {
1496 LLVM_DEBUG(dbgs() << "Dropping debug info for " << printDDI(V, DDI)
1497 << "\n");
1498 auto Undef = UndefValue::get(V->getType());
1499 auto SDV =
1500 DAG.getConstantDbgValue(Variable, Expr, Undef, DL, DbgSDNodeOrder);
1501 DAG.AddDbgValue(SDV, false);
1502 }
1503 }
1504 DDIV.clear();
1505}
1506
1508 DanglingDebugInfo &DDI) {
1509 // TODO: For the variadic implementation, instead of only checking the fail
1510 // state of `handleDebugValue`, we need know specifically which values were
1511 // invalid, so that we attempt to salvage only those values when processing
1512 // a DIArgList.
1513 const Value *OrigV = V;
1514 DILocalVariable *Var = DDI.getVariable();
1515 DIExpression *Expr = DDI.getExpression();
1516 DebugLoc DL = DDI.getDebugLoc();
1517 unsigned SDOrder = DDI.getSDNodeOrder();
1518
1519 // Currently we consider only dbg.value intrinsics -- we tell the salvager
1520 // that DW_OP_stack_value is desired.
1521 bool StackValue = true;
1522
1523 // Can this Value can be encoded without any further work?
1524 if (handleDebugValue(V, Var, Expr, DL, SDOrder, /*IsVariadic=*/false))
1525 return;
1526
1527 // Attempt to salvage back through as many instructions as possible. Bail if
1528 // a non-instruction is seen, such as a constant expression or global
1529 // variable. FIXME: Further work could recover those too.
1530 while (isa<Instruction>(V)) {
1531 const Instruction &VAsInst = *cast<const Instruction>(V);
1532 // Temporary "0", awaiting real implementation.
1534 SmallVector<Value *, 4> AdditionalValues;
1535 V = salvageDebugInfoImpl(const_cast<Instruction &>(VAsInst),
1536 Expr->getNumLocationOperands(), Ops,
1537 AdditionalValues);
1538 // If we cannot salvage any further, and haven't yet found a suitable debug
1539 // expression, bail out.
1540 if (!V)
1541 break;
1542
1543 // TODO: If AdditionalValues isn't empty, then the salvage can only be
1544 // represented with a DBG_VALUE_LIST, so we give up. When we have support
1545 // here for variadic dbg_values, remove that condition.
1546 if (!AdditionalValues.empty())
1547 break;
1548
1549 // New value and expr now represent this debuginfo.
1550 Expr = DIExpression::appendOpsToArg(Expr, Ops, 0, StackValue);
1551
1552 // Some kind of simplification occurred: check whether the operand of the
1553 // salvaged debug expression can be encoded in this DAG.
1554 if (handleDebugValue(V, Var, Expr, DL, SDOrder, /*IsVariadic=*/false)) {
1555 LLVM_DEBUG(
1556 dbgs() << "Salvaged debug location info for:\n " << *Var << "\n"
1557 << *OrigV << "\nBy stripping back to:\n " << *V << "\n");
1558 return;
1559 }
1560 }
1561
1562 // This was the final opportunity to salvage this debug information, and it
1563 // couldn't be done. Place an undef DBG_VALUE at this location to terminate
1564 // any earlier variable location.
1565 assert(OrigV && "V shouldn't be null");
1566 auto *Undef = UndefValue::get(OrigV->getType());
1567 auto *SDV = DAG.getConstantDbgValue(Var, Expr, Undef, DL, SDNodeOrder);
1568 DAG.AddDbgValue(SDV, false);
1569 LLVM_DEBUG(dbgs() << "Dropping debug value info for:\n "
1570 << printDDI(OrigV, DDI) << "\n");
1571}
1572
1574 DIExpression *Expr,
1575 DebugLoc DbgLoc,
1576 unsigned Order) {
1580 handleDebugValue(Poison, Var, NewExpr, DbgLoc, Order,
1581 /*IsVariadic*/ false);
1582}
1583
1585 DILocalVariable *Var,
1586 DIExpression *Expr, DebugLoc DbgLoc,
1587 unsigned Order, bool IsVariadic) {
1588 if (Values.empty())
1589 return true;
1590
1591 // Filter EntryValue locations out early.
1592 if (visitEntryValueDbgValue(Values, Var, Expr, DbgLoc))
1593 return true;
1594
1595 SmallVector<SDDbgOperand> LocationOps;
1596 SmallVector<SDNode *> Dependencies;
1597 for (const Value *V : Values) {
1598 // Constant value.
1599 if (isa<ConstantInt>(V) || isa<ConstantFP>(V) || isa<UndefValue>(V) ||
1600 isa<ConstantPointerNull>(V)) {
1601 LocationOps.emplace_back(SDDbgOperand::fromConst(V));
1602 continue;
1603 }
1604
1605 // Look through IntToPtr constants.
1606 if (auto *CE = dyn_cast<ConstantExpr>(V))
1607 if (CE->getOpcode() == Instruction::IntToPtr) {
1608 LocationOps.emplace_back(SDDbgOperand::fromConst(CE->getOperand(0)));
1609 continue;
1610 }
1611
1612 // If the Value is a frame index, we can create a FrameIndex debug value
1613 // without relying on the DAG at all.
1614 if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
1615 auto SI = FuncInfo.StaticAllocaMap.find(AI);
1616 if (SI != FuncInfo.StaticAllocaMap.end()) {
1617 LocationOps.emplace_back(SDDbgOperand::fromFrameIdx(SI->second));
1618 continue;
1619 }
1620 }
1621
1622 // Do not use getValue() in here; we don't want to generate code at
1623 // this point if it hasn't been done yet.
1624 SDValue N = NodeMap[V];
1625 if (!N.getNode() && isa<Argument>(V)) // Check unused arguments map.
1626 N = UnusedArgNodeMap[V];
1627 if (N.getNode()) {
1628 // Only emit func arg dbg value for non-variadic dbg.values for now.
1629 if (!IsVariadic &&
1630 EmitFuncArgumentDbgValue(V, Var, Expr, DbgLoc,
1631 FuncArgumentDbgValueKind::Value, N))
1632 return true;
1633 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(N.getNode())) {
1634 // Construct a FrameIndexDbgValue for FrameIndexSDNodes so we can
1635 // describe stack slot locations.
1636 //
1637 // Consider "int x = 0; int *px = &x;". There are two kinds of
1638 // interesting debug values here after optimization:
1639 //
1640 // dbg.value(i32* %px, !"int *px", !DIExpression()), and
1641 // dbg.value(i32* %px, !"int x", !DIExpression(DW_OP_deref))
1642 //
1643 // Both describe the direct values of their associated variables.
1644 Dependencies.push_back(N.getNode());
1645 LocationOps.emplace_back(SDDbgOperand::fromFrameIdx(FISDN->getIndex()));
1646 continue;
1647 }
1648 LocationOps.emplace_back(
1649 SDDbgOperand::fromNode(N.getNode(), N.getResNo()));
1650 continue;
1651 }
1652
1654 // Special rules apply for the first dbg.values of parameter variables in a
1655 // function. Identify them by the fact they reference Argument Values, that
1656 // they're parameters, and they are parameters of the current function. We
1657 // need to let them dangle until they get an SDNode.
1658 bool IsParamOfFunc =
1659 isa<Argument>(V) && Var->isParameter() && !DbgLoc.getInlinedAt();
1660 if (IsParamOfFunc)
1661 return false;
1662
1663 // The value is not used in this block yet (or it would have an SDNode).
1664 // We still want the value to appear for the user if possible -- if it has
1665 // an associated VReg, we can refer to that instead.
1666 auto VMI = FuncInfo.ValueMap.find(V);
1667 if (VMI != FuncInfo.ValueMap.end()) {
1668 unsigned Reg = VMI->second;
1669 // If this is a PHI node, it may be split up into several MI PHI nodes
1670 // (in FunctionLoweringInfo::set).
1671 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), Reg,
1672 V->getType(), std::nullopt);
1673 if (RFV.occupiesMultipleRegs()) {
1674 // FIXME: We could potentially support variadic dbg_values here.
1675 if (IsVariadic)
1676 return false;
1677 unsigned Offset = 0;
1678 unsigned BitsToDescribe = 0;
1679 if (auto VarSize = Var->getSizeInBits())
1680 BitsToDescribe = *VarSize;
1681 if (auto Fragment = Expr->getFragmentInfo())
1682 BitsToDescribe = Fragment->SizeInBits;
1683 for (const auto &RegAndSize : RFV.getRegsAndSizes()) {
1684 // Bail out if all bits are described already.
1685 if (Offset >= BitsToDescribe)
1686 break;
1687 // TODO: handle scalable vectors.
1688 unsigned RegisterSize = RegAndSize.second;
1689 unsigned FragmentSize = (Offset + RegisterSize > BitsToDescribe)
1690 ? BitsToDescribe - Offset
1691 : RegisterSize;
1692 auto FragmentExpr = DIExpression::createFragmentExpression(
1693 Expr, Offset, FragmentSize);
1694 if (!FragmentExpr)
1695 continue;
1697 Var, *FragmentExpr, RegAndSize.first, false, DbgLoc, Order);
1698 DAG.AddDbgValue(SDV, false);
1699 Offset += RegisterSize;
1700 }
1701 return true;
1702 }
1703 // We can use simple vreg locations for variadic dbg_values as well.
1704 LocationOps.emplace_back(SDDbgOperand::fromVReg(Reg));
1705 continue;
1706 }
1707 // We failed to create a SDDbgOperand for V.
1708 return false;
1709 }
1710
1711 // We have created a SDDbgOperand for each Value in Values.
1712 assert(!LocationOps.empty());
1713 SDDbgValue *SDV =
1714 DAG.getDbgValueList(Var, Expr, LocationOps, Dependencies,
1715 /*IsIndirect=*/false, DbgLoc, Order, IsVariadic);
1716 DAG.AddDbgValue(SDV, /*isParameter=*/false);
1717 return true;
1718}
1719
1721 // Try to fixup any remaining dangling debug info -- and drop it if we can't.
1722 for (auto &Pair : DanglingDebugInfoMap)
1723 for (auto &DDI : Pair.second)
1724 salvageUnresolvedDbgValue(const_cast<Value *>(Pair.first), DDI);
1726}
1727
1728/// getCopyFromRegs - If there was virtual register allocated for the value V
1729/// emit CopyFromReg of the specified type Ty. Return empty SDValue() otherwise.
1732 SDValue Result;
1733
1734 if (It != FuncInfo.ValueMap.end()) {
1735 Register InReg = It->second;
1736
1738 DAG.getDataLayout(), InReg, Ty,
1739 std::nullopt); // This is not an ABI copy.
1740 SDValue Chain = DAG.getEntryNode();
1741 Result = RFV.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(), Chain, nullptr,
1742 V);
1743 resolveDanglingDebugInfo(V, Result);
1744 }
1745
1746 return Result;
1747}
1748
1749/// getValue - Return an SDValue for the given Value.
1751 // If we already have an SDValue for this value, use it. It's important
1752 // to do this first, so that we don't create a CopyFromReg if we already
1753 // have a regular SDValue.
1754 SDValue &N = NodeMap[V];
1755 if (N.getNode()) return N;
1756
1757 // If there's a virtual register allocated and initialized for this
1758 // value, use it.
1759 if (SDValue copyFromReg = getCopyFromRegs(V, V->getType()))
1760 return copyFromReg;
1761
1762 // Otherwise create a new SDValue and remember it.
1763 SDValue Val = getValueImpl(V);
1764 NodeMap[V] = Val;
1766 return Val;
1767}
1768
1769/// getNonRegisterValue - Return an SDValue for the given Value, but
1770/// don't look in FuncInfo.ValueMap for a virtual register.
1772 // If we already have an SDValue for this value, use it.
1773 SDValue &N = NodeMap[V];
1774 if (N.getNode()) {
1775 if (isIntOrFPConstant(N)) {
1776 // Remove the debug location from the node as the node is about to be used
1777 // in a location which may differ from the original debug location. This
1778 // is relevant to Constant and ConstantFP nodes because they can appear
1779 // as constant expressions inside PHI nodes.
1780 N->setDebugLoc(DebugLoc());
1781 }
1782 return N;
1783 }
1784
1785 // Otherwise create a new SDValue and remember it.
1786 SDValue Val = getValueImpl(V);
1787 NodeMap[V] = Val;
1789 return Val;
1790}
1791
1792/// getValueImpl - Helper function for getValue and getNonRegisterValue.
1793/// Create an SDValue for the given value.
1796
1797 if (const Constant *C = dyn_cast<Constant>(V)) {
1798 EVT VT = TLI.getValueType(DAG.getDataLayout(), V->getType(), true);
1799
1800 if (const ConstantInt *CI = dyn_cast<ConstantInt>(C))
1801 return DAG.getConstant(*CI, getCurSDLoc(), VT);
1802
1803 if (const GlobalValue *GV = dyn_cast<GlobalValue>(C))
1804 return DAG.getGlobalAddress(GV, getCurSDLoc(), VT);
1805
1806 if (const ConstantPtrAuth *CPA = dyn_cast<ConstantPtrAuth>(C)) {
1808 getValue(CPA->getPointer()), getValue(CPA->getKey()),
1809 getValue(CPA->getAddrDiscriminator()),
1810 getValue(CPA->getDiscriminator()));
1811 }
1812
1813 if (isa<ConstantPointerNull>(C)) {
1814 unsigned AS = V->getType()->getPointerAddressSpace();
1815 return DAG.getConstant(0, getCurSDLoc(),
1816 TLI.getPointerTy(DAG.getDataLayout(), AS));
1817 }
1818
1819 if (match(C, m_VScale()))
1820 return DAG.getVScale(getCurSDLoc(), VT, APInt(VT.getSizeInBits(), 1));
1821
1822 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C))
1823 return DAG.getConstantFP(*CFP, getCurSDLoc(), VT);
1824
1825 if (isa<UndefValue>(C) && !V->getType()->isAggregateType())
1826 return DAG.getUNDEF(VT);
1827
1828 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
1829 visit(CE->getOpcode(), *CE);
1830 SDValue N1 = NodeMap[V];
1831 assert(N1.getNode() && "visit didn't populate the NodeMap!");
1832 return N1;
1833 }
1834
1835 if (isa<ConstantStruct>(C) || isa<ConstantArray>(C)) {
1837 for (const Use &U : C->operands()) {
1838 SDNode *Val = getValue(U).getNode();
1839 // If the operand is an empty aggregate, there are no values.
1840 if (!Val) continue;
1841 // Add each leaf value from the operand to the Constants list
1842 // to form a flattened list of all the values.
1843 for (unsigned i = 0, e = Val->getNumValues(); i != e; ++i)
1844 Constants.push_back(SDValue(Val, i));
1845 }
1846
1848 }
1849
1850 if (const ConstantDataSequential *CDS =
1851 dyn_cast<ConstantDataSequential>(C)) {
1853 for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) {
1854 SDNode *Val = getValue(CDS->getElementAsConstant(i)).getNode();
1855 // Add each leaf value from the operand to the Constants list
1856 // to form a flattened list of all the values.
1857 for (unsigned i = 0, e = Val->getNumValues(); i != e; ++i)
1858 Ops.push_back(SDValue(Val, i));
1859 }
1860
1861 if (isa<ArrayType>(CDS->getType()))
1862 return DAG.getMergeValues(Ops, getCurSDLoc());
1863 return NodeMap[V] = DAG.getBuildVector(VT, getCurSDLoc(), Ops);
1864 }
1865
1866 if (C->getType()->isStructTy() || C->getType()->isArrayTy()) {
1867 assert((isa<ConstantAggregateZero>(C) || isa<UndefValue>(C)) &&
1868 "Unknown struct or array constant!");
1869
1870 SmallVector<EVT, 4> ValueVTs;
1871 ComputeValueVTs(TLI, DAG.getDataLayout(), C->getType(), ValueVTs);
1872 unsigned NumElts = ValueVTs.size();
1873 if (NumElts == 0)
1874 return SDValue(); // empty struct
1876 for (unsigned i = 0; i != NumElts; ++i) {
1877 EVT EltVT = ValueVTs[i];
1878 if (isa<UndefValue>(C))
1879 Constants[i] = DAG.getUNDEF(EltVT);
1880 else if (EltVT.isFloatingPoint())
1881 Constants[i] = DAG.getConstantFP(0, getCurSDLoc(), EltVT);
1882 else
1883 Constants[i] = DAG.getConstant(0, getCurSDLoc(), EltVT);
1884 }
1885
1887 }
1888
1889 if (const BlockAddress *BA = dyn_cast<BlockAddress>(C))
1890 return DAG.getBlockAddress(BA, VT);
1891
1892 if (const auto *Equiv = dyn_cast<DSOLocalEquivalent>(C))
1893 return getValue(Equiv->getGlobalValue());
1894
1895 if (const auto *NC = dyn_cast<NoCFIValue>(C))
1896 return getValue(NC->getGlobalValue());
1897
1898 if (VT == MVT::aarch64svcount) {
1899 assert(C->isNullValue() && "Can only zero this target type!");
1900 return DAG.getNode(ISD::BITCAST, getCurSDLoc(), VT,
1901 DAG.getConstant(0, getCurSDLoc(), MVT::nxv16i1));
1902 }
1903
1904 VectorType *VecTy = cast<VectorType>(V->getType());
1905
1906 // Now that we know the number and type of the elements, get that number of
1907 // elements into the Ops array based on what kind of constant it is.
1908 if (const ConstantVector *CV = dyn_cast<ConstantVector>(C)) {
1910 unsigned NumElements = cast<FixedVectorType>(VecTy)->getNumElements();
1911 for (unsigned i = 0; i != NumElements; ++i)
1912 Ops.push_back(getValue(CV->getOperand(i)));
1913
1914 return NodeMap[V] = DAG.getBuildVector(VT, getCurSDLoc(), Ops);
1915 }
1916
1917 if (isa<ConstantAggregateZero>(C)) {
1918 EVT EltVT =
1920
1921 SDValue Op;
1922 if (EltVT.isFloatingPoint())
1923 Op = DAG.getConstantFP(0, getCurSDLoc(), EltVT);
1924 else
1925 Op = DAG.getConstant(0, getCurSDLoc(), EltVT);
1926
1927 return NodeMap[V] = DAG.getSplat(VT, getCurSDLoc(), Op);
1928 }
1929
1930 llvm_unreachable("Unknown vector constant");
1931 }
1932
1933 // If this is a static alloca, generate it as the frameindex instead of
1934 // computation.
1935 if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
1937 FuncInfo.StaticAllocaMap.find(AI);
1938 if (SI != FuncInfo.StaticAllocaMap.end())
1939 return DAG.getFrameIndex(
1940 SI->second, TLI.getValueType(DAG.getDataLayout(), AI->getType()));
1941 }
1942
1943 // If this is an instruction which fast-isel has deferred, select it now.
1944 if (const Instruction *Inst = dyn_cast<Instruction>(V)) {
1946
1947 RegsForValue RFV(*DAG.getContext(), TLI, DAG.getDataLayout(), InReg,
1948 Inst->getType(), std::nullopt);
1949 SDValue Chain = DAG.getEntryNode();
1950 return RFV.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(), Chain, nullptr, V);
1951 }
1952
1953 if (const MetadataAsValue *MD = dyn_cast<MetadataAsValue>(V))
1954 return DAG.getMDNode(cast<MDNode>(MD->getMetadata()));
1955
1956 if (const auto *BB = dyn_cast<BasicBlock>(V))
1957 return DAG.getBasicBlock(FuncInfo.MBBMap[BB]);
1958
1959 llvm_unreachable("Can't get register for value!");
1960}
1961
1962void SelectionDAGBuilder::visitCatchPad(const CatchPadInst &I) {
1964 bool IsMSVCCXX = Pers == EHPersonality::MSVC_CXX;
1965 bool IsCoreCLR = Pers == EHPersonality::CoreCLR;
1966 bool IsSEH = isAsynchronousEHPersonality(Pers);
1967 MachineBasicBlock *CatchPadMBB = FuncInfo.MBB;
1968 if (!IsSEH)
1969 CatchPadMBB->setIsEHScopeEntry();
1970 // In MSVC C++ and CoreCLR, catchblocks are funclets and need prologues.
1971 if (IsMSVCCXX || IsCoreCLR)
1972 CatchPadMBB->setIsEHFuncletEntry();
1973}
1974
1975void SelectionDAGBuilder::visitCatchRet(const CatchReturnInst &I) {
1976 // Update machine-CFG edge.
1977 MachineBasicBlock *TargetMBB = FuncInfo.MBBMap[I.getSuccessor()];
1978 FuncInfo.MBB->addSuccessor(TargetMBB);
1979 TargetMBB->setIsEHCatchretTarget(true);
1981
1983 bool IsSEH = isAsynchronousEHPersonality(Pers);
1984 if (IsSEH) {
1985 // If this is not a fall-through branch or optimizations are switched off,
1986 // emit the branch.
1987 if (TargetMBB != NextBlock(FuncInfo.MBB) ||
1989 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
1990 getControlRoot(), DAG.getBasicBlock(TargetMBB)));
1991 return;
1992 }
1993
1994 // Figure out the funclet membership for the catchret's successor.
1995 // This will be used by the FuncletLayout pass to determine how to order the
1996 // BB's.
1997 // A 'catchret' returns to the outer scope's color.
1998 Value *ParentPad = I.getCatchSwitchParentPad();
1999 const BasicBlock *SuccessorColor;
2000 if (isa<ConstantTokenNone>(ParentPad))
2001 SuccessorColor = &FuncInfo.Fn->getEntryBlock();
2002 else
2003 SuccessorColor = cast<Instruction>(ParentPad)->getParent();
2004 assert(SuccessorColor && "No parent funclet for catchret!");
2005 MachineBasicBlock *SuccessorColorMBB = FuncInfo.MBBMap[SuccessorColor];
2006 assert(SuccessorColorMBB && "No MBB for SuccessorColor!");
2007
2008 // Create the terminator node.
2010 getControlRoot(), DAG.getBasicBlock(TargetMBB),
2011 DAG.getBasicBlock(SuccessorColorMBB));
2012 DAG.setRoot(Ret);
2013}
2014
2015void SelectionDAGBuilder::visitCleanupPad(const CleanupPadInst &CPI) {
2016 // Don't emit any special code for the cleanuppad instruction. It just marks
2017 // the start of an EH scope/funclet.
2020 if (Pers != EHPersonality::Wasm_CXX) {
2023 }
2024}
2025
2026// In wasm EH, even though a catchpad may not catch an exception if a tag does
2027// not match, it is OK to add only the first unwind destination catchpad to the
2028// successors, because there will be at least one invoke instruction within the
2029// catch scope that points to the next unwind destination, if one exists, so
2030// CFGSort cannot mess up with BB sorting order.
2031// (All catchpads with 'catch (type)' clauses have a 'llvm.rethrow' intrinsic
2032// call within them, and catchpads only consisting of 'catch (...)' have a
2033// '__cxa_end_catch' call within them, both of which generate invokes in case
2034// the next unwind destination exists, i.e., the next unwind destination is not
2035// the caller.)
2036//
2037// Having at most one EH pad successor is also simpler and helps later
2038// transformations.
2039//
2040// For example,
2041// current:
2042// invoke void @foo to ... unwind label %catch.dispatch
2043// catch.dispatch:
2044// %0 = catchswitch within ... [label %catch.start] unwind label %next
2045// catch.start:
2046// ...
2047// ... in this BB or some other child BB dominated by this BB there will be an
2048// invoke that points to 'next' BB as an unwind destination
2049//
2050// next: ; We don't need to add this to 'current' BB's successor
2051// ...
2053 FunctionLoweringInfo &FuncInfo, const BasicBlock *EHPadBB,
2054 BranchProbability Prob,
2055 SmallVectorImpl<std::pair<MachineBasicBlock *, BranchProbability>>
2056 &UnwindDests) {
2057 while (EHPadBB) {
2058 const Instruction *Pad = EHPadBB->getFirstNonPHI();
2059 if (isa<CleanupPadInst>(Pad)) {
2060 // Stop on cleanup pads.
2061 UnwindDests.emplace_back(FuncInfo.MBBMap[EHPadBB], Prob);
2062 UnwindDests.back().first->setIsEHScopeEntry();
2063 break;
2064 } else if (const auto *CatchSwitch = dyn_cast<CatchSwitchInst>(Pad)) {
2065 // Add the catchpad handlers to the possible destinations. We don't
2066 // continue to the unwind destination of the catchswitch for wasm.
2067 for (const BasicBlock *CatchPadBB : CatchSwitch->handlers()) {
2068 UnwindDests.emplace_back(FuncInfo.MBBMap[CatchPadBB], Prob);
2069 UnwindDests.back().first->setIsEHScopeEntry();
2070 }
2071 break;
2072 } else {
2073 continue;
2074 }
2075 }
2076}
2077
2078/// When an invoke or a cleanupret unwinds to the next EH pad, there are
2079/// many places it could ultimately go. In the IR, we have a single unwind
2080/// destination, but in the machine CFG, we enumerate all the possible blocks.
2081/// This function skips over imaginary basic blocks that hold catchswitch
2082/// instructions, and finds all the "real" machine
2083/// basic block destinations. As those destinations may not be successors of
2084/// EHPadBB, here we also calculate the edge probability to those destinations.
2085/// The passed-in Prob is the edge probability to EHPadBB.
2087 FunctionLoweringInfo &FuncInfo, const BasicBlock *EHPadBB,
2088 BranchProbability Prob,
2089 SmallVectorImpl<std::pair<MachineBasicBlock *, BranchProbability>>
2090 &UnwindDests) {
2091 EHPersonality Personality =
2093 bool IsMSVCCXX = Personality == EHPersonality::MSVC_CXX;
2094 bool IsCoreCLR = Personality == EHPersonality::CoreCLR;
2095 bool IsWasmCXX = Personality == EHPersonality::Wasm_CXX;
2096 bool IsSEH = isAsynchronousEHPersonality(Personality);
2097
2098 if (IsWasmCXX) {
2099 findWasmUnwindDestinations(FuncInfo, EHPadBB, Prob, UnwindDests);
2100 assert(UnwindDests.size() <= 1 &&
2101 "There should be at most one unwind destination for wasm");
2102 return;
2103 }
2104
2105 while (EHPadBB) {
2106 const Instruction *Pad = EHPadBB->getFirstNonPHI();
2107 BasicBlock *NewEHPadBB = nullptr;
2108 if (isa<LandingPadInst>(Pad)) {
2109 // Stop on landingpads. They are not funclets.
2110 UnwindDests.emplace_back(FuncInfo.MBBMap[EHPadBB], Prob);
2111 break;
2112 } else if (isa<CleanupPadInst>(Pad)) {
2113 // Stop on cleanup pads. Cleanups are always funclet entries for all known
2114 // personalities.
2115 UnwindDests.emplace_back(FuncInfo.MBBMap[EHPadBB], Prob);
2116 UnwindDests.back().first->setIsEHScopeEntry();
2117 UnwindDests.back().first->setIsEHFuncletEntry();
2118 break;
2119 } else if (const auto *CatchSwitch = dyn_cast<CatchSwitchInst>(Pad)) {
2120 // Add the catchpad handlers to the possible destinations.
2121 for (const BasicBlock *CatchPadBB : CatchSwitch->handlers()) {
2122 UnwindDests.emplace_back(FuncInfo.MBBMap[CatchPadBB], Prob);
2123 // For MSVC++ and the CLR, catchblocks are funclets and need prologues.
2124 if (IsMSVCCXX || IsCoreCLR)
2125 UnwindDests.back().first->setIsEHFuncletEntry();
2126 if (!IsSEH)
2127 UnwindDests.back().first->setIsEHScopeEntry();
2128 }
2129 NewEHPadBB = CatchSwitch->getUnwindDest();
2130 } else {
2131 continue;
2132 }
2133
2134 BranchProbabilityInfo *BPI = FuncInfo.BPI;
2135 if (BPI && NewEHPadBB)
2136 Prob *= BPI->getEdgeProbability(EHPadBB, NewEHPadBB);
2137 EHPadBB = NewEHPadBB;
2138 }
2139}
2140
2141void SelectionDAGBuilder::visitCleanupRet(const CleanupReturnInst &I) {
2142 // Update successor info.
2144 auto UnwindDest = I.getUnwindDest();
2146 BranchProbability UnwindDestProb =
2147 (BPI && UnwindDest)
2148 ? BPI->getEdgeProbability(FuncInfo.MBB->getBasicBlock(), UnwindDest)
2150 findUnwindDestinations(FuncInfo, UnwindDest, UnwindDestProb, UnwindDests);
2151 for (auto &UnwindDest : UnwindDests) {
2152 UnwindDest.first->setIsEHPad();
2153 addSuccessorWithProb(FuncInfo.MBB, UnwindDest.first, UnwindDest.second);
2154 }
2156
2157 // Create the terminator node.
2158 SDValue Ret =
2160 DAG.setRoot(Ret);
2161}
2162
2163void SelectionDAGBuilder::visitCatchSwitch(const CatchSwitchInst &CSI) {
2164 report_fatal_error("visitCatchSwitch not yet implemented!");
2165}
2166
2167void SelectionDAGBuilder::visitRet(const ReturnInst &I) {
2169 auto &DL = DAG.getDataLayout();
2170 SDValue Chain = getControlRoot();
2173
2174 // Calls to @llvm.experimental.deoptimize don't generate a return value, so
2175 // lower
2176 //
2177 // %val = call <ty> @llvm.experimental.deoptimize()
2178 // ret <ty> %val
2179 //
2180 // differently.
2181 if (I.getParent()->getTerminatingDeoptimizeCall()) {
2183 return;
2184 }
2185
2186 if (!FuncInfo.CanLowerReturn) {
2187 unsigned DemoteReg = FuncInfo.DemoteRegister;
2188 const Function *F = I.getParent()->getParent();
2189
2190 // Emit a store of the return value through the virtual register.
2191 // Leave Outs empty so that LowerReturn won't try to load return
2192 // registers the usual way.
2193 SmallVector<EVT, 1> PtrValueVTs;
2194 ComputeValueVTs(TLI, DL,
2195 PointerType::get(F->getContext(),
2197 PtrValueVTs);
2198
2199 SDValue RetPtr =
2200 DAG.getCopyFromReg(Chain, getCurSDLoc(), DemoteReg, PtrValueVTs[0]);
2201 SDValue RetOp = getValue(I.getOperand(0));
2202
2203 SmallVector<EVT, 4> ValueVTs, MemVTs;
2205 ComputeValueVTs(TLI, DL, I.getOperand(0)->getType(), ValueVTs, &MemVTs,
2206 &Offsets, 0);
2207 unsigned NumValues = ValueVTs.size();
2208
2209 SmallVector<SDValue, 4> Chains(NumValues);
2210 Align BaseAlign = DL.getPrefTypeAlign(I.getOperand(0)->getType());
2211 for (unsigned i = 0; i != NumValues; ++i) {
2212 // An aggregate return value cannot wrap around the address space, so
2213 // offsets to its parts don't wrap either.
2215 TypeSize::getFixed(Offsets[i]));
2216
2217 SDValue Val = RetOp.getValue(RetOp.getResNo() + i);
2218 if (MemVTs[i] != ValueVTs[i])
2219 Val = DAG.getPtrExtOrTrunc(Val, getCurSDLoc(), MemVTs[i]);
2220 Chains[i] = DAG.getStore(
2221 Chain, getCurSDLoc(), Val,
2222 // FIXME: better loc info would be nice.
2224 commonAlignment(BaseAlign, Offsets[i]));
2225 }
2226
2228 MVT::Other, Chains);
2229 } else if (I.getNumOperands() != 0) {
2230 SmallVector<EVT, 4> ValueVTs;
2231 ComputeValueVTs(TLI, DL, I.getOperand(0)->getType(), ValueVTs);
2232 unsigned NumValues = ValueVTs.size();
2233 if (NumValues) {
2234 SDValue RetOp = getValue(I.getOperand(0));
2235
2236 const Function *F = I.getParent()->getParent();
2237
2238 bool NeedsRegBlock = TLI.functionArgumentNeedsConsecutiveRegisters(
2239 I.getOperand(0)->getType(), F->getCallingConv(),
2240 /*IsVarArg*/ false, DL);
2241
2242 ISD::NodeType ExtendKind = ISD::ANY_EXTEND;
2243 if (F->getAttributes().hasRetAttr(Attribute::SExt))
2244 ExtendKind = ISD::SIGN_EXTEND;
2245 else if (F->getAttributes().hasRetAttr(Attribute::ZExt))
2246 ExtendKind = ISD::ZERO_EXTEND;
2247
2248 LLVMContext &Context = F->getContext();
2249 bool RetInReg = F->getAttributes().hasRetAttr(Attribute::InReg);
2250
2251 for (unsigned j = 0; j != NumValues; ++j) {
2252 EVT VT = ValueVTs[j];
2253
2254 if (ExtendKind != ISD::ANY_EXTEND && VT.isInteger())
2255 VT = TLI.getTypeForExtReturn(Context, VT, ExtendKind);
2256
2257 CallingConv::ID CC = F->getCallingConv();
2258
2259 unsigned NumParts = TLI.getNumRegistersForCallingConv(Context, CC, VT);
2260 MVT PartVT = TLI.getRegisterTypeForCallingConv(Context, CC, VT);
2261 SmallVector<SDValue, 4> Parts(NumParts);
2263 SDValue(RetOp.getNode(), RetOp.getResNo() + j),
2264 &Parts[0], NumParts, PartVT, &I, CC, ExtendKind);
2265
2266 // 'inreg' on function refers to return value
2268 if (RetInReg)
2269 Flags.setInReg();
2270
2271 if (I.getOperand(0)->getType()->isPointerTy()) {
2272 Flags.setPointer();
2273 Flags.setPointerAddrSpace(
2274 cast<PointerType>(I.getOperand(0)->getType())->getAddressSpace());
2275 }
2276
2277 if (NeedsRegBlock) {
2278 Flags.setInConsecutiveRegs();
2279 if (j == NumValues - 1)
2280 Flags.setInConsecutiveRegsLast();
2281 }
2282
2283 // Propagate extension type if any
2284 if (ExtendKind == ISD::SIGN_EXTEND)
2285 Flags.setSExt();
2286 else if (ExtendKind == ISD::ZERO_EXTEND)
2287 Flags.setZExt();
2288
2289 for (unsigned i = 0; i < NumParts; ++i) {
2290 Outs.push_back(ISD::OutputArg(Flags,
2291 Parts[i].getValueType().getSimpleVT(),
2292 VT, /*isfixed=*/true, 0, 0));
2293 OutVals.push_back(Parts[i]);
2294 }
2295 }
2296 }
2297 }
2298
2299 // Push in swifterror virtual register as the last element of Outs. This makes
2300 // sure swifterror virtual register will be returned in the swifterror
2301 // physical register.
2302 const Function *F = I.getParent()->getParent();
2303 if (TLI.supportSwiftError() &&
2304 F->getAttributes().hasAttrSomewhere(Attribute::SwiftError)) {
2305 assert(SwiftError.getFunctionArg() && "Need a swift error argument");
2307 Flags.setSwiftError();
2309 Flags, /*vt=*/TLI.getPointerTy(DL), /*argvt=*/EVT(TLI.getPointerTy(DL)),
2310 /*isfixed=*/true, /*origidx=*/1, /*partOffs=*/0));
2311 // Create SDNode for the swifterror virtual register.
2312 OutVals.push_back(
2315 EVT(TLI.getPointerTy(DL))));
2316 }
2317
2318 bool isVarArg = DAG.getMachineFunction().getFunction().isVarArg();
2319 CallingConv::ID CallConv =
2322 Chain, CallConv, isVarArg, Outs, OutVals, getCurSDLoc(), DAG);
2323
2324 // Verify that the target's LowerReturn behaved as expected.
2325 assert(Chain.getNode() && Chain.getValueType() == MVT::Other &&
2326 "LowerReturn didn't return a valid chain!");
2327
2328 // Update the DAG with the new chain value resulting from return lowering.
2329 DAG.setRoot(Chain);
2330}
2331
2332/// CopyToExportRegsIfNeeded - If the given value has virtual registers
2333/// created for it, emit nodes to copy the value into the virtual
2334/// registers.
2336 // Skip empty types
2337 if (V->getType()->isEmptyTy())
2338 return;
2339
2341 if (VMI != FuncInfo.ValueMap.end()) {
2342 assert((!V->use_empty() || isa<CallBrInst>(V)) &&
2343 "Unused value assigned virtual registers!");
2344 CopyValueToVirtualRegister(V, VMI->second);
2345 }
2346}
2347
2348/// ExportFromCurrentBlock - If this condition isn't known to be exported from
2349/// the current basic block, add it to ValueMap now so that we'll get a
2350/// CopyTo/FromReg.
2352 // No need to export constants.
2353 if (!isa<Instruction>(V) && !isa<Argument>(V)) return;
2354
2355 // Already exported?
2356 if (FuncInfo.isExportedInst(V)) return;
2357
2360}
2361
2363 const BasicBlock *FromBB) {
2364 // The operands of the setcc have to be in this block. We don't know
2365 // how to export them from some other block.
2366 if (const Instruction *VI = dyn_cast<Instruction>(V)) {
2367 // Can export from current BB.
2368 if (VI->getParent() == FromBB)
2369 return true;
2370
2371 // Is already exported, noop.
2372 return FuncInfo.isExportedInst(V);
2373 }
2374
2375 // If this is an argument, we can export it if the BB is the entry block or
2376 // if it is already exported.
2377 if (isa<Argument>(V)) {
2378 if (FromBB->isEntryBlock())
2379 return true;
2380
2381 // Otherwise, can only export this if it is already exported.
2382 return FuncInfo.isExportedInst(V);
2383 }
2384
2385 // Otherwise, constants can always be exported.
2386 return true;
2387}
2388
2389/// Return branch probability calculated by BranchProbabilityInfo for IR blocks.
2391SelectionDAGBuilder::getEdgeProbability(const MachineBasicBlock *Src,
2392 const MachineBasicBlock *Dst) const {
2394 const BasicBlock *SrcBB = Src->getBasicBlock();
2395 const BasicBlock *DstBB = Dst->getBasicBlock();
2396 if (!BPI) {
2397 // If BPI is not available, set the default probability as 1 / N, where N is
2398 // the number of successors.
2399 auto SuccSize = std::max<uint32_t>(succ_size(SrcBB), 1);
2400 return BranchProbability(1, SuccSize);
2401 }
2402 return BPI->getEdgeProbability(SrcBB, DstBB);
2403}
2404
2405void SelectionDAGBuilder::addSuccessorWithProb(MachineBasicBlock *Src,
2406 MachineBasicBlock *Dst,
2407 BranchProbability Prob) {
2408 if (!FuncInfo.BPI)
2409 Src->addSuccessorWithoutProb(Dst);
2410 else {
2411 if (Prob.isUnknown())
2412 Prob = getEdgeProbability(Src, Dst);
2413 Src->addSuccessor(Dst, Prob);
2414 }
2415}
2416
2417static bool InBlock(const Value *V, const BasicBlock *BB) {
2418 if (const Instruction *I = dyn_cast<Instruction>(V))
2419 return I->getParent() == BB;
2420 return true;
2421}
2422
2423/// EmitBranchForMergedCondition - Helper method for FindMergedConditions.
2424/// This function emits a branch and is used at the leaves of an OR or an
2425/// AND operator tree.
2426void
2429 MachineBasicBlock *FBB,
2430 MachineBasicBlock *CurBB,
2431 MachineBasicBlock *SwitchBB,
2432 BranchProbability TProb,
2433 BranchProbability FProb,
2434 bool InvertCond) {
2435 const BasicBlock *BB = CurBB->getBasicBlock();
2436
2437 // If the leaf of the tree is a comparison, merge the condition into
2438 // the caseblock.
2439 if (const CmpInst *BOp = dyn_cast<CmpInst>(Cond)) {
2440 // The operands of the cmp have to be in this block. We don't know
2441 // how to export them from some other block. If this is the first block
2442 // of the sequence, no exporting is needed.
2443 if (CurBB == SwitchBB ||
2444 (isExportableFromCurrentBlock(BOp->getOperand(0), BB) &&
2445 isExportableFromCurrentBlock(BOp->getOperand(1), BB))) {
2446 ISD::CondCode Condition;
2447 if (const ICmpInst *IC = dyn_cast<ICmpInst>(Cond)) {
2448 ICmpInst::Predicate Pred =
2449 InvertCond ? IC->getInversePredicate() : IC->getPredicate();
2450 Condition = getICmpCondCode(Pred);
2451 } else {
2452 const FCmpInst *FC = cast<FCmpInst>(Cond);
2453 FCmpInst::Predicate Pred =
2454 InvertCond ? FC->getInversePredicate() : FC->getPredicate();
2455 Condition = getFCmpCondCode(Pred);
2456 if (TM.Options.NoNaNsFPMath)
2457 Condition = getFCmpCodeWithoutNaN(Condition);
2458 }
2459
2460 CaseBlock CB(Condition, BOp->getOperand(0), BOp->getOperand(1), nullptr,
2461 TBB, FBB, CurBB, getCurSDLoc(), TProb, FProb);
2462 SL->SwitchCases.push_back(CB);
2463 return;
2464 }
2465 }
2466
2467 // Create a CaseBlock record representing this branch.
2468 ISD::CondCode Opc = InvertCond ? ISD::SETNE : ISD::SETEQ;
2470 nullptr, TBB, FBB, CurBB, getCurSDLoc(), TProb, FProb);
2471 SL->SwitchCases.push_back(CB);
2472}
2473
2474// Collect dependencies on V recursively. This is used for the cost analysis in
2475// `shouldKeepJumpConditionsTogether`.
2479 unsigned Depth = 0) {
2480 // Return false if we have an incomplete count.
2482 return false;
2483
2484 auto *I = dyn_cast<Instruction>(V);
2485 if (I == nullptr)
2486 return true;
2487
2488 if (Necessary != nullptr) {
2489 // This instruction is necessary for the other side of the condition so
2490 // don't count it.
2491 if (Necessary->contains(I))
2492 return true;
2493 }
2494
2495 // Already added this dep.
2496 if (!Deps->try_emplace(I, false).second)
2497 return true;
2498
2499 for (unsigned OpIdx = 0, E = I->getNumOperands(); OpIdx < E; ++OpIdx)
2500 if (!collectInstructionDeps(Deps, I->getOperand(OpIdx), Necessary,
2501 Depth + 1))
2502 return false;
2503 return true;
2504}
2505
2507 const FunctionLoweringInfo &FuncInfo, const BranchInst &I,
2508 Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs,
2510 if (I.getNumSuccessors() != 2)
2511 return false;
2512
2513 if (!I.isConditional())
2514 return false;
2515
2516 if (Params.BaseCost < 0)
2517 return false;
2518
2519 // Baseline cost.
2520 InstructionCost CostThresh = Params.BaseCost;
2521
2522 BranchProbabilityInfo *BPI = nullptr;
2523 if (Params.LikelyBias || Params.UnlikelyBias)
2524 BPI = FuncInfo.BPI;
2525 if (BPI != nullptr) {
2526 // See if we are either likely to get an early out or compute both lhs/rhs
2527 // of the condition.
2528 BasicBlock *IfFalse = I.getSuccessor(0);
2529 BasicBlock *IfTrue = I.getSuccessor(1);
2530
2531 std::optional<bool> Likely;
2532 if (BPI->isEdgeHot(I.getParent(), IfTrue))
2533 Likely = true;
2534 else if (BPI->isEdgeHot(I.getParent(), IfFalse))
2535 Likely = false;
2536
2537 if (Likely) {
2538 if (Opc == (*Likely ? Instruction::And : Instruction::Or))
2539 // Its likely we will have to compute both lhs and rhs of condition
2540 CostThresh += Params.LikelyBias;
2541 else {
2542 if (Params.UnlikelyBias < 0)
2543 return false;
2544 // Its likely we will get an early out.
2545 CostThresh -= Params.UnlikelyBias;
2546 }
2547 }
2548 }
2549
2550 if (CostThresh <= 0)
2551 return false;
2552
2553 // Collect "all" instructions that lhs condition is dependent on.
2554 // Use map for stable iteration (to avoid non-determanism of iteration of
2555 // SmallPtrSet). The `bool` value is just a dummy.
2557 collectInstructionDeps(&LhsDeps, Lhs);
2558 // Collect "all" instructions that rhs condition is dependent on AND are
2559 // dependencies of lhs. This gives us an estimate on which instructions we
2560 // stand to save by splitting the condition.
2561 if (!collectInstructionDeps(&RhsDeps, Rhs, &LhsDeps))
2562 return false;
2563 // Add the compare instruction itself unless its a dependency on the LHS.
2564 if (const auto *RhsI = dyn_cast<Instruction>(Rhs))
2565 if (!LhsDeps.contains(RhsI))
2566 RhsDeps.try_emplace(RhsI, false);
2567
2568 const auto &TLI = DAG.getTargetLoweringInfo();
2569 const auto &TTI =
2570 TLI.getTargetMachine().getTargetTransformInfo(*I.getFunction());
2571
2572 InstructionCost CostOfIncluding = 0;
2573 // See if this instruction will need to computed independently of whether RHS
2574 // is.
2575 Value *BrCond = I.getCondition();
2576 auto ShouldCountInsn = [&RhsDeps, &BrCond](const Instruction *Ins) {
2577 for (const auto *U : Ins->users()) {
2578 // If user is independent of RHS calculation we don't need to count it.
2579 if (auto *UIns = dyn_cast<Instruction>(U))
2580 if (UIns != BrCond && !RhsDeps.contains(UIns))
2581 return false;
2582 }
2583 return true;
2584 };
2585
2586 // Prune instructions from RHS Deps that are dependencies of unrelated
2587 // instructions. The value (SelectionDAG::MaxRecursionDepth) is fairly
2588 // arbitrary and just meant to cap the how much time we spend in the pruning
2589 // loop. Its highly unlikely to come into affect.
2590 const unsigned MaxPruneIters = SelectionDAG::MaxRecursionDepth;
2591 // Stop after a certain point. No incorrectness from including too many
2592 // instructions.
2593 for (unsigned PruneIters = 0; PruneIters < MaxPruneIters; ++PruneIters) {
2594 const Instruction *ToDrop = nullptr;
2595 for (const auto &InsPair : RhsDeps) {
2596 if (!ShouldCountInsn(InsPair.first)) {
2597 ToDrop = InsPair.first;
2598 break;
2599 }
2600 }
2601 if (ToDrop == nullptr)
2602 break;
2603 RhsDeps.erase(ToDrop);
2604 }
2605
2606 for (const auto &InsPair : RhsDeps) {
2607 // Finally accumulate latency that we can only attribute to computing the
2608 // RHS condition. Use latency because we are essentially trying to calculate
2609 // the cost of the dependency chain.
2610 // Possible TODO: We could try to estimate ILP and make this more precise.
2611 CostOfIncluding +=
2613
2614 if (CostOfIncluding > CostThresh)
2615 return false;
2616 }
2617 return true;
2618}
2619
2622 MachineBasicBlock *FBB,
2623 MachineBasicBlock *CurBB,
2624 MachineBasicBlock *SwitchBB,
2626 BranchProbability TProb,
2627 BranchProbability FProb,
2628 bool InvertCond) {
2629 // Skip over not part of the tree and remember to invert op and operands at
2630 // next level.
2631 Value *NotCond;
2632 if (match(Cond, m_OneUse(m_Not(m_Value(NotCond)))) &&
2633 InBlock(NotCond, CurBB->getBasicBlock())) {
2634 FindMergedConditions(NotCond, TBB, FBB, CurBB, SwitchBB, Opc, TProb, FProb,
2635 !InvertCond);
2636 return;
2637 }
2638
2639 const Instruction *BOp = dyn_cast<Instruction>(Cond);
2640 const Value *BOpOp0, *BOpOp1;
2641 // Compute the effective opcode for Cond, taking into account whether it needs
2642 // to be inverted, e.g.
2643 // and (not (or A, B)), C
2644 // gets lowered as
2645 // and (and (not A, not B), C)
2647 if (BOp) {
2648 BOpc = match(BOp, m_LogicalAnd(m_Value(BOpOp0), m_Value(BOpOp1)))
2649 ? Instruction::And
2650 : (match(BOp, m_LogicalOr(m_Value(BOpOp0), m_Value(BOpOp1)))
2651 ? Instruction::Or
2653 if (InvertCond) {
2654 if (BOpc == Instruction::And)
2655 BOpc = Instruction::Or;
2656 else if (BOpc == Instruction::Or)
2657 BOpc = Instruction::And;
2658 }
2659 }
2660
2661 // If this node is not part of the or/and tree, emit it as a branch.
2662 // Note that all nodes in the tree should have same opcode.
2663 bool BOpIsInOrAndTree = BOpc && BOpc == Opc && BOp->hasOneUse();
2664 if (!BOpIsInOrAndTree || BOp->getParent() != CurBB->getBasicBlock() ||
2665 !InBlock(BOpOp0, CurBB->getBasicBlock()) ||
2666 !InBlock(BOpOp1, CurBB->getBasicBlock())) {
2667 EmitBranchForMergedCondition(Cond, TBB, FBB, CurBB, SwitchBB,
2668 TProb, FProb, InvertCond);
2669 return;
2670 }
2671
2672 // Create TmpBB after CurBB.
2673 MachineFunction::iterator BBI(CurBB);
2676 CurBB->getParent()->insert(++BBI, TmpBB);
2677
2678 if (Opc == Instruction::Or) {
2679 // Codegen X | Y as:
2680 // BB1:
2681 // jmp_if_X TBB
2682 // jmp TmpBB
2683 // TmpBB:
2684 // jmp_if_Y TBB
2685 // jmp FBB
2686 //
2687
2688 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
2689 // The requirement is that
2690 // TrueProb for BB1 + (FalseProb for BB1 * TrueProb for TmpBB)
2691 // = TrueProb for original BB.
2692 // Assuming the original probabilities are A and B, one choice is to set
2693 // BB1's probabilities to A/2 and A/2+B, and set TmpBB's probabilities to
2694 // A/(1+B) and 2B/(1+B). This choice assumes that
2695 // TrueProb for BB1 == FalseProb for BB1 * TrueProb for TmpBB.
2696 // Another choice is to assume TrueProb for BB1 equals to TrueProb for
2697 // TmpBB, but the math is more complicated.
2698
2699 auto NewTrueProb = TProb / 2;
2700 auto NewFalseProb = TProb / 2 + FProb;
2701 // Emit the LHS condition.
2702 FindMergedConditions(BOpOp0, TBB, TmpBB, CurBB, SwitchBB, Opc, NewTrueProb,
2703 NewFalseProb, InvertCond);
2704
2705 // Normalize A/2 and B to get A/(1+B) and 2B/(1+B).
2706 SmallVector<BranchProbability, 2> Probs{TProb / 2, FProb};
2707 BranchProbability::normalizeProbabilities(Probs.begin(), Probs.end());
2708 // Emit the RHS condition into TmpBB.
2709 FindMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
2710 Probs[1], InvertCond);
2711 } else {
2712 assert(Opc == Instruction::And && "Unknown merge op!");
2713 // Codegen X & Y as:
2714 // BB1:
2715 // jmp_if_X TmpBB
2716 // jmp FBB
2717 // TmpBB:
2718 // jmp_if_Y TBB
2719 // jmp FBB
2720 //
2721 // This requires creation of TmpBB after CurBB.
2722
2723 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
2724 // The requirement is that
2725 // FalseProb for BB1 + (TrueProb for BB1 * FalseProb for TmpBB)
2726 // = FalseProb for original BB.
2727 // Assuming the original probabilities are A and B, one choice is to set
2728 // BB1's probabilities to A+B/2 and B/2, and set TmpBB's probabilities to
2729 // 2A/(1+A) and B/(1+A). This choice assumes that FalseProb for BB1 ==
2730 // TrueProb for BB1 * FalseProb for TmpBB.
2731
2732 auto NewTrueProb = TProb + FProb / 2;
2733 auto NewFalseProb = FProb / 2;
2734 // Emit the LHS condition.
2735 FindMergedConditions(BOpOp0, TmpBB, FBB, CurBB, SwitchBB, Opc, NewTrueProb,
2736 NewFalseProb, InvertCond);
2737
2738 // Normalize A and B/2 to get 2A/(1+A) and B/(1+A).
2739 SmallVector<BranchProbability, 2> Probs{TProb, FProb / 2};
2740 BranchProbability::normalizeProbabilities(Probs.begin(), Probs.end());
2741 // Emit the RHS condition into TmpBB.
2742 FindMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
2743 Probs[1], InvertCond);
2744 }
2745}
2746
2747/// If the set of cases should be emitted as a series of branches, return true.
2748/// If we should emit this as a bunch of and/or'd together conditions, return
2749/// false.
2750bool
2751SelectionDAGBuilder::ShouldEmitAsBranches(const std::vector<CaseBlock> &Cases) {
2752 if (Cases.size() != 2) return true;
2753
2754 // If this is two comparisons of the same values or'd or and'd together, they
2755 // will get folded into a single comparison, so don't emit two blocks.
2756 if ((Cases[0].CmpLHS == Cases[1].CmpLHS &&
2757 Cases[0].CmpRHS == Cases[1].CmpRHS) ||
2758 (Cases[0].CmpRHS == Cases[1].CmpLHS &&
2759 Cases[0].CmpLHS == Cases[1].CmpRHS)) {
2760 return false;
2761 }
2762
2763 // Handle: (X != null) | (Y != null) --> (X|Y) != 0
2764 // Handle: (X == null) & (Y == null) --> (X|Y) == 0
2765 if (Cases[0].CmpRHS == Cases[1].CmpRHS &&
2766 Cases[0].CC == Cases[1].CC &&
2767 isa<Constant>(Cases[0].CmpRHS) &&
2768 cast<Constant>(Cases[0].CmpRHS)->isNullValue()) {
2769 if (Cases[0].CC == ISD::SETEQ && Cases[0].TrueBB == Cases[1].ThisBB)
2770 return false;
2771 if (Cases[0].CC == ISD::SETNE && Cases[0].FalseBB == Cases[1].ThisBB)
2772 return false;
2773 }
2774
2775 return true;
2776}
2777
2778void SelectionDAGBuilder::visitBr(const BranchInst &I) {
2780
2781 // Update machine-CFG edges.
2782 MachineBasicBlock *Succ0MBB = FuncInfo.MBBMap[I.getSuccessor(0)];
2783
2784 if (I.isUnconditional()) {
2785 // Update machine-CFG edges.
2786 BrMBB->addSuccessor(Succ0MBB);
2787
2788 // If this is not a fall-through branch or optimizations are switched off,
2789 // emit the branch.
2790 if (Succ0MBB != NextBlock(BrMBB) ||
2792 auto Br = DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
2793 getControlRoot(), DAG.getBasicBlock(Succ0MBB));
2794 setValue(&I, Br);
2795 DAG.setRoot(Br);
2796 }
2797
2798 return;
2799 }
2800
2801 // If this condition is one of the special cases we handle, do special stuff
2802 // now.
2803 const Value *CondVal = I.getCondition();
2804 MachineBasicBlock *Succ1MBB = FuncInfo.MBBMap[I.getSuccessor(1)];
2805
2806 // If this is a series of conditions that are or'd or and'd together, emit
2807 // this as a sequence of branches instead of setcc's with and/or operations.
2808 // As long as jumps are not expensive (exceptions for multi-use logic ops,
2809 // unpredictable branches, and vector extracts because those jumps are likely
2810 // expensive for any target), this should improve performance.
2811 // For example, instead of something like:
2812 // cmp A, B
2813 // C = seteq
2814 // cmp D, E
2815 // F = setle
2816 // or C, F
2817 // jnz foo
2818 // Emit:
2819 // cmp A, B
2820 // je foo
2821 // cmp D, E
2822 // jle foo
2823 const Instruction *BOp = dyn_cast<Instruction>(CondVal);
2824 if (!DAG.getTargetLoweringInfo().isJumpExpensive() && BOp &&
2825 BOp->hasOneUse() && !I.hasMetadata(LLVMContext::MD_unpredictable)) {
2826 Value *Vec;
2827 const Value *BOp0, *BOp1;
2829 if (match(BOp, m_LogicalAnd(m_Value(BOp0), m_Value(BOp1))))
2830 Opcode = Instruction::And;
2831 else if (match(BOp, m_LogicalOr(m_Value(BOp0), m_Value(BOp1))))
2832 Opcode = Instruction::Or;
2833
2834 if (Opcode &&
2835 !(match(BOp0, m_ExtractElt(m_Value(Vec), m_Value())) &&
2836 match(BOp1, m_ExtractElt(m_Specific(Vec), m_Value()))) &&
2838 FuncInfo, I, Opcode, BOp0, BOp1,
2840 Opcode, BOp0, BOp1))) {
2841 FindMergedConditions(BOp, Succ0MBB, Succ1MBB, BrMBB, BrMBB, Opcode,
2842 getEdgeProbability(BrMBB, Succ0MBB),
2843 getEdgeProbability(BrMBB, Succ1MBB),
2844 /*InvertCond=*/false);
2845 // If the compares in later blocks need to use values not currently
2846 // exported from this block, export them now. This block should always
2847 // be the first entry.
2848 assert(SL->SwitchCases[0].ThisBB == BrMBB && "Unexpected lowering!");
2849
2850 // Allow some cases to be rejected.
2851 if (ShouldEmitAsBranches(SL->SwitchCases)) {
2852 for (unsigned i = 1, e = SL->SwitchCases.size(); i != e; ++i) {
2853 ExportFromCurrentBlock(SL->SwitchCases[i].CmpLHS);
2854 ExportFromCurrentBlock(SL->SwitchCases[i].CmpRHS);
2855 }
2856
2857 // Emit the branch for this block.
2858 visitSwitchCase(SL->SwitchCases[0], BrMBB);
2859 SL->SwitchCases.erase(SL->SwitchCases.begin());
2860 return;
2861 }
2862
2863 // Okay, we decided not to do this, remove any inserted MBB's and clear
2864 // SwitchCases.
2865 for (unsigned i = 1, e = SL->SwitchCases.size(); i != e; ++i)
2866 FuncInfo.MF->erase(SL->SwitchCases[i].ThisBB);
2867
2868 SL->SwitchCases.clear();
2869 }
2870 }
2871
2872 // Create a CaseBlock record representing this branch.
2874 nullptr, Succ0MBB, Succ1MBB, BrMBB, getCurSDLoc());
2875
2876 // Use visitSwitchCase to actually insert the fast branch sequence for this
2877 // cond branch.
2878 visitSwitchCase(CB, BrMBB);
2879}
2880
2881/// visitSwitchCase - Emits the necessary code to represent a single node in
2882/// the binary search tree resulting from lowering a switch instruction.
2884 MachineBasicBlock *SwitchBB) {
2885 SDValue Cond;
2886 SDValue CondLHS = getValue(CB.CmpLHS);
2887 SDLoc dl = CB.DL;
2888
2889 if (CB.CC == ISD::SETTRUE) {
2890 // Branch or fall through to TrueBB.
2891 addSuccessorWithProb(SwitchBB, CB.TrueBB, CB.TrueProb);
2892 SwitchBB->normalizeSuccProbs();
2893 if (CB.TrueBB != NextBlock(SwitchBB)) {
2894 DAG.setRoot(DAG.getNode(ISD::BR, dl, MVT::Other, getControlRoot(),
2895 DAG.getBasicBlock(CB.TrueBB)));
2896 }
2897 return;
2898 }
2899
2900 auto &TLI = DAG.getTargetLoweringInfo();
2901 EVT MemVT = TLI.getMemValueType(DAG.getDataLayout(), CB.CmpLHS->getType());
2902
2903 // Build the setcc now.
2904 if (!CB.CmpMHS) {
2905 // Fold "(X == true)" to X and "(X == false)" to !X to
2906 // handle common cases produced by branch lowering.
2907 if (CB.CmpRHS == ConstantInt::getTrue(*DAG.getContext()) &&
2908 CB.CC == ISD::SETEQ)
2909 Cond = CondLHS;
2910 else if (CB.CmpRHS == ConstantInt::getFalse(*DAG.getContext()) &&
2911 CB.CC == ISD::SETEQ) {
2912 SDValue True = DAG.getConstant(1, dl, CondLHS.getValueType());
2913 Cond = DAG.getNode(ISD::XOR, dl, CondLHS.getValueType(), CondLHS, True);
2914 } else {
2915 SDValue CondRHS = getValue(CB.CmpRHS);
2916
2917 // If a pointer's DAG type is larger than its memory type then the DAG
2918 // values are zero-extended. This breaks signed comparisons so truncate
2919 // back to the underlying type before doing the compare.
2920 if (CondLHS.getValueType() != MemVT) {
2921 CondLHS = DAG.getPtrExtOrTrunc(CondLHS, getCurSDLoc(), MemVT);
2922 CondRHS = DAG.getPtrExtOrTrunc(CondRHS, getCurSDLoc(), MemVT);
2923 }
2924 Cond = DAG.getSetCC(dl, MVT::i1, CondLHS, CondRHS, CB.CC);
2925 }
2926 } else {
2927 assert(CB.CC == ISD::SETLE && "Can handle only LE ranges now");
2928
2929 const APInt& Low = cast<ConstantInt>(CB.CmpLHS)->getValue();
2930 const APInt& High = cast<ConstantInt>(CB.CmpRHS)->getValue();
2931
2932 SDValue CmpOp = getValue(CB.CmpMHS);
2933 EVT VT = CmpOp.getValueType();
2934
2935 if (cast<ConstantInt>(CB.CmpLHS)->isMinValue(true)) {
2936 Cond = DAG.getSetCC(dl, MVT::i1, CmpOp, DAG.getConstant(High, dl, VT),
2937 ISD::SETLE);
2938 } else {
2939 SDValue SUB = DAG.getNode(ISD::SUB, dl,
2940 VT, CmpOp, DAG.getConstant(Low, dl, VT));
2941 Cond = DAG.getSetCC(dl, MVT::i1, SUB,
2942 DAG.getConstant(High-Low, dl, VT), ISD::SETULE);
2943 }
2944 }
2945
2946 // Update successor info
2947 addSuccessorWithProb(SwitchBB, CB.TrueBB, CB.TrueProb);
2948 // TrueBB and FalseBB are always different unless the incoming IR is
2949 // degenerate. This only happens when running llc on weird IR.
2950 if (CB.TrueBB != CB.FalseBB)
2951 addSuccessorWithProb(SwitchBB, CB.FalseBB, CB.FalseProb);
2952 SwitchBB->normalizeSuccProbs();
2953
2954 // If the lhs block is the next block, invert the condition so that we can
2955 // fall through to the lhs instead of the rhs block.
2956 if (CB.TrueBB == NextBlock(SwitchBB)) {
2957 std::swap(CB.TrueBB, CB.FalseBB);
2958 SDValue True = DAG.getConstant(1, dl, Cond.getValueType());
2959 Cond = DAG.getNode(ISD::XOR, dl, Cond.getValueType(), Cond, True);
2960 }
2961
2962 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl,
2963 MVT::Other, getControlRoot(), Cond,
2965
2966 setValue(CurInst, BrCond);
2967
2968 // Insert the false branch. Do this even if it's a fall through branch,
2969 // this makes it easier to do DAG optimizations which require inverting
2970 // the branch condition.
2971 BrCond = DAG.getNode(ISD::BR, dl, MVT::Other, BrCond,
2973
2974 DAG.setRoot(BrCond);
2975}
2976
2977/// visitJumpTable - Emit JumpTable node in the current MBB
2979 // Emit the code for the jump table
2980 assert(JT.SL && "Should set SDLoc for SelectionDAG!");
2981 assert(JT.Reg != -1U && "Should lower JT Header first!");
2983 SDValue Index = DAG.getCopyFromReg(getControlRoot(), *JT.SL, JT.Reg, PTy);
2984 SDValue Table = DAG.getJumpTable(JT.JTI, PTy);
2985 SDValue BrJumpTable = DAG.getNode(ISD::BR_JT, *JT.SL, MVT::Other,
2986 Index.getValue(1), Table, Index);
2987 DAG.setRoot(BrJumpTable);
2988}
2989
2990/// visitJumpTableHeader - This function emits necessary code to produce index
2991/// in the JumpTable from switch case.
2993 JumpTableHeader &JTH,
2994 MachineBasicBlock *SwitchBB) {
2995 assert(JT.SL && "Should set SDLoc for SelectionDAG!");
2996 const SDLoc &dl = *JT.SL;
2997
2998 // Subtract the lowest switch case value from the value being switched on.
2999 SDValue SwitchOp = getValue(JTH.SValue);
3000 EVT VT = SwitchOp.getValueType();
3001 SDValue Sub = DAG.getNode(ISD::SUB, dl, VT, SwitchOp,
3002 DAG.getConstant(JTH.First, dl, VT));
3003
3004 // The SDNode we just created, which holds the value being switched on minus
3005 // the smallest case value, needs to be copied to a virtual register so it
3006 // can be used as an index into the jump table in a subsequent basic block.
3007 // This value may be smaller or larger than the target's pointer type, and
3008 // therefore require extension or truncating.
3010 SwitchOp = DAG.getZExtOrTrunc(Sub, dl, TLI.getPointerTy(DAG.getDataLayout()));
3011
3012 unsigned JumpTableReg =
3014 SDValue CopyTo = DAG.getCopyToReg(getControlRoot(), dl,
3015 JumpTableReg, SwitchOp);
3016 JT.Reg = JumpTableReg;
3017
3018 if (!JTH.FallthroughUnreachable) {
3019 // Emit the range check for the jump table, and branch to the default block
3020 // for the switch statement if the value being switched on exceeds the
3021 // largest case in the switch.
3022 SDValue CMP = DAG.getSetCC(
3024 Sub.getValueType()),
3025 Sub, DAG.getConstant(JTH.Last - JTH.First, dl, VT), ISD::SETUGT);
3026
3027 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl,
3028 MVT::Other, CopyTo, CMP,
3029 DAG.getBasicBlock(JT.Default));
3030
3031 // Avoid emitting unnecessary branches to the next block.
3032 if (JT.MBB != NextBlock(SwitchBB))
3033 BrCond = DAG.getNode(ISD::BR, dl, MVT::Other, BrCond,
3034 DAG.getBasicBlock(JT.MBB));
3035
3036 DAG.setRoot(BrCond);
3037 } else {
3038 // Avoid emitting unnecessary branches to the next block.
3039 if (JT.MBB != NextBlock(SwitchBB))
3040 DAG.setRoot(DAG.getNode(ISD::BR, dl, MVT::Other, CopyTo,
3041 DAG.getBasicBlock(JT.MBB)));
3042 else
3043 DAG.setRoot(CopyTo);
3044 }
3045}
3046
3047/// Create a LOAD_STACK_GUARD node, and let it carry the target specific global
3048/// variable if there exists one.
3050 SDValue &Chain) {
3051 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3052 EVT PtrTy = TLI.getPointerTy(DAG.getDataLayout());
3053 EVT PtrMemTy = TLI.getPointerMemTy(DAG.getDataLayout());
3057 DAG.getMachineNode(TargetOpcode::LOAD_STACK_GUARD, DL, PtrTy, Chain);
3058 if (Global) {
3059 MachinePointerInfo MPInfo(Global);
3063 MPInfo, Flags, LocationSize::precise(PtrTy.getSizeInBits() / 8),
3064 DAG.getEVTAlign(PtrTy));
3065 DAG.setNodeMemRefs(Node, {MemRef});
3066 }
3067 if (PtrTy != PtrMemTy)
3068 return DAG.getPtrExtOrTrunc(SDValue(Node, 0), DL, PtrMemTy);
3069 return SDValue(Node, 0);
3070}
3071
3072/// Codegen a new tail for a stack protector check ParentMBB which has had its
3073/// tail spliced into a stack protector check success bb.
3074///
3075/// For a high level explanation of how this fits into the stack protector
3076/// generation see the comment on the declaration of class
3077/// StackProtectorDescriptor.
3079 MachineBasicBlock *ParentBB) {
3080
3081 // First create the loads to the guard/stack slot for the comparison.
3083 EVT PtrTy = TLI.getPointerTy(DAG.getDataLayout());
3084 EVT PtrMemTy = TLI.getPointerMemTy(DAG.getDataLayout());
3085
3086 MachineFrameInfo &MFI = ParentBB->getParent()->getFrameInfo();
3087 int FI = MFI.getStackProtectorIndex();
3088
3089 SDValue Guard;
3090 SDLoc dl = getCurSDLoc();
3091 SDValue StackSlotPtr = DAG.getFrameIndex(FI, PtrTy);
3092 const Module &M = *ParentBB->getParent()->getFunction().getParent();
3093 Align Align =
3094 DAG.getDataLayout().getPrefTypeAlign(PointerType::get(M.getContext(), 0));
3095
3096 // Generate code to load the content of the guard slot.
3097 SDValue GuardVal = DAG.getLoad(
3098 PtrMemTy, dl, DAG.getEntryNode(), StackSlotPtr,
3101
3102 if (TLI.useStackGuardXorFP())
3103 GuardVal = TLI.emitStackGuardXorFP(DAG, GuardVal, dl);
3104
3105 // Retrieve guard check function, nullptr if instrumentation is inlined.
3106 if (const Function *GuardCheckFn = TLI.getSSPStackGuardCheck(M)) {
3107 // The target provides a guard check function to validate the guard value.
3108 // Generate a call to that function with the content of the guard slot as
3109 // argument.
3110 FunctionType *FnTy = GuardCheckFn->getFunctionType();
3111 assert(FnTy->getNumParams() == 1 && "Invalid function signature");
3112
3115 Entry.Node = GuardVal;
3116 Entry.Ty = FnTy->getParamType(0);
3117 if (GuardCheckFn->hasParamAttribute(0, Attribute::AttrKind::InReg))
3118 Entry.IsInReg = true;
3119 Args.push_back(Entry);
3120
3124 .setCallee(GuardCheckFn->getCallingConv(), FnTy->getReturnType(),
3125 getValue(GuardCheckFn), std::move(Args));
3126
3127 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
3128 DAG.setRoot(Result.second);
3129 return;
3130 }
3131
3132 // If useLoadStackGuardNode returns true, generate LOAD_STACK_GUARD.
3133 // Otherwise, emit a volatile load to retrieve the stack guard value.
3134 SDValue Chain = DAG.getEntryNode();
3135 if (TLI.useLoadStackGuardNode()) {
3136 Guard = getLoadStackGuard(DAG, dl, Chain);
3137 } else {
3138 const Value *IRGuard = TLI.getSDagStackGuard(M);
3139 SDValue GuardPtr = getValue(IRGuard);
3140
3141 Guard = DAG.getLoad(PtrMemTy, dl, Chain, GuardPtr,
3142 MachinePointerInfo(IRGuard, 0), Align,
3144 }
3145
3146 // Perform the comparison via a getsetcc.
3148 *DAG.getContext(),
3149 Guard.getValueType()),
3150 Guard, GuardVal, ISD::SETNE);
3151
3152 // If the guard/stackslot do not equal, branch to failure MBB.
3153 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl,
3154 MVT::Other, GuardVal.getOperand(0),
3155 Cmp, DAG.getBasicBlock(SPD.getFailureMBB()));
3156 // Otherwise branch to success MBB.
3157 SDValue Br = DAG.getNode(ISD::BR, dl,
3158 MVT::Other, BrCond,
3160
3161 DAG.setRoot(Br);
3162}
3163
3164/// Codegen the failure basic block for a stack protector check.
3165///
3166/// A failure stack protector machine basic block consists simply of a call to
3167/// __stack_chk_fail().
3168///
3169/// For a high level explanation of how this fits into the stack protector
3170/// generation see the comment on the declaration of class
3171/// StackProtectorDescriptor.
3172void
3176 CallOptions.setDiscardResult(true);
3177 SDValue Chain =
3178 TLI.makeLibCall(DAG, RTLIB::STACKPROTECTOR_CHECK_FAIL, MVT::isVoid,
3179 std::nullopt, CallOptions, getCurSDLoc())
3180 .second;
3181 // On PS4/PS5, the "return address" must still be within the calling
3182 // function, even if it's at the very end, so emit an explicit TRAP here.
3183 // Passing 'true' for doesNotReturn above won't generate the trap for us.
3184 if (TM.getTargetTriple().isPS())
3185 Chain = DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, Chain);
3186 // WebAssembly needs an unreachable instruction after a non-returning call,
3187 // because the function return type can be different from __stack_chk_fail's
3188 // return type (void).
3189 if (TM.getTargetTriple().isWasm())
3190 Chain = DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, Chain);
3191
3192 DAG.setRoot(Chain);
3193}
3194
3195/// visitBitTestHeader - This function emits necessary code to produce value
3196/// suitable for "bit tests"
3198 MachineBasicBlock *SwitchBB) {
3199 SDLoc dl = getCurSDLoc();
3200
3201 // Subtract the minimum value.
3202 SDValue SwitchOp = getValue(B.SValue);
3203 EVT VT = SwitchOp.getValueType();
3204 SDValue RangeSub =
3205 DAG.getNode(ISD::SUB, dl, VT, SwitchOp, DAG.getConstant(B.First, dl, VT));
3206
3207 // Determine the type of the test operands.
3209 bool UsePtrType = false;
3210 if (!TLI.isTypeLegal(VT)) {
3211 UsePtrType = true;
3212 } else {
3213 for (unsigned i = 0, e = B.Cases.size(); i != e; ++i)
3214 if (!isUIntN(VT.getSizeInBits(), B.Cases[i].Mask)) {
3215 // Switch table case range are encoded into series of masks.
3216 // Just use pointer type, it's guaranteed to fit.
3217 UsePtrType = true;
3218 break;
3219 }
3220 }
3221 SDValue Sub = RangeSub;
3222 if (UsePtrType) {
3223 VT = TLI.getPointerTy(DAG.getDataLayout());
3224 Sub = DAG.getZExtOrTrunc(Sub, dl, VT);
3225 }
3226
3227 B.RegVT = VT.getSimpleVT();
3228 B.Reg = FuncInfo.CreateReg(B.RegVT);
3229 SDValue CopyTo = DAG.getCopyToReg(getControlRoot(), dl, B.Reg, Sub);
3230
3231 MachineBasicBlock* MBB = B.Cases[0].ThisBB;
3232
3233 if (!B.FallthroughUnreachable)
3234 addSuccessorWithProb(SwitchBB, B.Default, B.DefaultProb);
3235 addSuccessorWithProb(SwitchBB, MBB, B.Prob);
3236 SwitchBB->normalizeSuccProbs();
3237
3238 SDValue Root = CopyTo;
3239 if (!B.FallthroughUnreachable) {
3240 // Conditional branch to the default block.
3241 SDValue RangeCmp = DAG.getSetCC(dl,
3243 RangeSub.getValueType()),
3244 RangeSub, DAG.getConstant(B.Range, dl, RangeSub.getValueType()),
3245 ISD::SETUGT);
3246
3247 Root = DAG.getNode(ISD::BRCOND, dl, MVT::Other, Root, RangeCmp,
3248 DAG.getBasicBlock(B.Default));
3249 }
3250
3251 // Avoid emitting unnecessary branches to the next block.
3252 if (MBB != NextBlock(SwitchBB))
3253 Root = DAG.getNode(ISD::BR, dl, MVT::Other, Root, DAG.getBasicBlock(MBB));
3254
3255 DAG.setRoot(Root);
3256}
3257
3258/// visitBitTestCase - this function produces one "bit test"
3260 MachineBasicBlock* NextMBB,
3261 BranchProbability BranchProbToNext,
3262 unsigned Reg,
3263 BitTestCase &B,
3264 MachineBasicBlock *SwitchBB) {
3265 SDLoc dl = getCurSDLoc();
3266 MVT VT = BB.RegVT;
3267 SDValue ShiftOp = DAG.getCopyFromReg(getControlRoot(), dl, Reg, VT);
3268 SDValue Cmp;
3269 unsigned PopCount = llvm::popcount(B.Mask);
3271 if (PopCount == 1) {
3272 // Testing for a single bit; just compare the shift count with what it
3273 // would need to be to shift a 1 bit in that position.
3274 Cmp = DAG.getSetCC(
3276 ShiftOp, DAG.getConstant(llvm::countr_zero(B.Mask), dl, VT),
3277 ISD::SETEQ);
3278 } else if (PopCount == BB.Range) {
3279 // There is only one zero bit in the range, test for it directly.
3280 Cmp = DAG.getSetCC(
3282 ShiftOp, DAG.getConstant(llvm::countr_one(B.Mask), dl, VT), ISD::SETNE);
3283 } else {
3284 // Make desired shift
3285 SDValue SwitchVal = DAG.getNode(ISD::SHL, dl, VT,
3286 DAG.getConstant(1, dl, VT), ShiftOp);
3287
3288 // Emit bit tests and jumps
3289 SDValue AndOp = DAG.getNode(ISD::AND, dl,
3290 VT, SwitchVal, DAG.getConstant(B.Mask, dl, VT));
3291 Cmp = DAG.getSetCC(
3293 AndOp, DAG.getConstant(0, dl, VT), ISD::SETNE);
3294 }
3295
3296 // The branch probability from SwitchBB to B.TargetBB is B.ExtraProb.
3297 addSuccessorWithProb(SwitchBB, B.TargetBB, B.ExtraProb);
3298 // The branch probability from SwitchBB to NextMBB is BranchProbToNext.
3299 addSuccessorWithProb(SwitchBB, NextMBB, BranchProbToNext);
3300 // It is not guaranteed that the sum of B.ExtraProb and BranchProbToNext is
3301 // one as they are relative probabilities (and thus work more like weights),
3302 // and hence we need to normalize them to let the sum of them become one.
3303 SwitchBB->normalizeSuccProbs();
3304
3305 SDValue BrAnd = DAG.getNode(ISD::BRCOND, dl,
3306 MVT::Other, getControlRoot(),
3307 Cmp, DAG.getBasicBlock(B.TargetBB));
3308
3309 // Avoid emitting unnecessary branches to the next block.
3310 if (NextMBB != NextBlock(SwitchBB))
3311 BrAnd = DAG.getNode(ISD::BR, dl, MVT::Other, BrAnd,
3312 DAG.getBasicBlock(NextMBB));
3313
3314 DAG.setRoot(BrAnd);
3315}
3316
3317void SelectionDAGBuilder::visitInvoke(const InvokeInst &I) {
3318 MachineBasicBlock *InvokeMBB = FuncInfo.MBB;
3319
3320 // Retrieve successors. Look through artificial IR level blocks like
3321 // catchswitch for successors.
3322 MachineBasicBlock *Return = FuncInfo.MBBMap[I.getSuccessor(0)];
3323 const BasicBlock *EHPadBB = I.getSuccessor(1);
3324 MachineBasicBlock *EHPadMBB = FuncInfo.MBBMap[EHPadBB];
3325
3326 // Deopt and ptrauth bundles are lowered in helper functions, and we don't
3327 // have to do anything here to lower funclet bundles.
3328 assert(!I.hasOperandBundlesOtherThan(
3329 {LLVMContext::OB_deopt, LLVMContext::OB_gc_transition,
3330 LLVMContext::OB_gc_live, LLVMContext::OB_funclet,
3331 LLVMContext::OB_cfguardtarget, LLVMContext::OB_ptrauth,
3332 LLVMContext::OB_clang_arc_attachedcall}) &&
3333 "Cannot lower invokes with arbitrary operand bundles yet!");
3334
3335 const Value *Callee(I.getCalledOperand());
3336 const Function *Fn = dyn_cast<Function>(Callee);
3337 if (isa<InlineAsm>(Callee))
3338 visitInlineAsm(I, EHPadBB);
3339 else if (Fn && Fn->isIntrinsic()) {
3340 switch (Fn->getIntrinsicID()) {
3341 default:
3342 llvm_unreachable("Cannot invoke this intrinsic");
3343 case Intrinsic::donothing:
3344 // Ignore invokes to @llvm.donothing: jump directly to the next BB.
3345 case Intrinsic::seh_try_begin:
3346 case Intrinsic::seh_scope_begin:
3347 case Intrinsic::seh_try_end:
3348 case Intrinsic::seh_scope_end:
3349 if (EHPadMBB)
3350 // a block referenced by EH table
3351 // so dtor-funclet not removed by opts
3352 EHPadMBB->setMachineBlockAddressTaken();
3353 break;
3354 case Intrinsic::experimental_patchpoint_void:
3355 case Intrinsic::experimental_patchpoint:
3356 visitPatchpoint(I, EHPadBB);
3357 break;
3358 case Intrinsic::experimental_gc_statepoint:
3359 LowerStatepoint(cast<GCStatepointInst>(I), EHPadBB);
3360 break;
3361 case Intrinsic::wasm_rethrow: {
3362 // This is usually done in visitTargetIntrinsic, but this intrinsic is
3363 // special because it can be invoked, so we manually lower it to a DAG
3364 // node here.
3366 Ops.push_back(getControlRoot()); // inchain for the terminator node
3368 Ops.push_back(
3369 DAG.getTargetConstant(Intrinsic::wasm_rethrow, getCurSDLoc(),
3371 SDVTList VTs = DAG.getVTList(ArrayRef<EVT>({MVT::Other})); // outchain
3373 break;
3374 }
3375 }
3376 } else if (I.hasDeoptState()) {
3377 // Currently we do not lower any intrinsic calls with deopt operand bundles.
3378 // Eventually we will support lowering the @llvm.experimental.deoptimize
3379 // intrinsic, and right now there are no plans to support other intrinsics
3380 // with deopt state.
3381 LowerCallSiteWithDeoptBundle(&I, getValue(Callee), EHPadBB);
3382 } else if (I.countOperandBundlesOfType(LLVMContext::OB_ptrauth)) {
3383 LowerCallSiteWithPtrAuthBundle(cast<CallBase>(I), EHPadBB);
3384 } else {
3385 LowerCallTo(I, getValue(Callee), false, false, EHPadBB);
3386 }
3387
3388 // If the value of the invoke is used outside of its defining block, make it
3389 // available as a virtual register.
3390 // We already took care of the exported value for the statepoint instruction
3391 // during call to the LowerStatepoint.
3392 if (!isa<GCStatepointInst>(I)) {
3394 }
3395
3398 BranchProbability EHPadBBProb =
3399 BPI ? BPI->getEdgeProbability(InvokeMBB->getBasicBlock(), EHPadBB)
3401 findUnwindDestinations(FuncInfo, EHPadBB, EHPadBBProb, UnwindDests);
3402
3403 // Update successor info.
3404 addSuccessorWithProb(InvokeMBB, Return);
3405 for (auto &UnwindDest : UnwindDests) {
3406 UnwindDest.first->setIsEHPad();
3407 addSuccessorWithProb(InvokeMBB, UnwindDest.first, UnwindDest.second);
3408 }
3409 InvokeMBB->normalizeSuccProbs();
3410
3411 // Drop into normal successor.
3413 DAG.getBasicBlock(Return)));
3414}
3415
3416void SelectionDAGBuilder::visitCallBr(const CallBrInst &I) {
3417 MachineBasicBlock *CallBrMBB = FuncInfo.MBB;
3418
3419 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
3420 // have to do anything here to lower funclet bundles.
3421 assert(!I.hasOperandBundlesOtherThan(
3422 {LLVMContext::OB_deopt, LLVMContext::OB_funclet}) &&
3423 "Cannot lower callbrs with arbitrary operand bundles yet!");
3424
3425 assert(I.isInlineAsm() && "Only know how to handle inlineasm callbr");
3426 visitInlineAsm(I);
3428
3429 // Retrieve successors.
3431 Dests.insert(I.getDefaultDest());
3432 MachineBasicBlock *Return = FuncInfo.MBBMap[I.getDefaultDest()];
3433
3434 // Update successor info.
3435 addSuccessorWithProb(CallBrMBB, Return, BranchProbability::getOne());
3436 for (unsigned i = 0, e = I.getNumIndirectDests(); i < e; ++i) {
3437 BasicBlock *Dest = I.getIndirectDest(i);
3439 Target->setIsInlineAsmBrIndirectTarget();
3440 Target->setMachineBlockAddressTaken();
3441 Target->setLabelMustBeEmitted();
3442 // Don't add duplicate machine successors.
3443 if (Dests.insert(Dest).second)
3444 addSuccessorWithProb(CallBrMBB, Target, BranchProbability::getZero());
3445 }
3446 CallBrMBB->normalizeSuccProbs();
3447
3448 // Drop into default successor.
3450 MVT::Other, getControlRoot(),
3451 DAG.getBasicBlock(Return)));
3452}
3453
3454void SelectionDAGBuilder::visitResume(const ResumeInst &RI) {
3455 llvm_unreachable("SelectionDAGBuilder shouldn't visit resume instructions!");
3456}
3457
3458void SelectionDAGBuilder::visitLandingPad(const LandingPadInst &LP) {
3460 "Call to landingpad not in landing pad!");
3461
3462 // If there aren't registers to copy the values into (e.g., during SjLj
3463 // exceptions), then don't bother to create these DAG nodes.
3465 const Constant *PersonalityFn = FuncInfo.Fn->getPersonalityFn();
3466 if (TLI.getExceptionPointerRegister(PersonalityFn) == 0 &&
3467 TLI.getExceptionSelectorRegister(PersonalityFn) == 0)
3468 return;
3469
3470 // If landingpad's return type is token type, we don't create DAG nodes
3471 // for its exception pointer and selector value. The extraction of exception
3472 // pointer or selector value from token type landingpads is not currently
3473 // supported.
3474 if (LP.getType()->isTokenTy())
3475 return;
3476
3477 SmallVector<EVT, 2> ValueVTs;
3478 SDLoc dl = getCurSDLoc();
3479 ComputeValueVTs(TLI, DAG.getDataLayout(), LP.getType(), ValueVTs);
3480 assert(ValueVTs.size() == 2 && "Only two-valued landingpads are supported");
3481
3482 // Get the two live-in registers as SDValues. The physregs have already been
3483 // copied into virtual registers.
3484 SDValue Ops[2];
3486 Ops[0] = DAG.getZExtOrTrunc(
3490 dl, ValueVTs[0]);
3491 } else {
3492 Ops[0] = DAG.getConstant(0, dl, TLI.getPointerTy(DAG.getDataLayout()));
3493 }
3494 Ops[1] = DAG.getZExtOrTrunc(
3498 dl, ValueVTs[1]);
3499
3500 // Merge into one.
3502 DAG.getVTList(ValueVTs), Ops);
3503 setValue(&LP, Res);
3504}
3505
3508 // Update JTCases.
3509 for (JumpTableBlock &JTB : SL->JTCases)
3510 if (JTB.first.HeaderBB == First)
3511 JTB.first.HeaderBB = Last;
3512
3513 // Update BitTestCases.
3514 for (BitTestBlock &BTB : SL->BitTestCases)
3515 if (BTB.Parent == First)
3516 BTB.Parent = Last;
3517}
3518
3519void SelectionDAGBuilder::visitIndirectBr(const IndirectBrInst &I) {
3520 MachineBasicBlock *IndirectBrMBB = FuncInfo.MBB;
3521
3522 // Update machine-CFG edges with unique successors.
3524 for (unsigned i = 0, e = I.getNumSuccessors(); i != e; ++i) {
3525 BasicBlock *BB = I.getSuccessor(i);
3526 bool Inserted = Done.insert(BB).second;
3527 if (!Inserted)
3528 continue;
3529
3530 MachineBasicBlock *Succ = FuncInfo.MBBMap[BB];
3531 addSuccessorWithProb(IndirectBrMBB, Succ);
3532 }
3533 IndirectBrMBB->normalizeSuccProbs();
3534
3536 MVT::Other, getControlRoot(),
3537 getValue(I.getAddress())));
3538}
3539
3540void SelectionDAGBuilder::visitUnreachable(const UnreachableInst &I) {
3542 return;
3543
3544 // We may be able to ignore unreachable behind a noreturn call.
3545 if (const CallInst *Call = dyn_cast_or_null<CallInst>(I.getPrevNode());
3546 Call && Call->doesNotReturn()) {
3548 return;
3549 // Do not emit an additional trap instruction.
3550 if (Call->isNonContinuableTrap())
3551 return;
3552 }
3553
3554 DAG.setRoot(DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, DAG.getRoot()));
3555}
3556
3557void SelectionDAGBuilder::visitUnary(const User &I, unsigned Opcode) {
3559 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3560 Flags.copyFMF(*FPOp);
3561
3562 SDValue Op = getValue(I.getOperand(0));
3563 SDValue UnNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op.getValueType(),
3564 Op, Flags);
3565 setValue(&I, UnNodeValue);
3566}
3567
3568void SelectionDAGBuilder::visitBinary(const User &I, unsigned Opcode) {
3570 if (auto *OFBinOp = dyn_cast<OverflowingBinaryOperator>(&I)) {
3571 Flags.setNoSignedWrap(OFBinOp->hasNoSignedWrap());
3572 Flags.setNoUnsignedWrap(OFBinOp->hasNoUnsignedWrap());
3573 }
3574 if (auto *ExactOp = dyn_cast<PossiblyExactOperator>(&I))
3575 Flags.setExact(ExactOp->isExact());
3576 if (auto *DisjointOp = dyn_cast<PossiblyDisjointInst>(&I))
3577 Flags.setDisjoint(DisjointOp->isDisjoint());
3578 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3579 Flags.copyFMF(*FPOp);
3580
3581 SDValue Op1 = getValue(I.getOperand(0));
3582 SDValue Op2 = getValue(I.getOperand(1));
3583 SDValue BinNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(),
3584 Op1, Op2, Flags);
3585 setValue(&I, BinNodeValue);
3586}
3587
3588void SelectionDAGBuilder::visitShift(const User &I, unsigned Opcode) {
3589 SDValue Op1 = getValue(I.getOperand(0));
3590 SDValue Op2 = getValue(I.getOperand(1));
3591
3593 Op1.getValueType(), DAG.getDataLayout());
3594
3595 // Coerce the shift amount to the right type if we can. This exposes the
3596 // truncate or zext to optimization early.
3597 if (!I.getType()->isVectorTy() && Op2.getValueType() != ShiftTy) {
3599 "Unexpected shift type");
3600 Op2 = DAG.getZExtOrTrunc(Op2, getCurSDLoc(), ShiftTy);
3601 }
3602
3603 bool nuw = false;
3604 bool nsw = false;
3605 bool exact = false;
3606
3607 if (Opcode == ISD::SRL || Opcode == ISD::SRA || Opcode == ISD::SHL) {
3608
3609 if (const OverflowingBinaryOperator *OFBinOp =
3610 dyn_cast<const OverflowingBinaryOperator>(&I)) {
3611 nuw = OFBinOp->hasNoUnsignedWrap();
3612 nsw = OFBinOp->hasNoSignedWrap();
3613 }
3614 if (const PossiblyExactOperator *ExactOp =
3615 dyn_cast<const PossiblyExactOperator>(&I))
3616 exact = ExactOp->isExact();
3617 }
3619 Flags.setExact(exact);
3620 Flags.setNoSignedWrap(nsw);
3621 Flags.setNoUnsignedWrap(nuw);
3622 SDValue Res = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(), Op1, Op2,
3623 Flags);
3624 setValue(&I, Res);
3625}
3626
3627void SelectionDAGBuilder::visitSDiv(const User &I) {
3628 SDValue Op1 = getValue(I.getOperand(0));
3629 SDValue Op2 = getValue(I.getOperand(1));
3630
3632 Flags.setExact(isa<PossiblyExactOperator>(&I) &&
3633 cast<PossiblyExactOperator>(&I)->isExact());
3635 Op2, Flags));
3636}
3637
3638void SelectionDAGBuilder::visitICmp(const ICmpInst &I) {
3639 ICmpInst::Predicate predicate = I.getPredicate();
3640 SDValue Op1 = getValue(I.getOperand(0));
3641 SDValue Op2 = getValue(I.getOperand(1));
3642 ISD::CondCode Opcode = getICmpCondCode(predicate);
3643
3644 auto &TLI = DAG.getTargetLoweringInfo();
3645 EVT MemVT =
3646 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
3647
3648 // If a pointer's DAG type is larger than its memory type then the DAG values
3649 // are zero-extended. This breaks signed comparisons so truncate back to the
3650 // underlying type before doing the compare.
3651 if (Op1.getValueType() != MemVT) {
3652 Op1 = DAG.getPtrExtOrTrunc(Op1, getCurSDLoc(), MemVT);
3653 Op2 = DAG.getPtrExtOrTrunc(Op2, getCurSDLoc(), MemVT);
3654 }
3655
3657 I.getType());
3658 setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Opcode));
3659}
3660
3661void SelectionDAGBuilder::visitFCmp(const FCmpInst &I) {
3662 FCmpInst::Predicate predicate = I.getPredicate();
3663 SDValue Op1 = getValue(I.getOperand(0));
3664 SDValue Op2 = getValue(I.getOperand(1));
3665
3666 ISD::CondCode Condition = getFCmpCondCode(predicate);
3667 auto *FPMO = cast<FPMathOperator>(&I);
3668 if (FPMO->hasNoNaNs() || TM.Options.NoNaNsFPMath)
3669 Condition = getFCmpCodeWithoutNaN(Condition);
3670
3672 Flags.copyFMF(*FPMO);
3673 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
3674
3676 I.getType());
3677 setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Condition));
3678}
3679
3680// Check if the condition of the select has one use or two users that are both
3681// selects with the same condition.
3682static bool hasOnlySelectUsers(const Value *Cond) {
3683 return llvm::all_of(Cond->users(), [](const Value *V) {
3684 return isa<SelectInst>(V);
3685 });
3686}
3687
3688void SelectionDAGBuilder::visitSelect(const User &I) {
3689 SmallVector<EVT, 4> ValueVTs;
3691 ValueVTs);
3692 unsigned NumValues = ValueVTs.size();
3693 if (NumValues == 0) return;
3694
3695 SmallVector<SDValue, 4> Values(NumValues);
3696 SDValue Cond = getValue(I.getOperand(0));
3697 SDValue LHSVal = getValue(I.getOperand(1));
3698 SDValue RHSVal = getValue(I.getOperand(2));
3699 SmallVector<SDValue, 1> BaseOps(1, Cond);
3700 ISD::NodeType OpCode =
3701 Cond.getValueType().isVector() ? ISD::VSELECT : ISD::SELECT;
3702
3703 bool IsUnaryAbs = false;
3704 bool Negate = false;
3705
3707 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3708 Flags.copyFMF(*FPOp);
3709
3710 Flags.setUnpredictable(
3711 cast<SelectInst>(I).getMetadata(LLVMContext::MD_unpredictable));
3712
3713 // Min/max matching is only viable if all output VTs are the same.
3714 if (all_equal(ValueVTs)) {
3715 EVT VT = ValueVTs[0];
3716 LLVMContext &Ctx = *DAG.getContext();
3717 auto &TLI = DAG.getTargetLoweringInfo();
3718
3719 // We care about the legality of the operation after it has been type
3720 // legalized.
3721 while (TLI.getTypeAction(Ctx, VT) != TargetLoweringBase::TypeLegal)
3722 VT = TLI.getTypeToTransformTo(Ctx, VT);
3723
3724 // If the vselect is legal, assume we want to leave this as a vector setcc +
3725 // vselect. Otherwise, if this is going to be scalarized, we want to see if
3726 // min/max is legal on the scalar type.
3727 bool UseScalarMinMax = VT.isVector() &&
3729
3730 // ValueTracking's select pattern matching does not account for -0.0,
3731 // so we can't lower to FMINIMUM/FMAXIMUM because those nodes specify that
3732 // -0.0 is less than +0.0.
3733 const Value *LHS, *RHS;
3734 auto SPR = matchSelectPattern(&I, LHS, RHS);
3736 switch (SPR.Flavor) {
3737 case SPF_UMAX: Opc = ISD::UMAX; break;
3738 case SPF_UMIN: Opc = ISD::UMIN; break;
3739 case SPF_SMAX: Opc = ISD::SMAX; break;
3740 case SPF_SMIN: Opc = ISD::SMIN; break;
3741 case SPF_FMINNUM:
3742 switch (SPR.NaNBehavior) {
3743 case SPNB_NA: llvm_unreachable("No NaN behavior for FP op?");
3744 case SPNB_RETURNS_NAN: break;
3745 case SPNB_RETURNS_OTHER: Opc = ISD::FMINNUM; break;
3746 case SPNB_RETURNS_ANY:
3748 (UseScalarMinMax &&
3750 Opc = ISD::FMINNUM;
3751 break;
3752 }
3753 break;
3754 case SPF_FMAXNUM:
3755 switch (SPR.NaNBehavior) {
3756 case SPNB_NA: llvm_unreachable("No NaN behavior for FP op?");
3757 case SPNB_RETURNS_NAN: break;
3758 case SPNB_RETURNS_OTHER: Opc = ISD::FMAXNUM; break;
3759 case SPNB_RETURNS_ANY:
3761 (UseScalarMinMax &&
3763 Opc = ISD::FMAXNUM;
3764 break;
3765 }
3766 break;
3767 case SPF_NABS:
3768 Negate = true;
3769 [[fallthrough]];
3770 case SPF_ABS:
3771 IsUnaryAbs = true;
3772 Opc = ISD::ABS;
3773 break;
3774 default: break;
3775 }
3776
3777 if (!IsUnaryAbs && Opc != ISD::DELETED_NODE &&
3778 (TLI.isOperationLegalOrCustomOrPromote(Opc, VT) ||
3779 (UseScalarMinMax &&
3780 TLI.isOperationLegalOrCustom(Opc, VT.getScalarType()))) &&
3781 // If the underlying comparison instruction is used by any other
3782 // instruction, the consumed instructions won't be destroyed, so it is
3783 // not profitable to convert to a min/max.
3784 hasOnlySelectUsers(cast<SelectInst>(I).getCondition())) {
3785 OpCode = Opc;
3786 LHSVal = getValue(LHS);
3787 RHSVal = getValue(RHS);
3788 BaseOps.clear();
3789 }
3790
3791 if (IsUnaryAbs) {
3792 OpCode = Opc;
3793 LHSVal = getValue(LHS);
3794 BaseOps.clear();
3795 }
3796 }
3797
3798 if (IsUnaryAbs) {
3799 for (unsigned i = 0; i != NumValues; ++i) {
3800 SDLoc dl = getCurSDLoc();
3801 EVT VT = LHSVal.getNode()->getValueType(LHSVal.getResNo() + i);
3802 Values[i] =
3803 DAG.getNode(OpCode, dl, VT, LHSVal.getValue(LHSVal.getResNo() + i));
3804 if (Negate)
3805 Values[i] = DAG.getNegative(Values[i], dl, VT);
3806 }
3807 } else {
3808 for (unsigned i = 0; i != NumValues; ++i) {
3809 SmallVector<SDValue, 3> Ops(BaseOps.begin(), BaseOps.end());
3810 Ops.push_back(SDValue(LHSVal.getNode(), LHSVal.getResNo() + i));
3811 Ops.push_back(SDValue(RHSVal.getNode(), RHSVal.getResNo() + i));
3812 Values[i] = DAG.getNode(
3813 OpCode, getCurSDLoc(),
3814 LHSVal.getNode()->getValueType(LHSVal.getResNo() + i), Ops, Flags);
3815 }
3816 }
3817
3819 DAG.getVTList(ValueVTs), Values));
3820}
3821
3822void SelectionDAGBuilder::visitTrunc(const User &I) {
3823 // TruncInst cannot be a no-op cast because sizeof(src) > sizeof(dest).
3824 SDValue N = getValue(I.getOperand(0));
3826 I.getType());
3828}
3829
3830void SelectionDAGBuilder::visitZExt(const User &I) {
3831 // ZExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
3832 // ZExt also can't be a cast to bool for same reason. So, nothing much to do
3833 SDValue N = getValue(I.getOperand(0));
3834 auto &TLI = DAG.getTargetLoweringInfo();
3835 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
3836
3838 if (auto *PNI = dyn_cast<PossiblyNonNegInst>(&I))
3839 Flags.setNonNeg(PNI->hasNonNeg());
3840
3841 // Eagerly use nonneg information to canonicalize towards sign_extend if
3842 // that is the target's preference.
3843 // TODO: Let the target do this later.
3844 if (Flags.hasNonNeg() &&
3845 TLI.isSExtCheaperThanZExt(N.getValueType(), DestVT)) {
3847 return;
3848 }
3849
3850 setValue(&I, DAG.getNode(ISD::ZERO_EXTEND, getCurSDLoc(), DestVT, N, Flags));
3851}
3852
3853void SelectionDAGBuilder::visitSExt(const User &I) {
3854 // SExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
3855 // SExt also can't be a cast to bool for same reason. So, nothing much to do
3856 SDValue N = getValue(I.getOperand(0));
3858 I.getType());
3860}
3861
3862void SelectionDAGBuilder::visitFPTrunc(const User &I) {
3863 // FPTrunc is never a no-op cast, no need to check
3864 SDValue N = getValue(I.getOperand(0));
3865 SDLoc dl = getCurSDLoc();
3867 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
3868 setValue(&I, DAG.getNode(ISD::FP_ROUND, dl, DestVT, N,
3870 0, dl, TLI.getPointerTy(DAG.getDataLayout()))));
3871}
3872
3873void SelectionDAGBuilder::visitFPExt(const User &I) {
3874 // FPExt is never a no-op cast, no need to check
3875 SDValue N = getValue(I.getOperand(0));
3877 I.getType());
3879}
3880
3881void SelectionDAGBuilder::visitFPToUI(const User &I) {
3882 // FPToUI is never a no-op cast, no need to check
3883 SDValue N = getValue(I.getOperand(0));
3885 I.getType());
3887}
3888
3889void SelectionDAGBuilder::visitFPToSI(const User &I) {
3890 // FPToSI is never a no-op cast, no need to check
3891 SDValue N = getValue(I.getOperand(0));
3893 I.getType());
3895}
3896
3897void SelectionDAGBuilder::visitUIToFP(const User &I) {
3898 // UIToFP is never a no-op cast, no need to check
3899 SDValue N = getValue(I.getOperand(0));
3901 I.getType());
3903 if (auto *PNI = dyn_cast<PossiblyNonNegInst>(&I))
3904 Flags.setNonNeg(PNI->hasNonNeg());
3905
3906 setValue(&I, DAG.getNode(ISD::UINT_TO_FP, getCurSDLoc(), DestVT, N, Flags));
3907}
3908
3909void SelectionDAGBuilder::visitSIToFP(const User &I) {
3910 // SIToFP is never a no-op cast, no need to check
3911 SDValue N = getValue(I.getOperand(0));
3913 I.getType());
3915}
3916
3917void SelectionDAGBuilder::visitPtrToInt(const User &I) {
3918 // What to do depends on the size of the integer and the size of the pointer.
3919 // We can either truncate, zero extend, or no-op, accordingly.
3920 SDValue N = getValue(I.getOperand(0));
3921 auto &TLI = DAG.getTargetLoweringInfo();
3923 I.getType());
3924 EVT PtrMemVT =
3925 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
3926 N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), PtrMemVT);
3927 N = DAG.getZExtOrTrunc(N, getCurSDLoc(), DestVT);
3928 setValue(&I, N);
3929}
3930
3931void SelectionDAGBuilder::visitIntToPtr(const User &I) {
3932 // What to do depends on the size of the integer and the size of the pointer.
3933 // We can either truncate, zero extend, or no-op, accordingly.
3934 SDValue N = getValue(I.getOperand(0));
3935 auto &TLI = DAG.getTargetLoweringInfo();
3936 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
3937 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(), I.getType());
3938 N = DAG.getZExtOrTrunc(N, getCurSDLoc(), PtrMemVT);
3939 N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), DestVT);
3940 setValue(&I, N);
3941}
3942
3943void SelectionDAGBuilder::visitBitCast(const User &I) {
3944 SDValue N = getValue(I.getOperand(0));
3945 SDLoc dl = getCurSDLoc();
3947 I.getType());
3948
3949 // BitCast assures us that source and destination are the same size so this is
3950 // either a BITCAST or a no-op.
3951 if (DestVT != N.getValueType())
3953 DestVT, N)); // convert types.
3954 // Check if the original LLVM IR Operand was a ConstantInt, because getValue()
3955 // might fold any kind of constant expression to an integer constant and that
3956 // is not what we are looking for. Only recognize a bitcast of a genuine
3957 // constant integer as an opaque constant.
3958 else if(ConstantInt *C = dyn_cast<ConstantInt>(I.getOperand(0)))
3959 setValue(&I, DAG.getConstant(C->getValue(), dl, DestVT, /*isTarget=*/false,
3960 /*isOpaque*/true));
3961 else
3962 setValue(&I, N); // noop cast.
3963}
3964
3965void SelectionDAGBuilder::visitAddrSpaceCast(const User &I) {
3967 const Value *SV = I.getOperand(0);
3968 SDValue N = getValue(SV);
3969 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
3970
3971 unsigned SrcAS = SV->getType()->getPointerAddressSpace();
3972 unsigned DestAS = I.getType()->getPointerAddressSpace();
3973
3974 if (!TM.isNoopAddrSpaceCast(SrcAS, DestAS))
3975 N = DAG.getAddrSpaceCast(getCurSDLoc(), DestVT, N, SrcAS, DestAS);
3976
3977 setValue(&I, N);
3978}
3979
3980void SelectionDAGBuilder::visitInsertElement(const User &I) {
3982 SDValue InVec = getValue(I.getOperand(0));
3983 SDValue InVal = getValue(I.getOperand(1));
3984 SDValue InIdx = DAG.getZExtOrTrunc(getValue(I.getOperand(2)), getCurSDLoc(),
3987 TLI.getValueType(DAG.getDataLayout(), I.getType()),
3988 InVec, InVal, InIdx));
3989}
3990
3991void SelectionDAGBuilder::visitExtractElement(const User &I) {
3993 SDValue InVec = getValue(I.getOperand(0));
3994 SDValue InIdx = DAG.getZExtOrTrunc(getValue(I.getOperand(1)), getCurSDLoc(),
3997 TLI.getValueType(DAG.getDataLayout(), I.getType()),
3998 InVec, InIdx));
3999}
4000
4001void SelectionDAGBuilder::visitShuffleVector(const User &I) {
4002 SDValue Src1 = getValue(I.getOperand(0));
4003 SDValue Src2 = getValue(I.getOperand(1));
4005 if (auto *SVI = dyn_cast<ShuffleVectorInst>(&I))
4006 Mask = SVI->getShuffleMask();
4007 else
4008 Mask = cast<ConstantExpr>(I).getShuffleMask();
4009 SDLoc DL = getCurSDLoc();
4011 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4012 EVT SrcVT = Src1.getValueType();
4013
4014 if (all_of(Mask, [](int Elem) { return Elem == 0; }) &&
4015 VT.isScalableVector()) {
4016 // Canonical splat form of first element of first input vector.
4017 SDValue FirstElt =
4020 setValue(&I, DAG.getNode(ISD::SPLAT_VECTOR, DL, VT, FirstElt));
4021 return;
4022 }
4023
4024 // For now, we only handle splats for scalable vectors.
4025 // The DAGCombiner will perform a BUILD_VECTOR -> SPLAT_VECTOR transformation
4026 // for targets that support a SPLAT_VECTOR for non-scalable vector types.
4027 assert(!VT.isScalableVector() && "Unsupported scalable vector shuffle");
4028
4029 unsigned SrcNumElts = SrcVT.getVectorNumElements();
4030 unsigned MaskNumElts = Mask.size();
4031
4032 if (SrcNumElts == MaskNumElts) {
4033 setValue(&I, DAG.getVectorShuffle(VT, DL, Src1, Src2, Mask));
4034 return;
4035 }
4036
4037 // Normalize the shuffle vector since mask and vector length don't match.
4038 if (SrcNumElts < MaskNumElts) {
4039 // Mask is longer than the source vectors. We can use concatenate vector to
4040 // make the mask and vectors lengths match.
4041
4042 if (MaskNumElts % SrcNumElts == 0) {
4043 // Mask length is a multiple of the source vector length.
4044 // Check if the shuffle is some kind of concatenation of the input
4045 // vectors.
4046 unsigned NumConcat = MaskNumElts / SrcNumElts;
4047 bool IsConcat = true;
4048 SmallVector<int, 8> ConcatSrcs(NumConcat, -1);
4049 for (unsigned i = 0; i != MaskNumElts; ++i) {
4050 int Idx = Mask[i];
4051 if (Idx < 0)
4052 continue;
4053 // Ensure the indices in each SrcVT sized piece are sequential and that
4054 // the same source is used for the whole piece.
4055 if ((Idx % SrcNumElts != (i % SrcNumElts)) ||
4056 (ConcatSrcs[i / SrcNumElts] >= 0 &&
4057 ConcatSrcs[i / SrcNumElts] != (int)(Idx / SrcNumElts))) {
4058 IsConcat = false;
4059 break;
4060 }
4061 // Remember which source this index came from.
4062 ConcatSrcs[i / SrcNumElts] = Idx / SrcNumElts;
4063 }
4064
4065 // The shuffle is concatenating multiple vectors together. Just emit
4066 // a CONCAT_VECTORS operation.
4067 if (IsConcat) {
4068 SmallVector<SDValue, 8> ConcatOps;
4069 for (auto Src : ConcatSrcs) {
4070 if (Src < 0)
4071 ConcatOps.push_back(DAG.getUNDEF(SrcVT));
4072 else if (Src == 0)
4073 ConcatOps.push_back(Src1);
4074 else
4075 ConcatOps.push_back(Src2);
4076 }
4077 setValue(&I, DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, ConcatOps));
4078 return;
4079 }
4080 }
4081
4082 unsigned PaddedMaskNumElts = alignTo(MaskNumElts, SrcNumElts);
4083 unsigned NumConcat = PaddedMaskNumElts / SrcNumElts;
4084 EVT PaddedVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(),
4085 PaddedMaskNumElts);
4086
4087 // Pad both vectors with undefs to make them the same length as the mask.
4088 SDValue UndefVal = DAG.getUNDEF(SrcVT);
4089
4090 SmallVector<SDValue, 8> MOps1(NumConcat, UndefVal);
4091 SmallVector<SDValue, 8> MOps2(NumConcat, UndefVal);
4092 MOps1[0] = Src1;
4093 MOps2[0] = Src2;
4094
4095 Src1 = DAG.getNode(ISD::CONCAT_VECTORS, DL, PaddedVT, MOps1);
4096 Src2 = DAG.getNode(ISD::CONCAT_VECTORS, DL, PaddedVT, MOps2);
4097
4098 // Readjust mask for new input vector length.
4099 SmallVector<int, 8> MappedOps(PaddedMaskNumElts, -1);
4100 for (unsigned i = 0; i != MaskNumElts; ++i) {
4101 int Idx = Mask[i];
4102 if (Idx >= (int)SrcNumElts)
4103 Idx -= SrcNumElts - PaddedMaskNumElts;
4104 MappedOps[i] = Idx;
4105 }
4106
4107 SDValue Result = DAG.getVectorShuffle(PaddedVT, DL, Src1, Src2, MappedOps);
4108
4109 // If the concatenated vector was padded, extract a subvector with the
4110 // correct number of elements.
4111 if (MaskNumElts != PaddedMaskNumElts)
4114
4115 setValue(&I, Result);
4116 return;
4117 }
4118
4119 if (SrcNumElts > MaskNumElts) {
4120 // Analyze the access pattern of the vector to see if we can extract
4121 // two subvectors and do the shuffle.
4122 int StartIdx[2] = { -1, -1 }; // StartIdx to extract from
4123 bool CanExtract = true;
4124 for (int Idx : Mask) {
4125 unsigned Input = 0;
4126 if (Idx < 0)
4127 continue;
4128
4129 if (Idx >= (int)SrcNumElts) {
4130 Input = 1;
4131 Idx -= SrcNumElts;
4132 }
4133
4134 // If all the indices come from the same MaskNumElts sized portion of
4135 // the sources we can use extract. Also make sure the extract wouldn't
4136 // extract past the end of the source.
4137 int NewStartIdx = alignDown(Idx, MaskNumElts);
4138 if (NewStartIdx + MaskNumElts > SrcNumElts ||
4139 (StartIdx[Input] >= 0 && StartIdx[Input] != NewStartIdx))
4140 CanExtract = false;
4141 // Make sure we always update StartIdx as we use it to track if all
4142 // elements are undef.
4143 StartIdx[Input] = NewStartIdx;
4144 }
4145
4146 if (StartIdx[0] < 0 && StartIdx[1] < 0) {
4147 setValue(&I, DAG.getUNDEF(VT)); // Vectors are not used.
4148 return;
4149 }
4150 if (CanExtract) {
4151 // Extract appropriate subvector and generate a vector shuffle
4152 for (unsigned Input = 0; Input < 2; ++Input) {
4153 SDValue &Src = Input == 0 ? Src1 : Src2;
4154 if (StartIdx[Input] < 0)
4155 Src = DAG.getUNDEF(VT);
4156 else {
4157 Src = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Src,
4158 DAG.getVectorIdxConstant(StartIdx[Input], DL));
4159 }
4160 }
4161
4162 // Calculate new mask.
4163 SmallVector<int, 8> MappedOps(Mask);
4164 for (int &Idx : MappedOps) {
4165 if (Idx >= (int)SrcNumElts)
4166 Idx -= SrcNumElts + StartIdx[1] - MaskNumElts;
4167 else if (Idx >= 0)
4168 Idx -= StartIdx[0];
4169 }
4170
4171 setValue(&I, DAG.getVectorShuffle(VT, DL, Src1, Src2, MappedOps));
4172 return;
4173 }
4174 }
4175
4176 // We can't use either concat vectors or extract subvectors so fall back to
4177 // replacing the shuffle with extract and build vector.
4178 // to insert and build vector.
4179 EVT EltVT = VT.getVectorElementType();
4181 for (int Idx : Mask) {
4182 SDValue Res;
4183
4184 if (Idx < 0) {
4185 Res = DAG.getUNDEF(EltVT);
4186 } else {
4187 SDValue &Src = Idx < (int)SrcNumElts ? Src1 : Src2;
4188 if (Idx >= (int)SrcNumElts) Idx -= SrcNumElts;
4189
4190 Res = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Src,
4192 }
4193
4194 Ops.push_back(Res);
4195 }
4196
4197 setValue(&I, DAG.getBuildVector(VT, DL, Ops));
4198}
4199
4200void SelectionDAGBuilder::visitInsertValue(const InsertValueInst &I) {
4201 ArrayRef<unsigned> Indices = I.getIndices();
4202 const Value *Op0 = I.getOperand(0);
4203 const Value *Op1 = I.getOperand(1);
4204 Type *AggTy = I.getType();
4205 Type *ValTy = Op1->getType();
4206 bool IntoUndef = isa<UndefValue>(Op0);
4207 bool FromUndef = isa<UndefValue>(Op1);
4208
4209 unsigned LinearIndex = ComputeLinearIndex(AggTy, Indices);
4210
4212 SmallVector<EVT, 4> AggValueVTs;
4213 ComputeValueVTs(TLI, DAG.getDataLayout(), AggTy, AggValueVTs);
4214 SmallVector<EVT, 4> ValValueVTs;
4215 ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);
4216
4217 unsigned NumAggValues = AggValueVTs.size();
4218 unsigned NumValValues = ValValueVTs.size();
4219 SmallVector<SDValue, 4> Values(NumAggValues);
4220
4221 // Ignore an insertvalue that produces an empty object
4222 if (!NumAggValues) {
4223 setValue(&I, DAG.getUNDEF(MVT(MVT::Other)));
4224 return;
4225 }
4226
4227 SDValue Agg = getValue(Op0);
4228 unsigned i = 0;
4229 // Copy the beginning value(s) from the original aggregate.
4230 for (; i != LinearIndex; ++i)
4231 Values[i] = IntoUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4232 SDValue(Agg.getNode(), Agg.getResNo() + i);
4233 // Copy values from the inserted value(s).
4234 if (NumValValues) {
4235 SDValue Val = getValue(Op1);
4236 for (; i != LinearIndex + NumValValues; ++i)
4237 Values[i] = FromUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4238 SDValue(Val.getNode(), Val.getResNo() + i - LinearIndex);
4239 }
4240 // Copy remaining value(s) from the original aggregate.
4241 for (; i != NumAggValues; ++i)
4242 Values[i] = IntoUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4243 SDValue(Agg.getNode(), Agg.getResNo() + i);
4244
4246 DAG.getVTList(AggValueVTs), Values));
4247}
4248
4249void SelectionDAGBuilder::visitExtractValue(const ExtractValueInst &I) {
4250 ArrayRef<unsigned> Indices = I.getIndices();
4251 const Value *Op0 = I.getOperand(0);
4252 Type *AggTy = Op0->getType();
4253 Type *ValTy = I.getType();
4254 bool OutOfUndef = isa<UndefValue>(Op0);
4255
4256 unsigned LinearIndex = ComputeLinearIndex(AggTy, Indices);
4257
4259 SmallVector<EVT, 4> ValValueVTs;
4260 ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);
4261
4262 unsigned NumValValues = ValValueVTs.size();
4263
4264 // Ignore a extractvalue that produces an empty object
4265 if (!NumValValues) {
4266 setValue(&I, DAG.getUNDEF(MVT(MVT::Other)));
4267 return;
4268 }
4269
4270 SmallVector<SDValue, 4> Values(NumValValues);
4271
4272 SDValue Agg = getValue(Op0);
4273 // Copy out the selected value(s).
4274 for (unsigned i = LinearIndex; i != LinearIndex + NumValValues; ++i)
4275 Values[i - LinearIndex] =
4276 OutOfUndef ?
4277 DAG.getUNDEF(Agg.getNode()->getValueType(Agg.getResNo() + i)) :
4278 SDValue(Agg.getNode(), Agg.getResNo() + i);
4279
4281 DAG.getVTList(ValValueVTs), Values));
4282}
4283
4284void SelectionDAGBuilder::visitGetElementPtr(const User &I) {
4285 Value *Op0 = I.getOperand(0);
4286 // Note that the pointer operand may be a vector of pointers. Take the scalar
4287 // element which holds a pointer.
4288 unsigned AS = Op0->getType()->getScalarType()->getPointerAddressSpace();
4289 SDValue N = getValue(Op0);
4290 SDLoc dl = getCurSDLoc();
4291 auto &TLI = DAG.getTargetLoweringInfo();
4292
4293 // Normalize Vector GEP - all scalar operands should be converted to the
4294 // splat vector.
4295 bool IsVectorGEP = I.getType()->isVectorTy();
4296 ElementCount VectorElementCount =
4297 IsVectorGEP ? cast<VectorType>(I.getType())->getElementCount()
4299
4300 if (IsVectorGEP && !N.getValueType().isVector()) {
4302 EVT VT = EVT::getVectorVT(Context, N.getValueType(), VectorElementCount);
4303 N = DAG.getSplat(VT, dl, N);
4304 }
4305
4306 for (gep_type_iterator GTI = gep_type_begin(&I), E = gep_type_end(&I);
4307 GTI != E; ++GTI) {
4308 const Value *Idx = GTI.getOperand();
4309 if (StructType *StTy = GTI.getStructTypeOrNull()) {
4310 unsigned Field = cast<Constant>(Idx)->getUniqueInteger().getZExtValue();
4311 if (Field) {
4312 // N = N + Offset
4315
4316 // In an inbounds GEP with an offset that is nonnegative even when
4317 // interpreted as signed, assume there is no unsigned overflow.
4319 if (int64_t(Offset) >= 0 && cast<GEPOperator>(I).isInBounds())
4320 Flags.setNoUnsignedWrap(true);
4321
4322 N = DAG.getNode(ISD::ADD, dl, N.getValueType(), N,
4323 DAG.getConstant(Offset, dl, N.getValueType()), Flags);
4324 }
4325 } else {
4326 // IdxSize is the width of the arithmetic according to IR semantics.
4327 // In SelectionDAG, we may prefer to do arithmetic in a wider bitwidth
4328 // (and fix up the result later).
4329 unsigned IdxSize = DAG.getDataLayout().getIndexSizeInBits(AS);
4330 MVT IdxTy = MVT::getIntegerVT(IdxSize);
4331 TypeSize ElementSize =
4332 GTI.getSequentialElementStride(DAG.getDataLayout());
4333 // We intentionally mask away the high bits here; ElementSize may not
4334 // fit in IdxTy.
4335 APInt ElementMul(IdxSize, ElementSize.getKnownMinValue());
4336 bool ElementScalable = ElementSize.isScalable();
4337
4338 // If this is a scalar constant or a splat vector of constants,
4339 // handle it quickly.
4340 const auto *C = dyn_cast<Constant>(Idx);
4341 if (C && isa<VectorType>(C->getType()))
4342 C = C->getSplatValue();
4343
4344 const auto *CI = dyn_cast_or_null<ConstantInt>(C);
4345 if (CI && CI->isZero())
4346 continue;
4347 if (CI && !ElementScalable) {
4348 APInt Offs = ElementMul * CI->getValue().sextOrTrunc(IdxSize);
4350 SDValue OffsVal;
4351 if (IsVectorGEP)
4352 OffsVal = DAG.getConstant(
4353 Offs, dl, EVT::getVectorVT(Context, IdxTy, VectorElementCount));
4354 else
4355 OffsVal = DAG.getConstant(Offs, dl, IdxTy);
4356
4357 // In an inbounds GEP with an offset that is nonnegative even when
4358 // interpreted as signed, assume there is no unsigned overflow.
4360 if (Offs.isNonNegative() && cast<GEPOperator>(I).isInBounds())
4361 Flags.setNoUnsignedWrap(true);
4362
4363 OffsVal = DAG.getSExtOrTrunc(OffsVal, dl, N.getValueType());
4364
4365 N = DAG.getNode(ISD::ADD, dl, N.getValueType(), N, OffsVal, Flags);
4366 continue;
4367 }
4368
4369 // N = N + Idx * ElementMul;
4370 SDValue IdxN = getValue(Idx);
4371
4372 if (!IdxN.getValueType().isVector() && IsVectorGEP) {
4374 VectorElementCount);
4375 IdxN = DAG.getSplat(VT, dl, IdxN);
4376 }
4377
4378 // If the index is smaller or larger than intptr_t, truncate or extend
4379 // it.
4380 IdxN = DAG.getSExtOrTrunc(IdxN, dl, N.getValueType());
4381
4382 if (ElementScalable) {
4383 EVT VScaleTy = N.getValueType().getScalarType();
4384 SDValue VScale = DAG.getNode(
4385 ISD::VSCALE, dl, VScaleTy,
4386 DAG.getConstant(ElementMul.getZExtValue(), dl, VScaleTy));
4387 if (IsVectorGEP)
4388 VScale = DAG.getSplatVector(N.getValueType(), dl, VScale);
4389 IdxN = DAG.getNode(ISD::MUL, dl, N.getValueType(), IdxN, VScale);
4390 } else {
4391 // If this is a multiply by a power of two, turn it into a shl
4392 // immediately. This is a very common case.
4393 if (ElementMul != 1) {
4394 if (ElementMul.isPowerOf2()) {
4395 unsigned Amt = ElementMul.logBase2();
4396 IdxN = DAG.getNode(ISD::SHL, dl,
4397 N.getValueType(), IdxN,
4398 DAG.getConstant(Amt, dl, IdxN.getValueType()));
4399 } else {
4400 SDValue Scale = DAG.getConstant(ElementMul.getZExtValue(), dl,
4401 IdxN.getValueType());
4402 IdxN = DAG.getNode(ISD::MUL, dl,
4403 N.getValueType(), IdxN, Scale);
4404 }
4405 }
4406 }
4407
4408 N = DAG.getNode(ISD::ADD, dl,
4409 N.getValueType(), N, IdxN);
4410 }
4411 }
4412
4413 MVT PtrTy = TLI.getPointerTy(DAG.getDataLayout(), AS);
4414 MVT PtrMemTy = TLI.getPointerMemTy(DAG.getDataLayout(), AS);
4415 if (IsVectorGEP) {
4416 PtrTy = MVT::getVectorVT(PtrTy, VectorElementCount);
4417 PtrMemTy = MVT::getVectorVT(PtrMemTy, VectorElementCount);
4418 }
4419
4420 if (PtrMemTy != PtrTy && !cast<GEPOperator>(I).isInBounds())
4421 N = DAG.getPtrExtendInReg(N, dl, PtrMemTy);
4422
4423 setValue(&I, N);
4424}
4425
4426void SelectionDAGBuilder::visitAlloca(const AllocaInst &I) {
4427 // If this is a fixed sized alloca in the entry block of the function,
4428 // allocate it statically on the stack.
4429 if (FuncInfo.StaticAllocaMap.count(&I))
4430 return; // getValue will auto-populate this.
4431
4432 SDLoc dl = getCurSDLoc();
4433 Type *Ty = I.getAllocatedType();
4435 auto &DL = DAG.getDataLayout();
4436 TypeSize TySize = DL.getTypeAllocSize(Ty);
4437 MaybeAlign Alignment = std::max(DL.getPrefTypeAlign(Ty), I.getAlign());
4438
4439 SDValue AllocSize = getValue(I.getArraySize());
4440
4441 EVT IntPtr = TLI.getPointerTy(DL, I.getAddressSpace());
4442 if (AllocSize.getValueType() != IntPtr)
4443 AllocSize = DAG.getZExtOrTrunc(AllocSize, dl, IntPtr);
4444
4445 if (TySize.isScalable())
4446 AllocSize = DAG.getNode(ISD::MUL, dl, IntPtr, AllocSize,
4447 DAG.getVScale(dl, IntPtr,
4448 APInt(IntPtr.getScalarSizeInBits(),
4449 TySize.getKnownMinValue())));
4450 else {
4451 SDValue TySizeValue =
4453 AllocSize = DAG.getNode(ISD::MUL, dl, IntPtr, AllocSize,
4454 DAG.getZExtOrTrunc(TySizeValue, dl, IntPtr));
4455 }
4456
4457 // Handle alignment. If the requested alignment is less than or equal to
4458 // the stack alignment, ignore it. If the size is greater than or equal to
4459 // the stack alignment, we note this in the DYNAMIC_STACKALLOC node.
4461 if (*Alignment <= StackAlign)
4462 Alignment = std::nullopt;
4463
4464 const uint64_t StackAlignMask = StackAlign.value() - 1U;
4465 // Round the size of the allocation up to the stack alignment size
4466 // by add SA-1 to the size. This doesn't overflow because we're computing
4467 // an address inside an alloca.
4469 Flags.setNoUnsignedWrap(true);
4470 AllocSize = DAG.getNode(ISD::ADD, dl, AllocSize.getValueType(), AllocSize,
4471 DAG.getConstant(StackAlignMask, dl, IntPtr), Flags);
4472
4473 // Mask out the low bits for alignment purposes.
4474 AllocSize = DAG.getNode(ISD::AND, dl, AllocSize.getValueType(), AllocSize,
4475 DAG.getConstant(~StackAlignMask, dl, IntPtr));
4476
4477 SDValue Ops[] = {
4478 getRoot(), AllocSize,
4479 DAG.getConstant(Alignment ? Alignment->value() : 0, dl, IntPtr)};
4480 SDVTList VTs = DAG.getVTList(AllocSize.getValueType(), MVT::Other);
4481 SDValue DSA = DAG.getNode(ISD::DYNAMIC_STACKALLOC, dl, VTs, Ops);
4482 setValue(&I, DSA);
4483 DAG.setRoot(DSA.getValue(1));
4484
4486}
4487
4488static const MDNode *getRangeMetadata(const Instruction &I) {
4489 // If !noundef is not present, then !range violation results in a poison
4490 // value rather than immediate undefined behavior. In theory, transferring
4491 // these annotations to SDAG is fine, but in practice there are key SDAG
4492 // transforms that are known not to be poison-safe, such as folding logical
4493 // and/or to bitwise and/or. For now, only transfer !range if !noundef is
4494 // also present.
4495 if (!I.hasMetadata(LLVMContext::MD_noundef))
4496 return nullptr;
4497 return I.getMetadata(LLVMContext::MD_range);
4498}
4499
4500static std::optional<ConstantRange> getRange(const Instruction &I) {
4501 if (const auto *CB = dyn_cast<CallBase>(&I)) {
4502 // see comment in getRangeMetadata about this check
4503 if (CB->hasRetAttr(Attribute::NoUndef))
4504 return CB->getRange();
4505 }
4506 if (const MDNode *Range = getRangeMetadata(I))
4508 return std::nullopt;
4509}
4510
4511void SelectionDAGBuilder::visitLoad(const LoadInst &I) {
4512 if (I.isAtomic())
4513 return visitAtomicLoad(I);
4514
4516 const Value *SV = I.getOperand(0);
4517 if (TLI.supportSwiftError()) {
4518 // Swifterror values can come from either a function parameter with
4519 // swifterror attribute or an alloca with swifterror attribute.
4520 if (const Argument *Arg = dyn_cast<Argument>(SV)) {
4521 if (Arg->hasSwiftErrorAttr())
4522 return visitLoadFromSwiftError(I);
4523 }
4524
4525 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(SV)) {
4526 if (Alloca->isSwiftError())
4527 return visitLoadFromSwiftError(I);
4528 }
4529 }
4530
4531 SDValue Ptr = getValue(SV);
4532
4533 Type *Ty = I.getType();
4534 SmallVector<EVT, 4> ValueVTs, MemVTs;
4536 ComputeValueVTs(TLI, DAG.getDataLayout(), Ty, ValueVTs, &MemVTs, &Offsets);
4537 unsigned NumValues = ValueVTs.size();
4538 if (NumValues == 0)
4539 return;
4540
4541 Align Alignment = I.getAlign();
4542 AAMDNodes AAInfo = I.getAAMetadata();
4543 const MDNode *Ranges = getRangeMetadata(I);
4544 bool isVolatile = I.isVolatile();
4545 MachineMemOperand::Flags MMOFlags =
4547
4548 SDValue Root;
4549 bool ConstantMemory = false;
4550 if (isVolatile)
4551 // Serialize volatile loads with other side effects.
4552 Root = getRoot();
4553 else if (NumValues > MaxParallelChains)
4554 Root = getMemoryRoot();
4555 else if (AA &&
4557 SV,
4559 AAInfo))) {
4560 // Do not serialize (non-volatile) loads of constant memory with anything.
4561 Root = DAG.getEntryNode();
4562 ConstantMemory = true;
4564 } else {
4565 // Do not serialize non-volatile loads against each other.
4566 Root = DAG.getRoot();
4567 }
4568
4569 SDLoc dl = getCurSDLoc();
4570
4571 if (isVolatile)
4572 Root = TLI.prepareVolatileOrAtomicLoad(Root, dl, DAG);
4573
4574 SmallVector<SDValue, 4> Values(NumValues);
4575 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4576
4577 unsigned ChainI = 0;
4578 for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
4579 // Serializing loads here may result in excessive register pressure, and
4580 // TokenFactor places arbitrary choke points on the scheduler. SD scheduling
4581 // could recover a bit by hoisting nodes upward in the chain by recognizing
4582 // they are side-effect free or do not alias. The optimizer should really
4583 // avoid this case by converting large object/array copies to llvm.memcpy
4584 // (MaxParallelChains should always remain as failsafe).
4585 if (ChainI == MaxParallelChains) {
4586 assert(PendingLoads.empty() && "PendingLoads must be serialized first");
4587 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4588 ArrayRef(Chains.data(), ChainI));
4589 Root = Chain;
4590 ChainI = 0;
4591 }
4592
4593 // TODO: MachinePointerInfo only supports a fixed length offset.
4594 MachinePointerInfo PtrInfo =
4595 !Offsets[i].isScalable() || Offsets[i].isZero()
4596 ? MachinePointerInfo(SV, Offsets[i].getKnownMinValue())
4598
4599 SDValue A = DAG.getObjectPtrOffset(dl, Ptr, Offsets[i]);
4600 SDValue L = DAG.getLoad(MemVTs[i], dl, Root, A, PtrInfo, Alignment,
4601 MMOFlags, AAInfo, Ranges);
4602 Chains[ChainI] = L.getValue(1);
4603
4604 if (MemVTs[i] != ValueVTs[i])
4605 L = DAG.getPtrExtOrTrunc(L, dl, ValueVTs[i]);
4606
4607 Values[i] = L;
4608 }
4609
4610 if (!ConstantMemory) {
4611 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4612 ArrayRef(Chains.data(), ChainI));
4613 if (isVolatile)
4614 DAG.setRoot(Chain);
4615 else
4616 PendingLoads.push_back(Chain);
4617 }
4618
4620 DAG.getVTList(ValueVTs), Values));
4621}
4622
4623void SelectionDAGBuilder::visitStoreToSwiftError(const StoreInst &I) {
4625 "call visitStoreToSwiftError when backend supports swifterror");
4626
4627 SmallVector<EVT, 4> ValueVTs;
4629 const Value *SrcV = I.getOperand(0);
4631 SrcV->getType(), ValueVTs, &Offsets, 0);
4632 assert(ValueVTs.size() == 1 && Offsets[0] == 0 &&
4633 "expect a single EVT for swifterror");
4634
4635 SDValue Src = getValue(SrcV);
4636 // Create a virtual register, then update the virtual register.
4637 Register VReg =
4638 SwiftError.getOrCreateVRegDefAt(&I, FuncInfo.MBB, I.getPointerOperand());
4639 // Chain, DL, Reg, N or Chain, DL, Reg, N, Glue
4640 // Chain can be getRoot or getControlRoot.
4641 SDValue CopyNode = DAG.getCopyToReg(getRoot(), getCurSDLoc(), VReg,
4642 SDValue(Src.getNode(), Src.getResNo()));
4643 DAG.setRoot(CopyNode);
4644}
4645
4646void SelectionDAGBuilder::visitLoadFromSwiftError(const LoadInst &I) {
4648 "call visitLoadFromSwiftError when backend supports swifterror");
4649
4650 assert(!I.isVolatile() &&
4651 !I.hasMetadata(LLVMContext::MD_nontemporal) &&
4652 !I.hasMetadata(LLVMContext::MD_invariant_load) &&
4653 "Support volatile, non temporal, invariant for load_from_swift_error");
4654
4655 const Value *SV = I.getOperand(0);
4656 Type *Ty = I.getType();
4657 assert(
4658 (!AA ||
4661 I.getAAMetadata()))) &&
4662 "load_from_swift_error should not be constant memory");
4663
4664 SmallVector<EVT, 4> ValueVTs;
4667 ValueVTs, &Offsets, 0);
4668 assert(ValueVTs.size() == 1 && Offsets[0] == 0 &&
4669 "expect a single EVT for swifterror");
4670
4671 // Chain, DL, Reg, VT, Glue or Chain, DL, Reg, VT
4673 getRoot(), getCurSDLoc(),
4674 SwiftError.getOrCreateVRegUseAt(&I, FuncInfo.MBB, SV), ValueVTs[0]);
4675
4676 setValue(&I, L);
4677}
4678
4679void SelectionDAGBuilder::visitStore(const StoreInst &I) {
4680 if (I.isAtomic())
4681 return visitAtomicStore(I);
4682
4683 const Value *SrcV = I.getOperand(0);
4684 const Value *PtrV = I.getOperand(1);
4685
4687 if (TLI.supportSwiftError()) {
4688 // Swifterror values can come from either a function parameter with
4689 // swifterror attribute or an alloca with swifterror attribute.
4690 if (const Argument *Arg = dyn_cast<Argument>(PtrV)) {
4691 if (Arg->hasSwiftErrorAttr())
4692 return visitStoreToSwiftError(I);
4693 }
4694
4695 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(PtrV)) {
4696 if (Alloca->isSwiftError())
4697 return visitStoreToSwiftError(I);
4698 }
4699 }
4700
4701 SmallVector<EVT, 4> ValueVTs, MemVTs;
4704 SrcV->getType(), ValueVTs, &MemVTs, &Offsets);
4705 unsigned NumValues = ValueVTs.size();
4706 if (NumValues == 0)
4707 return;
4708
4709 // Get the lowered operands. Note that we do this after
4710 // checking if NumResults is zero, because with zero results
4711 // the operands won't have values in the map.
4712 SDValue Src = getValue(SrcV);
4713 SDValue Ptr = getValue(PtrV);
4714
4715 SDValue Root = I.isVolatile() ? getRoot() : getMemoryRoot();
4716 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4717 SDLoc dl = getCurSDLoc();
4718 Align Alignment = I.getAlign();
4719 AAMDNodes AAInfo = I.getAAMetadata();
4720
4721 auto MMOFlags = TLI.getStoreMemOperandFlags(I, DAG.getDataLayout());
4722
4723 unsigned ChainI = 0;
4724 for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
4725 // See visitLoad comments.
4726 if (ChainI == MaxParallelChains) {
4727 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4728 ArrayRef(Chains.data(), ChainI));
4729 Root = Chain;
4730 ChainI = 0;
4731 }
4732
4733 // TODO: MachinePointerInfo only supports a fixed length offset.
4734 MachinePointerInfo PtrInfo =
4735 !Offsets[i].isScalable() || Offsets[i].isZero()
4736 ? MachinePointerInfo(PtrV, Offsets[i].getKnownMinValue())
4738
4739 SDValue Add = DAG.getObjectPtrOffset(dl, Ptr, Offsets[i]);
4740 SDValue Val = SDValue(Src.getNode(), Src.getResNo() + i);
4741 if (MemVTs[i] != ValueVTs[i])
4742 Val = DAG.getPtrExtOrTrunc(Val, dl, MemVTs[i]);
4743 SDValue St =
4744 DAG.getStore(Root, dl, Val, Add, PtrInfo, Alignment, MMOFlags, AAInfo);
4745 Chains[ChainI] = St;
4746 }
4747
4748 SDValue StoreNode = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4749 ArrayRef(Chains.data(), ChainI));
4750 setValue(&I, StoreNode);
4751 DAG.setRoot(StoreNode);
4752}
4753
4754void SelectionDAGBuilder::visitMaskedStore(const CallInst &I,
4755 bool IsCompressing) {
4756 SDLoc sdl = getCurSDLoc();
4757
4758 auto getMaskedStoreOps = [&](Value *&Ptr, Value *&Mask, Value *&Src0,
4759 Align &Alignment) {
4760 // llvm.masked.store.*(Src0, Ptr, alignment, Mask)
4761 Src0 = I.getArgOperand(0);
4762 Ptr = I.getArgOperand(1);
4763 Alignment = cast<ConstantInt>(I.getArgOperand(2))->getAlignValue();
4764 Mask = I.getArgOperand(3);
4765 };
4766 auto getCompressingStoreOps = [&](Value *&Ptr, Value *&Mask, Value *&Src0,
4767 Align &Alignment) {
4768 // llvm.masked.compressstore.*(Src0, Ptr, Mask)
4769 Src0 = I.getArgOperand(0);
4770 Ptr = I.getArgOperand(1);
4771 Mask = I.getArgOperand(2);
4772 Alignment = I.getParamAlign(1).valueOrOne();
4773 };
4774
4775 Value *PtrOperand, *MaskOperand, *Src0Operand;
4776 Align Alignment;
4777 if (IsCompressing)
4778 getCompressingStoreOps(PtrOperand, MaskOperand, Src0Operand, Alignment);
4779 else
4780 getMaskedStoreOps(PtrOperand, MaskOperand, Src0Operand, Alignment);
4781
4782 SDValue Ptr = getValue(PtrOperand);
4783 SDValue Src0 = getValue(Src0Operand);
4784 SDValue Mask = getValue(MaskOperand);
4785 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
4786
4787 EVT VT = Src0.getValueType();
4788
4789 auto MMOFlags = MachineMemOperand::MOStore;
4790 if (I.hasMetadata(LLVMContext::MD_nontemporal))
4792
4794 MachinePointerInfo(PtrOperand), MMOFlags,
4795 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata());
4796
4797 const auto &TLI = DAG.getTargetLoweringInfo();
4798 const auto &TTI =
4799 TLI.getTargetMachine().getTargetTransformInfo(*I.getFunction());
4800 SDValue StoreNode =
4801 !IsCompressing &&
4802 TTI.hasConditionalLoadStoreForType(I.getArgOperand(0)->getType())
4803 ? TLI.visitMaskedStore(DAG, sdl, getMemoryRoot(), MMO, Ptr, Src0,
4804 Mask)
4805 : DAG.getMaskedStore(getMemoryRoot(), sdl, Src0, Ptr, Offset, Mask,
4806 VT, MMO, ISD::UNINDEXED, /*Truncating=*/false,
4807 IsCompressing);
4808 DAG.setRoot(StoreNode);
4809 setValue(&I, StoreNode);
4810}
4811
4812// Get a uniform base for the Gather/Scatter intrinsic.
4813// The first argument of the Gather/Scatter intrinsic is a vector of pointers.
4814// We try to represent it as a base pointer + vector of indices.
4815// Usually, the vector of pointers comes from a 'getelementptr' instruction.
4816// The first operand of the GEP may be a single pointer or a vector of pointers
4817// Example:
4818// %gep.ptr = getelementptr i32, <8 x i32*> %vptr, <8 x i32> %ind
4819// or
4820// %gep.ptr = getelementptr i32, i32* %ptr, <8 x i32> %ind
4821// %res = call <8 x i32> @llvm.masked.gather.v8i32(<8 x i32*> %gep.ptr, ..
4822//
4823// When the first GEP operand is a single pointer - it is the uniform base we
4824// are looking for. If first operand of the GEP is a splat vector - we
4825// extract the splat value and use it as a uniform base.
4826// In all other cases the function returns 'false'.
4828 ISD::MemIndexType &IndexType, SDValue &Scale,
4829 SelectionDAGBuilder *SDB, const BasicBlock *CurBB,
4830 uint64_t ElemSize) {
4831 SelectionDAG& DAG = SDB->DAG;
4832 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4833 const DataLayout &DL = DAG.getDataLayout();
4834
4835 assert(Ptr->getType()->isVectorTy() && "Unexpected pointer type");
4836
4837 // Handle splat constant pointer.
4838 if (auto *C = dyn_cast<Constant>(Ptr)) {
4839 C = C->getSplatValue();
4840 if (!C)
4841 return false;
4842
4843 Base = SDB->getValue(C);
4844
4845 ElementCount NumElts = cast<VectorType>(Ptr->getType())->getElementCount();
4846 EVT VT = EVT::getVectorVT(*DAG.getContext(), TLI.getPointerTy(DL), NumElts);
4847 Index = DAG.getConstant(0, SDB->getCurSDLoc(), VT);
4848 IndexType = ISD::SIGNED_SCALED;
4849 Scale = DAG.getTargetConstant(1, SDB->getCurSDLoc(), TLI.getPointerTy(DL));
4850 return true;
4851 }
4852
4853 const GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(Ptr);
4854 if (!GEP || GEP->getParent() != CurBB)
4855 return false;
4856
4857 if (GEP->getNumOperands() != 2)
4858 return false;
4859
4860 const Value *BasePtr = GEP->getPointerOperand();
4861 const Value *IndexVal = GEP->getOperand(GEP->getNumOperands() - 1);
4862
4863 // Make sure the base is scalar and the index is a vector.
4864 if (BasePtr->getType()->isVectorTy() || !IndexVal->getType()->isVectorTy())
4865 return false;
4866
4867 TypeSize ScaleVal = DL.getTypeAllocSize(GEP->getResultElementType());
4868 if (ScaleVal.isScalable())
4869 return false;
4870
4871 // Target may not support the required addressing mode.
4872 if (ScaleVal != 1 &&
4873 !TLI.isLegalScaleForGatherScatter(ScaleVal.getFixedValue(), ElemSize))
4874 return false;
4875
4876 Base = SDB->getValue(BasePtr);
4877 Index = SDB->getValue(IndexVal);
4878 IndexType = ISD::SIGNED_SCALED;
4879
4880 Scale =
4881 DAG.getTargetConstant(ScaleVal, SDB->getCurSDLoc(), TLI.getPointerTy(DL));
4882 return true;
4883}
4884
4885void SelectionDAGBuilder::visitMaskedScatter(const CallInst &I) {
4886 SDLoc sdl = getCurSDLoc();
4887
4888 // llvm.masked.scatter.*(Src0, Ptrs, alignment, Mask)
4889 const Value *Ptr = I.getArgOperand(1);
4890 SDValue Src0 = getValue(I.getArgOperand(0));
4891 SDValue Mask = getValue(I.getArgOperand(3));
4892 EVT VT = Src0.getValueType();
4893 Align Alignment = cast<ConstantInt>(I.getArgOperand(2))
4894 ->getMaybeAlignValue()
4895 .value_or(DAG.getEVTAlign(VT.getScalarType()));
4897
4898 SDValue Base;
4899 SDValue Index;
4900 ISD::MemIndexType IndexType;
4901 SDValue Scale;
4902 bool UniformBase = getUniformBase(Ptr, Base, Index, IndexType, Scale, this,
4903 I.getParent(), VT.getScalarStoreSize());
4904
4905 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
4908 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata());
4909 if (!UniformBase) {
4911 Index = getValue(Ptr);
4912 IndexType = ISD::SIGNED_SCALED;
4913 Scale = DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
4914 }
4915
4916 EVT IdxVT = Index.getValueType();
4917 EVT EltTy = IdxVT.getVectorElementType();
4918 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
4919 EVT NewIdxVT = IdxVT.changeVectorElementType(EltTy);
4920 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
4921 }
4922
4923 SDValue Ops[] = { getMemoryRoot(), Src0, Mask, Base, Index, Scale };
4924 SDValue Scatter = DAG.getMaskedScatter(DAG.getVTList(MVT::Other), VT, sdl,
4925 Ops, MMO, IndexType, false);
4926 DAG.setRoot(Scatter);
4927 setValue(&I, Scatter);
4928}
4929
4930void SelectionDAGBuilder::visitMaskedLoad(const CallInst &I, bool IsExpanding) {
4931 SDLoc sdl = getCurSDLoc();
4932
4933 auto getMaskedLoadOps = [&](Value *&Ptr, Value *&Mask, Value *&Src0,
4934 Align &Alignment) {
4935 // @llvm.masked.load.*(Ptr, alignment, Mask, Src0)
4936 Ptr = I.getArgOperand(0);
4937 Alignment = cast<ConstantInt>(I.getArgOperand(1))->getAlignValue();
4938 Mask = I.getArgOperand(2);
4939 Src0 = I.getArgOperand(3);
4940 };
4941 auto getExpandingLoadOps = [&](Value *&Ptr, Value *&Mask, Value *&Src0,
4942 Align &Alignment) {
4943 // @llvm.masked.expandload.*(Ptr, Mask, Src0)
4944 Ptr = I.getArgOperand(0);
4945 Alignment = I.getParamAlign(0).valueOrOne();
4946 Mask = I.getArgOperand(1);
4947 Src0 = I.getArgOperand(2);
4948 };
4949
4950 Value *PtrOperand, *MaskOperand, *Src0Operand;
4951 Align Alignment;
4952 if (IsExpanding)
4953 getExpandingLoadOps(PtrOperand, MaskOperand, Src0Operand, Alignment);
4954 else
4955 getMaskedLoadOps(PtrOperand, MaskOperand, Src0Operand, Alignment);
4956
4957 SDValue Ptr = getValue(PtrOperand);
4958 SDValue Src0 = getValue(Src0Operand);
4959 SDValue Mask = getValue(MaskOperand);
4960 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
4961
4962 EVT VT = Src0.getValueType();
4963 AAMDNodes AAInfo = I.getAAMetadata();
4964 const MDNode *Ranges = getRangeMetadata(I);
4965
4966 // Do not serialize masked loads of constant memory with anything.
4967 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
4968 bool AddToChain = !AA || !AA->pointsToConstantMemory(ML);
4969
4970 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
4971
4972 auto MMOFlags = MachineMemOperand::MOLoad;
4973 if (I.hasMetadata(LLVMContext::MD_nontemporal))
4975
4977 MachinePointerInfo(PtrOperand), MMOFlags,
4978 LocationSize::beforeOrAfterPointer(), Alignment, AAInfo, Ranges);
4979
4980 const auto &TLI = DAG.getTargetLoweringInfo();
4981 const auto &TTI =
4982 TLI.getTargetMachine().getTargetTransformInfo(*I.getFunction());
4983 // The Load/Res may point to different values and both of them are output
4984 // variables.
4985 SDValue Load;
4986 SDValue Res;
4987 if (!IsExpanding &&
4989 Res = TLI.visitMaskedLoad(DAG, sdl, InChain, MMO, Load, Ptr, Src0, Mask);
4990 else
4991 Res = Load =
4992 DAG.getMaskedLoad(VT, sdl, InChain, Ptr, Offset, Mask, Src0, VT, MMO,
4993 ISD::UNINDEXED, ISD::NON_EXTLOAD, IsExpanding);
4994 if (AddToChain)
4995 PendingLoads.push_back(Load.getValue(1));
4996 setValue(&I, Res);
4997}
4998
4999void SelectionDAGBuilder::visitMaskedGather(const CallInst &I) {
5000 SDLoc sdl = getCurSDLoc();
5001
5002 // @llvm.masked.gather.*(Ptrs, alignment, Mask, Src0)
5003 const Value *Ptr = I.getArgOperand(0);
5004 SDValue Src0 = getValue(I.getArgOperand(3));
5005 SDValue Mask = getValue(I.getArgOperand(2));
5006
5008 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
5009 Align Alignment = cast<ConstantInt>(I.getArgOperand(1))
5010 ->getMaybeAlignValue()
5011 .value_or(DAG.getEVTAlign(VT.getScalarType()));
5012
5013 const MDNode *Ranges = getRangeMetadata(I);
5014
5015 SDValue Root = DAG.getRoot();
5016 SDValue Base;
5017 SDValue Index;
5018 ISD::MemIndexType IndexType;
5019 SDValue Scale;
5020 bool UniformBase = getUniformBase(Ptr, Base, Index, IndexType, Scale, this,
5021 I.getParent(), VT.getScalarStoreSize());
5022 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
5025 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata(),
5026 Ranges);
5027
5028 if (!UniformBase) {
5030 Index = getValue(Ptr);
5031 IndexType = ISD::SIGNED_SCALED;
5032 Scale = DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5033 }
5034
5035 EVT IdxVT = Index.getValueType();
5036 EVT EltTy = IdxVT.getVectorElementType();
5037 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
5038 EVT NewIdxVT = IdxVT.changeVectorElementType(EltTy);
5039 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
5040 }
5041
5042 SDValue Ops[] = { Root, Src0, Mask, Base, Index, Scale };
5043 SDValue Gather = DAG.getMaskedGather(DAG.getVTList(VT, MVT::Other), VT, sdl,
5044 Ops, MMO, IndexType, ISD::NON_EXTLOAD);
5045
5046 PendingLoads.push_back(Gather.getValue(1));
5047 setValue(&I, Gather);
5048}
5049
5050void SelectionDAGBuilder::visitAtomicCmpXchg(const AtomicCmpXchgInst &I) {
5051 SDLoc dl = getCurSDLoc();
5052 AtomicOrdering SuccessOrdering = I.getSuccessOrdering();
5053 AtomicOrdering FailureOrdering = I.getFailureOrdering();
5054 SyncScope::ID SSID = I.getSyncScopeID();
5055
5056 SDValue InChain = getRoot();
5057
5058 MVT MemVT = getValue(I.getCompareOperand()).getSimpleValueType();
5059 SDVTList VTs = DAG.getVTList(MemVT, MVT::i1, MVT::Other);
5060
5063
5066 MachinePointerInfo(I.getPointerOperand()), Flags,
5068 AAMDNodes(), nullptr, SSID, SuccessOrdering, FailureOrdering);
5069
5071 dl, MemVT, VTs, InChain,
5072 getValue(I.getPointerOperand()),
5073 getValue(I.getCompareOperand()),
5074 getValue(I.getNewValOperand()), MMO);
5075
5076 SDValue OutChain = L.getValue(2);
5077
5078 setValue(&I, L);
5079 DAG.setRoot(OutChain);
5080}
5081
5082void SelectionDAGBuilder::visitAtomicRMW(const AtomicRMWInst &I) {
5083 SDLoc dl = getCurSDLoc();
5085 switch (I.getOperation()) {
5086 default: llvm_unreachable("Unknown atomicrmw operation");
5104 break;
5107 break;
5108 }
5109 AtomicOrdering Ordering = I.getOrdering();
5110 SyncScope::ID SSID = I.getSyncScopeID();
5111
5112 SDValue InChain = getRoot();
5113
5114 auto MemVT = getValue(I.getValOperand()).getSimpleValueType();
5117
5120 MachinePointerInfo(I.getPointerOperand()), Flags,
5122 AAMDNodes(), nullptr, SSID, Ordering);
5123
5124 SDValue L =
5125 DAG.getAtomic(NT, dl, MemVT, InChain,
5126 getValue(I.getPointerOperand()), getValue(I.getValOperand()),
5127 MMO);
5128
5129 SDValue OutChain = L.getValue(1);
5130
5131 setValue(&I, L);
5132 DAG.setRoot(OutChain);
5133}
5134
5135void SelectionDAGBuilder::visitFence(const FenceInst &I) {
5136 SDLoc dl = getCurSDLoc();
5138 SDValue Ops[3];
5139 Ops[0] = getRoot();
5140 Ops[1] = DAG.getTargetConstant((unsigned)I.getOrdering(), dl,
5142 Ops[2] = DAG.getTargetConstant(I.getSyncScopeID(), dl,
5144 SDValue N = DAG.getNode(ISD::ATOMIC_FENCE, dl, MVT::Other, Ops);
5145 setValue(&I, N);
5146 DAG.setRoot(N);
5147}
5148
5149void SelectionDAGBuilder::visitAtomicLoad(const LoadInst &I) {
5150 SDLoc dl = getCurSDLoc();
5151 AtomicOrdering Order = I.getOrdering();
5152 SyncScope::ID SSID = I.getSyncScopeID();
5153
5154 SDValue InChain = getRoot();
5155
5157 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
5158 EVT MemVT = TLI.getMemValueType(DAG.getDataLayout(), I.getType());
5159
5160 if (!TLI.supportsUnalignedAtomics() &&
5161 I.getAlign().value() < MemVT.getSizeInBits() / 8)
5162 report_fatal_error("Cannot generate unaligned atomic load");
5163
5165
5167 MachinePointerInfo(I.getPointerOperand()), Flags,
5168 LocationSize::precise(MemVT.getStoreSize()), I.getAlign(), AAMDNodes(),
5169 nullptr, SSID, Order);
5170
5171 InChain = TLI.prepareVolatileOrAtomicLoad(InChain, dl, DAG);
5172
5173 SDValue Ptr = getValue(I.getPointerOperand());
5174 SDValue L = DAG.getAtomic(ISD::ATOMIC_LOAD, dl, MemVT, MemVT, InChain,
5175 Ptr, MMO);
5176
5177 SDValue OutChain = L.getValue(1);
5178 if (MemVT != VT)
5179 L = DAG.getPtrExtOrTrunc(L, dl, VT);
5180
5181 setValue(&I, L);
5182 DAG.setRoot(OutChain);
5183}
5184
5185void SelectionDAGBuilder::visitAtomicStore(const StoreInst &I) {
5186 SDLoc dl = getCurSDLoc();
5187
5188 AtomicOrdering Ordering = I.getOrdering();
5189 SyncScope::ID SSID = I.getSyncScopeID();
5190
5191 SDValue InChain = getRoot();
5192
5194 EVT MemVT =
5195 TLI.getMemValueType(DAG.getDataLayout(), I.getValueOperand()->getType());
5196
5197 if (!TLI.supportsUnalignedAtomics() &&
5198 I.getAlign().value() < MemVT.getSizeInBits() / 8)
5199 report_fatal_error("Cannot generate unaligned atomic store");
5200
5202
5205 MachinePointerInfo(I.getPointerOperand()), Flags,
5206 LocationSize::precise(MemVT.getStoreSize()), I.getAlign(), AAMDNodes(),
5207 nullptr, SSID, Ordering);
5208
5209 SDValue Val = getValue(I.getValueOperand());
5210 if (Val.getValueType() != MemVT)
5211 Val = DAG.getPtrExtOrTrunc(Val, dl, MemVT);
5212 SDValue Ptr = getValue(I.getPointerOperand());
5213
5214 SDValue OutChain =
5215 DAG.getAtomic(ISD::ATOMIC_STORE, dl, MemVT, InChain, Val, Ptr, MMO);
5216
5217 setValue(&I, OutChain);
5218 DAG.setRoot(OutChain);
5219}
5220
5221/// visitTargetIntrinsic - Lower a call of a target intrinsic to an INTRINSIC
5222/// node.
5223void SelectionDAGBuilder::visitTargetIntrinsic(const CallInst &I,
5224 unsigned Intrinsic) {
5225 // Ignore the callsite's attributes. A specific call site may be marked with
5226 // readnone, but the lowering code will expect the chain based on the
5227 // definition.
5228 const Function *F = I.getCalledFunction();
5229 bool HasChain = !F->doesNotAccessMemory();
5230 bool OnlyLoad = HasChain && F->onlyReadsMemory();
5231
5232 // Build the operand list.
5234 if (HasChain) { // If this intrinsic has side-effects, chainify it.
5235 if (OnlyLoad) {
5236 // We don't need to serialize loads against other loads.
5237 Ops.push_back(DAG.getRoot());
5238 } else {
5239 Ops.push_back(getRoot());
5240 }
5241 }
5242
5243 // Info is set by getTgtMemIntrinsic
5246 bool IsTgtIntrinsic = TLI.getTgtMemIntrinsic(Info, I,
5248 Intrinsic);
5249
5250 // Add the intrinsic ID as an integer operand if it's not a target intrinsic.
5251 if (!IsTgtIntrinsic || Info.opc == ISD::INTRINSIC_VOID ||
5253 Ops.push_back(DAG.getTargetConstant(Intrinsic, getCurSDLoc(),
5255
5256 // Add all operands of the call to the operand list.
5257 for (unsigned i = 0, e = I.arg_size(); i != e; ++i) {
5258 const Value *Arg = I.getArgOperand(i);
5259 if (!I.paramHasAttr(i, Attribute::ImmArg)) {
5260 Ops.push_back(getValue(Arg));
5261 continue;
5262 }
5263
5264 // Use TargetConstant instead of a regular constant for immarg.
5265 EVT VT = TLI.getValueType(DAG.getDataLayout(), Arg->getType(), true);
5266 if (const ConstantInt *CI = dyn_cast<ConstantInt>(Arg)) {
5267 assert(CI->getBitWidth() <= 64 &&
5268 "large intrinsic immediates not handled");
5269 Ops.push_back(DAG.getTargetConstant(*CI, SDLoc(), VT));
5270 } else {
5271 Ops.push_back(
5272 DAG.getTargetConstantFP(*cast<ConstantFP>(Arg), SDLoc(), VT));
5273 }
5274 }
5275
5276 SmallVector<EVT, 4> ValueVTs;
5277 ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);
5278
5279 if (HasChain)
5280 ValueVTs.push_back(MVT::Other);
5281
5282 SDVTList VTs = DAG.getVTList(ValueVTs);
5283
5284 // Propagate fast-math-flags from IR to node(s).
5286 if (auto *FPMO = dyn_cast<FPMathOperator>(&I))
5287 Flags.copyFMF(*FPMO);
5288 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
5289
5290 // Create the node.
5292
5293 if (auto Bundle = I.getOperandBundle(LLVMContext::OB_convergencectrl)) {
5294 auto *Token = Bundle->Inputs[0].get();
5295 SDValue ConvControlToken = getValue(Token);
5296 assert(Ops.back().getValueType() != MVT::Glue &&
5297 "Did not expected another glue node here.");
5298 ConvControlToken =
5299 DAG.getNode(ISD::CONVERGENCECTRL_GLUE, {}, MVT::Glue, ConvControlToken);
5300 Ops.push_back(ConvControlToken);
5301 }
5302
5303 // In some cases, custom collection of operands from CallInst I may be needed.
5305 if (IsTgtIntrinsic) {
5306 // This is target intrinsic that touches memory
5307 //
5308 // TODO: We currently just fallback to address space 0 if getTgtMemIntrinsic
5309 // didn't yield anything useful.
5311 if (Info.ptrVal)
5312 MPI = MachinePointerInfo(Info.ptrVal, Info.offset);
5313 else if (Info.fallbackAddressSpace)
5314 MPI = MachinePointerInfo(*Info.fallbackAddressSpace);
5315 Result = DAG.getMemIntrinsicNode(Info.opc, getCurSDLoc(), VTs, Ops,
5316 Info.memVT, MPI, Info.align, Info.flags,
5317 Info.size, I.getAAMetadata());
5318 } else if (!HasChain) {
5320 } else if (!I.getType()->isVoidTy()) {
5322 } else {
5324 }
5325
5326 if (HasChain) {
5327 SDValue Chain = Result.getValue(Result.getNode()->getNumValues()-1);
5328 if (OnlyLoad)
5329 PendingLoads.push_back(Chain);
5330 else
5331 DAG.setRoot(Chain);
5332 }
5333
5334 if (!I.getType()->isVoidTy()) {
5335 if (!isa<VectorType>(I.getType()))
5336 Result = lowerRangeToAssertZExt(DAG, I, Result);
5337
5338 MaybeAlign Alignment = I.getRetAlign();
5339
5340 // Insert `assertalign` node if there's an alignment.
5341 if (InsertAssertAlign && Alignment) {
5342 Result =
5343 DAG.getAssertAlign(getCurSDLoc(), Result, Alignment.valueOrOne());
5344 }
5345 }
5346
5347 setValue(&I, Result);
5348}
5349
5350/// GetSignificand - Get the significand and build it into a floating-point
5351/// number with exponent of 1:
5352///
5353/// Op = (Op & 0x007fffff) | 0x3f800000;
5354///
5355/// where Op is the hexadecimal representation of floating point value.
5357 SDValue t1 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
5358 DAG.getConstant(0x007fffff, dl, MVT::i32));
5359 SDValue t2 = DAG.getNode(ISD::OR, dl, MVT::i32, t1,
5360 DAG.getConstant(0x3f800000, dl, MVT::i32));
5361 return DAG.getNode(ISD::BITCAST, dl, MVT::f32, t2);
5362}
5363
5364/// GetExponent - Get the exponent:
5365///
5366/// (float)(int)(((Op & 0x7f800000) >> 23) - 127);
5367///
5368/// where Op is the hexadecimal representation of floating point value.
5370 const TargetLowering &TLI, const SDLoc &dl) {
5371 SDValue t0 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
5372 DAG.getConstant(0x7f800000, dl, MVT::i32));
5373 SDValue t1 = DAG.getNode(
5374 ISD::SRL, dl, MVT::i32, t0,
5375 DAG.getConstant(23, dl,
5376 TLI.getShiftAmountTy(MVT::i32, DAG.getDataLayout())));
5377 SDValue t2 = DAG.getNode(ISD::SUB, dl, MVT::i32, t1,
5378 DAG.getConstant(127, dl, MVT::i32));
5379 return DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, t2);
5380}
5381
5382/// getF32Constant - Get 32-bit floating point constant.
5384 const SDLoc &dl) {
5385 return DAG.getConstantFP(APFloat(APFloat::IEEEsingle(), APInt(32, Flt)), dl,
5386 MVT::f32);
5387}
5388
5390 SelectionDAG &DAG) {
5391 // TODO: What fast-math-flags should be set on the floating-point nodes?
5392
5393 // IntegerPartOfX = ((int32_t)(t0);
5394 SDValue IntegerPartOfX = DAG.getNode(ISD::FP_TO_SINT, dl, MVT::i32, t0);
5395
5396 // FractionalPartOfX = t0 - (float)IntegerPartOfX;
5397 SDValue t1 = DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, IntegerPartOfX);
5398 SDValue X = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0, t1);
5399
5400 // IntegerPartOfX <<= 23;
5401 IntegerPartOfX =
5402 DAG.getNode(ISD::SHL, dl, MVT::i32, IntegerPartOfX,
5403 DAG.getConstant(23, dl,
5405 MVT::i32, DAG.getDataLayout())));
5406
5407 SDValue TwoToFractionalPartOfX;
5408 if (LimitFloatPrecision <= 6) {
5409 // For floating-point precision of 6:
5410 //
5411 // TwoToFractionalPartOfX =
5412 // 0.997535578f +
5413 // (0.735607626f + 0.252464424f * x) * x;
5414 //
5415 // error 0.0144103317, which is 6 bits
5416 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5417 getF32Constant(DAG, 0x3e814304, dl));
5418 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5419 getF32Constant(DAG, 0x3f3c50c8, dl));
5420 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5421 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5422 getF32Constant(DAG, 0x3f7f5e7e, dl));
5423 } else if (LimitFloatPrecision <= 12) {
5424 // For floating-point precision of 12:
5425 //
5426 // TwoToFractionalPartOfX =
5427 // 0.999892986f +
5428 // (0.696457318f +
5429 // (0.224338339f + 0.792043434e-1f * x) * x) * x;
5430 //
5431 // error 0.000107046256, which is 13 to 14 bits
5432 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5433 getF32Constant(DAG, 0x3da235e3, dl));
5434 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5435 getF32Constant(DAG, 0x3e65b8f3, dl));
5436 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5437 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5438 getF32Constant(DAG, 0x3f324b07, dl));
5439 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5440 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5441 getF32Constant(DAG, 0x3f7ff8fd, dl));
5442 } else { // LimitFloatPrecision <= 18
5443 // For floating-point precision of 18:
5444 //
5445 // TwoToFractionalPartOfX =
5446 // 0.999999982f +
5447 // (0.693148872f +
5448 // (0.240227044f +
5449 // (0.554906021e-1f +
5450 // (0.961591928e-2f +
5451 // (0.136028312e-2f + 0.157059148e-3f *x)*x)*x)*x)*x)*x;
5452 // error 2.47208000*10^(-7), which is better than 18 bits
5453 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5454 getF32Constant(DAG, 0x3924b03e, dl));
5455 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5456 getF32Constant(DAG, 0x3ab24b87, dl));
5457 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5458 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5459 getF32Constant(DAG, 0x3c1d8c17, dl));
5460 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5461 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5462 getF32Constant(DAG, 0x3d634a1d, dl));
5463 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5464 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5465 getF32Constant(DAG, 0x3e75fe14, dl));
5466 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5467 SDValue t11 = DAG.getNode(ISD::FADD, dl, MVT::f32, t10,
5468 getF32Constant(DAG, 0x3f317234, dl));
5469 SDValue t12 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t11, X);
5470 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t12,
5471 getF32Constant(DAG, 0x3f800000, dl));
5472 }
5473
5474 // Add the exponent into the result in integer domain.
5475 SDValue t13 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, TwoToFractionalPartOfX);
5476 return DAG.getNode(ISD::BITCAST, dl, MVT::f32,
5477 DAG.getNode(ISD::ADD, dl, MVT::i32, t13, IntegerPartOfX));
5478}
5479
5480/// expandExp - Lower an exp intrinsic. Handles the special sequences for
5481/// limited-precision mode.
5483 const TargetLowering &TLI, SDNodeFlags Flags) {
5484 if (Op.getValueType() == MVT::f32 &&
5486
5487 // Put the exponent in the right bit position for later addition to the
5488 // final result:
5489 //
5490 // t0 = Op * log2(e)
5491
5492 // TODO: What fast-math-flags should be set here?
5493 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, Op,
5494 DAG.getConstantFP(numbers::log2ef, dl, MVT::f32));
5495 return getLimitedPrecisionExp2(t0, dl, DAG);
5496 }
5497
5498 // No special expansion.
5499 return DAG.getNode(ISD::FEXP, dl, Op.getValueType(), Op, Flags);
5500}
5501
5502/// expandLog - Lower a log intrinsic. Handles the special sequences for
5503/// limited-precision mode.
5505 const TargetLowering &TLI, SDNodeFlags Flags) {
5506 // TODO: What fast-math-flags should be set on the floating-point nodes?
5507
5508 if (Op.getValueType() == MVT::f32 &&
5510 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5511
5512 // Scale the exponent by log(2).
5513 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5514 SDValue LogOfExponent =
5515 DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5516 DAG.getConstantFP(numbers::ln2f, dl, MVT::f32));
5517
5518 // Get the significand and build it into a floating-point number with
5519 // exponent of 1.
5520 SDValue X = GetSignificand(DAG, Op1, dl);
5521
5522 SDValue LogOfMantissa;
5523 if (LimitFloatPrecision <= 6) {
5524 // For floating-point precision of 6:
5525 //
5526 // LogofMantissa =
5527 // -1.1609546f +
5528 // (1.4034025f - 0.23903021f * x) * x;
5529 //
5530 // error 0.0034276066, which is better than 8 bits
5531 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5532 getF32Constant(DAG, 0xbe74c456, dl));
5533 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5534 getF32Constant(DAG, 0x3fb3a2b1, dl));
5535 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5536 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5537 getF32Constant(DAG, 0x3f949a29, dl));
5538 } else if (LimitFloatPrecision <= 12) {
5539 // For floating-point precision of 12:
5540 //
5541 // LogOfMantissa =
5542 // -1.7417939f +
5543 // (2.8212026f +
5544 // (-1.4699568f +
5545 // (0.44717955f - 0.56570851e-1f * x) * x) * x) * x;
5546 //
5547 // error 0.000061011436, which is 14 bits
5548 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5549 getF32Constant(DAG, 0xbd67b6d6, dl));
5550 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5551 getF32Constant(DAG, 0x3ee4f4b8, dl));
5552 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5553 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5554 getF32Constant(DAG, 0x3fbc278b, dl));
5555 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5556 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5557 getF32Constant(DAG, 0x40348e95, dl));
5558 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5559 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5560 getF32Constant(DAG, 0x3fdef31a, dl));
5561 } else { // LimitFloatPrecision <= 18
5562 // For floating-point precision of 18:
5563 //
5564 // LogOfMantissa =
5565 // -2.1072184f +
5566 // (4.2372794f +
5567 // (-3.7029485f +
5568 // (2.2781945f +
5569 // (-0.87823314f +
5570 // (0.19073739f - 0.17809712e-1f * x) * x) * x) * x) * x)*x;
5571 //
5572 // error 0.0000023660568, which is better than 18 bits
5573 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5574 getF32Constant(DAG, 0xbc91e5ac, dl));
5575 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5576 getF32Constant(DAG, 0x3e4350aa, dl));
5577 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5578 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5579 getF32Constant(DAG, 0x3f60d3e3, dl));
5580 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5581 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5582 getF32Constant(DAG, 0x4011cdf0, dl));
5583 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5584 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5585 getF32Constant(DAG, 0x406cfd1c, dl));
5586 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5587 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5588 getF32Constant(DAG, 0x408797cb, dl));
5589 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5590 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t10,
5591 getF32Constant(DAG, 0x4006dcab, dl));
5592 }
5593
5594 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, LogOfMantissa);
5595 }
5596
5597 // No special expansion.
5598 return DAG.getNode(ISD::FLOG, dl, Op.getValueType(), Op, Flags);
5599}
5600
5601/// expandLog2 - Lower a log2 intrinsic. Handles the special sequences for
5602/// limited-precision mode.
5604 const TargetLowering &TLI, SDNodeFlags Flags) {
5605 // TODO: What fast-math-flags should be set on the floating-point nodes?
5606
5607 if (Op.getValueType() == MVT::f32 &&
5609 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5610
5611 // Get the exponent.
5612 SDValue LogOfExponent = GetExponent(DAG, Op1, TLI, dl);
5613
5614 // Get the significand and build it into a floating-point number with
5615 // exponent of 1.
5616 SDValue X = GetSignificand(DAG, Op1, dl);
5617
5618 // Different possible minimax approximations of significand in
5619 // floating-point for various degrees of accuracy over [1,2].
5620 SDValue Log2ofMantissa;
5621 if (LimitFloatPrecision <= 6) {
5622 // For floating-point precision of 6:
5623 //
5624 // Log2ofMantissa = -1.6749035f + (2.0246817f - .34484768f * x) * x;
5625 //
5626 // error 0.0049451742, which is more than 7 bits
5627 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5628 getF32Constant(DAG, 0xbeb08fe0, dl));
5629 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5630 getF32Constant(DAG, 0x40019463, dl));
5631 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5632 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5633 getF32Constant(DAG, 0x3fd6633d, dl));
5634 } else if (LimitFloatPrecision <= 12) {
5635 // For floating-point precision of 12:
5636 //
5637 // Log2ofMantissa =
5638 // -2.51285454f +
5639 // (4.07009056f +
5640 // (-2.12067489f +
5641 // (.645142248f - 0.816157886e-1f * x) * x) * x) * x;
5642 //
5643 // error 0.0000876136000, which is better than 13 bits
5644 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5645 getF32Constant(DAG, 0xbda7262e, dl));
5646 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5647 getF32Constant(DAG, 0x3f25280b, dl));
5648 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5649 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5650 getF32Constant(DAG, 0x4007b923, dl));
5651 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5652 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5653 getF32Constant(DAG, 0x40823e2f, dl));
5654 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5655 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5656 getF32Constant(DAG, 0x4020d29c, dl));
5657 } else { // LimitFloatPrecision <= 18
5658 // For floating-point precision of 18:
5659 //
5660 // Log2ofMantissa =
5661 // -3.0400495f +
5662 // (6.1129976f +
5663 // (-5.3420409f +
5664 // (3.2865683f +
5665 // (-1.2669343f +
5666 // (0.27515199f -
5667 // 0.25691327e-1f * x) * x) * x) * x) * x) * x;
5668 //
5669 // error 0.0000018516, which is better than 18 bits
5670 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5671 getF32Constant(DAG, 0xbcd2769e, dl));
5672 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5673 getF32Constant(DAG, 0x3e8ce0b9, dl));
5674 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5675 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5676 getF32Constant(DAG, 0x3fa22ae7, dl));
5677 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5678 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5679 getF32Constant(DAG, 0x40525723, dl));
5680 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5681 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5682 getF32Constant(DAG, 0x40aaf200, dl));
5683 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5684 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5685 getF32Constant(DAG, 0x40c39dad, dl));
5686 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5687 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t10,
5688 getF32Constant(DAG, 0x4042902c, dl));
5689 }
5690
5691 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, Log2ofMantissa);
5692 }
5693
5694 // No special expansion.
5695 return DAG.getNode(ISD::FLOG2, dl, Op.getValueType(), Op, Flags);
5696}
5697
5698/// expandLog10 - Lower a log10 intrinsic. Handles the special sequences for
5699/// limited-precision mode.
5701 const TargetLowering &TLI, SDNodeFlags Flags) {
5702 // TODO: What fast-math-flags should be set on the floating-point nodes?
5703
5704 if (Op.getValueType() == MVT::f32 &&
5706 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5707
5708 // Scale the exponent by log10(2) [0.30102999f].
5709 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5710 SDValue LogOfExponent = DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5711 getF32Constant(DAG, 0x3e9a209a, dl));
5712
5713 // Get the significand and build it into a floating-point number with
5714 // exponent of 1.
5715 SDValue X = GetSignificand(DAG, Op1, dl);
5716
5717 SDValue Log10ofMantissa;
5718 if (LimitFloatPrecision <= 6) {
5719 // For floating-point precision of 6:
5720 //
5721 // Log10ofMantissa =
5722 // -0.50419619f +
5723 // (0.60948995f - 0.10380950f * x) * x;
5724 //
5725 // error 0.0014886165, which is 6 bits
5726 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5727 getF32Constant(DAG, 0xbdd49a13, dl));
5728 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5729 getF32Constant(DAG, 0x3f1c0789, dl));
5730 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5731 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5732 getF32Constant(DAG, 0x3f011300, dl));
5733 } else if (LimitFloatPrecision <= 12) {
5734 // For floating-point precision of 12:
5735 //
5736 // Log10ofMantissa =
5737 // -0.64831180f +
5738 // (0.91751397f +
5739 // (-0.31664806f + 0.47637168e-1f * x) * x) * x;
5740 //
5741 // error 0.00019228036, which is better than 12 bits
5742 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5743 getF32Constant(DAG, 0x3d431f31, dl));
5744 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
5745 getF32Constant(DAG, 0x3ea21fb2, dl));
5746 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5747 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5748 getF32Constant(DAG, 0x3f6ae232, dl));
5749 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5750 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
5751 getF32Constant(DAG, 0x3f25f7c3, dl));
5752 } else { // LimitFloatPrecision <= 18
5753 // For floating-point precision of 18:
5754 //
5755 // Log10ofMantissa =
5756 // -0.84299375f +
5757 // (1.5327582f +
5758 // (-1.0688956f +
5759 // (0.49102474f +
5760 // (-0.12539807f + 0.13508273e-1f * x) * x) * x) * x) * x;
5761 //
5762 // error 0.0000037995730, which is better than 18 bits
5763 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5764 getF32Constant(DAG, 0x3c5d51ce, dl));
5765 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
5766 getF32Constant(DAG, 0x3e00685a, dl));
5767 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5768 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5769 getF32Constant(DAG, 0x3efb6798, dl));
5770 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5771 SDValue t5 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
5772 getF32Constant(DAG, 0x3f88d192, dl));
5773 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5774 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5775 getF32Constant(DAG, 0x3fc4316c, dl));
5776 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5777 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t8,
5778 getF32Constant(DAG, 0x3f57ce70, dl));
5779 }
5780
5781 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, Log10ofMantissa);
5782 }
5783
5784 // No special expansion.
5785 return DAG.getNode(ISD::FLOG10, dl, Op.getValueType(), Op, Flags);
5786}
5787
5788/// expandExp2 - Lower an exp2 intrinsic. Handles the special sequences for
5789/// limited-precision mode.
5791 const TargetLowering &TLI, SDNodeFlags Flags) {
5792 if (Op.getValueType() == MVT::f32 &&
5794 return getLimitedPrecisionExp2(Op, dl, DAG);
5795
5796 // No special expansion.
5797 return DAG.getNode(ISD::FEXP2, dl, Op.getValueType(), Op, Flags);
5798}
5799
5800/// visitPow - Lower a pow intrinsic. Handles the special sequences for
5801/// limited-precision mode with x == 10.0f.
5802static SDValue expandPow(const SDLoc &dl, SDValue LHS, SDValue RHS,
5803 SelectionDAG &DAG, const TargetLowering &TLI,
5804 SDNodeFlags Flags) {
5805 bool IsExp10 = false;
5806 if (LHS.getValueType() == MVT::f32 && RHS.getValueType() == MVT::f32 &&
5808 if (ConstantFPSDNode *LHSC = dyn_cast<ConstantFPSDNode>(LHS)) {
5809 APFloat Ten(10.0f);
5810 IsExp10 = LHSC->isExactlyValue(Ten);
5811 }
5812 }
5813
5814 // TODO: What fast-math-flags should be set on the FMUL node?
5815 if (IsExp10) {
5816 // Put the exponent in the right bit position for later addition to the
5817 // final result:
5818 //
5819 // #define LOG2OF10 3.3219281f
5820 // t0 = Op * LOG2OF10;
5821 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, RHS,
5822 getF32Constant(DAG, 0x40549a78, dl));
5823 return getLimitedPrecisionExp2(t0, dl, DAG);
5824 }
5825
5826 // No special expansion.
5827 return DAG.getNode(ISD::FPOW, dl, LHS.getValueType(), LHS, RHS, Flags);
5828}
5829
5830/// ExpandPowI - Expand a llvm.powi intrinsic.
5831static SDValue ExpandPowI(const SDLoc &DL, SDValue LHS, SDValue RHS,
5832 SelectionDAG &DAG) {
5833 // If RHS is a constant, we can expand this out to a multiplication tree if
5834 // it's beneficial on the target, otherwise we end up lowering to a call to
5835 // __powidf2 (for example).
5836 if (ConstantSDNode *RHSC = dyn_cast<ConstantSDNode>(RHS)) {
5837 unsigned Val = RHSC->getSExtValue();
5838
5839 // powi(x, 0) -> 1.0
5840 if (Val == 0)
5841 return DAG.getConstantFP(1.0, DL, LHS.getValueType());
5842
5844 Val, DAG.shouldOptForSize())) {
5845 // Get the exponent as a positive value.
5846 if ((int)Val < 0)
5847 Val = -Val;
5848 // We use the simple binary decomposition method to generate the multiply
5849 // sequence. There are more optimal ways to do this (for example,
5850 // powi(x,15) generates one more multiply than it should), but this has
5851 // the benefit of being both really simple and much better than a libcall.
5852 SDValue Res; // Logically starts equal to 1.0
5853 SDValue CurSquare = LHS;
5854 // TODO: Intrinsics should have fast-math-flags that propagate to these
5855 // nodes.
5856 while (Val) {
5857 if (Val & 1) {
5858 if (Res.getNode())
5859 Res =
5860 DAG.getNode(ISD::FMUL, DL, Res.getValueType(), Res, CurSquare);
5861 else
5862 Res = CurSquare; // 1.0*CurSquare.
5863 }
5864
5865 CurSquare = DAG.getNode(ISD::FMUL, DL, CurSquare.getValueType(),
5866 CurSquare, CurSquare);
5867 Val >>= 1;
5868 }
5869
5870 // If the original was negative, invert the result, producing 1/(x*x*x).
5871 if (RHSC->getSExtValue() < 0)
5872 Res = DAG.getNode(ISD::FDIV, DL, LHS.getValueType(),
5873 DAG.getConstantFP(1.0, DL, LHS.getValueType()), Res);
5874 return Res;
5875 }
5876 }
5877
5878 // Otherwise, expand to a libcall.
5879 return DAG.getNode(ISD::FPOWI, DL, LHS.getValueType(), LHS, RHS);
5880}
5881
5882static SDValue expandDivFix(unsigned Opcode, const SDLoc &DL,
5883 SDValue LHS, SDValue RHS, SDValue Scale,
5884 SelectionDAG &DAG, const TargetLowering &TLI) {
5885 EVT VT = LHS.getValueType();
5886 bool Signed = Opcode == ISD::SDIVFIX || Opcode == ISD::SDIVFIXSAT;
5887 bool Saturating = Opcode == ISD::SDIVFIXSAT || Opcode == ISD::UDIVFIXSAT;
5888 LLVMContext &Ctx = *DAG.getContext();
5889
5890 // If the type is legal but the operation isn't, this node might survive all
5891 // the way to operation legalization. If we end up there and we do not have
5892 // the ability to widen the type (if VT*2 is not legal), we cannot expand the
5893 // node.
5894
5895 // Coax the legalizer into expanding the node during type legalization instead
5896 // by bumping the size by one bit. This will force it to Promote, enabling the
5897 // early expansion and avoiding the need to expand later.
5898
5899 // We don't have to do this if Scale is 0; that can always be expanded, unless
5900 // it's a saturating signed operation. Those can experience true integer
5901 // division overflow, a case which we must avoid.
5902
5903 // FIXME: We wouldn't have to do this (or any of the early
5904 // expansion/promotion) if it was possible to expand a libcall of an
5905 // illegal type during operation legalization. But it's not, so things
5906 // get a bit hacky.
5907 unsigned ScaleInt = Scale->getAsZExtVal();
5908 if ((ScaleInt > 0 || (Saturating && Signed)) &&
5909 (TLI.isTypeLegal(VT) ||
5910 (VT.isVector() && TLI.isTypeLegal(VT.getVectorElementType())))) {
5912 Opcode, VT, ScaleInt);
5913 if (Action != TargetLowering::Legal && Action != TargetLowering::Custom) {
5914 EVT PromVT;
5915 if (VT.isScalarInteger())
5916 PromVT = EVT::getIntegerVT(Ctx, VT.getSizeInBits() + 1);
5917 else if (VT.isVector()) {
5918 PromVT = VT.getVectorElementType();
5919 PromVT = EVT::getIntegerVT(Ctx, PromVT.getSizeInBits() + 1);
5920 PromVT = EVT::getVectorVT(Ctx, PromVT, VT.getVectorElementCount());
5921 } else
5922 llvm_unreachable("Wrong VT for DIVFIX?");
5923 LHS = DAG.getExtOrTrunc(Signed, LHS, DL, PromVT);
5924 RHS = DAG.getExtOrTrunc(Signed, RHS, DL, PromVT);
5925 EVT ShiftTy = TLI.getShiftAmountTy(PromVT, DAG.getDataLayout());
5926 // For saturating operations, we need to shift up the LHS to get the
5927 // proper saturation width, and then shift down again afterwards.
5928 if (Saturating)
5929 LHS = DAG.getNode(ISD::SHL, DL, PromVT, LHS,
5930 DAG.getConstant(1, DL, ShiftTy));
5931 SDValue Res = DAG.getNode(Opcode, DL, PromVT, LHS, RHS, Scale);
5932 if (Saturating)
5933 Res = DAG.getNode(Signed ? ISD::SRA : ISD::SRL, DL, PromVT, Res,
5934 DAG.getConstant(1, DL, ShiftTy));
5935 return DAG.getZExtOrTrunc(Res, DL, VT);
5936 }
5937 }
5938
5939 return DAG.getNode(Opcode, DL, VT, LHS, RHS, Scale);
5940}
5941
5942// getUnderlyingArgRegs - Find underlying registers used for a truncated,
5943// bitcasted, or split argument. Returns a list of <Register, size in bits>
5944static void
5945getUnderlyingArgRegs(SmallVectorImpl<std::pair<unsigned, TypeSize>> &Regs,
5946 const SDValue &N) {
5947 switch (N.getOpcode()) {
5948 case ISD::CopyFromReg: {
5949 SDValue Op = N.getOperand(1);
5950 Regs.emplace_back(cast<RegisterSDNode>(Op)->getReg(),
5951 Op.getValueType().getSizeInBits());
5952 return;
5953 }
5954 case ISD::BITCAST:
5955 case ISD::AssertZext:
5956 case ISD::AssertSext:
5957 case ISD::TRUNCATE:
5958 getUnderlyingArgRegs(Regs, N.getOperand(0));
5959 return;
5960 case ISD::BUILD_PAIR:
5961 case ISD::BUILD_VECTOR:
5963 for (SDValue Op : N->op_values())
5964 getUnderlyingArgRegs(Regs, Op);
5965 return;
5966 default:
5967 return;
5968 }
5969}
5970
5971/// If the DbgValueInst is a dbg_value of a function argument, create the
5972/// corresponding DBG_VALUE machine instruction for it now. At the end of
5973/// instruction selection, they will be inserted to the entry BB.
5974/// We don't currently support this for variadic dbg_values, as they shouldn't
5975/// appear for function arguments or in the prologue.
5976bool SelectionDAGBuilder::EmitFuncArgumentDbgValue(
5977 const Value *V, DILocalVariable *Variable, DIExpression *Expr,
5978 DILocation *DL, FuncArgumentDbgValueKind Kind, const SDValue &N) {
5979 const Argument *Arg = dyn_cast<Argument>(V);
5980 if (!Arg)
5981 return false;
5982
5985
5986 // Helper to create DBG_INSTR_REFs or DBG_VALUEs, depending on what kind
5987 // we've been asked to pursue.
5988 auto MakeVRegDbgValue = [&](Register Reg, DIExpression *FragExpr,
5989 bool Indirect) {
5990 if (Reg.isVirtual() && MF.useDebugInstrRef()) {
5991 // For VRegs, in instruction referencing mode, create a DBG_INSTR_REF
5992 // pointing at the VReg, which will be patched up later.
5993 auto &Inst = TII->get(TargetOpcode::DBG_INSTR_REF);
5995 /* Reg */ Reg, /* isDef */ false, /* isImp */ false,
5996 /* isKill */ false, /* isDead */ false,
5997 /* isUndef */ false, /* isEarlyClobber */ false,
5998 /* SubReg */ 0, /* isDebug */ true)});
5999
6000 auto *NewDIExpr = FragExpr;
6001 // We don't have an "Indirect" field in DBG_INSTR_REF, fold that into
6002 // the DIExpression.
6003 if (Indirect)
6004 NewDIExpr = DIExpression::prepend(FragExpr, DIExpression::DerefBefore);
6006 NewDIExpr = DIExpression::prependOpcodes(NewDIExpr, Ops);
6007 return BuildMI(MF, DL, Inst, false, MOs, Variable, NewDIExpr);
6008 } else {
6009 // Create a completely standard DBG_VALUE.
6010 auto &Inst = TII->get(TargetOpcode::DBG_VALUE);
6011 return BuildMI(MF, DL, Inst, Indirect, Reg, Variable, FragExpr);
6012 }
6013 };
6014
6015 if (Kind == FuncArgumentDbgValueKind::Value) {
6016 // ArgDbgValues are hoisted to the beginning of the entry block. So we
6017 // should only emit as ArgDbgValue if the dbg.value intrinsic is found in
6018 // the entry block.
6019 bool IsInEntryBlock = FuncInfo.MBB == &FuncInfo.MF->front();
6020 if (!IsInEntryBlock)
6021 return false;
6022
6023 // ArgDbgValues are hoisted to the beginning of the entry block. So we
6024 // should only emit as ArgDbgValue if the dbg.value intrinsic describes a
6025 // variable that also is a param.
6026 //
6027 // Although, if we are at the top of the entry block already, we can still
6028 // emit using ArgDbgValue. This might catch some situations when the
6029 // dbg.value refers to an argument that isn't used in the entry block, so
6030 // any CopyToReg node would be optimized out and the only way to express
6031 // this DBG_VALUE is by using the physical reg (or FI) as done in this
6032 // method. ArgDbgValues are hoisted to the beginning of the entry block. So
6033 // we should only emit as ArgDbgValue if the Variable is an argument to the
6034 // current function, and the dbg.value intrinsic is found in the entry
6035 // block.
6036 bool VariableIsFunctionInputArg = Variable->isParameter() &&
6037 !DL->getInlinedAt();
6038 bool IsInPrologue = SDNodeOrder == LowestSDNodeOrder;
6039 if (!IsInPrologue && !VariableIsFunctionInputArg)
6040 return false;
6041
6042 // Here we assume that a function argument on IR level only can be used to
6043 // describe one input parameter on source level. If we for example have
6044 // source code like this
6045 //
6046 // struct A { long x, y; };
6047 // void foo(struct A a, long b) {
6048 // ...
6049 // b = a.x;
6050 // ...
6051 // }
6052 //
6053 // and IR like this
6054 //
6055 // define void @foo(i32 %a1, i32 %a2, i32 %b) {
6056 // entry:
6057 // call void @llvm.dbg.value(metadata i32 %a1, "a", DW_OP_LLVM_fragment
6058 // call void @llvm.dbg.value(metadata i32 %a2, "a", DW_OP_LLVM_fragment
6059 // call void @llvm.dbg.value(metadata i32 %b, "b",
6060 // ...
6061 // call void @llvm.dbg.value(metadata i32 %a1, "b"
6062 // ...
6063 //
6064 // then the last dbg.value is describing a parameter "b" using a value that
6065 // is an argument. But since we already has used %a1 to describe a parameter
6066 // we should not handle that last dbg.value here (that would result in an
6067 // incorrect hoisting of the DBG_VALUE to the function entry).
6068 // Notice that we allow one dbg.value per IR level argument, to accommodate
6069 // for the situation with fragments above.
6070 // If there is no node for the value being handled, we return true to skip
6071 // the normal generation of debug info, as it would kill existing debug
6072 // info for the parameter in case of duplicates.
6073 if (VariableIsFunctionInputArg) {
6074 unsigned ArgNo = Arg->getArgNo();
6075 if (ArgNo >= FuncInfo.DescribedArgs.size())
6076 FuncInfo.DescribedArgs.resize(ArgNo + 1, false);
6077 else if (!IsInPrologue && FuncInfo.DescribedArgs.test(ArgNo))
6078 return !NodeMap[V].getNode();
6079 FuncInfo.DescribedArgs.set(ArgNo);
6080 }
6081 }
6082
6083 bool IsIndirect = false;
6084 std::optional<MachineOperand> Op;
6085 // Some arguments' frame index is recorded during argument lowering.
6086 int FI = FuncInfo.getArgumentFrameIndex(Arg);
6087 if (FI != std::numeric_limits<int>::max())
6089
6091 if (!Op && N.getNode()) {
6092 getUnderlyingArgRegs(ArgRegsAndSizes, N);
6093 Register Reg;
6094 if (ArgRegsAndSizes.size() == 1)
6095 Reg = ArgRegsAndSizes.front().first;
6096
6097 if (Reg && Reg.isVirtual()) {
6099 Register PR = RegInfo.getLiveInPhysReg(Reg);
6100 if (PR)
6101 Reg = PR;
6102 }
6103 if (Reg) {
6104 Op = MachineOperand::CreateReg(Reg, false);
6105 IsIndirect = Kind != FuncArgumentDbgValueKind::Value;
6106 }
6107 }
6108
6109 if (!Op && N.getNode()) {
6110 // Check if frame index is available.
6111 SDValue LCandidate = peekThroughBitcasts(N);
6112 if (LoadSDNode *LNode = dyn_cast<LoadSDNode>(LCandidate.getNode()))
6113 if (FrameIndexSDNode *FINode =
6114 dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
6115 Op = MachineOperand::CreateFI(FINode->getIndex());
6116 }
6117
6118 if (!Op) {
6119 // Create a DBG_VALUE for each decomposed value in ArgRegs to cover Reg
6120 auto splitMultiRegDbgValue = [&](ArrayRef<std::pair<unsigned, TypeSize>>
6121 SplitRegs) {
6122 unsigned Offset = 0;
6123 for (const auto &RegAndSize : SplitRegs) {
6124 // If the expression is already a fragment, the current register
6125 // offset+size might extend beyond the fragment. In this case, only
6126 // the register bits that are inside the fragment are relevant.
6127 int RegFragmentSizeInBits = RegAndSize.second;
6128 if (auto ExprFragmentInfo = Expr->getFragmentInfo()) {
6129 uint64_t ExprFragmentSizeInBits = ExprFragmentInfo->SizeInBits;
6130 // The register is entirely outside the expression fragment,
6131 // so is irrelevant for debug info.
6132 if (Offset >= ExprFragmentSizeInBits)
6133 break;
6134 // The register is partially outside the expression fragment, only
6135 // the low bits within the fragment are relevant for debug info.
6136 if (Offset + RegFragmentSizeInBits > ExprFragmentSizeInBits) {
6137 RegFragmentSizeInBits = ExprFragmentSizeInBits - Offset;
6138 }
6139 }
6140
6141 auto FragmentExpr = DIExpression::createFragmentExpression(
6142 Expr, Offset, RegFragmentSizeInBits);
6143 Offset += RegAndSize.second;
6144 // If a valid fragment expression cannot be created, the variable's
6145 // correct value cannot be determined and so it is set as Undef.
6146 if (!FragmentExpr) {
6148 Variable, Expr, UndefValue::get(V->getType()), DL, SDNodeOrder);
6149 DAG.AddDbgValue(SDV, false);
6150 continue;
6151 }
6152 MachineInstr *NewMI =
6153 MakeVRegDbgValue(RegAndSize.first, *FragmentExpr,
6154 Kind != FuncArgumentDbgValueKind::Value);
6155 FuncInfo.ArgDbgValues.push_back(NewMI);
6156 }
6157 };
6158
6159 // Check if ValueMap has reg number.
6161 VMI = FuncInfo.ValueMap.find(V);
6162 if (VMI != FuncInfo.ValueMap.end()) {
6163 const auto &TLI = DAG.getTargetLoweringInfo();
6164 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), VMI->second,
6165 V->getType(), std::nullopt);
6166 if (RFV.occupiesMultipleRegs()) {
6167 splitMultiRegDbgValue(RFV.getRegsAndSizes());
6168 return true;
6169 }
6170
6171 Op = MachineOperand::CreateReg(VMI->second, false);
6172 IsIndirect = Kind != FuncArgumentDbgValueKind::Value;
6173 } else if (ArgRegsAndSizes.size() > 1) {
6174 // This was split due to the calling convention, and no virtual register
6175 // mapping exists for the value.
6176 splitMultiRegDbgValue(ArgRegsAndSizes);
6177 return true;
6178 }
6179 }
6180
6181 if (!Op)
6182 return false;
6183
6185 "Expected inlined-at fields to agree");
6186 MachineInstr *NewMI = nullptr;
6187
6188 if (Op->isReg())
6189 NewMI = MakeVRegDbgValue(Op->getReg(), Expr, IsIndirect);
6190 else
6191 NewMI = BuildMI(MF, DL, TII->get(TargetOpcode::DBG_VALUE), true, *Op,
6192 Variable, Expr);
6193
6194 // Otherwise, use ArgDbgValues.
6195 FuncInfo.ArgDbgValues.push_back(NewMI);
6196 return true;
6197}
6198
6199/// Return the appropriate SDDbgValue based on N.
6200SDDbgValue *SelectionDAGBuilder::getDbgValue(SDValue N,
6201 DILocalVariable *Variable,
6202 DIExpression *Expr,
6203 const DebugLoc &dl,
6204 unsigned DbgSDNodeOrder) {
6205 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(N.getNode())) {
6206 // Construct a FrameIndexDbgValue for FrameIndexSDNodes so we can describe
6207 // stack slot locations.
6208 //
6209 // Consider "int x = 0; int *px = &x;". There are two kinds of interesting
6210 // debug values here after optimization:
6211 //
6212 // dbg.value(i32* %px, !"int *px", !DIExpression()), and
6213 // dbg.value(i32* %px, !"int x", !DIExpression(DW_OP_deref))
6214 //
6215 // Both describe the direct values of their associated variables.
6216 return DAG.getFrameIndexDbgValue(Variable, Expr, FISDN->getIndex(),
6217 /*IsIndirect*/ false, dl, DbgSDNodeOrder);
6218 }
6219 return DAG.getDbgValue(Variable, Expr, N.getNode(), N.getResNo(),
6220 /*IsIndirect*/ false, dl, DbgSDNodeOrder);
6221}
6222
6223static unsigned FixedPointIntrinsicToOpcode(unsigned Intrinsic) {
6224 switch (Intrinsic) {
6225 case Intrinsic::smul_fix:
6226 return ISD::SMULFIX;
6227 case Intrinsic::umul_fix:
6228 return ISD::UMULFIX;
6229 case Intrinsic::smul_fix_sat:
6230 return ISD::SMULFIXSAT;
6231 case Intrinsic::umul_fix_sat:
6232 return ISD::UMULFIXSAT;
6233 case Intrinsic::sdiv_fix:
6234 return ISD::SDIVFIX;
6235 case Intrinsic::udiv_fix:
6236 return ISD::UDIVFIX;
6237 case Intrinsic::sdiv_fix_sat:
6238 return ISD::SDIVFIXSAT;
6239 case Intrinsic::udiv_fix_sat:
6240 return ISD::UDIVFIXSAT;
6241 default:
6242 llvm_unreachable("Unhandled fixed point intrinsic");
6243 }
6244}
6245
6246void SelectionDAGBuilder::lowerCallToExternalSymbol(const CallInst &I,
6247 const char *FunctionName) {
6248 assert(FunctionName && "FunctionName must not be nullptr");
6250 FunctionName,
6252 LowerCallTo(I, Callee, I.isTailCall(), I.isMustTailCall());
6253}
6254
6255/// Given a @llvm.call.preallocated.setup, return the corresponding
6256/// preallocated call.
6257static const CallBase *FindPreallocatedCall(const Value *PreallocatedSetup) {
6258 assert(cast<CallBase>(PreallocatedSetup)
6260 ->getIntrinsicID() == Intrinsic::call_preallocated_setup &&
6261 "expected call_preallocated_setup Value");
6262 for (const auto *U : PreallocatedSetup->users()) {
6263 auto *UseCall = cast<CallBase>(U);
6264 const Function *Fn = UseCall->getCalledFunction();
6265 if (!Fn || Fn->getIntrinsicID() != Intrinsic::call_preallocated_arg) {
6266 return UseCall;
6267 }
6268 }
6269 llvm_unreachable("expected corresponding call to preallocated setup/arg");
6270}
6271
6272/// If DI is a debug value with an EntryValue expression, lower it using the
6273/// corresponding physical register of the associated Argument value
6274/// (guaranteed to exist by the verifier).
6275bool SelectionDAGBuilder::visitEntryValueDbgValue(
6276 ArrayRef<const Value *> Values, DILocalVariable *Variable,
6277 DIExpression *Expr, DebugLoc DbgLoc) {
6278 if (!Expr->isEntryValue() || !hasSingleElement(Values))
6279 return false;
6280
6281 // These properties are guaranteed by the verifier.
6282 const Argument *Arg = cast<Argument>(Values[0]);
6283 assert(Arg->hasAttribute(Attribute::AttrKind::SwiftAsync));
6284
6285 auto ArgIt = FuncInfo.ValueMap.find(Arg);
6286 if (ArgIt == FuncInfo.ValueMap.end()) {
6287 LLVM_DEBUG(
6288 dbgs() << "Dropping dbg.value: expression is entry_value but "
6289 "couldn't find an associated register for the Argument\n");
6290 return true;
6291 }
6292 Register ArgVReg = ArgIt->getSecond();
6293
6294 for (auto [PhysReg, VirtReg] : FuncInfo.RegInfo->liveins())
6295 if (ArgVReg == VirtReg || ArgVReg == PhysReg) {
6297 Variable, Expr, PhysReg, false /*IsIndidrect*/, DbgLoc, SDNodeOrder);
6298 DAG.AddDbgValue(SDV, false /*treat as dbg.declare byval parameter*/);
6299 return true;
6300 }
6301 LLVM_DEBUG(dbgs() << "Dropping dbg.value: expression is entry_value but "
6302 "couldn't find a physical register\n");
6303 return true;
6304}
6305
6306/// Lower the call to the specified intrinsic function.
6307void SelectionDAGBuilder::visitConvergenceControl(const CallInst &I,
6308 unsigned Intrinsic) {
6309 SDLoc sdl = getCurSDLoc();
6310 switch (Intrinsic) {
6311 case Intrinsic::experimental_convergence_anchor:
6312 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_ANCHOR, sdl, MVT::Untyped));
6313 break;
6314 case Intrinsic::experimental_convergence_entry:
6315 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_ENTRY, sdl, MVT::Untyped));
6316 break;
6317 case Intrinsic::experimental_convergence_loop: {
6318 auto Bundle = I.getOperandBundle(LLVMContext::OB_convergencectrl);
6319 auto *Token = Bundle->Inputs[0].get();
6320 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_LOOP, sdl, MVT::Untyped,
6321 getValue(Token)));
6322 break;
6323 }
6324 }
6325}
6326
6327void SelectionDAGBuilder::visitVectorHistogram(const CallInst &I,
6328 unsigned IntrinsicID) {
6329 // For now, we're only lowering an 'add' histogram.
6330 // We can add others later, e.g. saturating adds, min/max.
6331 assert(IntrinsicID == Intrinsic::experimental_vector_histogram_add &&
6332 "Tried to lower unsupported histogram type");
6333 SDLoc sdl = getCurSDLoc();
6334 Value *Ptr = I.getOperand(0);
6335 SDValue Inc = getValue(I.getOperand(1));
6336 SDValue Mask = getValue(I.getOperand(2));
6337
6339 DataLayout TargetDL = DAG.getDataLayout();
6340 EVT VT = Inc.getValueType();
6341 Align Alignment = DAG.getEVTAlign(VT);
6342
6343 const MDNode *Ranges = getRangeMetadata(I);
6344
6345 SDValue Root = DAG.getRoot();
6346 SDValue Base;
6347 SDValue Index;
6348 ISD::MemIndexType IndexType;
6349 SDValue Scale;
6350 bool UniformBase = getUniformBase(Ptr, Base, Index, IndexType, Scale, this,
6351 I.getParent(), VT.getScalarStoreSize());
6352
6353 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
6354
6358 MemoryLocation::UnknownSize, Alignment, I.getAAMetadata(), Ranges);
6359
6360 if (!UniformBase) {
6362 Index = getValue(Ptr);
6363 IndexType = ISD::SIGNED_SCALED;
6364 Scale =
6366 }
6367
6368 EVT IdxVT = Index.getValueType();
6369 EVT EltTy = IdxVT.getVectorElementType();
6370 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
6371 EVT NewIdxVT = IdxVT.changeVectorElementType(EltTy);
6372 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
6373 }
6374
6375 SDValue ID = DAG.getTargetConstant(IntrinsicID, sdl, MVT::i32);
6376
6377 SDValue Ops[] = {Root, Inc, Mask, Base, Index, Scale, ID};
6378 SDValue Histogram = DAG.getMaskedHistogram(DAG.getVTList(MVT::Other), VT, sdl,
6379 Ops, MMO, IndexType);
6380
6381 setValue(&I, Histogram);
6382 DAG.setRoot(Histogram);
6383}
6384
6385/// Lower the call to the specified intrinsic function.
6386void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
6387 unsigned Intrinsic) {
6389 SDLoc sdl = getCurSDLoc();
6390 DebugLoc dl = getCurDebugLoc();
6391 SDValue Res;
6392
6394 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
6395 Flags.copyFMF(*FPOp);
6396
6397 switch (Intrinsic) {
6398 default:
6399 // By default, turn this into a target intrinsic node.
6400 visitTargetIntrinsic(I, Intrinsic);
6401 return;
6402 case Intrinsic::vscale: {
6403 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6404 setValue(&I, DAG.getVScale(sdl, VT, APInt(VT.getSizeInBits(), 1)));
6405 return;
6406 }
6407 case Intrinsic::vastart: visitVAStart(I); return;
6408 case Intrinsic::vaend: visitVAEnd(I); return;
6409 case Intrinsic::vacopy: visitVACopy(I); return;
6410 case Intrinsic::returnaddress:
6412 TLI.getValueType(DAG.getDataLayout(), I.getType()),
6413 getValue(I.getArgOperand(0))));
6414 return;
6415 case Intrinsic::addressofreturnaddress:
6416 setValue(&I,
6418 TLI.getValueType(DAG.getDataLayout(), I.getType())));
6419 return;
6420 case Intrinsic::sponentry:
6421 setValue(&I,
6423 TLI.getValueType(DAG.getDataLayout(), I.getType())));
6424 return;
6425 case Intrinsic::frameaddress:
6428 getValue(I.getArgOperand(0))));
6429 return;
6430 case Intrinsic::read_volatile_register:
6431 case Intrinsic::read_register: {
6432 Value *Reg = I.getArgOperand(0);
6433 SDValue Chain = getRoot();
6435 DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
6436 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6437 Res = DAG.getNode(ISD::READ_REGISTER, sdl,
6438 DAG.getVTList(VT, MVT::Other), Chain, RegName);
6439 setValue(&I, Res);
6440 DAG.setRoot(Res.getValue(1));
6441 return;
6442 }
6443 case Intrinsic::write_register: {
6444 Value *Reg = I.getArgOperand(0);
6445 Value *RegValue = I.getArgOperand(1);
6446 SDValue Chain = getRoot();
6448 DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
6449 DAG.setRoot(DAG.getNode(ISD::WRITE_REGISTER, sdl, MVT::Other, Chain,
6450 RegName, getValue(RegValue)));
6451 return;
6452 }
6453 case Intrinsic::memcpy: {
6454 const auto &MCI = cast<MemCpyInst>(I);
6455 SDValue Op1 = getValue(I.getArgOperand(0));
6456 SDValue Op2 = getValue(I.getArgOperand(1));
6457 SDValue Op3 = getValue(I.getArgOperand(2));
6458 // @llvm.memcpy defines 0 and 1 to both mean no alignment.
6459 Align DstAlign = MCI.getDestAlign().valueOrOne();
6460 Align SrcAlign = MCI.getSourceAlign().valueOrOne();
6461 Align Alignment = std::min(DstAlign, SrcAlign);
6462 bool isVol = MCI.isVolatile();
6463 // FIXME: Support passing different dest/src alignments to the memcpy DAG
6464 // node.
6465 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6466 SDValue MC = DAG.getMemcpy(Root, sdl, Op1, Op2, Op3, Alignment, isVol,
6467 /* AlwaysInline */ false, &I, std::nullopt,
6468 MachinePointerInfo(I.getArgOperand(0)),
6469 MachinePointerInfo(I.getArgOperand(1)),
6470 I.getAAMetadata(), AA);
6471 updateDAGForMaybeTailCall(MC);
6472 return;
6473 }
6474 case Intrinsic::memcpy_inline: {
6475 const auto &MCI = cast<MemCpyInlineInst>(I);
6476 SDValue Dst = getValue(I.getArgOperand(0));
6477 SDValue Src = getValue(I.getArgOperand(1));
6478 SDValue Size = getValue(I.getArgOperand(2));
6479 assert(isa<ConstantSDNode>(Size) && "memcpy_inline needs constant size");
6480 // @llvm.memcpy.inline defines 0 and 1 to both mean no alignment.
6481 Align DstAlign = MCI.getDestAlign().valueOrOne();
6482 Align SrcAlign = MCI.getSourceAlign().valueOrOne();
6483 Align Alignment = std::min(DstAlign, SrcAlign);
6484 bool isVol = MCI.isVolatile();
6485 // FIXME: Support passing different dest/src alignments to the memcpy DAG
6486 // node.
6487 SDValue MC = DAG.getMemcpy(getRoot(), sdl, Dst, Src, Size, Alignment, isVol,
6488 /* AlwaysInline */ true, &I, std::nullopt,
6489 MachinePointerInfo(I.getArgOperand(0)),
6490 MachinePointerInfo(I.getArgOperand(1)),
6491 I.getAAMetadata(), AA);
6492 updateDAGForMaybeTailCall(MC);
6493 return;
6494 }
6495 case Intrinsic::memset: {
6496 const auto &MSI = cast<MemSetInst>(I);
6497 SDValue Op1 = getValue(I.getArgOperand(0));
6498 SDValue Op2 = getValue(I.getArgOperand(1));
6499 SDValue Op3 = getValue(I.getArgOperand(2));
6500 // @llvm.memset defines 0 and 1 to both mean no alignment.
6501 Align Alignment = MSI.getDestAlign().valueOrOne();
6502 bool isVol = MSI.isVolatile();
6503 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6504 SDValue MS = DAG.getMemset(
6505 Root, sdl, Op1, Op2, Op3, Alignment, isVol, /* AlwaysInline */ false,
6506 &I, MachinePointerInfo(I.getArgOperand(0)), I.getAAMetadata());
6507 updateDAGForMaybeTailCall(MS);
6508 return;
6509 }
6510 case Intrinsic::memset_inline: {
6511 const auto &MSII = cast<MemSetInlineInst>(I);
6512 SDValue Dst = getValue(I.getArgOperand(0));
6513 SDValue Value = getValue(I.getArgOperand(1));
6514 SDValue Size = getValue(I.getArgOperand(2));
6515 assert(isa<ConstantSDNode>(Size) && "memset_inline needs constant size");
6516 // @llvm.memset defines 0 and 1 to both mean no alignment.
6517 Align DstAlign = MSII.getDestAlign().valueOrOne();
6518 bool isVol = MSII.isVolatile();
6519 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6520 SDValue MC = DAG.getMemset(Root, sdl, Dst, Value, Size, DstAlign, isVol,
6521 /* AlwaysInline */ true, &I,
6522 MachinePointerInfo(I.getArgOperand(0)),
6523 I.getAAMetadata());
6524 updateDAGForMaybeTailCall(MC);
6525 return;
6526 }
6527 case Intrinsic::memmove: {
6528 const auto &MMI = cast<MemMoveInst>(I);
6529 SDValue Op1 = getValue(I.getArgOperand(0));
6530 SDValue Op2 = getValue(I.getArgOperand(1));
6531 SDValue Op3 = getValue(I.getArgOperand(2));
6532 // @llvm.memmove defines 0 and 1 to both mean no alignment.
6533 Align DstAlign = MMI.getDestAlign().valueOrOne();
6534 Align SrcAlign = MMI.getSourceAlign().valueOrOne();
6535 Align Alignment = std::min(DstAlign, SrcAlign);
6536 bool isVol = MMI.isVolatile();
6537 // FIXME: Support passing different dest/src alignments to the memmove DAG
6538 // node.
6539 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6540 SDValue MM = DAG.getMemmove(Root, sdl, Op1, Op2, Op3, Alignment, isVol, &I,
6541 /* OverrideTailCall */ std::nullopt,
6542 MachinePointerInfo(I.getArgOperand(0)),
6543 MachinePointerInfo(I.getArgOperand(1)),
6544 I.getAAMetadata(), AA);
6545 updateDAGForMaybeTailCall(MM);
6546 return;
6547 }
6548 case Intrinsic::memcpy_element_unordered_atomic: {
6549 const AtomicMemCpyInst &MI = cast<AtomicMemCpyInst>(I);
6550 SDValue Dst = getValue(MI.getRawDest());
6551 SDValue Src = getValue(MI.getRawSource());
6552 SDValue Length = getValue(MI.getLength());
6553
6554 Type *LengthTy = MI.getLength()->getType();
6555 unsigned ElemSz = MI.getElementSizeInBytes();
6556 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6557 SDValue MC =
6558 DAG.getAtomicMemcpy(getRoot(), sdl, Dst, Src, Length, LengthTy, ElemSz,
6559 isTC, MachinePointerInfo(MI.getRawDest()),
6560 MachinePointerInfo(MI.getRawSource()));
6561 updateDAGForMaybeTailCall(MC);
6562 return;
6563 }
6564 case Intrinsic::memmove_element_unordered_atomic: {
6565 auto &MI = cast<AtomicMemMoveInst>(I);
6566 SDValue Dst = getValue(MI.getRawDest());
6567 SDValue Src = getValue(MI.getRawSource());
6568 SDValue Length = getValue(MI.getLength());
6569
6570 Type *LengthTy = MI.getLength()->getType();
6571 unsigned ElemSz = MI.getElementSizeInBytes();
6572 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6573 SDValue MC =
6574 DAG.getAtomicMemmove(getRoot(), sdl, Dst, Src, Length, LengthTy, ElemSz,
6575 isTC, MachinePointerInfo(MI.getRawDest()),
6576 MachinePointerInfo(MI.getRawSource()));
6577 updateDAGForMaybeTailCall(MC);
6578 return;
6579 }
6580 case Intrinsic::memset_element_unordered_atomic: {
6581 auto &MI = cast<AtomicMemSetInst>(I);
6582 SDValue Dst = getValue(MI.getRawDest());
6583 SDValue Val = getValue(MI.getValue());
6584 SDValue Length = getValue(MI.getLength());
6585
6586 Type *LengthTy = MI.getLength()->getType();
6587 unsigned ElemSz = MI.getElementSizeInBytes();
6588 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6589 SDValue MC =
6590 DAG.getAtomicMemset(getRoot(), sdl, Dst, Val, Length, LengthTy, ElemSz,
6591 isTC, MachinePointerInfo(MI.getRawDest()));
6592 updateDAGForMaybeTailCall(MC);
6593 return;
6594 }
6595 case Intrinsic::call_preallocated_setup: {
6596 const CallBase *PreallocatedCall = FindPreallocatedCall(&I);
6597 SDValue SrcValue = DAG.getSrcValue(PreallocatedCall);
6598 SDValue Res = DAG.getNode(ISD::PREALLOCATED_SETUP, sdl, MVT::Other,
6599 getRoot(), SrcValue);
6600 setValue(&I, Res);
6601 DAG.setRoot(Res);
6602 return;
6603 }
6604 case Intrinsic::call_preallocated_arg: {
6605 const CallBase *PreallocatedCall = FindPreallocatedCall(I.getOperand(0));
6606 SDValue SrcValue = DAG.getSrcValue(PreallocatedCall);
6607 SDValue Ops[3];
6608 Ops[0] = getRoot();
6609 Ops[1] = SrcValue;
6610 Ops[2] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(1)), sdl,
6611 MVT::i32); // arg index
6612 SDValue Res = DAG.getNode(
6614 DAG.getVTList(TLI.getPointerTy(DAG.getDataLayout()), MVT::Other), Ops);
6615 setValue(&I, Res);
6616 DAG.setRoot(Res.getValue(1));
6617 return;
6618 }
6619 case Intrinsic::dbg_declare: {
6620 const auto &DI = cast<DbgDeclareInst>(I);
6621 // Debug intrinsics are handled separately in assignment tracking mode.
6622 // Some intrinsics are handled right after Argument lowering.
6623 if (AssignmentTrackingEnabled ||
6625 return;
6626 LLVM_DEBUG(dbgs() << "SelectionDAG visiting dbg_declare: " << DI << "\n");
6627 DILocalVariable *Variable = DI.getVariable();
6628 DIExpression *Expression = DI.getExpression();
6630 // Assume dbg.declare can not currently use DIArgList, i.e.
6631 // it is non-variadic.
6632 assert(!DI.hasArgList() && "Only dbg.value should currently use DIArgList");
6633 handleDebugDeclare(DI.getVariableLocationOp(0), Variable, Expression,
6634 DI.getDebugLoc());
6635 return;
6636 }
6637 case Intrinsic::dbg_label: {
6638 const DbgLabelInst &DI = cast<DbgLabelInst>(I);
6639 DILabel *Label = DI.getLabel();
6640 assert(Label && "Missing label");
6641
6642 SDDbgLabel *SDV;
6643 SDV = DAG.getDbgLabel(Label, dl, SDNodeOrder);
6644 DAG.AddDbgLabel(SDV);
6645 return;
6646 }
6647 case Intrinsic::dbg_assign: {
6648 // Debug intrinsics are handled separately in assignment tracking mode.
6649 if (AssignmentTrackingEnabled)
6650 return;
6651 // If assignment tracking hasn't been enabled then fall through and treat
6652 // the dbg.assign as a dbg.value.
6653 [[fallthrough]];
6654 }
6655 case Intrinsic::dbg_value: {
6656 // Debug intrinsics are handled separately in assignment tracking mode.
6657 if (AssignmentTrackingEnabled)
6658 return;
6659 const DbgValueInst &DI = cast<DbgValueInst>(I);
6660 assert(DI.getVariable() && "Missing variable");
6661
6662 DILocalVariable *Variable = DI.getVariable();
6665
6666 if (DI.isKillLocation()) {
6667 handleKillDebugValue(Variable, Expression, DI.getDebugLoc(), SDNodeOrder);
6668 return;
6669 }
6670
6672 if (Values.empty())
6673 return;
6674
6675 bool IsVariadic = DI.hasArgList();
6676 if (!handleDebugValue(Values, Variable, Expression, DI.getDebugLoc(),
6677 SDNodeOrder, IsVariadic))
6678 addDanglingDebugInfo(Values, Variable, Expression, IsVariadic,
6679 DI.getDebugLoc(), SDNodeOrder);
6680 return;
6681 }
6682
6683 case Intrinsic::eh_typeid_for: {
6684 // Find the type id for the given typeinfo.
6685 GlobalValue *GV = ExtractTypeInfo(I.getArgOperand(0));
6686 unsigned TypeID = DAG.getMachineFunction().getTypeIDFor(GV);
6687 Res = DAG.getConstant(TypeID, sdl, MVT::i32);
6688 setValue(&I, Res);
6689 return;
6690 }
6691
6692 case Intrinsic::eh_return_i32:
6693 case Intrinsic::eh_return_i64:
6696 MVT::Other,
6698 getValue(I.getArgOperand(0)),
6699 getValue(I.getArgOperand(1))));
6700 return;
6701 case Intrinsic::eh_unwind_init:
6703 return;
6704 case Intrinsic::eh_dwarf_cfa:
6707 getValue(I.getArgOperand(0))));
6708 return;
6709 case Intrinsic::eh_sjlj_callsite: {
6710 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(0));
6711 assert(DAG.getMMI()->getCurrentCallSite() == 0 &&
6712 "Overlapping call sites!");
6713
6715 return;
6716 }
6717 case Intrinsic::eh_sjlj_functioncontext: {
6718 // Get and store the index of the function context.
6720 AllocaInst *FnCtx =
6721 cast<AllocaInst>(I.getArgOperand(0)->stripPointerCasts());
6722 int FI = FuncInfo.StaticAllocaMap[FnCtx];
6724 return;
6725 }
6726 case Intrinsic::eh_sjlj_setjmp: {
6727 SDValue Ops[2];
6728 Ops[0] = getRoot();
6729 Ops[1] = getValue(I.getArgOperand(0));
6731 DAG.getVTList(MVT::i32, MVT::Other), Ops);
6732 setValue(&I, Op.getValue(0));
6733 DAG.setRoot(Op.getValue(1));
6734 return;
6735 }
6736 case Intrinsic::eh_sjlj_longjmp:
6737 DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_LONGJMP, sdl, MVT::Other,
6738 getRoot(), getValue(I.getArgOperand(0))));
6739 return;
6740 case Intrinsic::eh_sjlj_setup_dispatch:
6742 getRoot()));
6743 return;
6744 case Intrinsic::masked_gather:
6745 visitMaskedGather(I);
6746 return;
6747 case Intrinsic::masked_load:
6748 visitMaskedLoad(I);
6749 return;
6750 case Intrinsic::masked_scatter:
6751 visitMaskedScatter(I);
6752 return;
6753 case Intrinsic::masked_store:
6754 visitMaskedStore(I);
6755 return;
6756 case Intrinsic::masked_expandload:
6757 visitMaskedLoad(I, true /* IsExpanding */);
6758 return;
6759 case Intrinsic::masked_compressstore:
6760 visitMaskedStore(I, true /* IsCompressing */);
6761 return;
6762 case Intrinsic::powi:
6763 setValue(&I, ExpandPowI(sdl, getValue(I.getArgOperand(0)),
6764 getValue(I.getArgOperand(1)), DAG));
6765 return;
6766 case Intrinsic::log:
6767 setValue(&I, expandLog(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6768 return;
6769 case Intrinsic::log2:
6770 setValue(&I,
6771 expandLog2(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6772 return;
6773 case Intrinsic::log10:
6774 setValue(&I,
6775 expandLog10(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6776 return;
6777 case Intrinsic::exp:
6778 setValue(&I, expandExp(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6779 return;
6780 case Intrinsic::exp2:
6781 setValue(&I,
6782 expandExp2(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6783 return;
6784 case Intrinsic::pow:
6785 setValue(&I, expandPow(sdl, getValue(I.getArgOperand(0)),
6786 getValue(I.getArgOperand(1)), DAG, TLI, Flags));
6787 return;
6788 case Intrinsic::sqrt:
6789 case Intrinsic::fabs:
6790 case Intrinsic::sin:
6791 case Intrinsic::cos:
6792 case Intrinsic::tan:
6793 case Intrinsic::asin:
6794 case Intrinsic::acos:
6795 case Intrinsic::atan:
6796 case Intrinsic::sinh:
6797 case Intrinsic::cosh:
6798 case Intrinsic::tanh:
6799 case Intrinsic::exp10:
6800 case Intrinsic::floor:
6801 case Intrinsic::ceil:
6802 case Intrinsic::trunc:
6803 case Intrinsic::rint:
6804 case Intrinsic::nearbyint:
6805 case Intrinsic::round:
6806 case Intrinsic::roundeven:
6807 case Intrinsic::canonicalize: {
6808 unsigned Opcode;
6809 // clang-format off
6810 switch (Intrinsic) {
6811 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
6812 case Intrinsic::sqrt: Opcode = ISD::FSQRT; break;
6813 case Intrinsic::fabs: Opcode = ISD::FABS; break;
6814 case Intrinsic::sin: Opcode = ISD::FSIN; break;
6815 case Intrinsic::cos: Opcode = ISD::FCOS; break;
6816 case Intrinsic::tan: Opcode = ISD::FTAN; break;
6817 case Intrinsic::asin: Opcode = ISD::FASIN; break;
6818 case Intrinsic::acos: Opcode = ISD::FACOS; break;
6819 case Intrinsic::atan: Opcode = ISD::FATAN; break;
6820 case Intrinsic::sinh: Opcode = ISD::FSINH; break;
6821 case Intrinsic::cosh: Opcode = ISD::FCOSH; break;
6822 case Intrinsic::tanh: Opcode = ISD::FTANH; break;
6823 case Intrinsic::exp10: Opcode = ISD::FEXP10; break;
6824 case Intrinsic::floor: Opcode = ISD::FFLOOR; break;
6825 case Intrinsic::ceil: Opcode = ISD::FCEIL; break;
6826 case Intrinsic::trunc: Opcode = ISD::FTRUNC; break;
6827 case Intrinsic::rint: Opcode = ISD::FRINT; break;
6828 case Intrinsic::nearbyint: Opcode = ISD::FNEARBYINT; break;
6829 case Intrinsic::round: Opcode = ISD::FROUND; break;
6830 case Intrinsic::roundeven: Opcode = ISD::FROUNDEVEN; break;
6831 case Intrinsic::canonicalize: Opcode = ISD::FCANONICALIZE; break;
6832 }
6833 // clang-format on
6834
6835 setValue(&I, DAG.getNode(Opcode, sdl,
6836 getValue(I.getArgOperand(0)).getValueType(),
6837 getValue(I.getArgOperand(0)), Flags));
6838 return;
6839 }
6840 case Intrinsic::lround:
6841 case Intrinsic::llround:
6842 case Intrinsic::lrint:
6843 case Intrinsic::llrint: {
6844 unsigned Opcode;
6845 // clang-format off
6846 switch (Intrinsic) {
6847 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
6848 case Intrinsic::lround: Opcode = ISD::LROUND; break;
6849 case Intrinsic::llround: Opcode = ISD::LLROUND; break;
6850 case Intrinsic::lrint: Opcode = ISD::LRINT; break;
6851 case Intrinsic::llrint: Opcode = ISD::LLRINT; break;
6852 }
6853 // clang-format on
6854
6855 EVT RetVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6856 setValue(&I, DAG.getNode(Opcode, sdl, RetVT,
6857 getValue(I.getArgOperand(0))));
6858 return;
6859 }
6860 case Intrinsic::minnum:
6862 getValue(I.getArgOperand(0)).getValueType(),
6863 getValue(I.getArgOperand(0)),
6864 getValue(I.getArgOperand(1)), Flags));
6865 return;
6866 case Intrinsic::maxnum:
6868 getValue(I.getArgOperand(0)).getValueType(),
6869 getValue(I.getArgOperand(0)),
6870 getValue(I.getArgOperand(1)), Flags));
6871 return;
6872 case Intrinsic::minimum:
6874 getValue(I.getArgOperand(0)).getValueType(),
6875 getValue(I.getArgOperand(0)),
6876 getValue(I.getArgOperand(1)), Flags));
6877 return;
6878 case Intrinsic::maximum:
6880 getValue(I.getArgOperand(0)).getValueType(),
6881 getValue(I.getArgOperand(0)),
6882 getValue(I.getArgOperand(1)), Flags));
6883 return;
6884 case Intrinsic::copysign:
6886 getValue(I.getArgOperand(0)).getValueType(),
6887 getValue(I.getArgOperand(0)),
6888 getValue(I.getArgOperand(1)), Flags));
6889 return;
6890 case Intrinsic::ldexp:
6892 getValue(I.getArgOperand(0)).getValueType(),
6893 getValue(I.getArgOperand(0)),
6894 getValue(I.getArgOperand(1)), Flags));
6895 return;
6896 case Intrinsic::frexp: {
6897 SmallVector<EVT, 2> ValueVTs;
6898 ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);
6899 SDVTList VTs = DAG.getVTList(ValueVTs);
6900 setValue(&I,
6901 DAG.getNode(ISD::FFREXP, sdl, VTs, getValue(I.getArgOperand(0))));
6902 return;
6903 }
6904 case Intrinsic::arithmetic_fence: {
6906 getValue(I.getArgOperand(0)).getValueType(),
6907 getValue(I.getArgOperand(0)), Flags));
6908 return;
6909 }
6910 case Intrinsic::fma:
6912 ISD::FMA, sdl, getValue(I.getArgOperand(0)).getValueType(),
6913 getValue(I.getArgOperand(0)), getValue(I.getArgOperand(1)),
6914 getValue(I.getArgOperand(2)), Flags));
6915 return;
6916#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
6917 case Intrinsic::INTRINSIC:
6918#include "llvm/IR/ConstrainedOps.def"
6919 visitConstrainedFPIntrinsic(cast<ConstrainedFPIntrinsic>(I));
6920 return;
6921#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID:
6922#include "llvm/IR/VPIntrinsics.def"
6923 visitVectorPredicationIntrinsic(cast<VPIntrinsic>(I));
6924 return;
6925 case Intrinsic::fptrunc_round: {
6926 // Get the last argument, the metadata and convert it to an integer in the
6927 // call
6928 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(1))->getMetadata();
6929 std::optional<RoundingMode> RoundMode =
6930 convertStrToRoundingMode(cast<MDString>(MD)->getString());
6931
6932 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6933
6934 // Propagate fast-math-flags from IR to node(s).
6936 Flags.copyFMF(*cast<FPMathOperator>(&I));
6937 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
6938
6940 Result = DAG.getNode(
6941 ISD::FPTRUNC_ROUND, sdl, VT, getValue(I.getArgOperand(0)),
6942 DAG.getTargetConstant((int)*RoundMode, sdl,
6944 setValue(&I, Result);
6945
6946 return;
6947 }
6948 case Intrinsic::fmuladd: {
6949 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6952 setValue(&I, DAG.getNode(ISD::FMA, sdl,
6953 getValue(I.getArgOperand(0)).getValueType(),
6954 getValue(I.getArgOperand(0)),
6955 getValue(I.getArgOperand(1)),
6956 getValue(I.getArgOperand(2)), Flags));
6957 } else {
6958 // TODO: Intrinsic calls should have fast-math-flags.
6960 ISD::FMUL, sdl, getValue(I.getArgOperand(0)).getValueType(),
6961 getValue(I.getArgOperand(0)), getValue(I.getArgOperand(1)), Flags);
6963 getValue(I.getArgOperand(0)).getValueType(),
6964 Mul, getValue(I.getArgOperand(2)), Flags);
6965 setValue(&I, Add);
6966 }
6967 return;
6968 }
6969 case Intrinsic::convert_to_fp16:
6970 setValue(&I, DAG.getNode(ISD::BITCAST, sdl, MVT::i16,
6971 DAG.getNode(ISD::FP_ROUND, sdl, MVT::f16,
6972 getValue(I.getArgOperand(0)),
6973 DAG.getTargetConstant(0, sdl,
6974 MVT::i32))));
6975 return;
6976 case Intrinsic::convert_from_fp16:
6978 TLI.getValueType(DAG.getDataLayout(), I.getType()),
6979 DAG.getNode(ISD::BITCAST, sdl, MVT::f16,
6980 getValue(I.getArgOperand(0)))));
6981 return;
6982 case Intrinsic::fptosi_sat: {
6983 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6985 getValue(I.getArgOperand(0)),
6987 return;
6988 }
6989 case Intrinsic::fptoui_sat: {
6990 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6992 getValue(I.getArgOperand(0)),
6994 return;
6995 }
6996 case Intrinsic::set_rounding:
6997 Res = DAG.getNode(ISD::SET_ROUNDING, sdl, MVT::Other,
6998 {getRoot(), getValue(I.getArgOperand(0))});
6999 setValue(&I, Res);
7000 DAG.setRoot(Res.getValue(0));
7001 return;
7002 case Intrinsic::is_fpclass: {
7003 const DataLayout DLayout = DAG.getDataLayout();
7004 EVT DestVT = TLI.getValueType(DLayout, I.getType());
7005 EVT ArgVT = TLI.getValueType(DLayout, I.getArgOperand(0)->getType());
7006 FPClassTest Test = static_cast<FPClassTest>(
7007 cast<ConstantInt>(I.getArgOperand(1))->getZExtValue());
7009 const Function &F = MF.getFunction();
7010 SDValue Op = getValue(I.getArgOperand(0));
7012 Flags.setNoFPExcept(
7013 !F.getAttributes().hasFnAttr(llvm::Attribute::StrictFP));
7014 // If ISD::IS_FPCLASS should be expanded, do it right now, because the
7015 // expansion can use illegal types. Making expansion early allows
7016 // legalizing these types prior to selection.
7017 if (!TLI.isOperationLegalOrCustom(ISD::IS_FPCLASS, ArgVT)) {
7018 SDValue Result = TLI.expandIS_FPCLASS(DestVT, Op, Test, Flags, sdl, DAG);
7019 setValue(&I, Result);
7020 return;
7021 }
7022
7023 SDValue Check = DAG.getTargetConstant(Test, sdl, MVT::i32);
7024 SDValue V = DAG.getNode(ISD::IS_FPCLASS, sdl, DestVT, {Op, Check}, Flags);
7025 setValue(&I, V);
7026 return;
7027 }
7028 case Intrinsic::get_fpenv: {
7029 const DataLayout DLayout = DAG.getDataLayout();
7030 EVT EnvVT = TLI.getValueType(DLayout, I.getType());
7031 Align TempAlign = DAG.getEVTAlign(EnvVT);
7032 SDValue Chain = getRoot();
7033 // Use GET_FPENV if it is legal or custom. Otherwise use memory-based node
7034 // and temporary storage in stack.
7035 if (TLI.isOperationLegalOrCustom(ISD::GET_FPENV, EnvVT)) {
7036 Res = DAG.getNode(
7037 ISD::GET_FPENV, sdl,
7038 DAG.getVTList(TLI.getValueType(DAG.getDataLayout(), I.getType()),
7039 MVT::Other),
7040 Chain);
7041 } else {
7042 SDValue Temp = DAG.CreateStackTemporary(EnvVT, TempAlign.value());
7043 int SPFI = cast<FrameIndexSDNode>(Temp.getNode())->getIndex();
7044 auto MPI =
7048 TempAlign);
7049 Chain = DAG.getGetFPEnv(Chain, sdl, Temp, EnvVT, MMO);
7050 Res = DAG.getLoad(EnvVT, sdl, Chain, Temp, MPI);
7051 }
7052 setValue(&I, Res);
7053 DAG.setRoot(Res.getValue(1));
7054 return;
7055 }
7056 case Intrinsic::set_fpenv: {
7057 const DataLayout DLayout = DAG.getDataLayout();
7058 SDValue Env = getValue(I.getArgOperand(0));
7059 EVT EnvVT = Env.getValueType();
7060 Align TempAlign = DAG.getEVTAlign(EnvVT);
7061 SDValue Chain = getRoot();
7062 // If SET_FPENV is custom or legal, use it. Otherwise use loading
7063 // environment from memory.
7064 if (TLI.isOperationLegalOrCustom(ISD::SET_FPENV, EnvVT)) {
7065 Chain = DAG.getNode(ISD::SET_FPENV, sdl, MVT::Other, Chain, Env);
7066 } else {
7067 // Allocate space in stack, copy environment bits into it and use this
7068 // memory in SET_FPENV_MEM.
7069 SDValue Temp = DAG.CreateStackTemporary(EnvVT, TempAlign.value());
7070 int SPFI = cast<FrameIndexSDNode>(Temp.getNode())->getIndex();
7071 auto MPI =
7073 Chain = DAG.getStore(Chain, sdl, Env, Temp, MPI, TempAlign,
7077 TempAlign);
7078 Chain = DAG.getSetFPEnv(Chain, sdl, Temp, EnvVT, MMO);
7079 }
7080 DAG.setRoot(Chain);
7081 return;
7082 }
7083 case Intrinsic::reset_fpenv:
7084 DAG.setRoot(DAG.getNode(ISD::RESET_FPENV, sdl, MVT::Other, getRoot()));
7085 return;
7086 case Intrinsic::get_fpmode:
7087 Res = DAG.getNode(
7088 ISD::GET_FPMODE, sdl,
7089 DAG.getVTList(TLI.getValueType(DAG.getDataLayout(), I.getType()),
7090 MVT::Other),
7091 DAG.getRoot());
7092 setValue(&I, Res);
7093 DAG.setRoot(Res.getValue(1));
7094 return;
7095 case Intrinsic::set_fpmode:
7096 Res = DAG.getNode(ISD::SET_FPMODE, sdl, MVT::Other, {DAG.getRoot()},
7097 getValue(I.getArgOperand(0)));
7098 DAG.setRoot(Res);
7099 return;
7100 case Intrinsic::reset_fpmode: {
7101 Res = DAG.getNode(ISD::RESET_FPMODE, sdl, MVT::Other, getRoot());
7102 DAG.setRoot(Res);
7103 return;
7104 }
7105 case Intrinsic::pcmarker: {
7106 SDValue Tmp = getValue(I.getArgOperand(0));
7107 DAG.setRoot(DAG.getNode(ISD::PCMARKER, sdl, MVT::Other, getRoot(), Tmp));
7108 return;
7109 }
7110 case Intrinsic::readcyclecounter: {
7111 SDValue Op = getRoot();
7113 DAG.getVTList(MVT::i64, MVT::Other), Op);
7114 setValue(&I, Res);
7115 DAG.setRoot(Res.getValue(1));
7116 return;
7117 }
7118 case Intrinsic::readsteadycounter: {
7119 SDValue Op = getRoot();
7121 DAG.getVTList(MVT::i64, MVT::Other), Op);
7122 setValue(&I, Res);
7123 DAG.setRoot(Res.getValue(1));
7124 return;
7125 }
7126 case Intrinsic::bitreverse:
7128 getValue(I.getArgOperand(0)).getValueType(),
7129 getValue(I.getArgOperand(0))));
7130 return;
7131 case Intrinsic::bswap:
7133 getValue(I.getArgOperand(0)).getValueType(),
7134 getValue(I.getArgOperand(0))));
7135 return;
7136 case Intrinsic::cttz: {
7137 SDValue Arg = getValue(I.getArgOperand(0));
7138 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
7139 EVT Ty = Arg.getValueType();
7141 sdl, Ty, Arg));
7142 return;
7143 }
7144 case Intrinsic::ctlz: {
7145 SDValue Arg = getValue(I.getArgOperand(0));
7146 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
7147 EVT Ty = Arg.getValueType();
7149 sdl, Ty, Arg));
7150 return;
7151 }
7152 case Intrinsic::ctpop: {
7153 SDValue Arg = getValue(I.getArgOperand(0));
7154 EVT Ty = Arg.getValueType();
7155 setValue(&I, DAG.getNode(ISD::CTPOP, sdl, Ty, Arg));
7156 return;
7157 }
7158 case Intrinsic::fshl:
7159 case Intrinsic::fshr: {
7160 bool IsFSHL = Intrinsic == Intrinsic::fshl;
7161 SDValue X = getValue(I.getArgOperand(0));
7162 SDValue Y = getValue(I.getArgOperand(1));
7163 SDValue Z = getValue(I.getArgOperand(2));
7164 EVT VT = X.getValueType();
7165
7166 if (X == Y) {
7167 auto RotateOpcode = IsFSHL ? ISD::ROTL : ISD::ROTR;
7168 setValue(&I, DAG.getNode(RotateOpcode, sdl, VT, X, Z));
7169 } else {
7170 auto FunnelOpcode = IsFSHL ? ISD::FSHL : ISD::FSHR;
7171 setValue(&I, DAG.getNode(FunnelOpcode, sdl, VT, X, Y, Z));
7172 }
7173 return;
7174 }
7175 case Intrinsic::sadd_sat: {
7176 SDValue Op1 = getValue(I.getArgOperand(0));
7177 SDValue Op2 = getValue(I.getArgOperand(1));
7178 setValue(&I, DAG.getNode(ISD::SADDSAT, sdl, Op1.getValueType(), Op1, Op2));
7179 return;
7180 }
7181 case Intrinsic::uadd_sat: {
7182 SDValue Op1 = getValue(I.getArgOperand(0));
7183 SDValue Op2 = getValue(I.getArgOperand(1));
7184 setValue(&I, DAG.getNode(ISD::UADDSAT, sdl, Op1.getValueType(), Op1, Op2));
7185 return;
7186 }
7187 case Intrinsic::ssub_sat: {
7188 SDValue Op1 = getValue(I.getArgOperand(0));
7189 SDValue Op2 = getValue(I.getArgOperand(1));
7190 setValue(&I, DAG.getNode(ISD::SSUBSAT, sdl, Op1.getValueType(), Op1, Op2));
7191 return;
7192 }
7193 case Intrinsic::usub_sat: {
7194 SDValue Op1 = getValue(I.getArgOperand(0));
7195 SDValue Op2 = getValue(I.getArgOperand(1));
7196 setValue(&I, DAG.getNode(ISD::USUBSAT, sdl, Op1.getValueType(), Op1, Op2));
7197 return;
7198 }
7199 case Intrinsic::sshl_sat: {
7200 SDValue Op1 = getValue(I.getArgOperand(0));
7201 SDValue Op2 = getValue(I.getArgOperand(1));
7202 setValue(&I, DAG.getNode(ISD::SSHLSAT, sdl, Op1.getValueType(), Op1, Op2));
7203 return;
7204 }
7205 case Intrinsic::ushl_sat: {
7206 SDValue Op1 = getValue(I.getArgOperand(0));
7207 SDValue Op2 = getValue(I.getArgOperand(1));
7208 setValue(&I, DAG.getNode(ISD::USHLSAT, sdl, Op1.getValueType(), Op1, Op2));
7209 return;
7210 }
7211 case Intrinsic::smul_fix:
7212 case Intrinsic::umul_fix:
7213 case Intrinsic::smul_fix_sat:
7214 case Intrinsic::umul_fix_sat: {
7215 SDValue Op1 = getValue(I.getArgOperand(0));
7216 SDValue Op2 = getValue(I.getArgOperand(1));
7217 SDValue Op3 = getValue(I.getArgOperand(2));
7219 Op1.getValueType(), Op1, Op2, Op3));
7220 return;
7221 }
7222 case Intrinsic::sdiv_fix:
7223 case Intrinsic::udiv_fix:
7224 case Intrinsic::sdiv_fix_sat:
7225 case Intrinsic::udiv_fix_sat: {
7226 SDValue Op1 = getValue(I.getArgOperand(0));
7227 SDValue Op2 = getValue(I.getArgOperand(1));
7228 SDValue Op3 = getValue(I.getArgOperand(2));
7230 Op1, Op2, Op3, DAG, TLI));
7231 return;
7232 }
7233 case Intrinsic::smax: {
7234 SDValue Op1 = getValue(I.getArgOperand(0));
7235 SDValue Op2 = getValue(I.getArgOperand(1));
7236 setValue(&I, DAG.getNode(ISD::SMAX, sdl, Op1.getValueType(), Op1, Op2));
7237 return;
7238 }
7239 case Intrinsic::smin: {
7240 SDValue Op1 = getValue(I.getArgOperand(0));
7241 SDValue Op2 = getValue(I.getArgOperand(1));
7242 setValue(&I, DAG.getNode(ISD::SMIN, sdl, Op1.getValueType(), Op1, Op2));
7243 return;
7244 }
7245 case Intrinsic::umax: {
7246 SDValue Op1 = getValue(I.getArgOperand(0));
7247 SDValue Op2 = getValue(I.getArgOperand(1));
7248 setValue(&I, DAG.getNode(ISD::UMAX, sdl, Op1.getValueType(), Op1, Op2));
7249 return;
7250 }
7251 case Intrinsic::umin: {
7252 SDValue Op1 = getValue(I.getArgOperand(0));
7253 SDValue Op2 = getValue(I.getArgOperand(1));
7254 setValue(&I, DAG.getNode(ISD::UMIN, sdl, Op1.getValueType(), Op1, Op2));
7255 return;
7256 }
7257 case Intrinsic::abs: {
7258 // TODO: Preserve "int min is poison" arg in SDAG?
7259 SDValue Op1 = getValue(I.getArgOperand(0));
7260 setValue(&I, DAG.getNode(ISD::ABS, sdl, Op1.getValueType(), Op1));
7261 return;
7262 }
7263 case Intrinsic::scmp: {
7264 SDValue Op1 = getValue(I.getArgOperand(0));
7265 SDValue Op2 = getValue(I.getArgOperand(1));
7266 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7267 setValue(&I, DAG.getNode(ISD::SCMP, sdl, DestVT, Op1, Op2));
7268 break;
7269 }
7270 case Intrinsic::ucmp: {
7271 SDValue Op1 = getValue(I.getArgOperand(0));
7272 SDValue Op2 = getValue(I.getArgOperand(1));
7273 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7274 setValue(&I, DAG.getNode(ISD::UCMP, sdl, DestVT, Op1, Op2));
7275 break;
7276 }
7277 case Intrinsic::stacksave: {
7278 SDValue Op = getRoot();
7279 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7280 Res = DAG.getNode(ISD::STACKSAVE, sdl, DAG.getVTList(VT, MVT::Other), Op);
7281 setValue(&I, Res);
7282 DAG.setRoot(Res.getValue(1));
7283 return;
7284 }
7285 case Intrinsic::stackrestore:
7286 Res = getValue(I.getArgOperand(0));
7287 DAG.setRoot(DAG.getNode(ISD::STACKRESTORE, sdl, MVT::Other, getRoot(), Res));
7288 return;
7289 case Intrinsic::get_dynamic_area_offset: {
7290 SDValue Op = getRoot();
7291 EVT PtrTy = TLI.getFrameIndexTy(DAG.getDataLayout());
7292 EVT ResTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
7293 // Result type for @llvm.get.dynamic.area.offset should match PtrTy for
7294 // target.
7295 if (PtrTy.getFixedSizeInBits() < ResTy.getFixedSizeInBits())
7296 report_fatal_error("Wrong result type for @llvm.get.dynamic.area.offset"
7297 " intrinsic!");
7299 Op);
7300 DAG.setRoot(Op);
7301 setValue(&I, Res);
7302 return;
7303 }
7304 case Intrinsic::stackguard: {
7306 const Module &M = *MF.getFunction().getParent();
7307 EVT PtrTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
7308 SDValue Chain = getRoot();
7309 if (TLI.useLoadStackGuardNode()) {
7310 Res = getLoadStackGuard(DAG, sdl, Chain);
7311 Res = DAG.getPtrExtOrTrunc(Res, sdl, PtrTy);
7312 } else {
7313 const Value *Global = TLI.getSDagStackGuard(M);
7315 Res = DAG.getLoad(PtrTy, sdl, Chain, getValue(Global),
7318 }
7319 if (TLI.useStackGuardXorFP())
7320 Res = TLI.emitStackGuardXorFP(DAG, Res, sdl);
7321 DAG.setRoot(Chain);
7322 setValue(&I, Res);
7323 return;
7324 }
7325 case Intrinsic::stackprotector: {
7326 // Emit code into the DAG to store the stack guard onto the stack.
7328 MachineFrameInfo &MFI = MF.getFrameInfo();
7329 SDValue Src, Chain = getRoot();
7330
7331 if (TLI.useLoadStackGuardNode())
7332 Src = getLoadStackGuard(DAG, sdl, Chain);
7333 else
7334 Src = getValue(I.getArgOperand(0)); // The guard's value.
7335
7336 AllocaInst *Slot = cast<AllocaInst>(I.getArgOperand(1));
7337
7338 int FI = FuncInfo.StaticAllocaMap[Slot];
7339 MFI.setStackProtectorIndex(FI);
7340 EVT PtrTy = TLI.getFrameIndexTy(DAG.getDataLayout());
7341
7342 SDValue FIN = DAG.getFrameIndex(FI, PtrTy);
7343
7344 // Store the stack protector onto the stack.
7345 Res = DAG.getStore(
7346 Chain, sdl, Src, FIN,
7349 setValue(&I, Res);
7350 DAG.setRoot(Res);
7351 return;
7352 }
7353 case Intrinsic::objectsize:
7354 llvm_unreachable("llvm.objectsize.* should have been lowered already");
7355
7356 case Intrinsic::is_constant:
7357 llvm_unreachable("llvm.is.constant.* should have been lowered already");
7358
7359 case Intrinsic::annotation:
7360 case Intrinsic::ptr_annotation:
7361 case Intrinsic::launder_invariant_group:
7362 case Intrinsic::strip_invariant_group:
7363 // Drop the intrinsic, but forward the value
7364 setValue(&I, getValue(I.getOperand(0)));
7365 return;
7366
7367 case Intrinsic::assume:
7368 case Intrinsic::experimental_noalias_scope_decl:
7369 case Intrinsic::var_annotation:
7370 case Intrinsic::sideeffect:
7371 // Discard annotate attributes, noalias scope declarations, assumptions, and
7372 // artificial side-effects.
7373 return;
7374
7375 case Intrinsic::codeview_annotation: {
7376 // Emit a label associated with this metadata.
7378 MCSymbol *Label = MF.getContext().createTempSymbol("annotation", true);
7379 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(0))->getMetadata();
7380 MF.addCodeViewAnnotation(Label, cast<MDNode>(MD));
7381 Res = DAG.getLabelNode(ISD::ANNOTATION_LABEL, sdl, getRoot(), Label);
7382 DAG.setRoot(Res);
7383 return;
7384 }
7385
7386 case Intrinsic::init_trampoline: {
7387 const Function *F = cast<Function>(I.getArgOperand(1)->stripPointerCasts());
7388
7389 SDValue Ops[6];
7390 Ops[0] = getRoot();
7391 Ops[1] = getValue(I.getArgOperand(0));
7392 Ops[2] = getValue(I.getArgOperand(1));
7393 Ops[3] = getValue(I.getArgOperand(2));
7394 Ops[4] = DAG.getSrcValue(I.getArgOperand(0));
7395 Ops[5] = DAG.getSrcValue(F);
7396
7397 Res = DAG.getNode(ISD::INIT_TRAMPOLINE, sdl, MVT::Other, Ops);
7398
7399 DAG.setRoot(Res);
7400 return;
7401 }
7402 case Intrinsic::adjust_trampoline:
7405 getValue(I.getArgOperand(0))));
7406 return;
7407 case Intrinsic::gcroot: {
7409 "only valid in functions with gc specified, enforced by Verifier");
7410 assert(GFI && "implied by previous");
7411 const Value *Alloca = I.getArgOperand(0)->stripPointerCasts();
7412 const Constant *TypeMap = cast<Constant>(I.getArgOperand(1));
7413
7414 FrameIndexSDNode *FI = cast<FrameIndexSDNode>(getValue(Alloca).getNode());
7415 GFI->addStackRoot(FI->getIndex(), TypeMap);
7416 return;
7417 }
7418 case Intrinsic::gcread:
7419 case Intrinsic::gcwrite:
7420 llvm_unreachable("GC failed to lower gcread/gcwrite intrinsics!");
7421 case Intrinsic::get_rounding:
7422 Res = DAG.getNode(ISD::GET_ROUNDING, sdl, {MVT::i32, MVT::Other}, getRoot());
7423 setValue(&I, Res);
7424 DAG.setRoot(Res.getValue(1));
7425 return;
7426
7427 case Intrinsic::expect:
7428 // Just replace __builtin_expect(exp, c) with EXP.
7429 setValue(&I, getValue(I.getArgOperand(0)));
7430 return;
7431
7432 case Intrinsic::ubsantrap:
7433 case Intrinsic::debugtrap:
7434 case Intrinsic::trap: {
7435 StringRef TrapFuncName =
7436 I.getAttributes().getFnAttr("trap-func-name").getValueAsString();
7437 if (TrapFuncName.empty()) {
7438 switch (Intrinsic) {
7439 case Intrinsic::trap:
7440 DAG.setRoot(DAG.getNode(ISD::TRAP, sdl, MVT::Other, getRoot()));
7441 break;
7442 case Intrinsic::debugtrap:
7443 DAG.setRoot(DAG.getNode(ISD::DEBUGTRAP, sdl, MVT::Other, getRoot()));
7444 break;
7445 case Intrinsic::ubsantrap:
7447 ISD::UBSANTRAP, sdl, MVT::Other, getRoot(),
7449 cast<ConstantInt>(I.getArgOperand(0))->getZExtValue(), sdl,
7450 MVT::i32)));
7451 break;
7452 default: llvm_unreachable("unknown trap intrinsic");
7453 }
7454 return;
7455 }
7457 if (Intrinsic == Intrinsic::ubsantrap) {
7459 Args[0].Val = I.getArgOperand(0);
7460 Args[0].Node = getValue(Args[0].Val);
7461 Args[0].Ty = Args[0].Val->getType();
7462 }
7463
7465 CLI.setDebugLoc(sdl).setChain(getRoot()).setLibCallee(
7466 CallingConv::C, I.getType(),
7467 DAG.getExternalSymbol(TrapFuncName.data(),
7469 std::move(Args));
7470
7471 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
7472 DAG.setRoot(Result.second);
7473 return;
7474 }
7475
7476 case Intrinsic::allow_runtime_check:
7477 case Intrinsic::allow_ubsan_check:
7478 setValue(&I, getValue(ConstantInt::getTrue(I.getType())));
7479 return;
7480
7481 case Intrinsic::uadd_with_overflow:
7482 case Intrinsic::sadd_with_overflow:
7483 case Intrinsic::usub_with_overflow:
7484 case Intrinsic::ssub_with_overflow:
7485 case Intrinsic::umul_with_overflow:
7486 case Intrinsic::smul_with_overflow: {
7488 switch (Intrinsic) {
7489 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
7490 case Intrinsic::uadd_with_overflow: Op = ISD::UADDO; break;
7491 case Intrinsic::sadd_with_overflow: Op = ISD::SADDO; break;
7492 case Intrinsic::usub_with_overflow: Op = ISD::USUBO; break;
7493 case Intrinsic::ssub_with_overflow: Op = ISD::SSUBO; break;
7494 case Intrinsic::umul_with_overflow: Op = ISD::UMULO; break;
7495 case Intrinsic::smul_with_overflow: Op = ISD::SMULO; break;
7496 }
7497 SDValue Op1 = getValue(I.getArgOperand(0));
7498 SDValue Op2 = getValue(I.getArgOperand(1));
7499
7500 EVT ResultVT = Op1.getValueType();
7501 EVT OverflowVT = MVT::i1;
7502 if (ResultVT.isVector())
7503 OverflowVT = EVT::getVectorVT(
7504 *Context, OverflowVT, ResultVT.getVectorElementCount());
7505
7506 SDVTList VTs = DAG.getVTList(ResultVT, OverflowVT);
7507 setValue(&I, DAG.getNode(Op, sdl, VTs, Op1, Op2));
7508 return;
7509 }
7510 case Intrinsic::prefetch: {
7511 SDValue Ops[5];
7512 unsigned rw = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
7514 Ops[0] = DAG.getRoot();
7515 Ops[1] = getValue(I.getArgOperand(0));
7516 Ops[2] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(1)), sdl,
7517 MVT::i32);
7518 Ops[3] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(2)), sdl,
7519 MVT::i32);
7520 Ops[4] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(3)), sdl,
7521 MVT::i32);
7523 ISD::PREFETCH, sdl, DAG.getVTList(MVT::Other), Ops,
7524 EVT::getIntegerVT(*Context, 8), MachinePointerInfo(I.getArgOperand(0)),
7525 /* align */ std::nullopt, Flags);
7526
7527 // Chain the prefetch in parallel with any pending loads, to stay out of
7528 // the way of later optimizations.
7529 PendingLoads.push_back(Result);
7530 Result = getRoot();
7531 DAG.setRoot(Result);
7532 return;
7533 }
7534 case Intrinsic::lifetime_start:
7535 case Intrinsic::lifetime_end: {
7536 bool IsStart = (Intrinsic == Intrinsic::lifetime_start);
7537 // Stack coloring is not enabled in O0, discard region information.
7539 return;
7540
7541 const int64_t ObjectSize =
7542 cast<ConstantInt>(I.getArgOperand(0))->getSExtValue();
7543 Value *const ObjectPtr = I.getArgOperand(1);
7545 getUnderlyingObjects(ObjectPtr, Allocas);
7546
7547 for (const Value *Alloca : Allocas) {
7548 const AllocaInst *LifetimeObject = dyn_cast_or_null<AllocaInst>(Alloca);
7549
7550 // Could not find an Alloca.
7551 if (!LifetimeObject)
7552 continue;
7553
7554 // First check that the Alloca is static, otherwise it won't have a
7555 // valid frame index.
7556 auto SI = FuncInfo.StaticAllocaMap.find(LifetimeObject);
7557 if (SI == FuncInfo.StaticAllocaMap.end())
7558 return;
7559
7560 const int FrameIndex = SI->second;
7561 int64_t Offset;
7563 ObjectPtr, Offset, DAG.getDataLayout()) != LifetimeObject)
7564 Offset = -1; // Cannot determine offset from alloca to lifetime object.
7565 Res = DAG.getLifetimeNode(IsStart, sdl, getRoot(), FrameIndex, ObjectSize,
7566 Offset);
7567 DAG.setRoot(Res);
7568 }
7569 return;
7570 }
7571 case Intrinsic::pseudoprobe: {
7572 auto Guid = cast<ConstantInt>(I.getArgOperand(0))->getZExtValue();
7573 auto Index = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
7574 auto Attr = cast<ConstantInt>(I.getArgOperand(2))->getZExtValue();
7575 Res = DAG.getPseudoProbeNode(sdl, getRoot(), Guid, Index, Attr);
7576 DAG.setRoot(Res);
7577 return;
7578 }
7579 case Intrinsic::invariant_start:
7580 // Discard region information.
7581 setValue(&I,
7582 DAG.getUNDEF(TLI.getValueType(DAG.getDataLayout(), I.getType())));
7583 return;
7584 case Intrinsic::invariant_end:
7585 // Discard region information.
7586 return;
7587 case Intrinsic::clear_cache: {
7588 SDValue InputChain = DAG.getRoot();
7589 SDValue StartVal = getValue(I.getArgOperand(0));
7590 SDValue EndVal = getValue(I.getArgOperand(1));
7591 Res = DAG.getNode(ISD::CLEAR_CACHE, sdl, DAG.getVTList(MVT::Other),
7592 {InputChain, StartVal, EndVal});
7593 setValue(&I, Res);
7594 DAG.setRoot(Res);
7595 return;
7596 }
7597 case Intrinsic::donothing:
7598 case Intrinsic::seh_try_begin:
7599 case Intrinsic::seh_scope_begin:
7600 case Intrinsic::seh_try_end:
7601 case Intrinsic::seh_scope_end:
7602 // ignore
7603 return;
7604 case Intrinsic::experimental_stackmap:
7605 visitStackmap(I);
7606 return;
7607 case Intrinsic::experimental_patchpoint_void:
7608 case Intrinsic::experimental_patchpoint:
7609 visitPatchpoint(I);
7610 return;
7611 case Intrinsic::experimental_gc_statepoint:
7612 LowerStatepoint(cast<GCStatepointInst>(I));
7613 return;
7614 case Intrinsic::experimental_gc_result:
7615 visitGCResult(cast<GCResultInst>(I));
7616 return;
7617 case Intrinsic::experimental_gc_relocate:
7618 visitGCRelocate(cast<GCRelocateInst>(I));
7619 return;
7620 case Intrinsic::instrprof_cover:
7621 llvm_unreachable("instrprof failed to lower a cover");
7622 case Intrinsic::instrprof_increment:
7623 llvm_unreachable("instrprof failed to lower an increment");
7624 case Intrinsic::instrprof_timestamp:
7625 llvm_unreachable("instrprof failed to lower a timestamp");
7626 case Intrinsic::instrprof_value_profile:
7627 llvm_unreachable("instrprof failed to lower a value profiling call");
7628 case Intrinsic::instrprof_mcdc_parameters:
7629 llvm_unreachable("instrprof failed to lower mcdc parameters");
7630 case Intrinsic::instrprof_mcdc_tvbitmap_update:
7631 llvm_unreachable("instrprof failed to lower an mcdc tvbitmap update");
7632 case Intrinsic::localescape: {
7635
7636 // Directly emit some LOCAL_ESCAPE machine instrs. Label assignment emission
7637 // is the same on all targets.
7638 for (unsigned Idx = 0, E = I.arg_size(); Idx < E; ++Idx) {
7639 Value *Arg = I.getArgOperand(Idx)->stripPointerCasts();
7640 if (isa<ConstantPointerNull>(Arg))
7641 continue; // Skip null pointers. They represent a hole in index space.
7642 AllocaInst *Slot = cast<AllocaInst>(Arg);
7643 assert(FuncInfo.StaticAllocaMap.count(Slot) &&
7644 "can only escape static allocas");
7645 int FI = FuncInfo.StaticAllocaMap[Slot];
7646 MCSymbol *FrameAllocSym = MF.getContext().getOrCreateFrameAllocSymbol(
7649 TII->get(TargetOpcode::LOCAL_ESCAPE))
7650 .addSym(FrameAllocSym)
7651 .addFrameIndex(FI);
7652 }
7653
7654 return;
7655 }
7656
7657 case Intrinsic::localrecover: {
7658 // i8* @llvm.localrecover(i8* %fn, i8* %fp, i32 %idx)
7660
7661 // Get the symbol that defines the frame offset.
7662 auto *Fn = cast<Function>(I.getArgOperand(0)->stripPointerCasts());
7663 auto *Idx = cast<ConstantInt>(I.getArgOperand(2));
7664 unsigned IdxVal =
7665 unsigned(Idx->getLimitedValue(std::numeric_limits<int>::max()));
7666 MCSymbol *FrameAllocSym = MF.getContext().getOrCreateFrameAllocSymbol(
7668
7669 Value *FP = I.getArgOperand(1);
7670 SDValue FPVal = getValue(FP);
7671 EVT PtrVT = FPVal.getValueType();
7672
7673 // Create a MCSymbol for the label to avoid any target lowering
7674 // that would make this PC relative.
7675 SDValue OffsetSym = DAG.getMCSymbol(FrameAllocSym, PtrVT);
7676 SDValue OffsetVal =
7677 DAG.getNode(ISD::LOCAL_RECOVER, sdl, PtrVT, OffsetSym);
7678
7679 // Add the offset to the FP.
7680 SDValue Add = DAG.getMemBasePlusOffset(FPVal, OffsetVal, sdl);
7681 setValue(&I, Add);
7682
7683 return;
7684 }
7685
7686 case Intrinsic::eh_exceptionpointer:
7687 case Intrinsic::eh_exceptioncode: {
7688 // Get the exception pointer vreg, copy from it, and resize it to fit.
7689 const auto *CPI = cast<CatchPadInst>(I.getArgOperand(0));
7690 MVT PtrVT = TLI.getPointerTy(DAG.getDataLayout());
7691 const TargetRegisterClass *PtrRC = TLI.getRegClassFor(PtrVT);
7692 unsigned VReg = FuncInfo.getCatchPadExceptionPointerVReg(CPI, PtrRC);
7693 SDValue N = DAG.getCopyFromReg(DAG.getEntryNode(), sdl, VReg, PtrVT);
7694 if (Intrinsic == Intrinsic::eh_exceptioncode)
7695 N = DAG.getZExtOrTrunc(N, sdl, MVT::i32);
7696 setValue(&I, N);
7697 return;
7698 }
7699 case Intrinsic::xray_customevent: {
7700 // Here we want to make sure that the intrinsic behaves as if it has a
7701 // specific calling convention.
7702 const auto &Triple = DAG.getTarget().getTargetTriple();
7703 if (!Triple.isAArch64(64) && Triple.getArch() != Triple::x86_64)
7704 return;
7705
7707
7708 // We want to say that we always want the arguments in registers.
7709 SDValue LogEntryVal = getValue(I.getArgOperand(0));
7710 SDValue StrSizeVal = getValue(I.getArgOperand(1));
7711 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
7712 SDValue Chain = getRoot();
7713 Ops.push_back(LogEntryVal);
7714 Ops.push_back(StrSizeVal);
7715 Ops.push_back(Chain);
7716
7717 // We need to enforce the calling convention for the callsite, so that
7718 // argument ordering is enforced correctly, and that register allocation can
7719 // see that some registers may be assumed clobbered and have to preserve
7720 // them across calls to the intrinsic.
7721 MachineSDNode *MN = DAG.getMachineNode(TargetOpcode::PATCHABLE_EVENT_CALL,
7722 sdl, NodeTys, Ops);
7723 SDValue patchableNode = SDValue(MN, 0);
7724 DAG.setRoot(patchableNode);
7725 setValue(&I, patchableNode);
7726 return;
7727 }
7728 case Intrinsic::xray_typedevent: {
7729 // Here we want to make sure that the intrinsic behaves as if it has a
7730 // specific calling convention.
7731 const auto &Triple = DAG.getTarget().getTargetTriple();
7732 if (!Triple.isAArch64(64) && Triple.getArch() != Triple::x86_64)
7733 return;
7734
7736
7737 // We want to say that we always want the arguments in registers.
7738 // It's unclear to me how manipulating the selection DAG here forces callers
7739 // to provide arguments in registers instead of on the stack.
7740 SDValue LogTypeId = getValue(I.getArgOperand(0));
7741 SDValue LogEntryVal = getValue(I.getArgOperand(1));
7742 SDValue StrSizeVal = getValue(I.getArgOperand(2));
7743 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
7744 SDValue Chain = getRoot();
7745 Ops.push_back(LogTypeId);
7746 Ops.push_back(LogEntryVal);
7747 Ops.push_back(StrSizeVal);
7748 Ops.push_back(Chain);
7749
7750 // We need to enforce the calling convention for the callsite, so that
7751 // argument ordering is enforced correctly, and that register allocation can
7752 // see that some registers may be assumed clobbered and have to preserve
7753 // them across calls to the intrinsic.
7755 TargetOpcode::PATCHABLE_TYPED_EVENT_CALL, sdl, NodeTys, Ops);
7756 SDValue patchableNode = SDValue(MN, 0);
7757 DAG.setRoot(patchableNode);
7758 setValue(&I, patchableNode);
7759 return;
7760 }
7761 case Intrinsic::experimental_deoptimize:
7763 return;
7764 case Intrinsic::experimental_stepvector:
7765 visitStepVector(I);
7766 return;
7767 case Intrinsic::vector_reduce_fadd:
7768 case Intrinsic::vector_reduce_fmul:
7769 case Intrinsic::vector_reduce_add:
7770 case Intrinsic::vector_reduce_mul:
7771 case Intrinsic::vector_reduce_and:
7772 case Intrinsic::vector_reduce_or:
7773 case Intrinsic::vector_reduce_xor:
7774 case Intrinsic::vector_reduce_smax:
7775 case Intrinsic::vector_reduce_smin:
7776 case Intrinsic::vector_reduce_umax:
7777 case Intrinsic::vector_reduce_umin:
7778 case Intrinsic::vector_reduce_fmax:
7779 case Intrinsic::vector_reduce_fmin:
7780 case Intrinsic::vector_reduce_fmaximum:
7781 case Intrinsic::vector_reduce_fminimum:
7782 visitVectorReduce(I, Intrinsic);
7783 return;
7784
7785 case Intrinsic::icall_branch_funnel: {
7787 Ops.push_back(getValue(I.getArgOperand(0)));
7788
7789 int64_t Offset;
7790 auto *Base = dyn_cast<GlobalObject>(GetPointerBaseWithConstantOffset(
7791 I.getArgOperand(1), Offset, DAG.getDataLayout()));
7792 if (!Base)
7794 "llvm.icall.branch.funnel operand must be a GlobalValue");
7795 Ops.push_back(DAG.getTargetGlobalAddress(Base, sdl, MVT::i64, 0));
7796
7797 struct BranchFunnelTarget {
7798 int64_t Offset;
7800 };
7802
7803 for (unsigned Op = 1, N = I.arg_size(); Op != N; Op += 2) {
7804 auto *ElemBase = dyn_cast<GlobalObject>(GetPointerBaseWithConstantOffset(
7805 I.getArgOperand(Op), Offset, DAG.getDataLayout()));
7806 if (ElemBase != Base)
7807 report_fatal_error("all llvm.icall.branch.funnel operands must refer "
7808 "to the same GlobalValue");
7809
7810 SDValue Val = getValue(I.getArgOperand(Op + 1));
7811 auto *GA = dyn_cast<GlobalAddressSDNode>(Val);
7812 if (!GA)
7814 "llvm.icall.branch.funnel operand must be a GlobalValue");
7816 GA->getGlobal(), sdl, Val.getValueType(),
7817 GA->getOffset())});
7818 }
7819 llvm::sort(Targets,
7820 [](const BranchFunnelTarget &T1, const BranchFunnelTarget &T2) {
7821 return T1.Offset < T2.Offset;
7822 });
7823
7824 for (auto &T : Targets) {
7825 Ops.push_back(DAG.getTargetConstant(T.Offset, sdl, MVT::i32));
7826 Ops.push_back(T.Target);
7827 }
7828
7829 Ops.push_back(DAG.getRoot()); // Chain
7830 SDValue N(DAG.getMachineNode(TargetOpcode::ICALL_BRANCH_FUNNEL, sdl,
7831 MVT::Other, Ops),
7832 0);
7833 DAG.setRoot(N);
7834 setValue(&I, N);
7835 HasTailCall = true;
7836 return;
7837 }
7838
7839 case Intrinsic::wasm_landingpad_index:
7840 // Information this intrinsic contained has been transferred to
7841 // MachineFunction in SelectionDAGISel::PrepareEHLandingPad. We can safely
7842 // delete it now.
7843 return;
7844
7845 case Intrinsic::aarch64_settag:
7846 case Intrinsic::aarch64_settag_zero: {
7848 bool ZeroMemory = Intrinsic == Intrinsic::aarch64_settag_zero;
7850 DAG, sdl, getRoot(), getValue(I.getArgOperand(0)),
7851 getValue(I.getArgOperand(1)), MachinePointerInfo(I.getArgOperand(0)),
7852 ZeroMemory);
7853 DAG.setRoot(Val);
7854 setValue(&I, Val);
7855 return;
7856 }
7857 case Intrinsic::amdgcn_cs_chain: {
7858 assert(I.arg_size() == 5 && "Additional args not supported yet");
7859 assert(cast<ConstantInt>(I.getOperand(4))->isZero() &&
7860 "Non-zero flags not supported yet");
7861
7862 // At this point we don't care if it's amdgpu_cs_chain or
7863 // amdgpu_cs_chain_preserve.
7865
7866 Type *RetTy = I.getType();
7867 assert(RetTy->isVoidTy() && "Should not return");
7868
7869 SDValue Callee = getValue(I.getOperand(0));
7870
7871 // We only have 2 actual args: one for the SGPRs and one for the VGPRs.
7872 // We'll also tack the value of the EXEC mask at the end.
7874 Args.reserve(3);
7875
7876 for (unsigned Idx : {2, 3, 1}) {
7878 Arg.Node = getValue(I.getOperand(Idx));
7879 Arg.Ty = I.getOperand(Idx)->getType();
7880 Arg.setAttributes(&I, Idx);
7881 Args.push_back(Arg);
7882 }
7883
7884 assert(Args[0].IsInReg && "SGPR args should be marked inreg");
7885 assert(!Args[1].IsInReg && "VGPR args should not be marked inreg");
7886 Args[2].IsInReg = true; // EXEC should be inreg
7887
7889 CLI.setDebugLoc(getCurSDLoc())
7890 .setChain(getRoot())
7891 .setCallee(CC, RetTy, Callee, std::move(Args))
7892 .setNoReturn(true)
7893 .setTailCall(true)
7894 .setConvergent(I.isConvergent());
7895 CLI.CB = &I;
7896 std::pair<SDValue, SDValue> Result =
7897 lowerInvokable(CLI, /*EHPadBB*/ nullptr);
7898 (void)Result;
7899 assert(!Result.first.getNode() && !Result.second.getNode() &&
7900 "Should've lowered as tail call");
7901
7902 HasTailCall = true;
7903 return;
7904 }
7905 case Intrinsic::ptrmask: {
7906 SDValue Ptr = getValue(I.getOperand(0));
7907 SDValue Mask = getValue(I.getOperand(1));
7908
7909 // On arm64_32, pointers are 32 bits when stored in memory, but
7910 // zero-extended to 64 bits when in registers. Thus the mask is 32 bits to
7911 // match the index type, but the pointer is 64 bits, so the the mask must be
7912 // zero-extended up to 64 bits to match the pointer.
7913 EVT PtrVT =
7914 TLI.getValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
7915 EVT MemVT =
7916 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
7917 assert(PtrVT == Ptr.getValueType());
7918 assert(MemVT == Mask.getValueType());
7919 if (MemVT != PtrVT)
7920 Mask = DAG.getPtrExtOrTrunc(Mask, sdl, PtrVT);
7921
7922 setValue(&I, DAG.getNode(ISD::AND, sdl, PtrVT, Ptr, Mask));
7923 return;
7924 }
7925 case Intrinsic::threadlocal_address: {
7926 setValue(&I, getValue(I.getOperand(0)));
7927 return;
7928 }
7929 case Intrinsic::get_active_lane_mask: {
7930 EVT CCVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7931 SDValue Index = getValue(I.getOperand(0));
7932 EVT ElementVT = Index.getValueType();
7933
7934 if (!TLI.shouldExpandGetActiveLaneMask(CCVT, ElementVT)) {
7935 visitTargetIntrinsic(I, Intrinsic);
7936 return;
7937 }
7938
7939 SDValue TripCount = getValue(I.getOperand(1));
7940 EVT VecTy = EVT::getVectorVT(*DAG.getContext(), ElementVT,
7941 CCVT.getVectorElementCount());
7942
7943 SDValue VectorIndex = DAG.getSplat(VecTy, sdl, Index);
7944 SDValue VectorTripCount = DAG.getSplat(VecTy, sdl, TripCount);
7945 SDValue VectorStep = DAG.getStepVector(sdl, VecTy);
7946 SDValue VectorInduction = DAG.getNode(
7947 ISD::UADDSAT, sdl, VecTy, VectorIndex, VectorStep);
7948 SDValue SetCC = DAG.getSetCC(sdl, CCVT, VectorInduction,
7949 VectorTripCount, ISD::CondCode::SETULT);
7950 setValue(&I, SetCC);
7951 return;
7952 }
7953 case Intrinsic::experimental_get_vector_length: {
7954 assert(cast<ConstantInt>(I.getOperand(1))->getSExtValue() > 0 &&
7955 "Expected positive VF");
7956 unsigned VF = cast<ConstantInt>(I.getOperand(1))->getZExtValue();
7957 bool IsScalable = cast<ConstantInt>(I.getOperand(2))->isOne();
7958
7959 SDValue Count = getValue(I.getOperand(0));
7960 EVT CountVT = Count.getValueType();
7961
7962 if (!TLI.shouldExpandGetVectorLength(CountVT, VF, IsScalable)) {
7963 visitTargetIntrinsic(I, Intrinsic);
7964 return;
7965 }
7966
7967 // Expand to a umin between the trip count and the maximum elements the type
7968 // can hold.
7969 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7970
7971 // Extend the trip count to at least the result VT.
7972 if (CountVT.bitsLT(VT)) {
7973 Count = DAG.getNode(ISD::ZERO_EXTEND, sdl, VT, Count);
7974 CountVT = VT;
7975 }
7976
7977 SDValue MaxEVL = DAG.getElementCount(sdl, CountVT,
7978 ElementCount::get(VF, IsScalable));
7979
7980 SDValue UMin = DAG.getNode(ISD::UMIN, sdl, CountVT, Count, MaxEVL);
7981 // Clip to the result type if needed.
7982 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, sdl, VT, UMin);
7983
7984 setValue(&I, Trunc);
7985 return;
7986 }
7987 case Intrinsic::experimental_vector_partial_reduce_add: {
7988 SDValue OpNode = getValue(I.getOperand(1));
7989 EVT ReducedTy = EVT::getEVT(I.getType());
7990 EVT FullTy = OpNode.getValueType();
7991
7992 unsigned Stride = ReducedTy.getVectorMinNumElements();
7993 unsigned ScaleFactor = FullTy.getVectorMinNumElements() / Stride;
7994
7995 // Collect all of the subvectors
7996 std::deque<SDValue> Subvectors;
7997 Subvectors.push_back(getValue(I.getOperand(0)));
7998 for (unsigned i = 0; i < ScaleFactor; i++) {
7999 auto SourceIndex = DAG.getVectorIdxConstant(i * Stride, sdl);
8000 Subvectors.push_back(DAG.getNode(ISD::EXTRACT_SUBVECTOR, sdl, ReducedTy,
8001 {OpNode, SourceIndex}));
8002 }
8003
8004 // Flatten the subvector tree
8005 while (Subvectors.size() > 1) {
8006 Subvectors.push_back(DAG.getNode(ISD::ADD, sdl, ReducedTy,
8007 {Subvectors[0], Subvectors[1]}));
8008 Subvectors.pop_front();
8009 Subvectors.pop_front();
8010 }
8011
8012 assert(Subvectors.size() == 1 &&
8013 "There should only be one subvector after tree flattening");
8014
8015 setValue(&I, Subvectors[0]);
8016 return;
8017 }
8018 case Intrinsic::experimental_cttz_elts: {
8019 auto DL = getCurSDLoc();
8020 SDValue Op = getValue(I.getOperand(0));
8021 EVT OpVT = Op.getValueType();
8022
8023 if (!TLI.shouldExpandCttzElements(OpVT)) {
8024 visitTargetIntrinsic(I, Intrinsic);
8025 return;
8026 }
8027
8028 if (OpVT.getScalarType() != MVT::i1) {
8029 // Compare the input vector elements to zero & use to count trailing zeros
8030 SDValue AllZero = DAG.getConstant(0, DL, OpVT);
8031 OpVT = EVT::getVectorVT(*DAG.getContext(), MVT::i1,
8032 OpVT.getVectorElementCount());
8033 Op = DAG.getSetCC(DL, OpVT, Op, AllZero, ISD::SETNE);
8034 }
8035
8036 // If the zero-is-poison flag is set, we can assume the upper limit
8037 // of the result is VF-1.
8038 bool ZeroIsPoison =
8039 !cast<ConstantSDNode>(getValue(I.getOperand(1)))->isZero();
8040 ConstantRange VScaleRange(1, true); // Dummy value.
8041 if (isa<ScalableVectorType>(I.getOperand(0)->getType()))
8042 VScaleRange = getVScaleRange(I.getCaller(), 64);
8043 unsigned EltWidth = TLI.getBitWidthForCttzElements(
8044 I.getType(), OpVT.getVectorElementCount(), ZeroIsPoison, &VScaleRange);
8045
8046 MVT NewEltTy = MVT::getIntegerVT(EltWidth);
8047
8048 // Create the new vector type & get the vector length
8049 EVT NewVT = EVT::getVectorVT(*DAG.getContext(), NewEltTy,
8050 OpVT.getVectorElementCount());
8051
8052 SDValue VL =
8053 DAG.getElementCount(DL, NewEltTy, OpVT.getVectorElementCount());
8054
8055 SDValue StepVec = DAG.getStepVector(DL, NewVT);
8056 SDValue SplatVL = DAG.getSplat(NewVT, DL, VL);
8057 SDValue StepVL = DAG.getNode(ISD::SUB, DL, NewVT, SplatVL, StepVec);
8059 SDValue And = DAG.getNode(ISD::AND, DL, NewVT, StepVL, Ext);
8061 SDValue Sub = DAG.getNode(ISD::SUB, DL, NewEltTy, VL, Max);
8062
8063 EVT RetTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
8065
8066 setValue(&I, Ret);
8067 return;
8068 }
8069 case Intrinsic::vector_insert: {
8070 SDValue Vec = getValue(I.getOperand(0));
8071 SDValue SubVec = getValue(I.getOperand(1));
8072 SDValue Index = getValue(I.getOperand(2));
8073
8074 // The intrinsic's index type is i64, but the SDNode requires an index type
8075 // suitable for the target. Convert the index as required.
8076 MVT VectorIdxTy = TLI.getVectorIdxTy(DAG.getDataLayout());
8077 if (Index.getValueType() != VectorIdxTy)
8078 Index = DAG.getVectorIdxConstant(Index->getAsZExtVal(), sdl);
8079
8080 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8081 setValue(&I, DAG.getNode(ISD::INSERT_SUBVECTOR, sdl, ResultVT, Vec, SubVec,
8082 Index));
8083 return;
8084 }
8085 case Intrinsic::vector_extract: {
8086 SDValue Vec = getValue(I.getOperand(0));
8087 SDValue Index = getValue(I.getOperand(1));
8088 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8089
8090 // The intrinsic's index type is i64, but the SDNode requires an index type
8091 // suitable for the target. Convert the index as required.
8092 MVT VectorIdxTy = TLI.getVectorIdxTy(DAG.getDataLayout());
8093 if (Index.getValueType() != VectorIdxTy)
8094 Index = DAG.getVectorIdxConstant(Index->getAsZExtVal(), sdl);
8095
8096 setValue(&I,
8097 DAG.getNode(ISD::EXTRACT_SUBVECTOR, sdl, ResultVT, Vec, Index));
8098 return;
8099 }
8100 case Intrinsic::vector_reverse:
8101 visitVectorReverse(I);
8102 return;
8103 case Intrinsic::vector_splice:
8104 visitVectorSplice(I);
8105 return;
8106 case Intrinsic::callbr_landingpad:
8107 visitCallBrLandingPad(I);
8108 return;
8109 case Intrinsic::vector_interleave2:
8110 visitVectorInterleave(I);
8111 return;
8112 case Intrinsic::vector_deinterleave2:
8113 visitVectorDeinterleave(I);
8114 return;
8115 case Intrinsic::experimental_vector_compress:
8117 getValue(I.getArgOperand(0)).getValueType(),
8118 getValue(I.getArgOperand(0)),
8119 getValue(I.getArgOperand(1)),
8120 getValue(I.getArgOperand(2)), Flags));
8121 return;
8122 case Intrinsic::experimental_convergence_anchor:
8123 case Intrinsic::experimental_convergence_entry:
8124 case Intrinsic::experimental_convergence_loop:
8125 visitConvergenceControl(I, Intrinsic);
8126 return;
8127 case Intrinsic::experimental_vector_histogram_add: {
8128 visitVectorHistogram(I, Intrinsic);
8129 return;
8130 }
8131 }
8132}
8133
8134void SelectionDAGBuilder::visitConstrainedFPIntrinsic(
8135 const ConstrainedFPIntrinsic &FPI) {
8136 SDLoc sdl = getCurSDLoc();
8137
8138 // We do not need to serialize constrained FP intrinsics against
8139 // each other or against (nonvolatile) loads, so they can be
8140 // chained like loads.
8141 SDValue Chain = DAG.getRoot();
8143 Opers.push_back(Chain);
8144 for (unsigned I = 0, E = FPI.getNonMetadataArgCount(); I != E; ++I)
8145 Opers.push_back(getValue(FPI.getArgOperand(I)));
8146
8147 auto pushOutChain = [this](SDValue Result, fp::ExceptionBehavior EB) {
8148 assert(Result.getNode()->getNumValues() == 2);
8149
8150 // Push node to the appropriate list so that future instructions can be
8151 // chained up correctly.
8152 SDValue OutChain = Result.getValue(1);
8153 switch (EB) {
8155 // The only reason why ebIgnore nodes still need to be chained is that
8156 // they might depend on the current rounding mode, and therefore must
8157 // not be moved across instruction that may change that mode.
8158 [[fallthrough]];
8160 // These must not be moved across calls or instructions that may change
8161 // floating-point exception masks.
8162 PendingConstrainedFP.push_back(OutChain);
8163 break;
8165 // These must not be moved across calls or instructions that may change
8166 // floating-point exception masks or read floating-point exception flags.
8167 // In addition, they cannot be optimized out even if unused.
8168 PendingConstrainedFPStrict.push_back(OutChain);
8169 break;
8170 }
8171 };
8172
8174 EVT VT = TLI.getValueType(DAG.getDataLayout(), FPI.getType());
8175 SDVTList VTs = DAG.getVTList(VT, MVT::Other);
8177
8180 Flags.setNoFPExcept(true);
8181
8182 if (auto *FPOp = dyn_cast<FPMathOperator>(&FPI))
8183 Flags.copyFMF(*FPOp);
8184
8185 unsigned Opcode;
8186 switch (FPI.getIntrinsicID()) {
8187 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
8188#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
8189 case Intrinsic::INTRINSIC: \
8190 Opcode = ISD::STRICT_##DAGN; \
8191 break;
8192#include "llvm/IR/ConstrainedOps.def"
8193 case Intrinsic::experimental_constrained_fmuladd: {
8194 Opcode = ISD::STRICT_FMA;
8195 // Break fmuladd into fmul and fadd.
8198 Opers.pop_back();
8199 SDValue Mul = DAG.getNode(ISD::STRICT_FMUL, sdl, VTs, Opers, Flags);
8200 pushOutChain(Mul, EB);
8201 Opcode = ISD::STRICT_FADD;
8202 Opers.clear();
8203 Opers.push_back(Mul.getValue(1));
8204 Opers.push_back(Mul.getValue(0));
8205 Opers.push_back(getValue(FPI.getArgOperand(2)));
8206 }
8207 break;
8208 }
8209 }
8210
8211 // A few strict DAG nodes carry additional operands that are not
8212 // set up by the default code above.
8213 switch (Opcode) {
8214 default: break;
8216 Opers.push_back(
8218 break;
8219 case ISD::STRICT_FSETCC:
8220 case ISD::STRICT_FSETCCS: {
8221 auto *FPCmp = dyn_cast<ConstrainedFPCmpIntrinsic>(&FPI);
8222 ISD::CondCode Condition = getFCmpCondCode(FPCmp->getPredicate());
8223 if (TM.Options.NoNaNsFPMath)
8224 Condition = getFCmpCodeWithoutNaN(Condition);
8225 Opers.push_back(DAG.getCondCode(Condition));
8226 break;
8227 }
8228 }
8229
8230 SDValue Result = DAG.getNode(Opcode, sdl, VTs, Opers, Flags);
8231 pushOutChain(Result, EB);
8232
8233 SDValue FPResult = Result.getValue(0);
8234 setValue(&FPI, FPResult);
8235}
8236
8237static unsigned getISDForVPIntrinsic(const VPIntrinsic &VPIntrin) {
8238 std::optional<unsigned> ResOPC;
8239 switch (VPIntrin.getIntrinsicID()) {
8240 case Intrinsic::vp_ctlz: {
8241 bool IsZeroUndef = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8242 ResOPC = IsZeroUndef ? ISD::VP_CTLZ_ZERO_UNDEF : ISD::VP_CTLZ;
8243 break;
8244 }
8245 case Intrinsic::vp_cttz: {
8246 bool IsZeroUndef = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8247 ResOPC = IsZeroUndef ? ISD::VP_CTTZ_ZERO_UNDEF : ISD::VP_CTTZ;
8248 break;
8249 }
8250 case Intrinsic::vp_cttz_elts: {
8251 bool IsZeroPoison = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8252 ResOPC = IsZeroPoison ? ISD::VP_CTTZ_ELTS_ZERO_UNDEF : ISD::VP_CTTZ_ELTS;
8253 break;
8254 }
8255#define HELPER_MAP_VPID_TO_VPSD(VPID, VPSD) \
8256 case Intrinsic::VPID: \
8257 ResOPC = ISD::VPSD; \
8258 break;
8259#include "llvm/IR/VPIntrinsics.def"
8260 }
8261
8262 if (!ResOPC)
8264 "Inconsistency: no SDNode available for this VPIntrinsic!");
8265
8266 if (*ResOPC == ISD::VP_REDUCE_SEQ_FADD ||
8267 *ResOPC == ISD::VP_REDUCE_SEQ_FMUL) {
8268 if (VPIntrin.getFastMathFlags().allowReassoc())
8269 return *ResOPC == ISD::VP_REDUCE_SEQ_FADD ? ISD::VP_REDUCE_FADD
8270 : ISD::VP_REDUCE_FMUL;
8271 }
8272
8273 return *ResOPC;
8274}
8275
8276void SelectionDAGBuilder::visitVPLoad(
8277 const VPIntrinsic &VPIntrin, EVT VT,
8278 const SmallVectorImpl<SDValue> &OpValues) {
8279 SDLoc DL = getCurSDLoc();
8280 Value *PtrOperand = VPIntrin.getArgOperand(0);
8281 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8282 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8283 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8284 SDValue LD;
8285 // Do not serialize variable-length loads of constant memory with
8286 // anything.
8287 if (!Alignment)
8288 Alignment = DAG.getEVTAlign(VT);
8289 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8290 bool AddToChain = !AA || !AA->pointsToConstantMemory(ML);
8291 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8294 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo, Ranges);
8295 LD = DAG.getLoadVP(VT, DL, InChain, OpValues[0], OpValues[1], OpValues[2],
8296 MMO, false /*IsExpanding */);
8297 if (AddToChain)
8298 PendingLoads.push_back(LD.getValue(1));
8299 setValue(&VPIntrin, LD);
8300}
8301
8302void SelectionDAGBuilder::visitVPGather(
8303 const VPIntrinsic &VPIntrin, EVT VT,
8304 const SmallVectorImpl<SDValue> &OpValues) {
8305 SDLoc DL = getCurSDLoc();
8307 Value *PtrOperand = VPIntrin.getArgOperand(0);
8308 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8309 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8310 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8311 SDValue LD;
8312 if (!Alignment)
8313 Alignment = DAG.getEVTAlign(VT.getScalarType());
8314 unsigned AS =
8315 PtrOperand->getType()->getScalarType()->getPointerAddressSpace();
8318 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo, Ranges);
8319 SDValue Base, Index, Scale;
8320 ISD::MemIndexType IndexType;
8321 bool UniformBase = getUniformBase(PtrOperand, Base, Index, IndexType, Scale,
8322 this, VPIntrin.getParent(),
8323 VT.getScalarStoreSize());
8324 if (!UniformBase) {
8326 Index = getValue(PtrOperand);
8327 IndexType = ISD::SIGNED_SCALED;
8329 }
8330 EVT IdxVT = Index.getValueType();
8331 EVT EltTy = IdxVT.getVectorElementType();
8332 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
8333 EVT NewIdxVT = IdxVT.changeVectorElementType(EltTy);
8334 Index = DAG.getNode(ISD::SIGN_EXTEND, DL, NewIdxVT, Index);
8335 }
8336 LD = DAG.getGatherVP(
8337 DAG.getVTList(VT, MVT::Other), VT, DL,
8338 {DAG.getRoot(), Base, Index, Scale, OpValues[1], OpValues[2]}, MMO,
8339 IndexType);
8340 PendingLoads.push_back(LD.getValue(1));
8341 setValue(&VPIntrin, LD);
8342}
8343
8344void SelectionDAGBuilder::visitVPStore(
8345 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8346 SDLoc DL = getCurSDLoc();
8347 Value *PtrOperand = VPIntrin.getArgOperand(1);
8348 EVT VT = OpValues[0].getValueType();
8349 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8350 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8351 SDValue ST;
8352 if (!Alignment)
8353 Alignment = DAG.getEVTAlign(VT);
8354 SDValue Ptr = OpValues[1];
8355 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
8358 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo);
8359 ST = DAG.getStoreVP(getMemoryRoot(), DL, OpValues[0], Ptr, Offset,
8360 OpValues[2], OpValues[3], VT, MMO, ISD::UNINDEXED,
8361 /* IsTruncating */ false, /*IsCompressing*/ false);
8362 DAG.setRoot(ST);
8363 setValue(&VPIntrin, ST);
8364}
8365
8366void SelectionDAGBuilder::visitVPScatter(
8367 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8368 SDLoc DL = getCurSDLoc();
8370 Value *PtrOperand = VPIntrin.getArgOperand(1);
8371 EVT VT = OpValues[0].getValueType();
8372 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8373 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8374 SDValue ST;
8375 if (!Alignment)
8376 Alignment = DAG.getEVTAlign(VT.getScalarType());
8377 unsigned AS =
8378 PtrOperand->getType()->getScalarType()->getPointerAddressSpace();
8381 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo);
8382 SDValue Base, Index, Scale;
8383 ISD::MemIndexType IndexType;
8384 bool UniformBase = getUniformBase(PtrOperand, Base, Index, IndexType, Scale,
8385 this, VPIntrin.getParent(),
8386 VT.getScalarStoreSize());
8387 if (!UniformBase) {
8389 Index = getValue(PtrOperand);
8390 IndexType = ISD::SIGNED_SCALED;
8391 Scale =
8393 }
8394 EVT IdxVT = Index.getValueType();
8395 EVT EltTy = IdxVT.getVectorElementType();
8396 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
8397 EVT NewIdxVT = IdxVT.changeVectorElementType(EltTy);
8398 Index = DAG.getNode(ISD::SIGN_EXTEND, DL, NewIdxVT, Index);
8399 }
8400 ST = DAG.getScatterVP(DAG.getVTList(MVT::Other), VT, DL,
8401 {getMemoryRoot(), OpValues[0], Base, Index, Scale,
8402 OpValues[2], OpValues[3]},
8403 MMO, IndexType);
8404 DAG.setRoot(ST);
8405 setValue(&VPIntrin, ST);
8406}
8407
8408void SelectionDAGBuilder::visitVPStridedLoad(
8409 const VPIntrinsic &VPIntrin, EVT VT,
8410 const SmallVectorImpl<SDValue> &OpValues) {
8411 SDLoc DL = getCurSDLoc();
8412 Value *PtrOperand = VPIntrin.getArgOperand(0);
8413 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8414 if (!Alignment)
8415 Alignment = DAG.getEVTAlign(VT.getScalarType());
8416 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8417 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8418 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8419 bool AddToChain = !AA || !AA->pointsToConstantMemory(ML);
8420 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8421 unsigned AS = PtrOperand->getType()->getPointerAddressSpace();
8424 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo, Ranges);
8425
8426 SDValue LD = DAG.getStridedLoadVP(VT, DL, InChain, OpValues[0], OpValues[1],
8427 OpValues[2], OpValues[3], MMO,
8428 false /*IsExpanding*/);
8429
8430 if (AddToChain)
8431 PendingLoads.push_back(LD.getValue(1));
8432 setValue(&VPIntrin, LD);
8433}
8434
8435void SelectionDAGBuilder::visitVPStridedStore(
8436 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8437 SDLoc DL = getCurSDLoc();
8438 Value *PtrOperand = VPIntrin.getArgOperand(1);
8439 EVT VT = OpValues[0].getValueType();
8440 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8441 if (!Alignment)
8442 Alignment = DAG.getEVTAlign(VT.getScalarType());
8443 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8444 unsigned AS = PtrOperand->getType()->getPointerAddressSpace();
8447 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo);
8448
8450 getMemoryRoot(), DL, OpValues[0], OpValues[1],
8451 DAG.getUNDEF(OpValues[1].getValueType()), OpValues[2], OpValues[3],
8452 OpValues[4], VT, MMO, ISD::UNINDEXED, /*IsTruncating*/ false,
8453 /*IsCompressing*/ false);
8454
8455 DAG.setRoot(ST);
8456 setValue(&VPIntrin, ST);
8457}
8458
8459void SelectionDAGBuilder::visitVPCmp(const VPCmpIntrinsic &VPIntrin) {
8461 SDLoc DL = getCurSDLoc();
8462
8463 ISD::CondCode Condition;
8465 bool IsFP = VPIntrin.getOperand(0)->getType()->isFPOrFPVectorTy();
8466 if (IsFP) {
8467 // FIXME: Regular fcmps are FPMathOperators which may have fast-math (nnan)
8468 // flags, but calls that don't return floating-point types can't be
8469 // FPMathOperators, like vp.fcmp. This affects constrained fcmp too.
8470 Condition = getFCmpCondCode(CondCode);
8471 if (TM.Options.NoNaNsFPMath)
8472 Condition = getFCmpCodeWithoutNaN(Condition);
8473 } else {
8474 Condition = getICmpCondCode(CondCode);
8475 }
8476
8477 SDValue Op1 = getValue(VPIntrin.getOperand(0));
8478 SDValue Op2 = getValue(VPIntrin.getOperand(1));
8479 // #2 is the condition code
8480 SDValue MaskOp = getValue(VPIntrin.getOperand(3));
8481 SDValue EVL = getValue(VPIntrin.getOperand(4));
8482 MVT EVLParamVT = TLI.getVPExplicitVectorLengthTy();
8483 assert(EVLParamVT.isScalarInteger() && EVLParamVT.bitsGE(MVT::i32) &&
8484 "Unexpected target EVL type");
8485 EVL = DAG.getNode(ISD::ZERO_EXTEND, DL, EVLParamVT, EVL);
8486
8488 VPIntrin.getType());
8489 setValue(&VPIntrin,
8490 DAG.getSetCCVP(DL, DestVT, Op1, Op2, Condition, MaskOp, EVL));
8491}
8492
8493void SelectionDAGBuilder::visitVectorPredicationIntrinsic(
8494 const VPIntrinsic &VPIntrin) {
8495 SDLoc DL = getCurSDLoc();
8496 unsigned Opcode = getISDForVPIntrinsic(VPIntrin);
8497
8498 auto IID = VPIntrin.getIntrinsicID();
8499
8500 if (const auto *CmpI = dyn_cast<VPCmpIntrinsic>(&VPIntrin))
8501 return visitVPCmp(*CmpI);
8502
8503 SmallVector<EVT, 4> ValueVTs;
8505 ComputeValueVTs(TLI, DAG.getDataLayout(), VPIntrin.getType(), ValueVTs);
8506 SDVTList VTs = DAG.getVTList(ValueVTs);
8507
8508 auto EVLParamPos = VPIntrinsic::getVectorLengthParamPos(IID);
8509
8510 MVT EVLParamVT = TLI.getVPExplicitVectorLengthTy();
8511 assert(EVLParamVT.isScalarInteger() && EVLParamVT.bitsGE(MVT::i32) &&
8512 "Unexpected target EVL type");
8513
8514 // Request operands.
8515 SmallVector<SDValue, 7> OpValues;
8516 for (unsigned I = 0; I < VPIntrin.arg_size(); ++I) {
8517 auto Op = getValue(VPIntrin.getArgOperand(I));
8518 if (I == EVLParamPos)
8519 Op = DAG.getNode(ISD::ZERO_EXTEND, DL, EVLParamVT, Op);
8520 OpValues.push_back(Op);
8521 }
8522
8523 switch (Opcode) {
8524 default: {
8525 SDNodeFlags SDFlags;
8526 if (auto *FPMO = dyn_cast<FPMathOperator>(&VPIntrin))
8527 SDFlags.copyFMF(*FPMO);
8528 SDValue Result = DAG.getNode(Opcode, DL, VTs, OpValues, SDFlags);
8529 setValue(&VPIntrin, Result);
8530 break;
8531 }
8532 case ISD::VP_LOAD:
8533 visitVPLoad(VPIntrin, ValueVTs[0], OpValues);
8534 break;
8535 case ISD::VP_GATHER:
8536 visitVPGather(VPIntrin, ValueVTs[0], OpValues);
8537 break;
8538 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
8539 visitVPStridedLoad(VPIntrin, ValueVTs[0], OpValues);
8540 break;
8541 case ISD::VP_STORE:
8542 visitVPStore(VPIntrin, OpValues);
8543 break;
8544 case ISD::VP_SCATTER:
8545 visitVPScatter(VPIntrin, OpValues);
8546 break;
8547 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
8548 visitVPStridedStore(VPIntrin, OpValues);
8549 break;
8550 case ISD::VP_FMULADD: {
8551 assert(OpValues.size() == 5 && "Unexpected number of operands");
8552 SDNodeFlags SDFlags;
8553 if (auto *FPMO = dyn_cast<FPMathOperator>(&VPIntrin))
8554 SDFlags.copyFMF(*FPMO);
8557 setValue(&VPIntrin, DAG.getNode(ISD::VP_FMA, DL, VTs, OpValues, SDFlags));
8558 } else {
8560 ISD::VP_FMUL, DL, VTs,
8561 {OpValues[0], OpValues[1], OpValues[3], OpValues[4]}, SDFlags);
8562 SDValue Add =
8563 DAG.getNode(ISD::VP_FADD, DL, VTs,
8564 {Mul, OpValues[2], OpValues[3], OpValues[4]}, SDFlags);
8565 setValue(&VPIntrin, Add);
8566 }
8567 break;
8568 }
8569 case ISD::VP_IS_FPCLASS: {
8570 const DataLayout DLayout = DAG.getDataLayout();
8571 EVT DestVT = TLI.getValueType(DLayout, VPIntrin.getType());
8572 auto Constant = OpValues[1]->getAsZExtVal();
8574 SDValue V = DAG.getNode(ISD::VP_IS_FPCLASS, DL, DestVT,
8575 {OpValues[0], Check, OpValues[2], OpValues[3]});
8576 setValue(&VPIntrin, V);
8577 return;
8578 }
8579 case ISD::VP_INTTOPTR: {
8580 SDValue N = OpValues[0];
8581 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), VPIntrin.getType());
8582 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(), VPIntrin.getType());
8583 N = DAG.getVPPtrExtOrTrunc(getCurSDLoc(), DestVT, N, OpValues[1],
8584 OpValues[2]);
8585 N = DAG.getVPZExtOrTrunc(getCurSDLoc(), PtrMemVT, N, OpValues[1],
8586 OpValues[2]);
8587 setValue(&VPIntrin, N);
8588 break;
8589 }
8590 case ISD::VP_PTRTOINT: {
8591 SDValue N = OpValues[0];
8593 VPIntrin.getType());
8594 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(),
8595 VPIntrin.getOperand(0)->getType());
8596 N = DAG.getVPPtrExtOrTrunc(getCurSDLoc(), PtrMemVT, N, OpValues[1],
8597 OpValues[2]);
8598 N = DAG.getVPZExtOrTrunc(getCurSDLoc(), DestVT, N, OpValues[1],
8599 OpValues[2]);
8600 setValue(&VPIntrin, N);
8601 break;
8602 }
8603 case ISD::VP_ABS:
8604 case ISD::VP_CTLZ:
8605 case ISD::VP_CTLZ_ZERO_UNDEF:
8606 case ISD::VP_CTTZ:
8607 case ISD::VP_CTTZ_ZERO_UNDEF:
8608 case ISD::VP_CTTZ_ELTS_ZERO_UNDEF:
8609 case ISD::VP_CTTZ_ELTS: {
8610 SDValue Result =
8611 DAG.getNode(Opcode, DL, VTs, {OpValues[0], OpValues[2], OpValues[3]});
8612 setValue(&VPIntrin, Result);
8613 break;
8614 }
8615 }
8616}
8617
8618SDValue SelectionDAGBuilder::lowerStartEH(SDValue Chain,
8619 const BasicBlock *EHPadBB,
8620 MCSymbol *&BeginLabel) {
8622 MachineModuleInfo &MMI = MF.getMMI();
8623
8624 // Insert a label before the invoke call to mark the try range. This can be
8625 // used to detect deletion of the invoke via the MachineModuleInfo.
8626 BeginLabel = MF.getContext().createTempSymbol();
8627
8628 // For SjLj, keep track of which landing pads go with which invokes
8629 // so as to maintain the ordering of pads in the LSDA.
8630 unsigned CallSiteIndex = MMI.getCurrentCallSite();
8631 if (CallSiteIndex) {
8632 MF.setCallSiteBeginLabel(BeginLabel, CallSiteIndex);
8633 LPadToCallSiteMap[FuncInfo.MBBMap[EHPadBB]].push_back(CallSiteIndex);
8634
8635 // Now that the call site is handled, stop tracking it.
8636 MMI.setCurrentCallSite(0);
8637 }
8638
8639 return DAG.getEHLabel(getCurSDLoc(), Chain, BeginLabel);
8640}
8641
8642SDValue SelectionDAGBuilder::lowerEndEH(SDValue Chain, const InvokeInst *II,
8643 const BasicBlock *EHPadBB,
8644 MCSymbol *BeginLabel) {
8645 assert(BeginLabel && "BeginLabel should've been set");
8646
8648
8649 // Insert a label at the end of the invoke call to mark the try range. This
8650 // can be used to detect deletion of the invoke via the MachineModuleInfo.
8651 MCSymbol *EndLabel = MF.getContext().createTempSymbol();
8652 Chain = DAG.getEHLabel(getCurSDLoc(), Chain, EndLabel);
8653
8654 // Inform MachineModuleInfo of range.
8656 // There is a platform (e.g. wasm) that uses funclet style IR but does not
8657 // actually use outlined funclets and their LSDA info style.
8658 if (MF.hasEHFunclets() && isFuncletEHPersonality(Pers)) {
8659 assert(II && "II should've been set");
8660 WinEHFuncInfo *EHInfo = MF.getWinEHFuncInfo();
8661 EHInfo->addIPToStateRange(II, BeginLabel, EndLabel);
8662 } else if (!isScopedEHPersonality(Pers)) {
8663 assert(EHPadBB);
8664 MF.addInvoke(FuncInfo.MBBMap[EHPadBB], BeginLabel, EndLabel);
8665 }
8666
8667 return Chain;
8668}
8669
8670std::pair<SDValue, SDValue>
8672 const BasicBlock *EHPadBB) {
8673 MCSymbol *BeginLabel = nullptr;
8674
8675 if (EHPadBB) {
8676 // Both PendingLoads and PendingExports must be flushed here;
8677 // this call might not return.
8678 (void)getRoot();
8679 DAG.setRoot(lowerStartEH(getControlRoot(), EHPadBB, BeginLabel));
8680 CLI.setChain(getRoot());
8681 }
8682
8684 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
8685
8686 assert((CLI.IsTailCall || Result.second.getNode()) &&
8687 "Non-null chain expected with non-tail call!");
8688 assert((Result.second.getNode() || !Result.first.getNode()) &&
8689 "Null value expected with tail call!");
8690
8691 if (!Result.second.getNode()) {
8692 // As a special case, a null chain means that a tail call has been emitted
8693 // and the DAG root is already updated.
8694 HasTailCall = true;
8695
8696 // Since there's no actual continuation from this block, nothing can be
8697 // relying on us setting vregs for them.
8698 PendingExports.clear();
8699 } else {
8700 DAG.setRoot(Result.second);
8701 }
8702
8703 if (EHPadBB) {
8704 DAG.setRoot(lowerEndEH(getRoot(), cast_or_null<InvokeInst>(CLI.CB), EHPadBB,
8705 BeginLabel));
8706 Result.second = getRoot();
8707 }
8708
8709 return Result;
8710}
8711
8713 bool isTailCall, bool isMustTailCall,
8714 const BasicBlock *EHPadBB,
8715 const TargetLowering::PtrAuthInfo *PAI) {
8716 auto &DL = DAG.getDataLayout();
8717 FunctionType *FTy = CB.getFunctionType();
8718 Type *RetTy = CB.getType();
8719
8721 Args.reserve(CB.arg_size());
8722
8723 const Value *SwiftErrorVal = nullptr;
8725
8726 if (isTailCall) {
8727 // Avoid emitting tail calls in functions with the disable-tail-calls
8728 // attribute.
8729 auto *Caller = CB.getParent()->getParent();
8730 if (Caller->getFnAttribute("disable-tail-calls").getValueAsString() ==
8731 "true" && !isMustTailCall)
8732 isTailCall = false;
8733
8734 // We can't tail call inside a function with a swifterror argument. Lowering
8735 // does not support this yet. It would have to move into the swifterror
8736 // register before the call.
8737 if (TLI.supportSwiftError() &&
8738 Caller->getAttributes().hasAttrSomewhere(Attribute::SwiftError))
8739 isTailCall = false;
8740 }
8741
8742 for (auto I = CB.arg_begin(), E = CB.arg_end(); I != E; ++I) {
8744 const Value *V = *I;
8745
8746 // Skip empty types
8747 if (V->getType()->isEmptyTy())
8748 continue;
8749
8750 SDValue ArgNode = getValue(V);
8751 Entry.Node = ArgNode; Entry.Ty = V->getType();
8752
8753 Entry.setAttributes(&CB, I - CB.arg_begin());
8754
8755 // Use swifterror virtual register as input to the call.
8756 if (Entry.IsSwiftError && TLI.supportSwiftError()) {
8757 SwiftErrorVal = V;
8758 // We find the virtual register for the actual swifterror argument.
8759 // Instead of using the Value, we use the virtual register instead.
8760 Entry.Node =
8762 EVT(TLI.getPointerTy(DL)));
8763 }
8764
8765 Args.push_back(Entry);
8766
8767 // If we have an explicit sret argument that is an Instruction, (i.e., it
8768 // might point to function-local memory), we can't meaningfully tail-call.
8769 if (Entry.IsSRet && isa<Instruction>(V))
8770 isTailCall = false;
8771 }
8772
8773 // If call site has a cfguardtarget operand bundle, create and add an
8774 // additional ArgListEntry.
8775 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_cfguardtarget)) {
8777 Value *V = Bundle->Inputs[0];
8778 SDValue ArgNode = getValue(V);
8779 Entry.Node = ArgNode;
8780 Entry.Ty = V->getType();
8781 Entry.IsCFGuardTarget = true;
8782 Args.push_back(Entry);
8783 }
8784
8785 // Check if target-independent constraints permit a tail call here.
8786 // Target-dependent constraints are checked within TLI->LowerCallTo.
8787 if (isTailCall && !isInTailCallPosition(CB, DAG.getTarget()))
8788 isTailCall = false;
8789
8790 // Disable tail calls if there is an swifterror argument. Targets have not
8791 // been updated to support tail calls.
8792 if (TLI.supportSwiftError() && SwiftErrorVal)
8793 isTailCall = false;
8794
8795 ConstantInt *CFIType = nullptr;
8796 if (CB.isIndirectCall()) {
8797 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_kcfi)) {
8798 if (!TLI.supportKCFIBundles())
8800 "Target doesn't support calls with kcfi operand bundles.");
8801 CFIType = cast<ConstantInt>(Bundle->Inputs[0]);
8802 assert(CFIType->getType()->isIntegerTy(32) && "Invalid CFI type");
8803 }
8804 }
8805
8806 SDValue ConvControlToken;
8807 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_convergencectrl)) {
8808 auto *Token = Bundle->Inputs[0].get();
8809 ConvControlToken = getValue(Token);
8810 }
8811
8814 .setChain(getRoot())
8815 .setCallee(RetTy, FTy, Callee, std::move(Args), CB)
8816 .setTailCall(isTailCall)
8820 .setCFIType(CFIType)
8821 .setConvergenceControlToken(ConvControlToken);
8822
8823 // Set the pointer authentication info if we have it.
8824 if (PAI) {
8825 if (!TLI.supportPtrAuthBundles())
8827 "This target doesn't support calls with ptrauth operand bundles.");
8828 CLI.setPtrAuth(*PAI);
8829 }
8830
8831 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
8832
8833 if (Result.first.getNode()) {
8834 Result.first = lowerRangeToAssertZExt(DAG, CB, Result.first);
8835 setValue(&CB, Result.first);
8836 }
8837
8838 // The last element of CLI.InVals has the SDValue for swifterror return.
8839 // Here we copy it to a virtual register and update SwiftErrorMap for
8840 // book-keeping.
8841 if (SwiftErrorVal && TLI.supportSwiftError()) {
8842 // Get the last element of InVals.
8843 SDValue Src = CLI.InVals.back();
8844 Register VReg =
8845 SwiftError.getOrCreateVRegDefAt(&CB, FuncInfo.MBB, SwiftErrorVal);
8846 SDValue CopyNode = CLI.DAG.getCopyToReg(Result.second, CLI.DL, VReg, Src);
8847 DAG.setRoot(CopyNode);
8848 }
8849}
8850
8851static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT,
8852 SelectionDAGBuilder &Builder) {
8853 // Check to see if this load can be trivially constant folded, e.g. if the
8854 // input is from a string literal.
8855 if (const Constant *LoadInput = dyn_cast<Constant>(PtrVal)) {
8856 // Cast pointer to the type we really want to load.
8857 Type *LoadTy =
8858 Type::getIntNTy(PtrVal->getContext(), LoadVT.getScalarSizeInBits());
8859 if (LoadVT.isVector())
8860 LoadTy = FixedVectorType::get(LoadTy, LoadVT.getVectorNumElements());
8861
8862 LoadInput = ConstantExpr::getBitCast(const_cast<Constant *>(LoadInput),
8863 PointerType::getUnqual(LoadTy));
8864
8865 if (const Constant *LoadCst =
8866 ConstantFoldLoadFromConstPtr(const_cast<Constant *>(LoadInput),
8867 LoadTy, Builder.DAG.getDataLayout()))
8868 return Builder.getValue(LoadCst);
8869 }
8870
8871 // Otherwise, we have to emit the load. If the pointer is to unfoldable but
8872 // still constant memory, the input chain can be the entry node.
8873 SDValue Root;
8874 bool ConstantMemory = false;
8875
8876 // Do not serialize (non-volatile) loads of constant memory with anything.
8877 if (Builder.AA && Builder.AA->pointsToConstantMemory(PtrVal)) {
8878 Root = Builder.DAG.getEntryNode();
8879 ConstantMemory = true;
8880 } else {
8881 // Do not serialize non-volatile loads against each other.
8882 Root = Builder.DAG.getRoot();
8883 }
8884
8885 SDValue Ptr = Builder.getValue(PtrVal);
8886 SDValue LoadVal =
8887 Builder.DAG.getLoad(LoadVT, Builder.getCurSDLoc(), Root, Ptr,
8888 MachinePointerInfo(PtrVal), Align(1));
8889
8890 if (!ConstantMemory)
8891 Builder.PendingLoads.push_back(LoadVal.getValue(1));
8892 return LoadVal;
8893}
8894
8895/// Record the value for an instruction that produces an integer result,
8896/// converting the type where necessary.
8897void SelectionDAGBuilder::processIntegerCallValue(const Instruction &I,
8898 SDValue Value,
8899 bool IsSigned) {
8901 I.getType(), true);
8902 Value = DAG.getExtOrTrunc(IsSigned, Value, getCurSDLoc(), VT);
8903 setValue(&I, Value);
8904}
8905
8906/// See if we can lower a memcmp/bcmp call into an optimized form. If so, return
8907/// true and lower it. Otherwise return false, and it will be lowered like a
8908/// normal call.
8909/// The caller already checked that \p I calls the appropriate LibFunc with a
8910/// correct prototype.
8911bool SelectionDAGBuilder::visitMemCmpBCmpCall(const CallInst &I) {
8912 const Value *LHS = I.getArgOperand(0), *RHS = I.getArgOperand(1);
8913 const Value *Size = I.getArgOperand(2);
8914 const ConstantSDNode *CSize = dyn_cast<ConstantSDNode>(getValue(Size));
8915 if (CSize && CSize->getZExtValue() == 0) {
8917 I.getType(), true);
8918 setValue(&I, DAG.getConstant(0, getCurSDLoc(), CallVT));
8919 return true;
8920 }
8921
8923 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForMemcmp(
8924 DAG, getCurSDLoc(), DAG.getRoot(), getValue(LHS), getValue(RHS),
8926 if (Res.first.getNode()) {
8927 processIntegerCallValue(I, Res.first, true);
8928 PendingLoads.push_back(Res.second);
8929 return true;
8930 }
8931
8932 // memcmp(S1,S2,2) != 0 -> (*(short*)LHS != *(short*)RHS) != 0
8933 // memcmp(S1,S2,4) != 0 -> (*(int*)LHS != *(int*)RHS) != 0
8934 if (!CSize || !isOnlyUsedInZeroEqualityComparison(&I))
8935 return false;
8936
8937 // If the target has a fast compare for the given size, it will return a
8938 // preferred load type for that size. Require that the load VT is legal and
8939 // that the target supports unaligned loads of that type. Otherwise, return
8940 // INVALID.
8941 auto hasFastLoadsAndCompare = [&](unsigned NumBits) {
8943 MVT LVT = TLI.hasFastEqualityCompare(NumBits);
8944 if (LVT != MVT::INVALID_SIMPLE_VALUE_TYPE) {
8945 // TODO: Handle 5 byte compare as 4-byte + 1 byte.
8946 // TODO: Handle 8 byte compare on x86-32 as two 32-bit loads.
8947 // TODO: Check alignment of src and dest ptrs.
8948 unsigned DstAS = LHS->getType()->getPointerAddressSpace();
8949 unsigned SrcAS = RHS->getType()->getPointerAddressSpace();
8950 if (!TLI.isTypeLegal(LVT) ||
8951 !TLI.allowsMisalignedMemoryAccesses(LVT, SrcAS) ||
8952 !TLI.allowsMisalignedMemoryAccesses(LVT, DstAS))
8954 }
8955
8956 return LVT;
8957 };
8958
8959 // This turns into unaligned loads. We only do this if the target natively
8960 // supports the MVT we'll be loading or if it is small enough (<= 4) that
8961 // we'll only produce a small number of byte loads.
8962 MVT LoadVT;
8963 unsigned NumBitsToCompare = CSize->getZExtValue() * 8;
8964 switch (NumBitsToCompare) {
8965 default:
8966 return false;
8967 case 16:
8968 LoadVT = MVT::i16;
8969 break;
8970 case 32:
8971 LoadVT = MVT::i32;
8972 break;
8973 case 64:
8974 case 128:
8975 case 256:
8976 LoadVT = hasFastLoadsAndCompare(NumBitsToCompare);
8977 break;
8978 }
8979
8980 if (LoadVT == MVT::INVALID_SIMPLE_VALUE_TYPE)
8981 return false;
8982
8983 SDValue LoadL = getMemCmpLoad(LHS, LoadVT, *this);
8984 SDValue LoadR = getMemCmpLoad(RHS, LoadVT, *this);
8985
8986 // Bitcast to a wide integer type if the loads are vectors.
8987 if (LoadVT.isVector()) {
8988 EVT CmpVT = EVT::getIntegerVT(LHS->getContext(), LoadVT.getSizeInBits());
8989 LoadL = DAG.getBitcast(CmpVT, LoadL);
8990 LoadR = DAG.getBitcast(CmpVT, LoadR);
8991 }
8992
8993 SDValue Cmp = DAG.getSetCC(getCurSDLoc(), MVT::i1, LoadL, LoadR, ISD::SETNE);
8994 processIntegerCallValue(I, Cmp, false);
8995 return true;
8996}
8997
8998/// See if we can lower a memchr call into an optimized form. If so, return
8999/// true and lower it. Otherwise return false, and it will be lowered like a
9000/// normal call.
9001/// The caller already checked that \p I calls the appropriate LibFunc with a
9002/// correct prototype.
9003bool SelectionDAGBuilder::visitMemChrCall(const CallInst &I) {
9004 const Value *Src = I.getArgOperand(0);
9005 const Value *Char = I.getArgOperand(1);
9006 const Value *Length = I.getArgOperand(2);
9007
9009 std::pair<SDValue, SDValue> Res =
9011 getValue(Src), getValue(Char), getValue(Length),
9012 MachinePointerInfo(Src));
9013 if (Res.first.getNode()) {
9014 setValue(&I, Res.first);
9015 PendingLoads.push_back(Res.second);
9016 return true;
9017 }
9018
9019 return false;
9020}
9021
9022/// See if we can lower a mempcpy call into an optimized form. If so, return
9023/// true and lower it. Otherwise return false, and it will be lowered like a
9024/// normal call.
9025/// The caller already checked that \p I calls the appropriate LibFunc with a
9026/// correct prototype.
9027bool SelectionDAGBuilder::visitMemPCpyCall(const CallInst &I) {
9028 SDValue Dst = getValue(I.getArgOperand(0));
9029 SDValue Src = getValue(I.getArgOperand(1));
9030 SDValue Size = getValue(I.getArgOperand(2));
9031
9032 Align DstAlign = DAG.InferPtrAlign(Dst).valueOrOne();
9033 Align SrcAlign = DAG.InferPtrAlign(Src).valueOrOne();
9034 // DAG::getMemcpy needs Alignment to be defined.
9035 Align Alignment = std::min(DstAlign, SrcAlign);
9036
9037 SDLoc sdl = getCurSDLoc();
9038
9039 // In the mempcpy context we need to pass in a false value for isTailCall
9040 // because the return pointer needs to be adjusted by the size of
9041 // the copied memory.
9042 SDValue Root = getMemoryRoot();
9043 SDValue MC = DAG.getMemcpy(
9044 Root, sdl, Dst, Src, Size, Alignment, false, false, /*CI=*/nullptr,
9045 std::nullopt, MachinePointerInfo(I.getArgOperand(0)),
9046 MachinePointerInfo(I.getArgOperand(1)), I.getAAMetadata());
9047 assert(MC.getNode() != nullptr &&
9048 "** memcpy should not be lowered as TailCall in mempcpy context **");
9049 DAG.setRoot(MC);
9050
9051 // Check if Size needs to be truncated or extended.
9052 Size = DAG.getSExtOrTrunc(Size, sdl, Dst.getValueType());
9053
9054 // Adjust return pointer to point just past the last dst byte.
9055 SDValue DstPlusSize = DAG.getNode(ISD::ADD, sdl, Dst.getValueType(),
9056 Dst, Size);
9057 setValue(&I, DstPlusSize);
9058 return true;
9059}
9060
9061/// See if we can lower a strcpy call into an optimized form. If so, return
9062/// true and lower it, otherwise return false and it will be lowered like a
9063/// normal call.
9064/// The caller already checked that \p I calls the appropriate LibFunc with a
9065/// correct prototype.
9066bool SelectionDAGBuilder::visitStrCpyCall(const CallInst &I, bool isStpcpy) {
9067 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9068
9070 std::pair<SDValue, SDValue> Res =
9072 getValue(Arg0), getValue(Arg1),
9073 MachinePointerInfo(Arg0),
9074 MachinePointerInfo(Arg1), isStpcpy);
9075 if (Res.first.getNode()) {
9076 setValue(&I, Res.first);
9077 DAG.setRoot(Res.second);
9078 return true;
9079 }
9080
9081 return false;
9082}
9083
9084/// See if we can lower a strcmp call into an optimized form. If so, return
9085/// true and lower it, otherwise return false and it will be lowered like a
9086/// normal call.
9087/// The caller already checked that \p I calls the appropriate LibFunc with a
9088/// correct prototype.
9089bool SelectionDAGBuilder::visitStrCmpCall(const CallInst &I) {
9090 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9091
9093 std::pair<SDValue, SDValue> Res =
9095 getValue(Arg0), getValue(Arg1),
9096 MachinePointerInfo(Arg0),
9097 MachinePointerInfo(Arg1));
9098 if (Res.first.getNode()) {
9099 processIntegerCallValue(I, Res.first, true);
9100 PendingLoads.push_back(Res.second);
9101 return true;
9102 }
9103
9104 return false;
9105}
9106
9107/// See if we can lower a strlen call into an optimized form. If so, return
9108/// true and lower it, otherwise return false and it will be lowered like a
9109/// normal call.
9110/// The caller already checked that \p I calls the appropriate LibFunc with a
9111/// correct prototype.
9112bool SelectionDAGBuilder::visitStrLenCall(const CallInst &I) {
9113 const Value *Arg0 = I.getArgOperand(0);
9114
9116 std::pair<SDValue, SDValue> Res =
9118 getValue(Arg0), MachinePointerInfo(Arg0));
9119 if (Res.first.getNode()) {
9120 processIntegerCallValue(I, Res.first, false);
9121 PendingLoads.push_back(Res.second);
9122 return true;
9123 }
9124
9125 return false;
9126}
9127
9128/// See if we can lower a strnlen call into an optimized form. If so, return
9129/// true and lower it, otherwise return false and it will be lowered like a
9130/// normal call.
9131/// The caller already checked that \p I calls the appropriate LibFunc with a
9132/// correct prototype.
9133bool SelectionDAGBuilder::visitStrNLenCall(const CallInst &I) {
9134 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9135
9137 std::pair<SDValue, SDValue> Res =
9139 getValue(Arg0), getValue(Arg1),
9140 MachinePointerInfo(Arg0));
9141 if (Res.first.getNode()) {
9142 processIntegerCallValue(I, Res.first, false);
9143 PendingLoads.push_back(Res.second);
9144 return true;
9145 }
9146
9147 return false;
9148}
9149
9150/// See if we can lower a unary floating-point operation into an SDNode with
9151/// the specified Opcode. If so, return true and lower it, otherwise return
9152/// false and it will be lowered like a normal call.
9153/// The caller already checked that \p I calls the appropriate LibFunc with a
9154/// correct prototype.
9155bool SelectionDAGBuilder::visitUnaryFloatCall(const CallInst &I,
9156 unsigned Opcode) {
9157 // We already checked this call's prototype; verify it doesn't modify errno.
9158 if (!I.onlyReadsMemory())
9159 return false;
9160
9162 Flags.copyFMF(cast<FPMathOperator>(I));
9163
9164 SDValue Tmp = getValue(I.getArgOperand(0));
9165 setValue(&I,
9166 DAG.getNode(Opcode, getCurSDLoc(), Tmp.getValueType(), Tmp, Flags));
9167 return true;
9168}
9169
9170/// See if we can lower a binary floating-point operation into an SDNode with
9171/// the specified Opcode. If so, return true and lower it. Otherwise return
9172/// false, and it will be lowered like a normal call.
9173/// The caller already checked that \p I calls the appropriate LibFunc with a
9174/// correct prototype.
9175bool SelectionDAGBuilder::visitBinaryFloatCall(const CallInst &I,
9176 unsigned Opcode) {
9177 // We already checked this call's prototype; verify it doesn't modify errno.
9178 if (!I.onlyReadsMemory())
9179 return false;
9180
9182 Flags.copyFMF(cast<FPMathOperator>(I));
9183
9184 SDValue Tmp0 = getValue(I.getArgOperand(0));
9185 SDValue Tmp1 = getValue(I.getArgOperand(1));
9186 EVT VT = Tmp0.getValueType();
9187 setValue(&I, DAG.getNode(Opcode, getCurSDLoc(), VT, Tmp0, Tmp1, Flags));
9188 return true;
9189}
9190
9191void SelectionDAGBuilder::visitCall(const CallInst &I) {
9192 // Handle inline assembly differently.
9193 if (I.isInlineAsm()) {
9194 visitInlineAsm(I);
9195 return;
9196 }
9197
9199
9200 if (Function *F = I.getCalledFunction()) {
9201 if (F->isDeclaration()) {
9202 // Is this an LLVM intrinsic or a target-specific intrinsic?
9203 unsigned IID = F->getIntrinsicID();
9204 if (!IID)
9205 if (const TargetIntrinsicInfo *II = TM.getIntrinsicInfo())
9206 IID = II->getIntrinsicID(F);
9207
9208 if (IID) {
9209 visitIntrinsicCall(I, IID);
9210 return;
9211 }
9212 }
9213
9214 // Check for well-known libc/libm calls. If the function is internal, it
9215 // can't be a library call. Don't do the check if marked as nobuiltin for
9216 // some reason or the call site requires strict floating point semantics.
9217 LibFunc Func;
9218 if (!I.isNoBuiltin() && !I.isStrictFP() && !F->hasLocalLinkage() &&
9219 F->hasName() && LibInfo->getLibFunc(*F, Func) &&
9221 switch (Func) {
9222 default: break;
9223 case LibFunc_bcmp:
9224 if (visitMemCmpBCmpCall(I))
9225 return;
9226 break;
9227 case LibFunc_copysign:
9228 case LibFunc_copysignf:
9229 case LibFunc_copysignl:
9230 // We already checked this call's prototype; verify it doesn't modify
9231 // errno.
9232 if (I.onlyReadsMemory()) {
9233 SDValue LHS = getValue(I.getArgOperand(0));
9234 SDValue RHS = getValue(I.getArgOperand(1));
9236 LHS.getValueType(), LHS, RHS));
9237 return;
9238 }
9239 break;
9240 case LibFunc_fabs:
9241 case LibFunc_fabsf:
9242 case LibFunc_fabsl:
9243 if (visitUnaryFloatCall(I, ISD::FABS))
9244 return;
9245 break;
9246 case LibFunc_fmin:
9247 case LibFunc_fminf:
9248 case LibFunc_fminl:
9249 if (visitBinaryFloatCall(I, ISD::FMINNUM))
9250 return;
9251 break;
9252 case LibFunc_fmax:
9253 case LibFunc_fmaxf:
9254 case LibFunc_fmaxl:
9255 if (visitBinaryFloatCall(I, ISD::FMAXNUM))
9256 return;
9257 break;
9258 case LibFunc_sin:
9259 case LibFunc_sinf:
9260 case LibFunc_sinl:
9261 if (visitUnaryFloatCall(I, ISD::FSIN))
9262 return;
9263 break;
9264 case LibFunc_cos:
9265 case LibFunc_cosf:
9266 case LibFunc_cosl:
9267 if (visitUnaryFloatCall(I, ISD::FCOS))
9268 return;
9269 break;
9270 case LibFunc_tan:
9271 case LibFunc_tanf:
9272 case LibFunc_tanl:
9273 if (visitUnaryFloatCall(I, ISD::FTAN))
9274 return;
9275 break;
9276 case LibFunc_asin:
9277 case LibFunc_asinf:
9278 case LibFunc_asinl:
9279 if (visitUnaryFloatCall(I, ISD::FASIN))
9280 return;
9281 break;
9282 case LibFunc_acos:
9283 case LibFunc_acosf:
9284 case LibFunc_acosl:
9285 if (visitUnaryFloatCall(I, ISD::FACOS))
9286 return;
9287 break;
9288 case LibFunc_atan:
9289 case LibFunc_atanf:
9290 case LibFunc_atanl:
9291 if (visitUnaryFloatCall(I, ISD::FATAN))
9292 return;
9293 break;
9294 case LibFunc_sinh:
9295 case LibFunc_sinhf:
9296 case LibFunc_sinhl:
9297 if (visitUnaryFloatCall(I, ISD::FSINH))
9298 return;
9299 break;
9300 case LibFunc_cosh:
9301 case LibFunc_coshf:
9302 case LibFunc_coshl:
9303 if (visitUnaryFloatCall(I, ISD::FCOSH))
9304 return;
9305 break;
9306 case LibFunc_tanh:
9307 case LibFunc_tanhf:
9308 case LibFunc_tanhl:
9309 if (visitUnaryFloatCall(I, ISD::FTANH))
9310 return;
9311 break;
9312 case LibFunc_sqrt:
9313 case LibFunc_sqrtf:
9314 case LibFunc_sqrtl:
9315 case LibFunc_sqrt_finite:
9316 case LibFunc_sqrtf_finite:
9317 case LibFunc_sqrtl_finite:
9318 if (visitUnaryFloatCall(I, ISD::FSQRT))
9319 return;
9320 break;
9321 case LibFunc_floor:
9322 case LibFunc_floorf:
9323 case LibFunc_floorl:
9324 if (visitUnaryFloatCall(I, ISD::FFLOOR))
9325 return;
9326 break;
9327 case LibFunc_nearbyint:
9328 case LibFunc_nearbyintf:
9329 case LibFunc_nearbyintl:
9330 if (visitUnaryFloatCall(I, ISD::FNEARBYINT))
9331 return;
9332 break;
9333 case LibFunc_ceil:
9334 case LibFunc_ceilf:
9335 case LibFunc_ceill:
9336 if (visitUnaryFloatCall(I, ISD::FCEIL))
9337 return;
9338 break;
9339 case LibFunc_rint:
9340 case LibFunc_rintf:
9341 case LibFunc_rintl:
9342 if (visitUnaryFloatCall(I, ISD::FRINT))
9343 return;
9344 break;
9345 case LibFunc_round:
9346 case LibFunc_roundf:
9347 case LibFunc_roundl:
9348 if (visitUnaryFloatCall(I, ISD::FROUND))
9349 return;
9350 break;
9351 case LibFunc_trunc:
9352 case LibFunc_truncf:
9353 case LibFunc_truncl:
9354 if (visitUnaryFloatCall(I, ISD::FTRUNC))
9355 return;
9356 break;
9357 case LibFunc_log2:
9358 case LibFunc_log2f:
9359 case LibFunc_log2l:
9360 if (visitUnaryFloatCall(I, ISD::FLOG2))
9361 return;
9362 break;
9363 case LibFunc_exp2:
9364 case LibFunc_exp2f:
9365 case LibFunc_exp2l:
9366 if (visitUnaryFloatCall(I, ISD::FEXP2))
9367 return;
9368 break;
9369 case LibFunc_exp10:
9370 case LibFunc_exp10f:
9371 case LibFunc_exp10l:
9372 if (visitUnaryFloatCall(I, ISD::FEXP10))
9373 return;
9374 break;
9375 case LibFunc_ldexp:
9376 case LibFunc_ldexpf:
9377 case LibFunc_ldexpl:
9378 if (visitBinaryFloatCall(I, ISD::FLDEXP))
9379 return;
9380 break;
9381 case LibFunc_memcmp:
9382 if (visitMemCmpBCmpCall(I))
9383 return;
9384 break;
9385 case LibFunc_mempcpy:
9386 if (visitMemPCpyCall(I))
9387 return;
9388 break;
9389 case LibFunc_memchr:
9390 if (visitMemChrCall(I))
9391 return;
9392 break;
9393 case LibFunc_strcpy:
9394 if (visitStrCpyCall(I, false))
9395 return;
9396 break;
9397 case LibFunc_stpcpy:
9398 if (visitStrCpyCall(I, true))
9399 return;
9400 break;
9401 case LibFunc_strcmp:
9402 if (visitStrCmpCall(I))
9403 return;
9404 break;
9405 case LibFunc_strlen:
9406 if (visitStrLenCall(I))
9407 return;
9408 break;
9409 case LibFunc_strnlen:
9410 if (visitStrNLenCall(I))
9411 return;
9412 break;
9413 }
9414 }
9415 }
9416
9417 if (I.countOperandBundlesOfType(LLVMContext::OB_ptrauth)) {
9418 LowerCallSiteWithPtrAuthBundle(cast<CallBase>(I), /*EHPadBB=*/nullptr);
9419 return;
9420 }
9421
9422 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
9423 // have to do anything here to lower funclet bundles.
9424 // CFGuardTarget bundles are lowered in LowerCallTo.
9425 assert(!I.hasOperandBundlesOtherThan(
9426 {LLVMContext::OB_deopt, LLVMContext::OB_funclet,
9427 LLVMContext::OB_cfguardtarget, LLVMContext::OB_preallocated,
9428 LLVMContext::OB_clang_arc_attachedcall, LLVMContext::OB_kcfi,
9429 LLVMContext::OB_convergencectrl}) &&
9430 "Cannot lower calls with arbitrary operand bundles!");
9431
9432 SDValue Callee = getValue(I.getCalledOperand());
9433
9434 if (I.hasDeoptState())
9435 LowerCallSiteWithDeoptBundle(&I, Callee, nullptr);
9436 else
9437 // Check if we can potentially perform a tail call. More detailed checking
9438 // is be done within LowerCallTo, after more information about the call is
9439 // known.
9440 LowerCallTo(I, Callee, I.isTailCall(), I.isMustTailCall());
9441}
9442
9444 const CallBase &CB, const BasicBlock *EHPadBB) {
9445 auto PAB = CB.getOperandBundle("ptrauth");
9446 const Value *CalleeV = CB.getCalledOperand();
9447
9448 // Gather the call ptrauth data from the operand bundle:
9449 // [ i32 <key>, i64 <discriminator> ]
9450 const auto *Key = cast<ConstantInt>(PAB->Inputs[0]);
9451 const Value *Discriminator = PAB->Inputs[1];
9452
9453 assert(Key->getType()->isIntegerTy(32) && "Invalid ptrauth key");
9454 assert(Discriminator->getType()->isIntegerTy(64) &&
9455 "Invalid ptrauth discriminator");
9456
9457 // Look through ptrauth constants to find the raw callee.
9458 // Do a direct unauthenticated call if we found it and everything matches.
9459 if (const auto *CalleeCPA = dyn_cast<ConstantPtrAuth>(CalleeV))
9460 if (CalleeCPA->isKnownCompatibleWith(Key, Discriminator,
9461 DAG.getDataLayout()))
9462 return LowerCallTo(CB, getValue(CalleeCPA->getPointer()), CB.isTailCall(),
9463 CB.isMustTailCall(), EHPadBB);
9464
9465 // Functions should never be ptrauth-called directly.
9466 assert(!isa<Function>(CalleeV) && "invalid direct ptrauth call");
9467
9468 // Otherwise, do an authenticated indirect call.
9469 TargetLowering::PtrAuthInfo PAI = {Key->getZExtValue(),
9470 getValue(Discriminator)};
9471
9472 LowerCallTo(CB, getValue(CalleeV), CB.isTailCall(), CB.isMustTailCall(),
9473 EHPadBB, &PAI);
9474}
9475
9476namespace {
9477
9478/// AsmOperandInfo - This contains information for each constraint that we are
9479/// lowering.
9480class SDISelAsmOperandInfo : public TargetLowering::AsmOperandInfo {
9481public:
9482 /// CallOperand - If this is the result output operand or a clobber
9483 /// this is null, otherwise it is the incoming operand to the CallInst.
9484 /// This gets modified as the asm is processed.
9485 SDValue CallOperand;
9486
9487 /// AssignedRegs - If this is a register or register class operand, this
9488 /// contains the set of register corresponding to the operand.
9489 RegsForValue AssignedRegs;
9490
9491 explicit SDISelAsmOperandInfo(const TargetLowering::AsmOperandInfo &info)
9492 : TargetLowering::AsmOperandInfo(info), CallOperand(nullptr, 0) {
9493 }
9494
9495 /// Whether or not this operand accesses memory
9496 bool hasMemory(const TargetLowering &TLI) const {
9497 // Indirect operand accesses access memory.
9498 if (isIndirect)
9499 return true;
9500
9501 for (const auto &Code : Codes)
9503 return true;
9504
9505 return false;
9506 }
9507};
9508
9509
9510} // end anonymous namespace
9511
9512/// Make sure that the output operand \p OpInfo and its corresponding input
9513/// operand \p MatchingOpInfo have compatible constraint types (otherwise error
9514/// out).
9515static void patchMatchingInput(const SDISelAsmOperandInfo &OpInfo,
9516 SDISelAsmOperandInfo &MatchingOpInfo,
9517 SelectionDAG &DAG) {
9518 if (OpInfo.ConstraintVT == MatchingOpInfo.ConstraintVT)
9519 return;
9520
9522 const auto &TLI = DAG.getTargetLoweringInfo();
9523
9524 std::pair<unsigned, const TargetRegisterClass *> MatchRC =
9525 TLI.getRegForInlineAsmConstraint(TRI, OpInfo.ConstraintCode,
9526 OpInfo.ConstraintVT);
9527 std::pair<unsigned, const TargetRegisterClass *> InputRC =
9528 TLI.getRegForInlineAsmConstraint(TRI, MatchingOpInfo.ConstraintCode,
9529 MatchingOpInfo.ConstraintVT);
9530 if ((OpInfo.ConstraintVT.isInteger() !=
9531 MatchingOpInfo.ConstraintVT.isInteger()) ||
9532 (MatchRC.second != InputRC.second)) {
9533 // FIXME: error out in a more elegant fashion
9534 report_fatal_error("Unsupported asm: input constraint"
9535 " with a matching output constraint of"
9536 " incompatible type!");
9537 }
9538 MatchingOpInfo.ConstraintVT = OpInfo.ConstraintVT;
9539}
9540
9541/// Get a direct memory input to behave well as an indirect operand.
9542/// This may introduce stores, hence the need for a \p Chain.
9543/// \return The (possibly updated) chain.
9544static SDValue getAddressForMemoryInput(SDValue Chain, const SDLoc &Location,
9545 SDISelAsmOperandInfo &OpInfo,
9546 SelectionDAG &DAG) {
9547 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9548
9549 // If we don't have an indirect input, put it in the constpool if we can,
9550 // otherwise spill it to a stack slot.
9551 // TODO: This isn't quite right. We need to handle these according to
9552 // the addressing mode that the constraint wants. Also, this may take
9553 // an additional register for the computation and we don't want that
9554 // either.
9555
9556 // If the operand is a float, integer, or vector constant, spill to a
9557 // constant pool entry to get its address.
9558 const Value *OpVal = OpInfo.CallOperandVal;
9559 if (isa<ConstantFP>(OpVal) || isa<ConstantInt>(OpVal) ||
9560 isa<ConstantVector>(OpVal) || isa<ConstantDataVector>(OpVal)) {
9561 OpInfo.CallOperand = DAG.getConstantPool(
9562 cast<Constant>(OpVal), TLI.getPointerTy(DAG.getDataLayout()));
9563 return Chain;
9564 }
9565
9566 // Otherwise, create a stack slot and emit a store to it before the asm.
9567 Type *Ty = OpVal->getType();
9568 auto &DL = DAG.getDataLayout();
9569 TypeSize TySize = DL.getTypeAllocSize(Ty);
9572 int StackID = 0;
9573 if (TySize.isScalable())
9574 StackID = TFI->getStackIDForScalableVectors();
9575 int SSFI = MF.getFrameInfo().CreateStackObject(TySize.getKnownMinValue(),
9576 DL.getPrefTypeAlign(Ty), false,
9577 nullptr, StackID);
9578 SDValue StackSlot = DAG.getFrameIndex(SSFI, TLI.getFrameIndexTy(DL));
9579 Chain = DAG.getTruncStore(Chain, Location, OpInfo.CallOperand, StackSlot,
9581 TLI.getMemValueType(DL, Ty));
9582 OpInfo.CallOperand = StackSlot;
9583
9584 return Chain;
9585}
9586
9587/// GetRegistersForValue - Assign registers (virtual or physical) for the
9588/// specified operand. We prefer to assign virtual registers, to allow the
9589/// register allocator to handle the assignment process. However, if the asm
9590/// uses features that we can't model on machineinstrs, we have SDISel do the
9591/// allocation. This produces generally horrible, but correct, code.
9592///
9593/// OpInfo describes the operand
9594/// RefOpInfo describes the matching operand if any, the operand otherwise
9595static std::optional<unsigned>
9597 SDISelAsmOperandInfo &OpInfo,
9598 SDISelAsmOperandInfo &RefOpInfo) {
9599 LLVMContext &Context = *DAG.getContext();
9600 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9601
9605
9606 // No work to do for memory/address operands.
9607 if (OpInfo.ConstraintType == TargetLowering::C_Memory ||
9608 OpInfo.ConstraintType == TargetLowering::C_Address)
9609 return std::nullopt;
9610
9611 // If this is a constraint for a single physreg, or a constraint for a
9612 // register class, find it.
9613 unsigned AssignedReg;
9614 const TargetRegisterClass *RC;
9615 std::tie(AssignedReg, RC) = TLI.getRegForInlineAsmConstraint(
9616 &TRI, RefOpInfo.ConstraintCode, RefOpInfo.ConstraintVT);
9617 // RC is unset only on failure. Return immediately.
9618 if (!RC)
9619 return std::nullopt;
9620
9621 // Get the actual register value type. This is important, because the user
9622 // may have asked for (e.g.) the AX register in i32 type. We need to
9623 // remember that AX is actually i16 to get the right extension.
9624 const MVT RegVT = *TRI.legalclasstypes_begin(*RC);
9625
9626 if (OpInfo.ConstraintVT != MVT::Other && RegVT != MVT::Untyped) {
9627 // If this is an FP operand in an integer register (or visa versa), or more
9628 // generally if the operand value disagrees with the register class we plan
9629 // to stick it in, fix the operand type.
9630 //
9631 // If this is an input value, the bitcast to the new type is done now.
9632 // Bitcast for output value is done at the end of visitInlineAsm().
9633 if ((OpInfo.Type == InlineAsm::isOutput ||
9634 OpInfo.Type == InlineAsm::isInput) &&
9635 !TRI.isTypeLegalForClass(*RC, OpInfo.ConstraintVT)) {
9636 // Try to convert to the first EVT that the reg class contains. If the
9637 // types are identical size, use a bitcast to convert (e.g. two differing
9638 // vector types). Note: output bitcast is done at the end of
9639 // visitInlineAsm().
9640 if (RegVT.getSizeInBits() == OpInfo.ConstraintVT.getSizeInBits()) {
9641 // Exclude indirect inputs while they are unsupported because the code
9642 // to perform the load is missing and thus OpInfo.CallOperand still
9643 // refers to the input address rather than the pointed-to value.
9644 if (OpInfo.Type == InlineAsm::isInput && !OpInfo.isIndirect)
9645 OpInfo.CallOperand =
9646 DAG.getNode(ISD::BITCAST, DL, RegVT, OpInfo.CallOperand);
9647 OpInfo.ConstraintVT = RegVT;
9648 // If the operand is an FP value and we want it in integer registers,
9649 // use the corresponding integer type. This turns an f64 value into
9650 // i64, which can be passed with two i32 values on a 32-bit machine.
9651 } else if (RegVT.isInteger() && OpInfo.ConstraintVT.isFloatingPoint()) {
9652 MVT VT = MVT::getIntegerVT(OpInfo.ConstraintVT.getSizeInBits());
9653 if (OpInfo.Type == InlineAsm::isInput)
9654 OpInfo.CallOperand =
9655 DAG.getNode(ISD::BITCAST, DL, VT, OpInfo.CallOperand);
9656 OpInfo.ConstraintVT = VT;
9657 }
9658 }
9659 }
9660
9661 // No need to allocate a matching input constraint since the constraint it's
9662 // matching to has already been allocated.
9663 if (OpInfo.isMatchingInputConstraint())
9664 return std::nullopt;
9665
9666 EVT ValueVT = OpInfo.ConstraintVT;
9667 if (OpInfo.ConstraintVT == MVT::Other)
9668 ValueVT = RegVT;
9669
9670 // Initialize NumRegs.
9671 unsigned NumRegs = 1;
9672 if (OpInfo.ConstraintVT != MVT::Other)
9673 NumRegs = TLI.getNumRegisters(Context, OpInfo.ConstraintVT, RegVT);
9674
9675 // If this is a constraint for a specific physical register, like {r17},
9676 // assign it now.
9677
9678 // If this associated to a specific register, initialize iterator to correct
9679 // place. If virtual, make sure we have enough registers
9680
9681 // Initialize iterator if necessary
9684
9685 // Do not check for single registers.
9686 if (AssignedReg) {
9687 I = std::find(I, RC->end(), AssignedReg);
9688 if (I == RC->end()) {
9689 // RC does not contain the selected register, which indicates a
9690 // mismatch between the register and the required type/bitwidth.
9691 return {AssignedReg};
9692 }
9693 }
9694
9695 for (; NumRegs; --NumRegs, ++I) {
9696 assert(I != RC->end() && "Ran out of registers to allocate!");
9697 Register R = AssignedReg ? Register(*I) : RegInfo.createVirtualRegister(RC);
9698 Regs.push_back(R);
9699 }
9700
9701 OpInfo.AssignedRegs = RegsForValue(Regs, RegVT, ValueVT);
9702 return std::nullopt;
9703}
9704
9705static unsigned
9707 const std::vector<SDValue> &AsmNodeOperands) {
9708 // Scan until we find the definition we already emitted of this operand.
9709 unsigned CurOp = InlineAsm::Op_FirstOperand;
9710 for (; OperandNo; --OperandNo) {
9711 // Advance to the next operand.
9712 unsigned OpFlag = AsmNodeOperands[CurOp]->getAsZExtVal();
9713 const InlineAsm::Flag F(OpFlag);
9714 assert(
9715 (F.isRegDefKind() || F.isRegDefEarlyClobberKind() || F.isMemKind()) &&
9716 "Skipped past definitions?");
9717 CurOp += F.getNumOperandRegisters() + 1;
9718 }
9719 return CurOp;
9720}
9721
9722namespace {
9723
9724class ExtraFlags {
9725 unsigned Flags = 0;
9726
9727public:
9728 explicit ExtraFlags(const CallBase &Call) {
9729 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
9730 if (IA->hasSideEffects())
9732 if (IA->isAlignStack())
9734 if (Call.isConvergent())
9736 Flags |= IA->getDialect() * InlineAsm::Extra_AsmDialect;
9737 }
9738
9739 void update(const TargetLowering::AsmOperandInfo &OpInfo) {
9740 // Ideally, we would only check against memory constraints. However, the
9741 // meaning of an Other constraint can be target-specific and we can't easily
9742 // reason about it. Therefore, be conservative and set MayLoad/MayStore
9743 // for Other constraints as well.
9746 if (OpInfo.Type == InlineAsm::isInput)
9748 else if (OpInfo.Type == InlineAsm::isOutput)
9750 else if (OpInfo.Type == InlineAsm::isClobber)
9752 }
9753 }
9754
9755 unsigned get() const { return Flags; }
9756};
9757
9758} // end anonymous namespace
9759
9760static bool isFunction(SDValue Op) {
9761 if (Op && Op.getOpcode() == ISD::GlobalAddress) {
9762 if (auto *GA = dyn_cast<GlobalAddressSDNode>(Op)) {
9763 auto Fn = dyn_cast_or_null<Function>(GA->getGlobal());
9764
9765 // In normal "call dllimport func" instruction (non-inlineasm) it force
9766 // indirect access by specifing call opcode. And usually specially print
9767 // asm with indirect symbol (i.g: "*") according to opcode. Inline asm can
9768 // not do in this way now. (In fact, this is similar with "Data Access"
9769 // action). So here we ignore dllimport function.
9770 if (Fn && !Fn->hasDLLImportStorageClass())
9771 return true;
9772 }
9773 }
9774 return false;
9775}
9776
9777/// visitInlineAsm - Handle a call to an InlineAsm object.
9778void SelectionDAGBuilder::visitInlineAsm(const CallBase &Call,
9779 const BasicBlock *EHPadBB) {
9780 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
9781
9782 /// ConstraintOperands - Information about all of the constraints.
9783 SmallVector<SDISelAsmOperandInfo, 16> ConstraintOperands;
9784
9788
9789 // First Pass: Calculate HasSideEffects and ExtraFlags (AlignStack,
9790 // AsmDialect, MayLoad, MayStore).
9791 bool HasSideEffect = IA->hasSideEffects();
9792 ExtraFlags ExtraInfo(Call);
9793
9794 for (auto &T : TargetConstraints) {
9795 ConstraintOperands.push_back(SDISelAsmOperandInfo(T));
9796 SDISelAsmOperandInfo &OpInfo = ConstraintOperands.back();
9797
9798 if (OpInfo.CallOperandVal)
9799 OpInfo.CallOperand = getValue(OpInfo.CallOperandVal);
9800
9801 if (!HasSideEffect)
9802 HasSideEffect = OpInfo.hasMemory(TLI);
9803
9804 // Determine if this InlineAsm MayLoad or MayStore based on the constraints.
9805 // FIXME: Could we compute this on OpInfo rather than T?
9806
9807 // Compute the constraint code and ConstraintType to use.
9809
9810 if (T.ConstraintType == TargetLowering::C_Immediate &&
9811 OpInfo.CallOperand && !isa<ConstantSDNode>(OpInfo.CallOperand))
9812 // We've delayed emitting a diagnostic like the "n" constraint because
9813 // inlining could cause an integer showing up.
9814 return emitInlineAsmError(Call, "constraint '" + Twine(T.ConstraintCode) +
9815 "' expects an integer constant "
9816 "expression");
9817
9818 ExtraInfo.update(T);
9819 }
9820
9821 // We won't need to flush pending loads if this asm doesn't touch
9822 // memory and is nonvolatile.
9823 SDValue Glue, Chain = (HasSideEffect) ? getRoot() : DAG.getRoot();
9824
9825 bool EmitEHLabels = isa<InvokeInst>(Call);
9826 if (EmitEHLabels) {
9827 assert(EHPadBB && "InvokeInst must have an EHPadBB");
9828 }
9829 bool IsCallBr = isa<CallBrInst>(Call);
9830
9831 if (IsCallBr || EmitEHLabels) {
9832 // If this is a callbr or invoke we need to flush pending exports since
9833 // inlineasm_br and invoke are terminators.
9834 // We need to do this before nodes are glued to the inlineasm_br node.
9835 Chain = getControlRoot();
9836 }
9837
9838 MCSymbol *BeginLabel = nullptr;
9839 if (EmitEHLabels) {
9840 Chain = lowerStartEH(Chain, EHPadBB, BeginLabel);
9841 }
9842
9843 int OpNo = -1;
9844 SmallVector<StringRef> AsmStrs;
9845 IA->collectAsmStrs(AsmStrs);
9846
9847 // Second pass over the constraints: compute which constraint option to use.
9848 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
9849 if (OpInfo.hasArg() || OpInfo.Type == InlineAsm::isOutput)
9850 OpNo++;
9851
9852 // If this is an output operand with a matching input operand, look up the
9853 // matching input. If their types mismatch, e.g. one is an integer, the
9854 // other is floating point, or their sizes are different, flag it as an
9855 // error.
9856 if (OpInfo.hasMatchingInput()) {
9857 SDISelAsmOperandInfo &Input = ConstraintOperands[OpInfo.MatchingInput];
9858 patchMatchingInput(OpInfo, Input, DAG);
9859 }
9860
9861 // Compute the constraint code and ConstraintType to use.
9862 TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
9863
9864 if ((OpInfo.ConstraintType == TargetLowering::C_Memory &&
9865 OpInfo.Type == InlineAsm::isClobber) ||
9866 OpInfo.ConstraintType == TargetLowering::C_Address)
9867 continue;
9868
9869 // In Linux PIC model, there are 4 cases about value/label addressing:
9870 //
9871 // 1: Function call or Label jmp inside the module.
9872 // 2: Data access (such as global variable, static variable) inside module.
9873 // 3: Function call or Label jmp outside the module.
9874 // 4: Data access (such as global variable) outside the module.
9875 //
9876 // Due to current llvm inline asm architecture designed to not "recognize"
9877 // the asm code, there are quite troubles for us to treat mem addressing
9878 // differently for same value/adress used in different instuctions.
9879 // For example, in pic model, call a func may in plt way or direclty
9880 // pc-related, but lea/mov a function adress may use got.
9881 //
9882 // Here we try to "recognize" function call for the case 1 and case 3 in
9883 // inline asm. And try to adjust the constraint for them.
9884 //
9885 // TODO: Due to current inline asm didn't encourage to jmp to the outsider
9886 // label, so here we don't handle jmp function label now, but we need to
9887 // enhance it (especilly in PIC model) if we meet meaningful requirements.
9888 if (OpInfo.isIndirect && isFunction(OpInfo.CallOperand) &&
9889 TLI.isInlineAsmTargetBranch(AsmStrs, OpNo) &&
9891 OpInfo.isIndirect = false;
9892 OpInfo.ConstraintType = TargetLowering::C_Address;
9893 }
9894
9895 // If this is a memory input, and if the operand is not indirect, do what we
9896 // need to provide an address for the memory input.
9897 if (OpInfo.ConstraintType == TargetLowering::C_Memory &&
9898 !OpInfo.isIndirect) {
9899 assert((OpInfo.isMultipleAlternative ||
9900 (OpInfo.Type == InlineAsm::isInput)) &&
9901 "Can only indirectify direct input operands!");
9902
9903 // Memory operands really want the address of the value.
9904 Chain = getAddressForMemoryInput(Chain, getCurSDLoc(), OpInfo, DAG);
9905
9906 // There is no longer a Value* corresponding to this operand.
9907 OpInfo.CallOperandVal = nullptr;
9908
9909 // It is now an indirect operand.
9910 OpInfo.isIndirect = true;
9911 }
9912
9913 }
9914
9915 // AsmNodeOperands - The operands for the ISD::INLINEASM node.
9916 std::vector<SDValue> AsmNodeOperands;
9917 AsmNodeOperands.push_back(SDValue()); // reserve space for input chain
9918 AsmNodeOperands.push_back(DAG.getTargetExternalSymbol(
9919 IA->getAsmString().c_str(), TLI.getProgramPointerTy(DAG.getDataLayout())));
9920
9921 // If we have a !srcloc metadata node associated with it, we want to attach
9922 // this to the ultimately generated inline asm machineinstr. To do this, we
9923 // pass in the third operand as this (potentially null) inline asm MDNode.
9924 const MDNode *SrcLoc = Call.getMetadata("srcloc");
9925 AsmNodeOperands.push_back(DAG.getMDNode(SrcLoc));
9926
9927 // Remember the HasSideEffect, AlignStack, AsmDialect, MayLoad and MayStore
9928 // bits as operand 3.
9929 AsmNodeOperands.push_back(DAG.getTargetConstant(
9930 ExtraInfo.get(), getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
9931
9932 // Third pass: Loop over operands to prepare DAG-level operands.. As part of
9933 // this, assign virtual and physical registers for inputs and otput.
9934 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
9935 // Assign Registers.
9936 SDISelAsmOperandInfo &RefOpInfo =
9937 OpInfo.isMatchingInputConstraint()
9938 ? ConstraintOperands[OpInfo.getMatchedOperand()]
9939 : OpInfo;
9940 const auto RegError =
9941 getRegistersForValue(DAG, getCurSDLoc(), OpInfo, RefOpInfo);
9942 if (RegError) {
9945 const char *RegName = TRI.getName(*RegError);
9946 emitInlineAsmError(Call, "register '" + Twine(RegName) +
9947 "' allocated for constraint '" +
9948 Twine(OpInfo.ConstraintCode) +
9949 "' does not match required type");
9950 return;
9951 }
9952
9953 auto DetectWriteToReservedRegister = [&]() {
9956 for (unsigned Reg : OpInfo.AssignedRegs.Regs) {
9958 TRI.isInlineAsmReadOnlyReg(MF, Reg)) {
9959 const char *RegName = TRI.getName(Reg);
9960 emitInlineAsmError(Call, "write to reserved register '" +
9961 Twine(RegName) + "'");
9962 return true;
9963 }
9964 }
9965 return false;
9966 };
9967 assert((OpInfo.ConstraintType != TargetLowering::C_Address ||
9968 (OpInfo.Type == InlineAsm::isInput &&
9969 !OpInfo.isMatchingInputConstraint())) &&
9970 "Only address as input operand is allowed.");
9971
9972 switch (OpInfo.Type) {
9974 if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
9975 const InlineAsm::ConstraintCode ConstraintID =
9976 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
9978 "Failed to convert memory constraint code to constraint id.");
9979
9980 // Add information to the INLINEASM node to know about this output.
9982 OpFlags.setMemConstraint(ConstraintID);
9983 AsmNodeOperands.push_back(DAG.getTargetConstant(OpFlags, getCurSDLoc(),
9984 MVT::i32));
9985 AsmNodeOperands.push_back(OpInfo.CallOperand);
9986 } else {
9987 // Otherwise, this outputs to a register (directly for C_Register /
9988 // C_RegisterClass, and a target-defined fashion for
9989 // C_Immediate/C_Other). Find a register that we can use.
9990 if (OpInfo.AssignedRegs.Regs.empty()) {
9991 emitInlineAsmError(
9992 Call, "couldn't allocate output register for constraint '" +
9993 Twine(OpInfo.ConstraintCode) + "'");
9994 return;
9995 }
9996
9997 if (DetectWriteToReservedRegister())
9998 return;
9999
10000 // Add information to the INLINEASM node to know that this register is
10001 // set.
10002 OpInfo.AssignedRegs.AddInlineAsmOperands(
10003 OpInfo.isEarlyClobber ? InlineAsm::Kind::RegDefEarlyClobber
10005 false, 0, getCurSDLoc(), DAG, AsmNodeOperands);
10006 }
10007 break;
10008
10009 case InlineAsm::isInput:
10010 case InlineAsm::isLabel: {
10011 SDValue InOperandVal = OpInfo.CallOperand;
10012
10013 if (OpInfo.isMatchingInputConstraint()) {
10014 // If this is required to match an output register we have already set,
10015 // just use its register.
10016 auto CurOp = findMatchingInlineAsmOperand(OpInfo.getMatchedOperand(),
10017 AsmNodeOperands);
10018 InlineAsm::Flag Flag(AsmNodeOperands[CurOp]->getAsZExtVal());
10019 if (Flag.isRegDefKind() || Flag.isRegDefEarlyClobberKind()) {
10020 if (OpInfo.isIndirect) {
10021 // This happens on gcc/testsuite/gcc.dg/pr8788-1.c
10022 emitInlineAsmError(Call, "inline asm not supported yet: "
10023 "don't know how to handle tied "
10024 "indirect register inputs");
10025 return;
10026 }
10027
10032 auto *R = cast<RegisterSDNode>(AsmNodeOperands[CurOp+1]);
10033 Register TiedReg = R->getReg();
10034 MVT RegVT = R->getSimpleValueType(0);
10035 const TargetRegisterClass *RC =
10036 TiedReg.isVirtual() ? MRI.getRegClass(TiedReg)
10037 : RegVT != MVT::Untyped ? TLI.getRegClassFor(RegVT)
10038 : TRI.getMinimalPhysRegClass(TiedReg);
10039 for (unsigned i = 0, e = Flag.getNumOperandRegisters(); i != e; ++i)
10040 Regs.push_back(MRI.createVirtualRegister(RC));
10041
10042 RegsForValue MatchedRegs(Regs, RegVT, InOperandVal.getValueType());
10043
10044 SDLoc dl = getCurSDLoc();
10045 // Use the produced MatchedRegs object to
10046 MatchedRegs.getCopyToRegs(InOperandVal, DAG, dl, Chain, &Glue, &Call);
10047 MatchedRegs.AddInlineAsmOperands(InlineAsm::Kind::RegUse, true,
10048 OpInfo.getMatchedOperand(), dl, DAG,
10049 AsmNodeOperands);
10050 break;
10051 }
10052
10053 assert(Flag.isMemKind() && "Unknown matching constraint!");
10054 assert(Flag.getNumOperandRegisters() == 1 &&
10055 "Unexpected number of operands");
10056 // Add information to the INLINEASM node to know about this input.
10057 // See InlineAsm.h isUseOperandTiedToDef.
10058 Flag.clearMemConstraint();
10059 Flag.setMatchingOp(OpInfo.getMatchedOperand());
10060 AsmNodeOperands.push_back(DAG.getTargetConstant(
10061 Flag, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10062 AsmNodeOperands.push_back(AsmNodeOperands[CurOp+1]);
10063 break;
10064 }
10065
10066 // Treat indirect 'X' constraint as memory.
10067 if (OpInfo.ConstraintType == TargetLowering::C_Other &&
10068 OpInfo.isIndirect)
10069 OpInfo.ConstraintType = TargetLowering::C_Memory;
10070
10071 if (OpInfo.ConstraintType == TargetLowering::C_Immediate ||
10072 OpInfo.ConstraintType == TargetLowering::C_Other) {
10073 std::vector<SDValue> Ops;
10074 TLI.LowerAsmOperandForConstraint(InOperandVal, OpInfo.ConstraintCode,
10075 Ops, DAG);
10076 if (Ops.empty()) {
10077 if (OpInfo.ConstraintType == TargetLowering::C_Immediate)
10078 if (isa<ConstantSDNode>(InOperandVal)) {
10079 emitInlineAsmError(Call, "value out of range for constraint '" +
10080 Twine(OpInfo.ConstraintCode) + "'");
10081 return;
10082 }
10083
10084 emitInlineAsmError(Call,
10085 "invalid operand for inline asm constraint '" +
10086 Twine(OpInfo.ConstraintCode) + "'");
10087 return;
10088 }
10089
10090 // Add information to the INLINEASM node to know about this input.
10091 InlineAsm::Flag ResOpType(InlineAsm::Kind::Imm, Ops.size());
10092 AsmNodeOperands.push_back(DAG.getTargetConstant(
10093 ResOpType, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10094 llvm::append_range(AsmNodeOperands, Ops);
10095 break;
10096 }
10097
10098 if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
10099 assert((OpInfo.isIndirect ||
10100 OpInfo.ConstraintType != TargetLowering::C_Memory) &&
10101 "Operand must be indirect to be a mem!");
10102 assert(InOperandVal.getValueType() ==
10104 "Memory operands expect pointer values");
10105
10106 const InlineAsm::ConstraintCode ConstraintID =
10107 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10109 "Failed to convert memory constraint code to constraint id.");
10110
10111 // Add information to the INLINEASM node to know about this input.
10113 ResOpType.setMemConstraint(ConstraintID);
10114 AsmNodeOperands.push_back(DAG.getTargetConstant(ResOpType,
10115 getCurSDLoc(),
10116 MVT::i32));
10117 AsmNodeOperands.push_back(InOperandVal);
10118 break;
10119 }
10120
10121 if (OpInfo.ConstraintType == TargetLowering::C_Address) {
10122 const InlineAsm::ConstraintCode ConstraintID =
10123 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10125 "Failed to convert memory constraint code to constraint id.");
10126
10128
10129 SDValue AsmOp = InOperandVal;
10130 if (isFunction(InOperandVal)) {
10131 auto *GA = cast<GlobalAddressSDNode>(InOperandVal);
10132 ResOpType = InlineAsm::Flag(InlineAsm::Kind::Func, 1);
10133 AsmOp = DAG.getTargetGlobalAddress(GA->getGlobal(), getCurSDLoc(),
10134 InOperandVal.getValueType(),
10135 GA->getOffset());
10136 }
10137
10138 // Add information to the INLINEASM node to know about this input.
10139 ResOpType.setMemConstraint(ConstraintID);
10140
10141 AsmNodeOperands.push_back(
10142 DAG.getTargetConstant(ResOpType, getCurSDLoc(), MVT::i32));
10143
10144 AsmNodeOperands.push_back(AsmOp);
10145 break;
10146 }
10147
10148 if (OpInfo.ConstraintType != TargetLowering::C_RegisterClass &&
10149 OpInfo.ConstraintType != TargetLowering::C_Register) {
10150 emitInlineAsmError(Call, "unknown asm constraint '" +
10151 Twine(OpInfo.ConstraintCode) + "'");
10152 return;
10153 }
10154
10155 // TODO: Support this.
10156 if (OpInfo.isIndirect) {
10157 emitInlineAsmError(
10158 Call, "Don't know how to handle indirect register inputs yet "
10159 "for constraint '" +
10160 Twine(OpInfo.ConstraintCode) + "'");
10161 return;
10162 }
10163
10164 // Copy the input into the appropriate registers.
10165 if (OpInfo.AssignedRegs.Regs.empty()) {
10166 emitInlineAsmError(Call,
10167 "couldn't allocate input reg for constraint '" +
10168 Twine(OpInfo.ConstraintCode) + "'");
10169 return;
10170 }
10171
10172 if (DetectWriteToReservedRegister())
10173 return;
10174
10175 SDLoc dl = getCurSDLoc();
10176
10177 OpInfo.AssignedRegs.getCopyToRegs(InOperandVal, DAG, dl, Chain, &Glue,
10178 &Call);
10179
10180 OpInfo.AssignedRegs.AddInlineAsmOperands(InlineAsm::Kind::RegUse, false,
10181 0, dl, DAG, AsmNodeOperands);
10182 break;
10183 }
10185 // Add the clobbered value to the operand list, so that the register
10186 // allocator is aware that the physreg got clobbered.
10187 if (!OpInfo.AssignedRegs.Regs.empty())
10188 OpInfo.AssignedRegs.AddInlineAsmOperands(InlineAsm::Kind::Clobber,
10189 false, 0, getCurSDLoc(), DAG,
10190 AsmNodeOperands);
10191 break;
10192 }
10193 }
10194
10195 // Finish up input operands. Set the input chain and add the flag last.
10196 AsmNodeOperands[InlineAsm::Op_InputChain] = Chain;
10197 if (Glue.getNode()) AsmNodeOperands.push_back(Glue);
10198
10199 unsigned ISDOpc = IsCallBr ? ISD::INLINEASM_BR : ISD::INLINEASM;
10200 Chain = DAG.getNode(ISDOpc, getCurSDLoc(),
10201 DAG.getVTList(MVT::Other, MVT::Glue), AsmNodeOperands);
10202 Glue = Chain.getValue(1);
10203
10204 // Do additional work to generate outputs.
10205
10206 SmallVector<EVT, 1> ResultVTs;
10207 SmallVector<SDValue, 1> ResultValues;
10208 SmallVector<SDValue, 8> OutChains;
10209
10210 llvm::Type *CallResultType = Call.getType();
10211 ArrayRef<Type *> ResultTypes;
10212 if (StructType *StructResult = dyn_cast<StructType>(CallResultType))
10213 ResultTypes = StructResult->elements();
10214 else if (!CallResultType->isVoidTy())
10215 ResultTypes = ArrayRef(CallResultType);
10216
10217 auto CurResultType = ResultTypes.begin();
10218 auto handleRegAssign = [&](SDValue V) {
10219 assert(CurResultType != ResultTypes.end() && "Unexpected value");
10220 assert((*CurResultType)->isSized() && "Unexpected unsized type");
10221 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), *CurResultType);
10222 ++CurResultType;
10223 // If the type of the inline asm call site return value is different but has
10224 // same size as the type of the asm output bitcast it. One example of this
10225 // is for vectors with different width / number of elements. This can
10226 // happen for register classes that can contain multiple different value
10227 // types. The preg or vreg allocated may not have the same VT as was
10228 // expected.
10229 //
10230 // This can also happen for a return value that disagrees with the register
10231 // class it is put in, eg. a double in a general-purpose register on a
10232 // 32-bit machine.
10233 if (ResultVT != V.getValueType() &&
10234 ResultVT.getSizeInBits() == V.getValueSizeInBits())
10235 V = DAG.getNode(ISD::BITCAST, getCurSDLoc(), ResultVT, V);
10236 else if (ResultVT != V.getValueType() && ResultVT.isInteger() &&
10237 V.getValueType().isInteger()) {
10238 // If a result value was tied to an input value, the computed result
10239 // may have a wider width than the expected result. Extract the
10240 // relevant portion.
10241 V = DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), ResultVT, V);
10242 }
10243 assert(ResultVT == V.getValueType() && "Asm result value mismatch!");
10244 ResultVTs.push_back(ResultVT);
10245 ResultValues.push_back(V);
10246 };
10247
10248 // Deal with output operands.
10249 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
10250 if (OpInfo.Type == InlineAsm::isOutput) {
10251 SDValue Val;
10252 // Skip trivial output operands.
10253 if (OpInfo.AssignedRegs.Regs.empty())
10254 continue;
10255
10256 switch (OpInfo.ConstraintType) {
10259 Val = OpInfo.AssignedRegs.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(),
10260 Chain, &Glue, &Call);
10261 break;
10264 Val = TLI.LowerAsmOutputForConstraint(Chain, Glue, getCurSDLoc(),
10265 OpInfo, DAG);
10266 break;
10268 break; // Already handled.
10270 break; // Silence warning.
10272 assert(false && "Unexpected unknown constraint");
10273 }
10274
10275 // Indirect output manifest as stores. Record output chains.
10276 if (OpInfo.isIndirect) {
10277 const Value *Ptr = OpInfo.CallOperandVal;
10278 assert(Ptr && "Expected value CallOperandVal for indirect asm operand");
10279 SDValue Store = DAG.getStore(Chain, getCurSDLoc(), Val, getValue(Ptr),
10281 OutChains.push_back(Store);
10282 } else {
10283 // generate CopyFromRegs to associated registers.
10284 assert(!Call.getType()->isVoidTy() && "Bad inline asm!");
10285 if (Val.getOpcode() == ISD::MERGE_VALUES) {
10286 for (const SDValue &V : Val->op_values())
10287 handleRegAssign(V);
10288 } else
10289 handleRegAssign(Val);
10290 }
10291 }
10292 }
10293
10294 // Set results.
10295 if (!ResultValues.empty()) {
10296 assert(CurResultType == ResultTypes.end() &&
10297 "Mismatch in number of ResultTypes");
10298 assert(ResultValues.size() == ResultTypes.size() &&
10299 "Mismatch in number of output operands in asm result");
10300
10302 DAG.getVTList(ResultVTs), ResultValues);
10303 setValue(&Call, V);
10304 }
10305
10306 // Collect store chains.
10307 if (!OutChains.empty())
10308 Chain = DAG.getNode(ISD::TokenFactor, getCurSDLoc(), MVT::Other, OutChains);
10309
10310 if (EmitEHLabels) {
10311 Chain = lowerEndEH(Chain, cast<InvokeInst>(&Call), EHPadBB, BeginLabel);
10312 }
10313
10314 // Only Update Root if inline assembly has a memory effect.
10315 if (ResultValues.empty() || HasSideEffect || !OutChains.empty() || IsCallBr ||
10316 EmitEHLabels)
10317 DAG.setRoot(Chain);
10318}
10319
10320void SelectionDAGBuilder::emitInlineAsmError(const CallBase &Call,
10321 const Twine &Message) {
10322 LLVMContext &Ctx = *DAG.getContext();
10323 Ctx.emitError(&Call, Message);
10324
10325 // Make sure we leave the DAG in a valid state
10327 SmallVector<EVT, 1> ValueVTs;
10328 ComputeValueVTs(TLI, DAG.getDataLayout(), Call.getType(), ValueVTs);
10329
10330 if (ValueVTs.empty())
10331 return;
10332
10334 for (const EVT &VT : ValueVTs)
10335 Ops.push_back(DAG.getUNDEF(VT));
10336
10337 setValue(&Call, DAG.getMergeValues(Ops, getCurSDLoc()));
10338}
10339
10340void SelectionDAGBuilder::visitVAStart(const CallInst &I) {
10342 MVT::Other, getRoot(),
10343 getValue(I.getArgOperand(0)),
10344 DAG.getSrcValue(I.getArgOperand(0))));
10345}
10346
10347void SelectionDAGBuilder::visitVAArg(const VAArgInst &I) {
10349 const DataLayout &DL = DAG.getDataLayout();
10351 TLI.getMemValueType(DAG.getDataLayout(), I.getType()), getCurSDLoc(),
10352 getRoot(), getValue(I.getOperand(0)), DAG.getSrcValue(I.getOperand(0)),
10353 DL.getABITypeAlign(I.getType()).value());
10354 DAG.setRoot(V.getValue(1));
10355
10356 if (I.getType()->isPointerTy())
10358 V, getCurSDLoc(), TLI.getValueType(DAG.getDataLayout(), I.getType()));
10359 setValue(&I, V);
10360}
10361
10362void SelectionDAGBuilder::visitVAEnd(const CallInst &I) {
10364 MVT::Other, getRoot(),
10365 getValue(I.getArgOperand(0)),
10366 DAG.getSrcValue(I.getArgOperand(0))));
10367}
10368
10369void SelectionDAGBuilder::visitVACopy(const CallInst &I) {
10371 MVT::Other, getRoot(),
10372 getValue(I.getArgOperand(0)),
10373 getValue(I.getArgOperand(1)),
10374 DAG.getSrcValue(I.getArgOperand(0)),
10375 DAG.getSrcValue(I.getArgOperand(1))));
10376}
10377
10379 const Instruction &I,
10380 SDValue Op) {
10381 std::optional<ConstantRange> CR = getRange(I);
10382
10383 if (!CR || CR->isFullSet() || CR->isEmptySet() || CR->isUpperWrapped())
10384 return Op;
10385
10386 APInt Lo = CR->getUnsignedMin();
10387 if (!Lo.isMinValue())
10388 return Op;
10389
10390 APInt Hi = CR->getUnsignedMax();
10391 unsigned Bits = std::max(Hi.getActiveBits(),
10392 static_cast<unsigned>(IntegerType::MIN_INT_BITS));
10393
10394 EVT SmallVT = EVT::getIntegerVT(*DAG.getContext(), Bits);
10395
10396 SDLoc SL = getCurSDLoc();
10397
10398 SDValue ZExt = DAG.getNode(ISD::AssertZext, SL, Op.getValueType(), Op,
10399 DAG.getValueType(SmallVT));
10400 unsigned NumVals = Op.getNode()->getNumValues();
10401 if (NumVals == 1)
10402 return ZExt;
10403
10405
10406 Ops.push_back(ZExt);
10407 for (unsigned I = 1; I != NumVals; ++I)
10408 Ops.push_back(Op.getValue(I));
10409
10410 return DAG.getMergeValues(Ops, SL);
10411}
10412
10413/// Populate a CallLowerinInfo (into \p CLI) based on the properties of
10414/// the call being lowered.
10415///
10416/// This is a helper for lowering intrinsics that follow a target calling
10417/// convention or require stack pointer adjustment. Only a subset of the
10418/// intrinsic's operands need to participate in the calling convention.
10421 unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy,
10422 AttributeSet RetAttrs, bool IsPatchPoint) {
10424 Args.reserve(NumArgs);
10425
10426 // Populate the argument list.
10427 // Attributes for args start at offset 1, after the return attribute.
10428 for (unsigned ArgI = ArgIdx, ArgE = ArgIdx + NumArgs;
10429 ArgI != ArgE; ++ArgI) {
10430 const Value *V = Call->getOperand(ArgI);
10431
10432 assert(!V->getType()->isEmptyTy() && "Empty type passed to intrinsic.");
10433
10435 Entry.Node = getValue(V);
10436 Entry.Ty = V->getType();
10437 Entry.setAttributes(Call, ArgI);
10438 Args.push_back(Entry);
10439 }
10440
10442 .setChain(getRoot())
10443 .setCallee(Call->getCallingConv(), ReturnTy, Callee, std::move(Args),
10444 RetAttrs)
10445 .setDiscardResult(Call->use_empty())
10446 .setIsPatchPoint(IsPatchPoint)
10448 Call->countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0);
10449}
10450
10451/// Add a stack map intrinsic call's live variable operands to a stackmap
10452/// or patchpoint target node's operand list.
10453///
10454/// Constants are converted to TargetConstants purely as an optimization to
10455/// avoid constant materialization and register allocation.
10456///
10457/// FrameIndex operands are converted to TargetFrameIndex so that ISEL does not
10458/// generate addess computation nodes, and so FinalizeISel can convert the
10459/// TargetFrameIndex into a DirectMemRefOp StackMap location. This avoids
10460/// address materialization and register allocation, but may also be required
10461/// for correctness. If a StackMap (or PatchPoint) intrinsic directly uses an
10462/// alloca in the entry block, then the runtime may assume that the alloca's
10463/// StackMap location can be read immediately after compilation and that the
10464/// location is valid at any point during execution (this is similar to the
10465/// assumption made by the llvm.gcroot intrinsic). If the alloca's location were
10466/// only available in a register, then the runtime would need to trap when
10467/// execution reaches the StackMap in order to read the alloca's location.
10468static void addStackMapLiveVars(const CallBase &Call, unsigned StartIdx,
10469 const SDLoc &DL, SmallVectorImpl<SDValue> &Ops,
10470 SelectionDAGBuilder &Builder) {
10471 SelectionDAG &DAG = Builder.DAG;
10472 for (unsigned I = StartIdx; I < Call.arg_size(); I++) {
10473 SDValue Op = Builder.getValue(Call.getArgOperand(I));
10474
10475 // Things on the stack are pointer-typed, meaning that they are already
10476 // legal and can be emitted directly to target nodes.
10477 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Op)) {
10478 Ops.push_back(DAG.getTargetFrameIndex(FI->getIndex(), Op.getValueType()));
10479 } else {
10480 // Otherwise emit a target independent node to be legalised.
10481 Ops.push_back(Builder.getValue(Call.getArgOperand(I)));
10482 }
10483 }
10484}
10485
10486/// Lower llvm.experimental.stackmap.
10487void SelectionDAGBuilder::visitStackmap(const CallInst &CI) {
10488 // void @llvm.experimental.stackmap(i64 <id>, i32 <numShadowBytes>,
10489 // [live variables...])
10490
10491 assert(CI.getType()->isVoidTy() && "Stackmap cannot return a value.");
10492
10493 SDValue Chain, InGlue, Callee;
10495
10496 SDLoc DL = getCurSDLoc();
10498
10499 // The stackmap intrinsic only records the live variables (the arguments
10500 // passed to it) and emits NOPS (if requested). Unlike the patchpoint
10501 // intrinsic, this won't be lowered to a function call. This means we don't
10502 // have to worry about calling conventions and target specific lowering code.
10503 // Instead we perform the call lowering right here.
10504 //
10505 // chain, flag = CALLSEQ_START(chain, 0, 0)
10506 // chain, flag = STACKMAP(id, nbytes, ..., chain, flag)
10507 // chain, flag = CALLSEQ_END(chain, 0, 0, flag)
10508 //
10509 Chain = DAG.getCALLSEQ_START(getRoot(), 0, 0, DL);
10510 InGlue = Chain.getValue(1);
10511
10512 // Add the STACKMAP operands, starting with DAG house-keeping.
10513 Ops.push_back(Chain);
10514 Ops.push_back(InGlue);
10515
10516 // Add the <id>, <numShadowBytes> operands.
10517 //
10518 // These do not require legalisation, and can be emitted directly to target
10519 // constant nodes.
10521 assert(ID.getValueType() == MVT::i64);
10522 SDValue IDConst =
10523 DAG.getTargetConstant(ID->getAsZExtVal(), DL, ID.getValueType());
10524 Ops.push_back(IDConst);
10525
10526 SDValue Shad = getValue(CI.getArgOperand(1));
10527 assert(Shad.getValueType() == MVT::i32);
10528 SDValue ShadConst =
10530 Ops.push_back(ShadConst);
10531
10532 // Add the live variables.
10533 addStackMapLiveVars(CI, 2, DL, Ops, *this);
10534
10535 // Create the STACKMAP node.
10536 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
10537 Chain = DAG.getNode(ISD::STACKMAP, DL, NodeTys, Ops);
10538 InGlue = Chain.getValue(1);
10539
10540 Chain = DAG.getCALLSEQ_END(Chain, 0, 0, InGlue, DL);
10541
10542 // Stackmaps don't generate values, so nothing goes into the NodeMap.
10543
10544 // Set the root to the target-lowered call chain.
10545 DAG.setRoot(Chain);
10546
10547 // Inform the Frame Information that we have a stackmap in this function.
10549}
10550
10551/// Lower llvm.experimental.patchpoint directly to its target opcode.
10552void SelectionDAGBuilder::visitPatchpoint(const CallBase &CB,
10553 const BasicBlock *EHPadBB) {
10554 // <ty> @llvm.experimental.patchpoint.<ty>(i64 <id>,
10555 // i32 <numBytes>,
10556 // i8* <target>,
10557 // i32 <numArgs>,
10558 // [Args...],
10559 // [live variables...])
10560
10562 bool IsAnyRegCC = CC == CallingConv::AnyReg;
10563 bool HasDef = !CB.getType()->isVoidTy();
10564 SDLoc dl = getCurSDLoc();
10566
10567 // Handle immediate and symbolic callees.
10568 if (auto* ConstCallee = dyn_cast<ConstantSDNode>(Callee))
10569 Callee = DAG.getIntPtrConstant(ConstCallee->getZExtValue(), dl,
10570 /*isTarget=*/true);
10571 else if (auto* SymbolicCallee = dyn_cast<GlobalAddressSDNode>(Callee))
10572 Callee = DAG.getTargetGlobalAddress(SymbolicCallee->getGlobal(),
10573 SDLoc(SymbolicCallee),
10574 SymbolicCallee->getValueType(0));
10575
10576 // Get the real number of arguments participating in the call <numArgs>
10578 unsigned NumArgs = NArgVal->getAsZExtVal();
10579
10580 // Skip the four meta args: <id>, <numNopBytes>, <target>, <numArgs>
10581 // Intrinsics include all meta-operands up to but not including CC.
10582 unsigned NumMetaOpers = PatchPointOpers::CCPos;
10583 assert(CB.arg_size() >= NumMetaOpers + NumArgs &&
10584 "Not enough arguments provided to the patchpoint intrinsic");
10585
10586 // For AnyRegCC the arguments are lowered later on manually.
10587 unsigned NumCallArgs = IsAnyRegCC ? 0 : NumArgs;
10588 Type *ReturnTy =
10589 IsAnyRegCC ? Type::getVoidTy(*DAG.getContext()) : CB.getType();
10590
10592 populateCallLoweringInfo(CLI, &CB, NumMetaOpers, NumCallArgs, Callee,
10593 ReturnTy, CB.getAttributes().getRetAttrs(), true);
10594 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
10595
10596 SDNode *CallEnd = Result.second.getNode();
10597 if (CallEnd->getOpcode() == ISD::EH_LABEL)
10598 CallEnd = CallEnd->getOperand(0).getNode();
10599 if (HasDef && (CallEnd->getOpcode() == ISD::CopyFromReg))
10600 CallEnd = CallEnd->getOperand(0).getNode();
10601
10602 /// Get a call instruction from the call sequence chain.
10603 /// Tail calls are not allowed.
10604 assert(CallEnd->getOpcode() == ISD::CALLSEQ_END &&
10605 "Expected a callseq node.");
10606 SDNode *Call = CallEnd->getOperand(0).getNode();
10607 bool HasGlue = Call->getGluedNode();
10608
10609 // Replace the target specific call node with the patchable intrinsic.
10611
10612 // Push the chain.
10613 Ops.push_back(*(Call->op_begin()));
10614
10615 // Optionally, push the glue (if any).
10616 if (HasGlue)
10617 Ops.push_back(*(Call->op_end() - 1));
10618
10619 // Push the register mask info.
10620 if (HasGlue)
10621 Ops.push_back(*(Call->op_end() - 2));
10622 else
10623 Ops.push_back(*(Call->op_end() - 1));
10624
10625 // Add the <id> and <numBytes> constants.
10627 Ops.push_back(DAG.getTargetConstant(IDVal->getAsZExtVal(), dl, MVT::i64));
10629 Ops.push_back(DAG.getTargetConstant(NBytesVal->getAsZExtVal(), dl, MVT::i32));
10630
10631 // Add the callee.
10632 Ops.push_back(Callee);
10633
10634 // Adjust <numArgs> to account for any arguments that have been passed on the
10635 // stack instead.
10636 // Call Node: Chain, Target, {Args}, RegMask, [Glue]
10637 unsigned NumCallRegArgs = Call->getNumOperands() - (HasGlue ? 4 : 3);
10638 NumCallRegArgs = IsAnyRegCC ? NumArgs : NumCallRegArgs;
10639 Ops.push_back(DAG.getTargetConstant(NumCallRegArgs, dl, MVT::i32));
10640
10641 // Add the calling convention
10642 Ops.push_back(DAG.getTargetConstant((unsigned)CC, dl, MVT::i32));
10643
10644 // Add the arguments we omitted previously. The register allocator should
10645 // place these in any free register.
10646 if (IsAnyRegCC)
10647 for (unsigned i = NumMetaOpers, e = NumMetaOpers + NumArgs; i != e; ++i)
10648 Ops.push_back(getValue(CB.getArgOperand(i)));
10649
10650 // Push the arguments from the call instruction.
10651 SDNode::op_iterator e = HasGlue ? Call->op_end()-2 : Call->op_end()-1;
10652 Ops.append(Call->op_begin() + 2, e);
10653
10654 // Push live variables for the stack map.
10655 addStackMapLiveVars(CB, NumMetaOpers + NumArgs, dl, Ops, *this);
10656
10657 SDVTList NodeTys;
10658 if (IsAnyRegCC && HasDef) {
10659 // Create the return types based on the intrinsic definition
10661 SmallVector<EVT, 3> ValueVTs;
10662 ComputeValueVTs(TLI, DAG.getDataLayout(), CB.getType(), ValueVTs);
10663 assert(ValueVTs.size() == 1 && "Expected only one return value type.");
10664
10665 // There is always a chain and a glue type at the end
10666 ValueVTs.push_back(MVT::Other);
10667 ValueVTs.push_back(MVT::Glue);
10668 NodeTys = DAG.getVTList(ValueVTs);
10669 } else
10670 NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
10671
10672 // Replace the target specific call node with a PATCHPOINT node.
10673 SDValue PPV = DAG.getNode(ISD::PATCHPOINT, dl, NodeTys, Ops);
10674
10675 // Update the NodeMap.
10676 if (HasDef) {
10677 if (IsAnyRegCC)
10678 setValue(&CB, SDValue(PPV.getNode(), 0));
10679 else
10680 setValue(&CB, Result.first);
10681 }
10682
10683 // Fixup the consumers of the intrinsic. The chain and glue may be used in the
10684 // call sequence. Furthermore the location of the chain and glue can change
10685 // when the AnyReg calling convention is used and the intrinsic returns a
10686 // value.
10687 if (IsAnyRegCC && HasDef) {
10688 SDValue From[] = {SDValue(Call, 0), SDValue(Call, 1)};
10689 SDValue To[] = {PPV.getValue(1), PPV.getValue(2)};
10691 } else
10692 DAG.ReplaceAllUsesWith(Call, PPV.getNode());
10693 DAG.DeleteNode(Call);
10694
10695 // Inform the Frame Information that we have a patchpoint in this function.
10697}
10698
10699void SelectionDAGBuilder::visitVectorReduce(const CallInst &I,
10700 unsigned Intrinsic) {
10702 SDValue Op1 = getValue(I.getArgOperand(0));
10703 SDValue Op2;
10704 if (I.arg_size() > 1)
10705 Op2 = getValue(I.getArgOperand(1));
10706 SDLoc dl = getCurSDLoc();
10707 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
10708 SDValue Res;
10709 SDNodeFlags SDFlags;
10710 if (auto *FPMO = dyn_cast<FPMathOperator>(&I))
10711 SDFlags.copyFMF(*FPMO);
10712
10713 switch (Intrinsic) {
10714 case Intrinsic::vector_reduce_fadd:
10715 if (SDFlags.hasAllowReassociation())
10716 Res = DAG.getNode(ISD::FADD, dl, VT, Op1,
10717 DAG.getNode(ISD::VECREDUCE_FADD, dl, VT, Op2, SDFlags),
10718 SDFlags);
10719 else
10720 Res = DAG.getNode(ISD::VECREDUCE_SEQ_FADD, dl, VT, Op1, Op2, SDFlags);
10721 break;
10722 case Intrinsic::vector_reduce_fmul:
10723 if (SDFlags.hasAllowReassociation())
10724 Res = DAG.getNode(ISD::FMUL, dl, VT, Op1,
10725 DAG.getNode(ISD::VECREDUCE_FMUL, dl, VT, Op2, SDFlags),
10726 SDFlags);
10727 else
10728 Res = DAG.getNode(ISD::VECREDUCE_SEQ_FMUL, dl, VT, Op1, Op2, SDFlags);
10729 break;
10730 case Intrinsic::vector_reduce_add:
10731 Res = DAG.getNode(ISD::VECREDUCE_ADD, dl, VT, Op1);
10732 break;
10733 case Intrinsic::vector_reduce_mul:
10734 Res = DAG.getNode(ISD::VECREDUCE_MUL, dl, VT, Op1);
10735 break;
10736 case Intrinsic::vector_reduce_and:
10737 Res = DAG.getNode(ISD::VECREDUCE_AND, dl, VT, Op1);
10738 break;
10739 case Intrinsic::vector_reduce_or:
10740 Res = DAG.getNode(ISD::VECREDUCE_OR, dl, VT, Op1);
10741 break;
10742 case Intrinsic::vector_reduce_xor:
10743 Res = DAG.getNode(ISD::VECREDUCE_XOR, dl, VT, Op1);
10744 break;
10745 case Intrinsic::vector_reduce_smax:
10746 Res = DAG.getNode(ISD::VECREDUCE_SMAX, dl, VT, Op1);
10747 break;
10748 case Intrinsic::vector_reduce_smin:
10749 Res = DAG.getNode(ISD::VECREDUCE_SMIN, dl, VT, Op1);
10750 break;
10751 case Intrinsic::vector_reduce_umax:
10752 Res = DAG.getNode(ISD::VECREDUCE_UMAX, dl, VT, Op1);
10753 break;
10754 case Intrinsic::vector_reduce_umin:
10755 Res = DAG.getNode(ISD::VECREDUCE_UMIN, dl, VT, Op1);
10756 break;
10757 case Intrinsic::vector_reduce_fmax:
10758 Res = DAG.getNode(ISD::VECREDUCE_FMAX, dl, VT, Op1, SDFlags);
10759 break;
10760 case Intrinsic::vector_reduce_fmin:
10761 Res = DAG.getNode(ISD::VECREDUCE_FMIN, dl, VT, Op1, SDFlags);
10762 break;
10763 case Intrinsic::vector_reduce_fmaximum:
10764 Res = DAG.getNode(ISD::VECREDUCE_FMAXIMUM, dl, VT, Op1, SDFlags);
10765 break;
10766 case Intrinsic::vector_reduce_fminimum:
10767 Res = DAG.getNode(ISD::VECREDUCE_FMINIMUM, dl, VT, Op1, SDFlags);
10768 break;
10769 default:
10770 llvm_unreachable("Unhandled vector reduce intrinsic");
10771 }
10772 setValue(&I, Res);
10773}
10774
10775/// Returns an AttributeList representing the attributes applied to the return
10776/// value of the given call.
10779 if (CLI.RetSExt)
10780 Attrs.push_back(Attribute::SExt);
10781 if (CLI.RetZExt)
10782 Attrs.push_back(Attribute::ZExt);
10783 if (CLI.IsInReg)
10784 Attrs.push_back(Attribute::InReg);
10785
10787 Attrs);
10788}
10789
10790/// TargetLowering::LowerCallTo - This is the default LowerCallTo
10791/// implementation, which just calls LowerCall.
10792/// FIXME: When all targets are
10793/// migrated to using LowerCall, this hook should be integrated into SDISel.
10794std::pair<SDValue, SDValue>
10796 // Handle the incoming return values from the call.
10797 CLI.Ins.clear();
10798 Type *OrigRetTy = CLI.RetTy;
10799 SmallVector<EVT, 4> RetTys;
10801 auto &DL = CLI.DAG.getDataLayout();
10802 ComputeValueVTs(*this, DL, CLI.RetTy, RetTys, &Offsets);
10803
10804 if (CLI.IsPostTypeLegalization) {
10805 // If we are lowering a libcall after legalization, split the return type.
10806 SmallVector<EVT, 4> OldRetTys;
10807 SmallVector<TypeSize, 4> OldOffsets;
10808 RetTys.swap(OldRetTys);
10809 Offsets.swap(OldOffsets);
10810
10811 for (size_t i = 0, e = OldRetTys.size(); i != e; ++i) {
10812 EVT RetVT = OldRetTys[i];
10813 uint64_t Offset = OldOffsets[i];
10814 MVT RegisterVT = getRegisterType(CLI.RetTy->getContext(), RetVT);
10815 unsigned NumRegs = getNumRegisters(CLI.RetTy->getContext(), RetVT);
10816 unsigned RegisterVTByteSZ = RegisterVT.getSizeInBits() / 8;
10817 RetTys.append(NumRegs, RegisterVT);
10818 for (unsigned j = 0; j != NumRegs; ++j)
10819 Offsets.push_back(TypeSize::getFixed(Offset + j * RegisterVTByteSZ));
10820 }
10821 }
10822
10824 GetReturnInfo(CLI.CallConv, CLI.RetTy, getReturnAttrs(CLI), Outs, *this, DL);
10825
10826 bool CanLowerReturn =
10828 CLI.IsVarArg, Outs, CLI.RetTy->getContext());
10829
10830 SDValue DemoteStackSlot;
10831 int DemoteStackIdx = -100;
10832 if (!CanLowerReturn) {
10833 // FIXME: equivalent assert?
10834 // assert(!CS.hasInAllocaArgument() &&
10835 // "sret demotion is incompatible with inalloca");
10836 uint64_t TySize = DL.getTypeAllocSize(CLI.RetTy);
10837 Align Alignment = DL.getPrefTypeAlign(CLI.RetTy);
10839 DemoteStackIdx =
10840 MF.getFrameInfo().CreateStackObject(TySize, Alignment, false);
10841 Type *StackSlotPtrType = PointerType::get(CLI.RetTy,
10842 DL.getAllocaAddrSpace());
10843
10844 DemoteStackSlot = CLI.DAG.getFrameIndex(DemoteStackIdx, getFrameIndexTy(DL));
10845 ArgListEntry Entry;
10846 Entry.Node = DemoteStackSlot;
10847 Entry.Ty = StackSlotPtrType;
10848 Entry.IsSExt = false;
10849 Entry.IsZExt = false;
10850 Entry.IsInReg = false;
10851 Entry.IsSRet = true;
10852 Entry.IsNest = false;
10853 Entry.IsByVal = false;
10854 Entry.IsByRef = false;
10855 Entry.IsReturned = false;
10856 Entry.IsSwiftSelf = false;
10857 Entry.IsSwiftAsync = false;
10858 Entry.IsSwiftError = false;
10859 Entry.IsCFGuardTarget = false;
10860 Entry.Alignment = Alignment;
10861 CLI.getArgs().insert(CLI.getArgs().begin(), Entry);
10862 CLI.NumFixedArgs += 1;
10863 CLI.getArgs()[0].IndirectType = CLI.RetTy;
10864 CLI.RetTy = Type::getVoidTy(CLI.RetTy->getContext());
10865
10866 // sret demotion isn't compatible with tail-calls, since the sret argument
10867 // points into the callers stack frame.
10868 CLI.IsTailCall = false;
10869 } else {
10870 bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
10871 CLI.RetTy, CLI.CallConv, CLI.IsVarArg, DL);
10872 for (unsigned I = 0, E = RetTys.size(); I != E; ++I) {
10873 ISD::ArgFlagsTy Flags;
10874 if (NeedsRegBlock) {
10875 Flags.setInConsecutiveRegs();
10876 if (I == RetTys.size() - 1)
10877 Flags.setInConsecutiveRegsLast();
10878 }
10879 EVT VT = RetTys[I];
10881 CLI.CallConv, VT);
10882 unsigned NumRegs = getNumRegistersForCallingConv(CLI.RetTy->getContext(),
10883 CLI.CallConv, VT);
10884 for (unsigned i = 0; i != NumRegs; ++i) {
10885 ISD::InputArg MyFlags;
10886 MyFlags.Flags = Flags;
10887 MyFlags.VT = RegisterVT;
10888 MyFlags.ArgVT = VT;
10889 MyFlags.Used = CLI.IsReturnValueUsed;
10890 if (CLI.RetTy->isPointerTy()) {
10891 MyFlags.Flags.setPointer();
10892 MyFlags.Flags.setPointerAddrSpace(
10893 cast<PointerType>(CLI.RetTy)->getAddressSpace());
10894 }
10895 if (CLI.RetSExt)
10896 MyFlags.Flags.setSExt();
10897 if (CLI.RetZExt)
10898 MyFlags.Flags.setZExt();
10899 if (CLI.IsInReg)
10900 MyFlags.Flags.setInReg();
10901 CLI.Ins.push_back(MyFlags);
10902 }
10903 }
10904 }
10905
10906 // We push in swifterror return as the last element of CLI.Ins.
10907 ArgListTy &Args = CLI.getArgs();
10908 if (supportSwiftError()) {
10909 for (const ArgListEntry &Arg : Args) {
10910 if (Arg.IsSwiftError) {
10911 ISD::InputArg MyFlags;
10912 MyFlags.VT = getPointerTy(DL);
10913 MyFlags.ArgVT = EVT(getPointerTy(DL));
10914 MyFlags.Flags.setSwiftError();
10915 CLI.Ins.push_back(MyFlags);
10916 }
10917 }
10918 }
10919
10920 // Handle all of the outgoing arguments.
10921 CLI.Outs.clear();
10922 CLI.OutVals.clear();
10923 for (unsigned i = 0, e = Args.size(); i != e; ++i) {
10924 SmallVector<EVT, 4> ValueVTs;
10925 ComputeValueVTs(*this, DL, Args[i].Ty, ValueVTs);
10926 // FIXME: Split arguments if CLI.IsPostTypeLegalization
10927 Type *FinalType = Args[i].Ty;
10928 if (Args[i].IsByVal)
10929 FinalType = Args[i].IndirectType;
10930 bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
10931 FinalType, CLI.CallConv, CLI.IsVarArg, DL);
10932 for (unsigned Value = 0, NumValues = ValueVTs.size(); Value != NumValues;
10933 ++Value) {
10934 EVT VT = ValueVTs[Value];
10935 Type *ArgTy = VT.getTypeForEVT(CLI.RetTy->getContext());
10936 SDValue Op = SDValue(Args[i].Node.getNode(),
10937 Args[i].Node.getResNo() + Value);
10938 ISD::ArgFlagsTy Flags;
10939
10940 // Certain targets (such as MIPS), may have a different ABI alignment
10941 // for a type depending on the context. Give the target a chance to
10942 // specify the alignment it wants.
10943 const Align OriginalAlignment(getABIAlignmentForCallingConv(ArgTy, DL));
10944 Flags.setOrigAlign(OriginalAlignment);
10945
10946 if (Args[i].Ty->isPointerTy()) {
10947 Flags.setPointer();
10948 Flags.setPointerAddrSpace(
10949 cast<PointerType>(Args[i].Ty)->getAddressSpace());
10950 }
10951 if (Args[i].IsZExt)
10952 Flags.setZExt();
10953 if (Args[i].IsSExt)
10954 Flags.setSExt();
10955 if (Args[i].IsInReg) {
10956 // If we are using vectorcall calling convention, a structure that is
10957 // passed InReg - is surely an HVA
10959 isa<StructType>(FinalType)) {
10960 // The first value of a structure is marked
10961 if (0 == Value)
10962 Flags.setHvaStart();
10963 Flags.setHva();
10964 }
10965 // Set InReg Flag
10966 Flags.setInReg();
10967 }
10968 if (Args[i].IsSRet)
10969 Flags.setSRet();
10970 if (Args[i].IsSwiftSelf)
10971 Flags.setSwiftSelf();
10972 if (Args[i].IsSwiftAsync)
10973 Flags.setSwiftAsync();
10974 if (Args[i].IsSwiftError)
10975 Flags.setSwiftError();
10976 if (Args[i].IsCFGuardTarget)
10977 Flags.setCFGuardTarget();
10978 if (Args[i].IsByVal)
10979 Flags.setByVal();
10980 if (Args[i].IsByRef)
10981 Flags.setByRef();
10982 if (Args[i].IsPreallocated) {
10983 Flags.setPreallocated();
10984 // Set the byval flag for CCAssignFn callbacks that don't know about
10985 // preallocated. This way we can know how many bytes we should've
10986 // allocated and how many bytes a callee cleanup function will pop. If
10987 // we port preallocated to more targets, we'll have to add custom
10988 // preallocated handling in the various CC lowering callbacks.
10989 Flags.setByVal();
10990 }
10991 if (Args[i].IsInAlloca) {
10992 Flags.setInAlloca();
10993 // Set the byval flag for CCAssignFn callbacks that don't know about
10994 // inalloca. This way we can know how many bytes we should've allocated
10995 // and how many bytes a callee cleanup function will pop. If we port
10996 // inalloca to more targets, we'll have to add custom inalloca handling
10997 // in the various CC lowering callbacks.
10998 Flags.setByVal();
10999 }
11000 Align MemAlign;
11001 if (Args[i].IsByVal || Args[i].IsInAlloca || Args[i].IsPreallocated) {
11002 unsigned FrameSize = DL.getTypeAllocSize(Args[i].IndirectType);
11003 Flags.setByValSize(FrameSize);
11004
11005 // info is not there but there are cases it cannot get right.
11006 if (auto MA = Args[i].Alignment)
11007 MemAlign = *MA;
11008 else
11009 MemAlign = Align(getByValTypeAlignment(Args[i].IndirectType, DL));
11010 } else if (auto MA = Args[i].Alignment) {
11011 MemAlign = *MA;
11012 } else {
11013 MemAlign = OriginalAlignment;
11014 }
11015 Flags.setMemAlign(MemAlign);
11016 if (Args[i].IsNest)
11017 Flags.setNest();
11018 if (NeedsRegBlock)
11019 Flags.setInConsecutiveRegs();
11020
11022 CLI.CallConv, VT);
11023 unsigned NumParts = getNumRegistersForCallingConv(CLI.RetTy->getContext(),
11024 CLI.CallConv, VT);
11025 SmallVector<SDValue, 4> Parts(NumParts);
11026 ISD::NodeType ExtendKind = ISD::ANY_EXTEND;
11027
11028 if (Args[i].IsSExt)
11029 ExtendKind = ISD::SIGN_EXTEND;
11030 else if (Args[i].IsZExt)
11031 ExtendKind = ISD::ZERO_EXTEND;
11032
11033 // Conservatively only handle 'returned' on non-vectors that can be lowered,
11034 // for now.
11035 if (Args[i].IsReturned && !Op.getValueType().isVector() &&
11037 assert((CLI.RetTy == Args[i].Ty ||
11038 (CLI.RetTy->isPointerTy() && Args[i].Ty->isPointerTy() &&
11040 Args[i].Ty->getPointerAddressSpace())) &&
11041 RetTys.size() == NumValues && "unexpected use of 'returned'");
11042 // Before passing 'returned' to the target lowering code, ensure that
11043 // either the register MVT and the actual EVT are the same size or that
11044 // the return value and argument are extended in the same way; in these
11045 // cases it's safe to pass the argument register value unchanged as the
11046 // return register value (although it's at the target's option whether
11047 // to do so)
11048 // TODO: allow code generation to take advantage of partially preserved
11049 // registers rather than clobbering the entire register when the
11050 // parameter extension method is not compatible with the return
11051 // extension method
11052 if ((NumParts * PartVT.getSizeInBits() == VT.getSizeInBits()) ||
11053 (ExtendKind != ISD::ANY_EXTEND && CLI.RetSExt == Args[i].IsSExt &&
11054 CLI.RetZExt == Args[i].IsZExt))
11055 Flags.setReturned();
11056 }
11057
11058 getCopyToParts(CLI.DAG, CLI.DL, Op, &Parts[0], NumParts, PartVT, CLI.CB,
11059 CLI.CallConv, ExtendKind);
11060
11061 for (unsigned j = 0; j != NumParts; ++j) {
11062 // if it isn't first piece, alignment must be 1
11063 // For scalable vectors the scalable part is currently handled
11064 // by individual targets, so we just use the known minimum size here.
11065 ISD::OutputArg MyFlags(
11066 Flags, Parts[j].getValueType().getSimpleVT(), VT,
11067 i < CLI.NumFixedArgs, i,
11068 j * Parts[j].getValueType().getStoreSize().getKnownMinValue());
11069 if (NumParts > 1 && j == 0)
11070 MyFlags.Flags.setSplit();
11071 else if (j != 0) {
11072 MyFlags.Flags.setOrigAlign(Align(1));
11073 if (j == NumParts - 1)
11074 MyFlags.Flags.setSplitEnd();
11075 }
11076
11077 CLI.Outs.push_back(MyFlags);
11078 CLI.OutVals.push_back(Parts[j]);
11079 }
11080
11081 if (NeedsRegBlock && Value == NumValues - 1)
11082 CLI.Outs[CLI.Outs.size() - 1].Flags.setInConsecutiveRegsLast();
11083 }
11084 }
11085
11087 CLI.Chain = LowerCall(CLI, InVals);
11088
11089 // Update CLI.InVals to use outside of this function.
11090 CLI.InVals = InVals;
11091
11092 // Verify that the target's LowerCall behaved as expected.
11093 assert(CLI.Chain.getNode() && CLI.Chain.getValueType() == MVT::Other &&
11094 "LowerCall didn't return a valid chain!");
11095 assert((!CLI.IsTailCall || InVals.empty()) &&
11096 "LowerCall emitted a return value for a tail call!");
11097 assert((CLI.IsTailCall || InVals.size() == CLI.Ins.size()) &&
11098 "LowerCall didn't emit the correct number of values!");
11099
11100 // For a tail call, the return value is merely live-out and there aren't
11101 // any nodes in the DAG representing it. Return a special value to
11102 // indicate that a tail call has been emitted and no more Instructions
11103 // should be processed in the current block.
11104 if (CLI.IsTailCall) {
11105 CLI.DAG.setRoot(CLI.Chain);
11106 return std::make_pair(SDValue(), SDValue());
11107 }
11108
11109#ifndef NDEBUG
11110 for (unsigned i = 0, e = CLI.Ins.size(); i != e; ++i) {
11111 assert(InVals[i].getNode() && "LowerCall emitted a null value!");
11112 assert(EVT(CLI.Ins[i].VT) == InVals[i].getValueType() &&
11113 "LowerCall emitted a value with the wrong type!");
11114 }
11115#endif
11116
11117 SmallVector<SDValue, 4> ReturnValues;
11118 if (!CanLowerReturn) {
11119 // The instruction result is the result of loading from the
11120 // hidden sret parameter.
11122 Type *PtrRetTy =
11123 PointerType::get(OrigRetTy->getContext(), DL.getAllocaAddrSpace());
11124
11125 ComputeValueVTs(*this, DL, PtrRetTy, PVTs);
11126 assert(PVTs.size() == 1 && "Pointers should fit in one register");
11127 EVT PtrVT = PVTs[0];
11128
11129 unsigned NumValues = RetTys.size();
11130 ReturnValues.resize(NumValues);
11131 SmallVector<SDValue, 4> Chains(NumValues);
11132
11133 // An aggregate return value cannot wrap around the address space, so
11134 // offsets to its parts don't wrap either.
11135 SDNodeFlags Flags;
11136 Flags.setNoUnsignedWrap(true);
11137
11139 Align HiddenSRetAlign = MF.getFrameInfo().getObjectAlign(DemoteStackIdx);
11140 for (unsigned i = 0; i < NumValues; ++i) {
11141 SDValue Add = CLI.DAG.getNode(ISD::ADD, CLI.DL, PtrVT, DemoteStackSlot,
11142 CLI.DAG.getConstant(Offsets[i], CLI.DL,
11143 PtrVT), Flags);
11144 SDValue L = CLI.DAG.getLoad(
11145 RetTys[i], CLI.DL, CLI.Chain, Add,
11147 DemoteStackIdx, Offsets[i]),
11148 HiddenSRetAlign);
11149 ReturnValues[i] = L;
11150 Chains[i] = L.getValue(1);
11151 }
11152
11153 CLI.Chain = CLI.DAG.getNode(ISD::TokenFactor, CLI.DL, MVT::Other, Chains);
11154 } else {
11155 // Collect the legal value parts into potentially illegal values
11156 // that correspond to the original function's return values.
11157 std::optional<ISD::NodeType> AssertOp;
11158 if (CLI.RetSExt)
11159 AssertOp = ISD::AssertSext;
11160 else if (CLI.RetZExt)
11161 AssertOp = ISD::AssertZext;
11162 unsigned CurReg = 0;
11163 for (EVT VT : RetTys) {
11165 CLI.CallConv, VT);
11166 unsigned NumRegs = getNumRegistersForCallingConv(CLI.RetTy->getContext(),
11167 CLI.CallConv, VT);
11168
11169 ReturnValues.push_back(getCopyFromParts(
11170 CLI.DAG, CLI.DL, &InVals[CurReg], NumRegs, RegisterVT, VT, nullptr,
11171 CLI.Chain, CLI.CallConv, AssertOp));
11172 CurReg += NumRegs;
11173 }
11174
11175 // For a function returning void, there is no return value. We can't create
11176 // such a node, so we just return a null return value in that case. In
11177 // that case, nothing will actually look at the value.
11178 if (ReturnValues.empty())
11179 return std::make_pair(SDValue(), CLI.Chain);
11180 }
11181
11182 SDValue Res = CLI.DAG.getNode(ISD::MERGE_VALUES, CLI.DL,
11183 CLI.DAG.getVTList(RetTys), ReturnValues);
11184 return std::make_pair(Res, CLI.Chain);
11185}
11186
11187/// Places new result values for the node in Results (their number
11188/// and types must exactly match those of the original return values of
11189/// the node), or leaves Results empty, which indicates that the node is not
11190/// to be custom lowered after all.
11193 SelectionDAG &DAG) const {
11194 SDValue Res = LowerOperation(SDValue(N, 0), DAG);
11195
11196 if (!Res.getNode())
11197 return;
11198
11199 // If the original node has one result, take the return value from
11200 // LowerOperation as is. It might not be result number 0.
11201 if (N->getNumValues() == 1) {
11202 Results.push_back(Res);
11203 return;
11204 }
11205
11206 // If the original node has multiple results, then the return node should
11207 // have the same number of results.
11208 assert((N->getNumValues() == Res->getNumValues()) &&
11209 "Lowering returned the wrong number of results!");
11210
11211 // Places new result values base on N result number.
11212 for (unsigned I = 0, E = N->getNumValues(); I != E; ++I)
11213 Results.push_back(Res.getValue(I));
11214}
11215
11217 llvm_unreachable("LowerOperation not implemented for this target!");
11218}
11219
11221 unsigned Reg,
11222 ISD::NodeType ExtendType) {
11224 assert((Op.getOpcode() != ISD::CopyFromReg ||
11225 cast<RegisterSDNode>(Op.getOperand(1))->getReg() != Reg) &&
11226 "Copy from a reg to the same reg!");
11227 assert(!Register::isPhysicalRegister(Reg) && "Is a physreg");
11228
11230 // If this is an InlineAsm we have to match the registers required, not the
11231 // notional registers required by the type.
11232
11233 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), Reg, V->getType(),
11234 std::nullopt); // This is not an ABI copy.
11235 SDValue Chain = DAG.getEntryNode();
11236
11237 if (ExtendType == ISD::ANY_EXTEND) {
11238 auto PreferredExtendIt = FuncInfo.PreferredExtendType.find(V);
11239 if (PreferredExtendIt != FuncInfo.PreferredExtendType.end())
11240 ExtendType = PreferredExtendIt->second;
11241 }
11242 RFV.getCopyToRegs(Op, DAG, getCurSDLoc(), Chain, nullptr, V, ExtendType);
11243 PendingExports.push_back(Chain);
11244}
11245
11247
11248/// isOnlyUsedInEntryBlock - If the specified argument is only used in the
11249/// entry block, return true. This includes arguments used by switches, since
11250/// the switch may expand into multiple basic blocks.
11251static bool isOnlyUsedInEntryBlock(const Argument *A, bool FastISel) {
11252 // With FastISel active, we may be splitting blocks, so force creation
11253 // of virtual registers for all non-dead arguments.
11254 if (FastISel)
11255 return A->use_empty();
11256
11257 const BasicBlock &Entry = A->getParent()->front();
11258 for (const User *U : A->users())
11259 if (cast<Instruction>(U)->getParent() != &Entry || isa<SwitchInst>(U))
11260 return false; // Use not in entry block.
11261
11262 return true;
11263}
11264
11266 DenseMap<const Argument *,
11267 std::pair<const AllocaInst *, const StoreInst *>>;
11268
11269/// Scan the entry block of the function in FuncInfo for arguments that look
11270/// like copies into a local alloca. Record any copied arguments in
11271/// ArgCopyElisionCandidates.
11272static void
11274 FunctionLoweringInfo *FuncInfo,
11275 ArgCopyElisionMapTy &ArgCopyElisionCandidates) {
11276 // Record the state of every static alloca used in the entry block. Argument
11277 // allocas are all used in the entry block, so we need approximately as many
11278 // entries as we have arguments.
11279 enum StaticAllocaInfo { Unknown, Clobbered, Elidable };
11281 unsigned NumArgs = FuncInfo->Fn->arg_size();
11282 StaticAllocas.reserve(NumArgs * 2);
11283
11284 auto GetInfoIfStaticAlloca = [&](const Value *V) -> StaticAllocaInfo * {
11285 if (!V)
11286 return nullptr;
11287 V = V->stripPointerCasts();
11288 const auto *AI = dyn_cast<AllocaInst>(V);
11289 if (!AI || !AI->isStaticAlloca() || !FuncInfo->StaticAllocaMap.count(AI))
11290 return nullptr;
11291 auto Iter = StaticAllocas.insert({AI, Unknown});
11292 return &Iter.first->second;
11293 };
11294
11295 // Look for stores of arguments to static allocas. Look through bitcasts and
11296 // GEPs to handle type coercions, as long as the alloca is fully initialized
11297 // by the store. Any non-store use of an alloca escapes it and any subsequent
11298 // unanalyzed store might write it.
11299 // FIXME: Handle structs initialized with multiple stores.
11300 for (const Instruction &I : FuncInfo->Fn->getEntryBlock()) {
11301 // Look for stores, and handle non-store uses conservatively.
11302 const auto *SI = dyn_cast<StoreInst>(&I);
11303 if (!SI) {
11304 // We will look through cast uses, so ignore them completely.
11305 if (I.isCast())
11306 continue;
11307 // Ignore debug info and pseudo op intrinsics, they don't escape or store
11308 // to allocas.
11309 if (I.isDebugOrPseudoInst())
11310 continue;
11311 // This is an unknown instruction. Assume it escapes or writes to all
11312 // static alloca operands.
11313 for (const Use &U : I.operands()) {
11314 if (StaticAllocaInfo *Info = GetInfoIfStaticAlloca(U))
11315 *Info = StaticAllocaInfo::Clobbered;
11316 }
11317 continue;
11318 }
11319
11320 // If the stored value is a static alloca, mark it as escaped.
11321 if (StaticAllocaInfo *Info = GetInfoIfStaticAlloca(SI->getValueOperand()))
11322 *Info = StaticAllocaInfo::Clobbered;
11323
11324 // Check if the destination is a static alloca.
11325 const Value *Dst = SI->getPointerOperand()->stripPointerCasts();
11326 StaticAllocaInfo *Info = GetInfoIfStaticAlloca(Dst);
11327 if (!Info)
11328 continue;
11329 const AllocaInst *AI = cast<AllocaInst>(Dst);
11330
11331 // Skip allocas that have been initialized or clobbered.
11332 if (*Info != StaticAllocaInfo::Unknown)
11333 continue;
11334
11335 // Check if the stored value is an argument, and that this store fully
11336 // initializes the alloca.
11337 // If the argument type has padding bits we can't directly forward a pointer
11338 // as the upper bits may contain garbage.
11339 // Don't elide copies from the same argument twice.
11340 const Value *Val = SI->getValueOperand()->stripPointerCasts();
11341 const auto *Arg = dyn_cast<Argument>(Val);
11342 if (!Arg || Arg->hasPassPointeeByValueCopyAttr() ||
11343 Arg->getType()->isEmptyTy() ||
11344 DL.getTypeStoreSize(Arg->getType()) !=
11345 DL.getTypeAllocSize(AI->getAllocatedType()) ||
11346 !DL.typeSizeEqualsStoreSize(Arg->getType()) ||
11347 ArgCopyElisionCandidates.count(Arg)) {
11348 *Info = StaticAllocaInfo::Clobbered;
11349 continue;
11350 }
11351
11352 LLVM_DEBUG(dbgs() << "Found argument copy elision candidate: " << *AI
11353 << '\n');
11354
11355 // Mark this alloca and store for argument copy elision.
11356 *Info = StaticAllocaInfo::Elidable;
11357 ArgCopyElisionCandidates.insert({Arg, {AI, SI}});
11358
11359 // Stop scanning if we've seen all arguments. This will happen early in -O0
11360 // builds, which is useful, because -O0 builds have large entry blocks and
11361 // many allocas.
11362 if (ArgCopyElisionCandidates.size() == NumArgs)
11363 break;
11364 }
11365}
11366
11367/// Try to elide argument copies from memory into a local alloca. Succeeds if
11368/// ArgVal is a load from a suitable fixed stack object.
11371 DenseMap<int, int> &ArgCopyElisionFrameIndexMap,
11372 SmallPtrSetImpl<const Instruction *> &ElidedArgCopyInstrs,
11373 ArgCopyElisionMapTy &ArgCopyElisionCandidates, const Argument &Arg,
11374 ArrayRef<SDValue> ArgVals, bool &ArgHasUses) {
11375 // Check if this is a load from a fixed stack object.
11376 auto *LNode = dyn_cast<LoadSDNode>(ArgVals[0]);
11377 if (!LNode)
11378 return;
11379 auto *FINode = dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode());
11380 if (!FINode)
11381 return;
11382
11383 // Check that the fixed stack object is the right size and alignment.
11384 // Look at the alignment that the user wrote on the alloca instead of looking
11385 // at the stack object.
11386 auto ArgCopyIter = ArgCopyElisionCandidates.find(&Arg);
11387 assert(ArgCopyIter != ArgCopyElisionCandidates.end());
11388 const AllocaInst *AI = ArgCopyIter->second.first;
11389 int FixedIndex = FINode->getIndex();
11390 int &AllocaIndex = FuncInfo.StaticAllocaMap[AI];
11391 int OldIndex = AllocaIndex;
11392 MachineFrameInfo &MFI = FuncInfo.MF->getFrameInfo();
11393 if (MFI.getObjectSize(FixedIndex) != MFI.getObjectSize(OldIndex)) {
11394 LLVM_DEBUG(
11395 dbgs() << " argument copy elision failed due to bad fixed stack "
11396 "object size\n");
11397 return;
11398 }
11399 Align RequiredAlignment = AI->getAlign();
11400 if (MFI.getObjectAlign(FixedIndex) < RequiredAlignment) {
11401 LLVM_DEBUG(dbgs() << " argument copy elision failed: alignment of alloca "
11402 "greater than stack argument alignment ("
11403 << DebugStr(RequiredAlignment) << " vs "
11404 << DebugStr(MFI.getObjectAlign(FixedIndex)) << ")\n");
11405 return;
11406 }
11407
11408 // Perform the elision. Delete the old stack object and replace its only use
11409 // in the variable info map. Mark the stack object as mutable and aliased.
11410 LLVM_DEBUG({
11411 dbgs() << "Eliding argument copy from " << Arg << " to " << *AI << '\n'
11412 << " Replacing frame index " << OldIndex << " with " << FixedIndex
11413 << '\n';
11414 });
11415 MFI.RemoveStackObject(OldIndex);
11416 MFI.setIsImmutableObjectIndex(FixedIndex, false);
11417 MFI.setIsAliasedObjectIndex(FixedIndex, true);
11418 AllocaIndex = FixedIndex;
11419 ArgCopyElisionFrameIndexMap.insert({OldIndex, FixedIndex});
11420 for (SDValue ArgVal : ArgVals)
11421 Chains.push_back(ArgVal.getValue(1));
11422
11423 // Avoid emitting code for the store implementing the copy.
11424 const StoreInst *SI = ArgCopyIter->second.second;
11425 ElidedArgCopyInstrs.insert(SI);
11426
11427 // Check for uses of the argument again so that we can avoid exporting ArgVal
11428 // if it is't used by anything other than the store.
11429 for (const Value *U : Arg.users()) {
11430 if (U != SI) {
11431 ArgHasUses = true;
11432 break;
11433 }
11434 }
11435}
11436
11437void SelectionDAGISel::LowerArguments(const Function &F) {
11438 SelectionDAG &DAG = SDB->DAG;
11439 SDLoc dl = SDB->getCurSDLoc();
11440 const DataLayout &DL = DAG.getDataLayout();
11442
11443 // In Naked functions we aren't going to save any registers.
11444 if (F.hasFnAttribute(Attribute::Naked))
11445 return;
11446
11447 if (!FuncInfo->CanLowerReturn) {
11448 // Put in an sret pointer parameter before all the other parameters.
11449 SmallVector<EVT, 1> ValueVTs;
11451 PointerType::get(F.getContext(),
11453 ValueVTs);
11454
11455 // NOTE: Assuming that a pointer will never break down to more than one VT
11456 // or one register.
11458 Flags.setSRet();
11459 MVT RegisterVT = TLI->getRegisterType(*DAG.getContext(), ValueVTs[0]);
11460 ISD::InputArg RetArg(Flags, RegisterVT, ValueVTs[0], true,
11462 Ins.push_back(RetArg);
11463 }
11464
11465 // Look for stores of arguments to static allocas. Mark such arguments with a
11466 // flag to ask the target to give us the memory location of that argument if
11467 // available.
11468 ArgCopyElisionMapTy ArgCopyElisionCandidates;
11470 ArgCopyElisionCandidates);
11471
11472 // Set up the incoming argument description vector.
11473 for (const Argument &Arg : F.args()) {
11474 unsigned ArgNo = Arg.getArgNo();
11475 SmallVector<EVT, 4> ValueVTs;
11476 ComputeValueVTs(*TLI, DAG.getDataLayout(), Arg.getType(), ValueVTs);
11477 bool isArgValueUsed = !Arg.use_empty();
11478 unsigned PartBase = 0;
11479 Type *FinalType = Arg.getType();
11480 if (Arg.hasAttribute(Attribute::ByVal))
11481 FinalType = Arg.getParamByValType();
11482 bool NeedsRegBlock = TLI->functionArgumentNeedsConsecutiveRegisters(
11483 FinalType, F.getCallingConv(), F.isVarArg(), DL);
11484 for (unsigned Value = 0, NumValues = ValueVTs.size();
11485 Value != NumValues; ++Value) {
11486 EVT VT = ValueVTs[Value];
11487 Type *ArgTy = VT.getTypeForEVT(*DAG.getContext());
11489
11490
11491 if (Arg.getType()->isPointerTy()) {
11492 Flags.setPointer();
11493 Flags.setPointerAddrSpace(
11494 cast<PointerType>(Arg.getType())->getAddressSpace());
11495 }
11496 if (Arg.hasAttribute(Attribute::ZExt))
11497 Flags.setZExt();
11498 if (Arg.hasAttribute(Attribute::SExt))
11499 Flags.setSExt();
11500 if (Arg.hasAttribute(Attribute::InReg)) {
11501 // If we are using vectorcall calling convention, a structure that is
11502 // passed InReg - is surely an HVA
11503 if (F.getCallingConv() == CallingConv::X86_VectorCall &&
11504 isa<StructType>(Arg.getType())) {
11505 // The first value of a structure is marked
11506 if (0 == Value)
11507 Flags.setHvaStart();
11508 Flags.setHva();
11509 }
11510 // Set InReg Flag
11511 Flags.setInReg();
11512 }
11513 if (Arg.hasAttribute(Attribute::StructRet))
11514 Flags.setSRet();
11515 if (Arg.hasAttribute(Attribute::SwiftSelf))
11516 Flags.setSwiftSelf();
11517 if (Arg.hasAttribute(Attribute::SwiftAsync))
11518 Flags.setSwiftAsync();
11519 if (Arg.hasAttribute(Attribute::SwiftError))
11520 Flags.setSwiftError();
11521 if (Arg.hasAttribute(Attribute::ByVal))
11522 Flags.setByVal();
11523 if (Arg.hasAttribute(Attribute::ByRef))
11524 Flags.setByRef();
11525 if (Arg.hasAttribute(Attribute::InAlloca)) {
11526 Flags.setInAlloca();
11527 // Set the byval flag for CCAssignFn callbacks that don't know about
11528 // inalloca. This way we can know how many bytes we should've allocated
11529 // and how many bytes a callee cleanup function will pop. If we port
11530 // inalloca to more targets, we'll have to add custom inalloca handling
11531 // in the various CC lowering callbacks.
11532 Flags.setByVal();
11533 }
11534 if (Arg.hasAttribute(Attribute::Preallocated)) {
11535 Flags.setPreallocated();
11536 // Set the byval flag for CCAssignFn callbacks that don't know about
11537 // preallocated. This way we can know how many bytes we should've
11538 // allocated and how many bytes a callee cleanup function will pop. If
11539 // we port preallocated to more targets, we'll have to add custom
11540 // preallocated handling in the various CC lowering callbacks.
11541 Flags.setByVal();
11542 }
11543
11544 // Certain targets (such as MIPS), may have a different ABI alignment
11545 // for a type depending on the context. Give the target a chance to
11546 // specify the alignment it wants.
11547 const Align OriginalAlignment(
11549 Flags.setOrigAlign(OriginalAlignment);
11550
11551 Align MemAlign;
11552 Type *ArgMemTy = nullptr;
11553 if (Flags.isByVal() || Flags.isInAlloca() || Flags.isPreallocated() ||
11554 Flags.isByRef()) {
11555 if (!ArgMemTy)
11556 ArgMemTy = Arg.getPointeeInMemoryValueType();
11557
11558 uint64_t MemSize = DL.getTypeAllocSize(ArgMemTy);
11559
11560 // For in-memory arguments, size and alignment should be passed from FE.
11561 // BE will guess if this info is not there but there are cases it cannot
11562 // get right.
11563 if (auto ParamAlign = Arg.getParamStackAlign())
11564 MemAlign = *ParamAlign;
11565 else if ((ParamAlign = Arg.getParamAlign()))
11566 MemAlign = *ParamAlign;
11567 else
11568 MemAlign = Align(TLI->getByValTypeAlignment(ArgMemTy, DL));
11569 if (Flags.isByRef())
11570 Flags.setByRefSize(MemSize);
11571 else
11572 Flags.setByValSize(MemSize);
11573 } else if (auto ParamAlign = Arg.getParamStackAlign()) {
11574 MemAlign = *ParamAlign;
11575 } else {
11576 MemAlign = OriginalAlignment;
11577 }
11578 Flags.setMemAlign(MemAlign);
11579
11580 if (Arg.hasAttribute(Attribute::Nest))
11581 Flags.setNest();
11582 if (NeedsRegBlock)
11583 Flags.setInConsecutiveRegs();
11584 if (ArgCopyElisionCandidates.count(&Arg))
11585 Flags.setCopyElisionCandidate();
11586 if (Arg.hasAttribute(Attribute::Returned))
11587 Flags.setReturned();
11588
11590 *CurDAG->getContext(), F.getCallingConv(), VT);
11591 unsigned NumRegs = TLI->getNumRegistersForCallingConv(
11592 *CurDAG->getContext(), F.getCallingConv(), VT);
11593 for (unsigned i = 0; i != NumRegs; ++i) {
11594 // For scalable vectors, use the minimum size; individual targets
11595 // are responsible for handling scalable vector arguments and
11596 // return values.
11597 ISD::InputArg MyFlags(
11598 Flags, RegisterVT, VT, isArgValueUsed, ArgNo,
11599 PartBase + i * RegisterVT.getStoreSize().getKnownMinValue());
11600 if (NumRegs > 1 && i == 0)
11601 MyFlags.Flags.setSplit();
11602 // if it isn't first piece, alignment must be 1
11603 else if (i > 0) {
11604 MyFlags.Flags.setOrigAlign(Align(1));
11605 if (i == NumRegs - 1)
11606 MyFlags.Flags.setSplitEnd();
11607 }
11608 Ins.push_back(MyFlags);
11609 }
11610 if (NeedsRegBlock && Value == NumValues - 1)
11611 Ins[Ins.size() - 1].Flags.setInConsecutiveRegsLast();
11612 PartBase += VT.getStoreSize().getKnownMinValue();
11613 }
11614 }
11615
11616 // Call the target to set up the argument values.
11618 SDValue NewRoot = TLI->LowerFormalArguments(
11619 DAG.getRoot(), F.getCallingConv(), F.isVarArg(), Ins, dl, DAG, InVals);
11620
11621 // Verify that the target's LowerFormalArguments behaved as expected.
11622 assert(NewRoot.getNode() && NewRoot.getValueType() == MVT::Other &&
11623 "LowerFormalArguments didn't return a valid chain!");
11624 assert(InVals.size() == Ins.size() &&
11625 "LowerFormalArguments didn't emit the correct number of values!");
11626 LLVM_DEBUG({
11627 for (unsigned i = 0, e = Ins.size(); i != e; ++i) {
11628 assert(InVals[i].getNode() &&
11629 "LowerFormalArguments emitted a null value!");
11630 assert(EVT(Ins[i].VT) == InVals[i].getValueType() &&
11631 "LowerFormalArguments emitted a value with the wrong type!");
11632 }
11633 });
11634
11635 // Update the DAG with the new chain value resulting from argument lowering.
11636 DAG.setRoot(NewRoot);
11637
11638 // Set up the argument values.
11639 unsigned i = 0;
11640 if (!FuncInfo->CanLowerReturn) {
11641 // Create a virtual register for the sret pointer, and put in a copy
11642 // from the sret argument into it.
11643 SmallVector<EVT, 1> ValueVTs;
11645 PointerType::get(F.getContext(),
11647 ValueVTs);
11648 MVT VT = ValueVTs[0].getSimpleVT();
11649 MVT RegVT = TLI->getRegisterType(*CurDAG->getContext(), VT);
11650 std::optional<ISD::NodeType> AssertOp;
11651 SDValue ArgValue =
11652 getCopyFromParts(DAG, dl, &InVals[0], 1, RegVT, VT, nullptr, NewRoot,
11653 F.getCallingConv(), AssertOp);
11654
11655 MachineFunction& MF = SDB->DAG.getMachineFunction();
11657 Register SRetReg =
11658 RegInfo.createVirtualRegister(TLI->getRegClassFor(RegVT));
11659 FuncInfo->DemoteRegister = SRetReg;
11660 NewRoot =
11661 SDB->DAG.getCopyToReg(NewRoot, SDB->getCurSDLoc(), SRetReg, ArgValue);
11662 DAG.setRoot(NewRoot);
11663
11664 // i indexes lowered arguments. Bump it past the hidden sret argument.
11665 ++i;
11666 }
11667
11669 DenseMap<int, int> ArgCopyElisionFrameIndexMap;
11670 for (const Argument &Arg : F.args()) {
11671 SmallVector<SDValue, 4> ArgValues;
11672 SmallVector<EVT, 4> ValueVTs;
11673 ComputeValueVTs(*TLI, DAG.getDataLayout(), Arg.getType(), ValueVTs);
11674 unsigned NumValues = ValueVTs.size();
11675 if (NumValues == 0)
11676 continue;
11677
11678 bool ArgHasUses = !Arg.use_empty();
11679
11680 // Elide the copying store if the target loaded this argument from a
11681 // suitable fixed stack object.
11682 if (Ins[i].Flags.isCopyElisionCandidate()) {
11683 unsigned NumParts = 0;
11684 for (EVT VT : ValueVTs)
11686 F.getCallingConv(), VT);
11687
11688 tryToElideArgumentCopy(*FuncInfo, Chains, ArgCopyElisionFrameIndexMap,
11689 ElidedArgCopyInstrs, ArgCopyElisionCandidates, Arg,
11690 ArrayRef(&InVals[i], NumParts), ArgHasUses);
11691 }
11692
11693 // If this argument is unused then remember its value. It is used to generate
11694 // debugging information.
11695 bool isSwiftErrorArg =
11697 Arg.hasAttribute(Attribute::SwiftError);
11698 if (!ArgHasUses && !isSwiftErrorArg) {
11699 SDB->setUnusedArgValue(&Arg, InVals[i]);
11700
11701 // Also remember any frame index for use in FastISel.
11702 if (FrameIndexSDNode *FI =
11703 dyn_cast<FrameIndexSDNode>(InVals[i].getNode()))
11704 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
11705 }
11706
11707 for (unsigned Val = 0; Val != NumValues; ++Val) {
11708 EVT VT = ValueVTs[Val];
11710 F.getCallingConv(), VT);
11711 unsigned NumParts = TLI->getNumRegistersForCallingConv(
11712 *CurDAG->getContext(), F.getCallingConv(), VT);
11713
11714 // Even an apparent 'unused' swifterror argument needs to be returned. So
11715 // we do generate a copy for it that can be used on return from the
11716 // function.
11717 if (ArgHasUses || isSwiftErrorArg) {
11718 std::optional<ISD::NodeType> AssertOp;
11719 if (Arg.hasAttribute(Attribute::SExt))
11720 AssertOp = ISD::AssertSext;
11721 else if (Arg.hasAttribute(Attribute::ZExt))
11722 AssertOp = ISD::AssertZext;
11723
11724 ArgValues.push_back(getCopyFromParts(DAG, dl, &InVals[i], NumParts,
11725 PartVT, VT, nullptr, NewRoot,
11726 F.getCallingConv(), AssertOp));
11727 }
11728
11729 i += NumParts;
11730 }
11731
11732 // We don't need to do anything else for unused arguments.
11733 if (ArgValues.empty())
11734 continue;
11735
11736 // Note down frame index.
11737 if (FrameIndexSDNode *FI =
11738 dyn_cast<FrameIndexSDNode>(ArgValues[0].getNode()))
11739 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
11740
11741 SDValue Res = DAG.getMergeValues(ArrayRef(ArgValues.data(), NumValues),
11742 SDB->getCurSDLoc());
11743
11744 SDB->setValue(&Arg, Res);
11746 // We want to associate the argument with the frame index, among
11747 // involved operands, that correspond to the lowest address. The
11748 // getCopyFromParts function, called earlier, is swapping the order of
11749 // the operands to BUILD_PAIR depending on endianness. The result of
11750 // that swapping is that the least significant bits of the argument will
11751 // be in the first operand of the BUILD_PAIR node, and the most
11752 // significant bits will be in the second operand.
11753 unsigned LowAddressOp = DAG.getDataLayout().isBigEndian() ? 1 : 0;
11754 if (LoadSDNode *LNode =
11755 dyn_cast<LoadSDNode>(Res.getOperand(LowAddressOp).getNode()))
11756 if (FrameIndexSDNode *FI =
11757 dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
11758 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
11759 }
11760
11761 // Analyses past this point are naive and don't expect an assertion.
11762 if (Res.getOpcode() == ISD::AssertZext)
11763 Res = Res.getOperand(0);
11764
11765 // Update the SwiftErrorVRegDefMap.
11766 if (Res.getOpcode() == ISD::CopyFromReg && isSwiftErrorArg) {
11767 unsigned Reg = cast<RegisterSDNode>(Res.getOperand(1))->getReg();
11770 Reg);
11771 }
11772
11773 // If this argument is live outside of the entry block, insert a copy from
11774 // wherever we got it to the vreg that other BB's will reference it as.
11775 if (Res.getOpcode() == ISD::CopyFromReg) {
11776 // If we can, though, try to skip creating an unnecessary vreg.
11777 // FIXME: This isn't very clean... it would be nice to make this more
11778 // general.
11779 unsigned Reg = cast<RegisterSDNode>(Res.getOperand(1))->getReg();
11780 if (Register::isVirtualRegister(Reg)) {
11781 FuncInfo->ValueMap[&Arg] = Reg;
11782 continue;
11783 }
11784 }
11786 FuncInfo->InitializeRegForValue(&Arg);
11787 SDB->CopyToExportRegsIfNeeded(&Arg);
11788 }
11789 }
11790
11791 if (!Chains.empty()) {
11792 Chains.push_back(NewRoot);
11793 NewRoot = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chains);
11794 }
11795
11796 DAG.setRoot(NewRoot);
11797
11798 assert(i == InVals.size() && "Argument register count mismatch!");
11799
11800 // If any argument copy elisions occurred and we have debug info, update the
11801 // stale frame indices used in the dbg.declare variable info table.
11802 if (!ArgCopyElisionFrameIndexMap.empty()) {
11805 auto I = ArgCopyElisionFrameIndexMap.find(VI.getStackSlot());
11806 if (I != ArgCopyElisionFrameIndexMap.end())
11807 VI.updateStackSlot(I->second);
11808 }
11809 }
11810
11811 // Finally, if the target has anything special to do, allow it to do so.
11813}
11814
11815/// Handle PHI nodes in successor blocks. Emit code into the SelectionDAG to
11816/// ensure constants are generated when needed. Remember the virtual registers
11817/// that need to be added to the Machine PHI nodes as input. We cannot just
11818/// directly add them, because expansion might result in multiple MBB's for one
11819/// BB. As such, the start of the BB might correspond to a different MBB than
11820/// the end.
11821void
11822SelectionDAGBuilder::HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) {
11824
11826
11827 // Check PHI nodes in successors that expect a value to be available from this
11828 // block.
11829 for (const BasicBlock *SuccBB : successors(LLVMBB->getTerminator())) {
11830 if (!isa<PHINode>(SuccBB->begin())) continue;
11831 MachineBasicBlock *SuccMBB = FuncInfo.MBBMap[SuccBB];
11832
11833 // If this terminator has multiple identical successors (common for
11834 // switches), only handle each succ once.
11835 if (!SuccsHandled.insert(SuccMBB).second)
11836 continue;
11837
11839
11840 // At this point we know that there is a 1-1 correspondence between LLVM PHI
11841 // nodes and Machine PHI nodes, but the incoming operands have not been
11842 // emitted yet.
11843 for (const PHINode &PN : SuccBB->phis()) {
11844 // Ignore dead phi's.
11845 if (PN.use_empty())
11846 continue;
11847
11848 // Skip empty types
11849 if (PN.getType()->isEmptyTy())
11850 continue;
11851
11852 unsigned Reg;
11853 const Value *PHIOp = PN.getIncomingValueForBlock(LLVMBB);
11854
11855 if (const auto *C = dyn_cast<Constant>(PHIOp)) {
11856 unsigned &RegOut = ConstantsOut[C];
11857 if (RegOut == 0) {
11858 RegOut = FuncInfo.CreateRegs(C);
11859 // We need to zero/sign extend ConstantInt phi operands to match
11860 // assumptions in FunctionLoweringInfo::ComputePHILiveOutRegInfo.
11861 ISD::NodeType ExtendType = ISD::ANY_EXTEND;
11862 if (auto *CI = dyn_cast<ConstantInt>(C))
11863 ExtendType = TLI.signExtendConstant(CI) ? ISD::SIGN_EXTEND
11865 CopyValueToVirtualRegister(C, RegOut, ExtendType);
11866 }
11867 Reg = RegOut;
11868 } else {
11870 FuncInfo.ValueMap.find(PHIOp);
11871 if (I != FuncInfo.ValueMap.end())
11872 Reg = I->second;
11873 else {
11874 assert(isa<AllocaInst>(PHIOp) &&
11875 FuncInfo.StaticAllocaMap.count(cast<AllocaInst>(PHIOp)) &&
11876 "Didn't codegen value into a register!??");
11877 Reg = FuncInfo.CreateRegs(PHIOp);
11878 CopyValueToVirtualRegister(PHIOp, Reg);
11879 }
11880 }
11881
11882 // Remember that this register needs to added to the machine PHI node as
11883 // the input for this MBB.
11884 SmallVector<EVT, 4> ValueVTs;
11885 ComputeValueVTs(TLI, DAG.getDataLayout(), PN.getType(), ValueVTs);
11886 for (EVT VT : ValueVTs) {
11887 const unsigned NumRegisters = TLI.getNumRegisters(*DAG.getContext(), VT);
11888 for (unsigned i = 0; i != NumRegisters; ++i)
11889 FuncInfo.PHINodesToUpdate.push_back(
11890 std::make_pair(&*MBBI++, Reg + i));
11891 Reg += NumRegisters;
11892 }
11893 }
11894 }
11895
11896 ConstantsOut.clear();
11897}
11898
11899MachineBasicBlock *SelectionDAGBuilder::NextBlock(MachineBasicBlock *MBB) {
11901 if (++I == FuncInfo.MF->end())
11902 return nullptr;
11903 return &*I;
11904}
11905
11906/// During lowering new call nodes can be created (such as memset, etc.).
11907/// Those will become new roots of the current DAG, but complications arise
11908/// when they are tail calls. In such cases, the call lowering will update
11909/// the root, but the builder still needs to know that a tail call has been
11910/// lowered in order to avoid generating an additional return.
11911void SelectionDAGBuilder::updateDAGForMaybeTailCall(SDValue MaybeTC) {
11912 // If the node is null, we do have a tail call.
11913 if (MaybeTC.getNode() != nullptr)
11914 DAG.setRoot(MaybeTC);
11915 else
11916 HasTailCall = true;
11917}
11918
11919void SelectionDAGBuilder::lowerWorkItem(SwitchWorkListItem W, Value *Cond,
11920 MachineBasicBlock *SwitchMBB,
11921 MachineBasicBlock *DefaultMBB) {
11922 MachineFunction *CurMF = FuncInfo.MF;
11923 MachineBasicBlock *NextMBB = nullptr;
11925 if (++BBI != FuncInfo.MF->end())
11926 NextMBB = &*BBI;
11927
11928 unsigned Size = W.LastCluster - W.FirstCluster + 1;
11929
11931
11932 if (Size == 2 && W.MBB == SwitchMBB) {
11933 // If any two of the cases has the same destination, and if one value
11934 // is the same as the other, but has one bit unset that the other has set,
11935 // use bit manipulation to do two compares at once. For example:
11936 // "if (X == 6 || X == 4)" -> "if ((X|2) == 6)"
11937 // TODO: This could be extended to merge any 2 cases in switches with 3
11938 // cases.
11939 // TODO: Handle cases where W.CaseBB != SwitchBB.
11940 CaseCluster &Small = *W.FirstCluster;
11941 CaseCluster &Big = *W.LastCluster;
11942
11943 if (Small.Low == Small.High && Big.Low == Big.High &&
11944 Small.MBB == Big.MBB) {
11945 const APInt &SmallValue = Small.Low->getValue();
11946 const APInt &BigValue = Big.Low->getValue();
11947
11948 // Check that there is only one bit different.
11949 APInt CommonBit = BigValue ^ SmallValue;
11950 if (CommonBit.isPowerOf2()) {
11951 SDValue CondLHS = getValue(Cond);
11952 EVT VT = CondLHS.getValueType();
11953 SDLoc DL = getCurSDLoc();
11954
11955 SDValue Or = DAG.getNode(ISD::OR, DL, VT, CondLHS,
11956 DAG.getConstant(CommonBit, DL, VT));
11958 DL, MVT::i1, Or, DAG.getConstant(BigValue | SmallValue, DL, VT),
11959 ISD::SETEQ);
11960
11961 // Update successor info.
11962 // Both Small and Big will jump to Small.BB, so we sum up the
11963 // probabilities.
11964 addSuccessorWithProb(SwitchMBB, Small.MBB, Small.Prob + Big.Prob);
11965 if (BPI)
11966 addSuccessorWithProb(
11967 SwitchMBB, DefaultMBB,
11968 // The default destination is the first successor in IR.
11969 BPI->getEdgeProbability(SwitchMBB->getBasicBlock(), (unsigned)0));
11970 else
11971 addSuccessorWithProb(SwitchMBB, DefaultMBB);
11972
11973 // Insert the true branch.
11974 SDValue BrCond =
11975 DAG.getNode(ISD::BRCOND, DL, MVT::Other, getControlRoot(), Cond,
11976 DAG.getBasicBlock(Small.MBB));
11977 // Insert the false branch.
11978 BrCond = DAG.getNode(ISD::BR, DL, MVT::Other, BrCond,
11979 DAG.getBasicBlock(DefaultMBB));
11980
11981 DAG.setRoot(BrCond);
11982 return;
11983 }
11984 }
11985 }
11986
11987 if (TM.getOptLevel() != CodeGenOptLevel::None) {
11988 // Here, we order cases by probability so the most likely case will be
11989 // checked first. However, two clusters can have the same probability in
11990 // which case their relative ordering is non-deterministic. So we use Low
11991 // as a tie-breaker as clusters are guaranteed to never overlap.
11992 llvm::sort(W.FirstCluster, W.LastCluster + 1,
11993 [](const CaseCluster &a, const CaseCluster &b) {
11994 return a.Prob != b.Prob ?
11995 a.Prob > b.Prob :
11996 a.Low->getValue().slt(b.Low->getValue());
11997 });
11998
11999 // Rearrange the case blocks so that the last one falls through if possible
12000 // without changing the order of probabilities.
12001 for (CaseClusterIt I = W.LastCluster; I > W.FirstCluster; ) {
12002 --I;
12003 if (I->Prob > W.LastCluster->Prob)
12004 break;
12005 if (I->Kind == CC_Range && I->MBB == NextMBB) {
12006 std::swap(*I, *W.LastCluster);
12007 break;
12008 }
12009 }
12010 }
12011
12012 // Compute total probability.
12013 BranchProbability DefaultProb = W.DefaultProb;
12014 BranchProbability UnhandledProbs = DefaultProb;
12015 for (CaseClusterIt I = W.FirstCluster; I <= W.LastCluster; ++I)
12016 UnhandledProbs += I->Prob;
12017
12018 MachineBasicBlock *CurMBB = W.MBB;
12019 for (CaseClusterIt I = W.FirstCluster, E = W.LastCluster; I <= E; ++I) {
12020 bool FallthroughUnreachable = false;
12021 MachineBasicBlock *Fallthrough;
12022 if (I == W.LastCluster) {
12023 // For the last cluster, fall through to the default destination.
12024 Fallthrough = DefaultMBB;
12025 FallthroughUnreachable = isa<UnreachableInst>(
12026 DefaultMBB->getBasicBlock()->getFirstNonPHIOrDbg());
12027 } else {
12028 Fallthrough = CurMF->CreateMachineBasicBlock(CurMBB->getBasicBlock());
12029 CurMF->insert(BBI, Fallthrough);
12030 // Put Cond in a virtual register to make it available from the new blocks.
12032 }
12033 UnhandledProbs -= I->Prob;
12034
12035 switch (I->Kind) {
12036 case CC_JumpTable: {
12037 // FIXME: Optimize away range check based on pivot comparisons.
12038 JumpTableHeader *JTH = &SL->JTCases[I->JTCasesIndex].first;
12039 SwitchCG::JumpTable *JT = &SL->JTCases[I->JTCasesIndex].second;
12040
12041 // The jump block hasn't been inserted yet; insert it here.
12042 MachineBasicBlock *JumpMBB = JT->MBB;
12043 CurMF->insert(BBI, JumpMBB);
12044
12045 auto JumpProb = I->Prob;
12046 auto FallthroughProb = UnhandledProbs;
12047
12048 // If the default statement is a target of the jump table, we evenly
12049 // distribute the default probability to successors of CurMBB. Also
12050 // update the probability on the edge from JumpMBB to Fallthrough.
12051 for (MachineBasicBlock::succ_iterator SI = JumpMBB->succ_begin(),
12052 SE = JumpMBB->succ_end();
12053 SI != SE; ++SI) {
12054 if (*SI == DefaultMBB) {
12055 JumpProb += DefaultProb / 2;
12056 FallthroughProb -= DefaultProb / 2;
12057 JumpMBB->setSuccProbability(SI, DefaultProb / 2);
12058 JumpMBB->normalizeSuccProbs();
12059 break;
12060 }
12061 }
12062
12063 // If the default clause is unreachable, propagate that knowledge into
12064 // JTH->FallthroughUnreachable which will use it to suppress the range
12065 // check.
12066 //
12067 // However, don't do this if we're doing branch target enforcement,
12068 // because a table branch _without_ a range check can be a tempting JOP
12069 // gadget - out-of-bounds inputs that are impossible in correct
12070 // execution become possible again if an attacker can influence the
12071 // control flow. So if an attacker doesn't already have a BTI bypass
12072 // available, we don't want them to be able to get one out of this
12073 // table branch.
12074 if (FallthroughUnreachable) {
12075 Function &CurFunc = CurMF->getFunction();
12076 if (!CurFunc.hasFnAttribute("branch-target-enforcement"))
12077 JTH->FallthroughUnreachable = true;
12078 }
12079
12080 if (!JTH->FallthroughUnreachable)
12081 addSuccessorWithProb(CurMBB, Fallthrough, FallthroughProb);
12082 addSuccessorWithProb(CurMBB, JumpMBB, JumpProb);
12083 CurMBB->normalizeSuccProbs();
12084
12085 // The jump table header will be inserted in our current block, do the
12086 // range check, and fall through to our fallthrough block.
12087 JTH->HeaderBB = CurMBB;
12088 JT->Default = Fallthrough; // FIXME: Move Default to JumpTableHeader.
12089
12090 // If we're in the right place, emit the jump table header right now.
12091 if (CurMBB == SwitchMBB) {
12092 visitJumpTableHeader(*JT, *JTH, SwitchMBB);
12093 JTH->Emitted = true;
12094 }
12095 break;
12096 }
12097 case CC_BitTests: {
12098 // FIXME: Optimize away range check based on pivot comparisons.
12099 BitTestBlock *BTB = &SL->BitTestCases[I->BTCasesIndex];
12100
12101 // The bit test blocks haven't been inserted yet; insert them here.
12102 for (BitTestCase &BTC : BTB->Cases)
12103 CurMF->insert(BBI, BTC.ThisBB);
12104
12105 // Fill in fields of the BitTestBlock.
12106 BTB->Parent = CurMBB;
12107 BTB->Default = Fallthrough;
12108
12109 BTB->DefaultProb = UnhandledProbs;
12110 // If the cases in bit test don't form a contiguous range, we evenly
12111 // distribute the probability on the edge to Fallthrough to two
12112 // successors of CurMBB.
12113 if (!BTB->ContiguousRange) {
12114 BTB->Prob += DefaultProb / 2;
12115 BTB->DefaultProb -= DefaultProb / 2;
12116 }
12117
12118 if (FallthroughUnreachable)
12119 BTB->FallthroughUnreachable = true;
12120
12121 // If we're in the right place, emit the bit test header right now.
12122 if (CurMBB == SwitchMBB) {
12123 visitBitTestHeader(*BTB, SwitchMBB);
12124 BTB->Emitted = true;
12125 }
12126 break;
12127 }
12128 case CC_Range: {
12129 const Value *RHS, *LHS, *MHS;
12131 if (I->Low == I->High) {
12132 // Check Cond == I->Low.
12133 CC = ISD::SETEQ;
12134 LHS = Cond;
12135 RHS=I->Low;
12136 MHS = nullptr;
12137 } else {
12138 // Check I->Low <= Cond <= I->High.
12139 CC = ISD::SETLE;
12140 LHS = I->Low;
12141 MHS = Cond;
12142 RHS = I->High;
12143 }
12144
12145 // If Fallthrough is unreachable, fold away the comparison.
12146 if (FallthroughUnreachable)
12147 CC = ISD::SETTRUE;
12148
12149 // The false probability is the sum of all unhandled cases.
12150 CaseBlock CB(CC, LHS, RHS, MHS, I->MBB, Fallthrough, CurMBB,
12151 getCurSDLoc(), I->Prob, UnhandledProbs);
12152
12153 if (CurMBB == SwitchMBB)
12154 visitSwitchCase(CB, SwitchMBB);
12155 else
12156 SL->SwitchCases.push_back(CB);
12157
12158 break;
12159 }
12160 }
12161 CurMBB = Fallthrough;
12162 }
12163}
12164
12165void SelectionDAGBuilder::splitWorkItem(SwitchWorkList &WorkList,
12166 const SwitchWorkListItem &W,
12167 Value *Cond,
12168 MachineBasicBlock *SwitchMBB) {
12169 assert(W.FirstCluster->Low->getValue().slt(W.LastCluster->Low->getValue()) &&
12170 "Clusters not sorted?");
12171 assert(W.LastCluster - W.FirstCluster + 1 >= 2 && "Too small to split!");
12172
12173 auto [LastLeft, FirstRight, LeftProb, RightProb] =
12174 SL->computeSplitWorkItemInfo(W);
12175
12176 // Use the first element on the right as pivot since we will make less-than
12177 // comparisons against it.
12178 CaseClusterIt PivotCluster = FirstRight;
12179 assert(PivotCluster > W.FirstCluster);
12180 assert(PivotCluster <= W.LastCluster);
12181
12182 CaseClusterIt FirstLeft = W.FirstCluster;
12183 CaseClusterIt LastRight = W.LastCluster;
12184
12185 const ConstantInt *Pivot = PivotCluster->Low;
12186
12187 // New blocks will be inserted immediately after the current one.
12189 ++BBI;
12190
12191 // We will branch to the LHS if Value < Pivot. If LHS is a single cluster,
12192 // we can branch to its destination directly if it's squeezed exactly in
12193 // between the known lower bound and Pivot - 1.
12194 MachineBasicBlock *LeftMBB;
12195 if (FirstLeft == LastLeft && FirstLeft->Kind == CC_Range &&
12196 FirstLeft->Low == W.GE &&
12197 (FirstLeft->High->getValue() + 1LL) == Pivot->getValue()) {
12198 LeftMBB = FirstLeft->MBB;
12199 } else {
12200 LeftMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
12201 FuncInfo.MF->insert(BBI, LeftMBB);
12202 WorkList.push_back(
12203 {LeftMBB, FirstLeft, LastLeft, W.GE, Pivot, W.DefaultProb / 2});
12204 // Put Cond in a virtual register to make it available from the new blocks.
12206 }
12207
12208 // Similarly, we will branch to the RHS if Value >= Pivot. If RHS is a
12209 // single cluster, RHS.Low == Pivot, and we can branch to its destination
12210 // directly if RHS.High equals the current upper bound.
12211 MachineBasicBlock *RightMBB;
12212 if (FirstRight == LastRight && FirstRight->Kind == CC_Range &&
12213 W.LT && (FirstRight->High->getValue() + 1ULL) == W.LT->getValue()) {
12214 RightMBB = FirstRight->MBB;
12215 } else {
12216 RightMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
12217 FuncInfo.MF->insert(BBI, RightMBB);
12218 WorkList.push_back(
12219 {RightMBB, FirstRight, LastRight, Pivot, W.LT, W.DefaultProb / 2});
12220 // Put Cond in a virtual register to make it available from the new blocks.
12222 }
12223
12224 // Create the CaseBlock record that will be used to lower the branch.
12225 CaseBlock CB(ISD::SETLT, Cond, Pivot, nullptr, LeftMBB, RightMBB, W.MBB,
12226 getCurSDLoc(), LeftProb, RightProb);
12227
12228 if (W.MBB == SwitchMBB)
12229 visitSwitchCase(CB, SwitchMBB);
12230 else
12231 SL->SwitchCases.push_back(CB);
12232}
12233
12234// Scale CaseProb after peeling a case with the probablity of PeeledCaseProb
12235// from the swith statement.
12237 BranchProbability PeeledCaseProb) {
12238 if (PeeledCaseProb == BranchProbability::getOne())
12240 BranchProbability SwitchProb = PeeledCaseProb.getCompl();
12241
12242 uint32_t Numerator = CaseProb.getNumerator();
12243 uint32_t Denominator = SwitchProb.scale(CaseProb.getDenominator());
12244 return BranchProbability(Numerator, std::max(Numerator, Denominator));
12245}
12246
12247// Try to peel the top probability case if it exceeds the threshold.
12248// Return current MachineBasicBlock for the switch statement if the peeling
12249// does not occur.
12250// If the peeling is performed, return the newly created MachineBasicBlock
12251// for the peeled switch statement. Also update Clusters to remove the peeled
12252// case. PeeledCaseProb is the BranchProbability for the peeled case.
12253MachineBasicBlock *SelectionDAGBuilder::peelDominantCaseCluster(
12254 const SwitchInst &SI, CaseClusterVector &Clusters,
12255 BranchProbability &PeeledCaseProb) {
12256 MachineBasicBlock *SwitchMBB = FuncInfo.MBB;
12257 // Don't perform if there is only one cluster or optimizing for size.
12258 if (SwitchPeelThreshold > 100 || !FuncInfo.BPI || Clusters.size() < 2 ||
12260 SwitchMBB->getParent()->getFunction().hasMinSize())
12261 return SwitchMBB;
12262
12264 unsigned PeeledCaseIndex = 0;
12265 bool SwitchPeeled = false;
12266 for (unsigned Index = 0; Index < Clusters.size(); ++Index) {
12267 CaseCluster &CC = Clusters[Index];
12268 if (CC.Prob < TopCaseProb)
12269 continue;
12270 TopCaseProb = CC.Prob;
12271 PeeledCaseIndex = Index;
12272 SwitchPeeled = true;
12273 }
12274 if (!SwitchPeeled)
12275 return SwitchMBB;
12276
12277 LLVM_DEBUG(dbgs() << "Peeled one top case in switch stmt, prob: "
12278 << TopCaseProb << "\n");
12279
12280 // Record the MBB for the peeled switch statement.
12281 MachineFunction::iterator BBI(SwitchMBB);
12282 ++BBI;
12283 MachineBasicBlock *PeeledSwitchMBB =
12285 FuncInfo.MF->insert(BBI, PeeledSwitchMBB);
12286
12287 ExportFromCurrentBlock(SI.getCondition());
12288 auto PeeledCaseIt = Clusters.begin() + PeeledCaseIndex;
12289 SwitchWorkListItem W = {SwitchMBB, PeeledCaseIt, PeeledCaseIt,
12290 nullptr, nullptr, TopCaseProb.getCompl()};
12291 lowerWorkItem(W, SI.getCondition(), SwitchMBB, PeeledSwitchMBB);
12292
12293 Clusters.erase(PeeledCaseIt);
12294 for (CaseCluster &CC : Clusters) {
12295 LLVM_DEBUG(
12296 dbgs() << "Scale the probablity for one cluster, before scaling: "
12297 << CC.Prob << "\n");
12298 CC.Prob = scaleCaseProbality(CC.Prob, TopCaseProb);
12299 LLVM_DEBUG(dbgs() << "After scaling: " << CC.Prob << "\n");
12300 }
12301 PeeledCaseProb = TopCaseProb;
12302 return PeeledSwitchMBB;
12303}
12304
12305void SelectionDAGBuilder::visitSwitch(const SwitchInst &SI) {
12306 // Extract cases from the switch.
12308 CaseClusterVector Clusters;
12309 Clusters.reserve(SI.getNumCases());
12310 for (auto I : SI.cases()) {
12311 MachineBasicBlock *Succ = FuncInfo.MBBMap[I.getCaseSuccessor()];
12312 const ConstantInt *CaseVal = I.getCaseValue();
12313 BranchProbability Prob =
12314 BPI ? BPI->getEdgeProbability(SI.getParent(), I.getSuccessorIndex())
12315 : BranchProbability(1, SI.getNumCases() + 1);
12316 Clusters.push_back(CaseCluster::range(CaseVal, CaseVal, Succ, Prob));
12317 }
12318
12319 MachineBasicBlock *DefaultMBB = FuncInfo.MBBMap[SI.getDefaultDest()];
12320
12321 // Cluster adjacent cases with the same destination. We do this at all
12322 // optimization levels because it's cheap to do and will make codegen faster
12323 // if there are many clusters.
12324 sortAndRangeify(Clusters);
12325
12326 // The branch probablity of the peeled case.
12328 MachineBasicBlock *PeeledSwitchMBB =
12329 peelDominantCaseCluster(SI, Clusters, PeeledCaseProb);
12330
12331 // If there is only the default destination, jump there directly.
12332 MachineBasicBlock *SwitchMBB = FuncInfo.MBB;
12333 if (Clusters.empty()) {
12334 assert(PeeledSwitchMBB == SwitchMBB);
12335 SwitchMBB->addSuccessor(DefaultMBB);
12336 if (DefaultMBB != NextBlock(SwitchMBB)) {
12337 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
12338 getControlRoot(), DAG.getBasicBlock(DefaultMBB)));
12339 }
12340 return;
12341 }
12342
12343 SL->findJumpTables(Clusters, &SI, getCurSDLoc(), DefaultMBB, DAG.getPSI(),
12344 DAG.getBFI());
12345 SL->findBitTestClusters(Clusters, &SI);
12346
12347 LLVM_DEBUG({
12348 dbgs() << "Case clusters: ";
12349 for (const CaseCluster &C : Clusters) {
12350 if (C.Kind == CC_JumpTable)
12351 dbgs() << "JT:";
12352 if (C.Kind == CC_BitTests)
12353 dbgs() << "BT:";
12354
12355 C.Low->getValue().print(dbgs(), true);
12356 if (C.Low != C.High) {
12357 dbgs() << '-';
12358 C.High->getValue().print(dbgs(), true);
12359 }
12360 dbgs() << ' ';
12361 }
12362 dbgs() << '\n';
12363 });
12364
12365 assert(!Clusters.empty());
12366 SwitchWorkList WorkList;
12367 CaseClusterIt First = Clusters.begin();
12368 CaseClusterIt Last = Clusters.end() - 1;
12369 auto DefaultProb = getEdgeProbability(PeeledSwitchMBB, DefaultMBB);
12370 // Scale the branchprobability for DefaultMBB if the peel occurs and
12371 // DefaultMBB is not replaced.
12372 if (PeeledCaseProb != BranchProbability::getZero() &&
12373 DefaultMBB == FuncInfo.MBBMap[SI.getDefaultDest()])
12374 DefaultProb = scaleCaseProbality(DefaultProb, PeeledCaseProb);
12375 WorkList.push_back(
12376 {PeeledSwitchMBB, First, Last, nullptr, nullptr, DefaultProb});
12377
12378 while (!WorkList.empty()) {
12379 SwitchWorkListItem W = WorkList.pop_back_val();
12380 unsigned NumClusters = W.LastCluster - W.FirstCluster + 1;
12381
12382 if (NumClusters > 3 && TM.getOptLevel() != CodeGenOptLevel::None &&
12383 !DefaultMBB->getParent()->getFunction().hasMinSize()) {
12384 // For optimized builds, lower large range as a balanced binary tree.
12385 splitWorkItem(WorkList, W, SI.getCondition(), SwitchMBB);
12386 continue;
12387 }
12388
12389 lowerWorkItem(W, SI.getCondition(), SwitchMBB, DefaultMBB);
12390 }
12391}
12392
12393void SelectionDAGBuilder::visitStepVector(const CallInst &I) {
12395 auto DL = getCurSDLoc();
12396 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12397 setValue(&I, DAG.getStepVector(DL, ResultVT));
12398}
12399
12400void SelectionDAGBuilder::visitVectorReverse(const CallInst &I) {
12402 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12403
12404 SDLoc DL = getCurSDLoc();
12405 SDValue V = getValue(I.getOperand(0));
12406 assert(VT == V.getValueType() && "Malformed vector.reverse!");
12407
12408 if (VT.isScalableVector()) {
12410 return;
12411 }
12412
12413 // Use VECTOR_SHUFFLE for the fixed-length vector
12414 // to maintain existing behavior.
12416 unsigned NumElts = VT.getVectorMinNumElements();
12417 for (unsigned i = 0; i != NumElts; ++i)
12418 Mask.push_back(NumElts - 1 - i);
12419
12420 setValue(&I, DAG.getVectorShuffle(VT, DL, V, DAG.getUNDEF(VT), Mask));
12421}
12422
12423void SelectionDAGBuilder::visitVectorDeinterleave(const CallInst &I) {
12424 auto DL = getCurSDLoc();
12425 SDValue InVec = getValue(I.getOperand(0));
12426 EVT OutVT =
12428
12429 unsigned OutNumElts = OutVT.getVectorMinNumElements();
12430
12431 // ISD Node needs the input vectors split into two equal parts
12432 SDValue Lo = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, OutVT, InVec,
12434 SDValue Hi = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, OutVT, InVec,
12435 DAG.getVectorIdxConstant(OutNumElts, DL));
12436
12437 // Use VECTOR_SHUFFLE for fixed-length vectors to benefit from existing
12438 // legalisation and combines.
12439 if (OutVT.isFixedLengthVector()) {
12440 SDValue Even = DAG.getVectorShuffle(OutVT, DL, Lo, Hi,
12441 createStrideMask(0, 2, OutNumElts));
12442 SDValue Odd = DAG.getVectorShuffle(OutVT, DL, Lo, Hi,
12443 createStrideMask(1, 2, OutNumElts));
12444 SDValue Res = DAG.getMergeValues({Even, Odd}, getCurSDLoc());
12445 setValue(&I, Res);
12446 return;
12447 }
12448
12450 DAG.getVTList(OutVT, OutVT), Lo, Hi);
12451 setValue(&I, Res);
12452}
12453
12454void SelectionDAGBuilder::visitVectorInterleave(const CallInst &I) {
12455 auto DL = getCurSDLoc();
12456 EVT InVT = getValue(I.getOperand(0)).getValueType();
12457 SDValue InVec0 = getValue(I.getOperand(0));
12458 SDValue InVec1 = getValue(I.getOperand(1));
12460 EVT OutVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12461
12462 // Use VECTOR_SHUFFLE for fixed-length vectors to benefit from existing
12463 // legalisation and combines.
12464 if (OutVT.isFixedLengthVector()) {
12465 unsigned NumElts = InVT.getVectorMinNumElements();
12466 SDValue V = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, InVec0, InVec1);
12467 setValue(&I, DAG.getVectorShuffle(OutVT, DL, V, DAG.getUNDEF(OutVT),
12468 createInterleaveMask(NumElts, 2)));
12469 return;
12470 }
12471
12473 DAG.getVTList(InVT, InVT), InVec0, InVec1);
12474 Res = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, Res.getValue(0),
12475 Res.getValue(1));
12476 setValue(&I, Res);
12477}
12478
12479void SelectionDAGBuilder::visitFreeze(const FreezeInst &I) {
12480 SmallVector<EVT, 4> ValueVTs;
12482 ValueVTs);
12483 unsigned NumValues = ValueVTs.size();
12484 if (NumValues == 0) return;
12485
12486 SmallVector<SDValue, 4> Values(NumValues);
12487 SDValue Op = getValue(I.getOperand(0));
12488
12489 for (unsigned i = 0; i != NumValues; ++i)
12490 Values[i] = DAG.getNode(ISD::FREEZE, getCurSDLoc(), ValueVTs[i],
12491 SDValue(Op.getNode(), Op.getResNo() + i));
12492
12494 DAG.getVTList(ValueVTs), Values));
12495}
12496
12497void SelectionDAGBuilder::visitVectorSplice(const CallInst &I) {
12499 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12500
12501 SDLoc DL = getCurSDLoc();
12502 SDValue V1 = getValue(I.getOperand(0));
12503 SDValue V2 = getValue(I.getOperand(1));
12504 int64_t Imm = cast<ConstantInt>(I.getOperand(2))->getSExtValue();
12505
12506 // VECTOR_SHUFFLE doesn't support a scalable mask so use a dedicated node.
12507 if (VT.isScalableVector()) {
12508 setValue(&I, DAG.getNode(ISD::VECTOR_SPLICE, DL, VT, V1, V2,
12509 DAG.getVectorIdxConstant(Imm, DL)));
12510 return;
12511 }
12512
12513 unsigned NumElts = VT.getVectorNumElements();
12514
12515 uint64_t Idx = (NumElts + Imm) % NumElts;
12516
12517 // Use VECTOR_SHUFFLE to maintain original behaviour for fixed-length vectors.
12519 for (unsigned i = 0; i < NumElts; ++i)
12520 Mask.push_back(Idx + i);
12521 setValue(&I, DAG.getVectorShuffle(VT, DL, V1, V2, Mask));
12522}
12523
12524// Consider the following MIR after SelectionDAG, which produces output in
12525// phyregs in the first case or virtregs in the second case.
12526//
12527// INLINEASM_BR ..., implicit-def $ebx, ..., implicit-def $edx
12528// %5:gr32 = COPY $ebx
12529// %6:gr32 = COPY $edx
12530// %1:gr32 = COPY %6:gr32
12531// %0:gr32 = COPY %5:gr32
12532//
12533// INLINEASM_BR ..., def %5:gr32, ..., def %6:gr32
12534// %1:gr32 = COPY %6:gr32
12535// %0:gr32 = COPY %5:gr32
12536//
12537// Given %0, we'd like to return $ebx in the first case and %5 in the second.
12538// Given %1, we'd like to return $edx in the first case and %6 in the second.
12539//
12540// If a callbr has outputs, it will have a single mapping in FuncInfo.ValueMap
12541// to a single virtreg (such as %0). The remaining outputs monotonically
12542// increase in virtreg number from there. If a callbr has no outputs, then it
12543// should not have a corresponding callbr landingpad; in fact, the callbr
12544// landingpad would not even be able to refer to such a callbr.
12546 MachineInstr *MI = MRI.def_begin(Reg)->getParent();
12547 // There is definitely at least one copy.
12548 assert(MI->getOpcode() == TargetOpcode::COPY &&
12549 "start of copy chain MUST be COPY");
12550 Reg = MI->getOperand(1).getReg();
12551 MI = MRI.def_begin(Reg)->getParent();
12552 // There may be an optional second copy.
12553 if (MI->getOpcode() == TargetOpcode::COPY) {
12554 assert(Reg.isVirtual() && "expected COPY of virtual register");
12555 Reg = MI->getOperand(1).getReg();
12556 assert(Reg.isPhysical() && "expected COPY of physical register");
12557 MI = MRI.def_begin(Reg)->getParent();
12558 }
12559 // The start of the chain must be an INLINEASM_BR.
12560 assert(MI->getOpcode() == TargetOpcode::INLINEASM_BR &&
12561 "end of copy chain MUST be INLINEASM_BR");
12562 return Reg;
12563}
12564
12565// We must do this walk rather than the simpler
12566// setValue(&I, getCopyFromRegs(CBR, CBR->getType()));
12567// otherwise we will end up with copies of virtregs only valid along direct
12568// edges.
12569void SelectionDAGBuilder::visitCallBrLandingPad(const CallInst &I) {
12570 SmallVector<EVT, 8> ResultVTs;
12571 SmallVector<SDValue, 8> ResultValues;
12572 const auto *CBR =
12573 cast<CallBrInst>(I.getParent()->getUniquePredecessor()->getTerminator());
12574
12578
12579 unsigned InitialDef = FuncInfo.ValueMap[CBR];
12580 SDValue Chain = DAG.getRoot();
12581
12582 // Re-parse the asm constraints string.
12583 TargetLowering::AsmOperandInfoVector TargetConstraints =
12584 TLI.ParseConstraints(DAG.getDataLayout(), TRI, *CBR);
12585 for (auto &T : TargetConstraints) {
12586 SDISelAsmOperandInfo OpInfo(T);
12587 if (OpInfo.Type != InlineAsm::isOutput)
12588 continue;
12589
12590 // Pencil in OpInfo.ConstraintType and OpInfo.ConstraintVT based on the
12591 // individual constraint.
12592 TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
12593
12594 switch (OpInfo.ConstraintType) {
12597 // Fill in OpInfo.AssignedRegs.Regs.
12598 getRegistersForValue(DAG, getCurSDLoc(), OpInfo, OpInfo);
12599
12600 // getRegistersForValue may produce 1 to many registers based on whether
12601 // the OpInfo.ConstraintVT is legal on the target or not.
12602 for (unsigned &Reg : OpInfo.AssignedRegs.Regs) {
12603 Register OriginalDef = FollowCopyChain(MRI, InitialDef++);
12604 if (Register::isPhysicalRegister(OriginalDef))
12605 FuncInfo.MBB->addLiveIn(OriginalDef);
12606 // Update the assigned registers to use the original defs.
12607 Reg = OriginalDef;
12608 }
12609
12610 SDValue V = OpInfo.AssignedRegs.getCopyFromRegs(
12611 DAG, FuncInfo, getCurSDLoc(), Chain, nullptr, CBR);
12612 ResultValues.push_back(V);
12613 ResultVTs.push_back(OpInfo.ConstraintVT);
12614 break;
12615 }
12617 SDValue Flag;
12618 SDValue V = TLI.LowerAsmOutputForConstraint(Chain, Flag, getCurSDLoc(),
12619 OpInfo, DAG);
12620 ++InitialDef;
12621 ResultValues.push_back(V);
12622 ResultVTs.push_back(OpInfo.ConstraintVT);
12623 break;
12624 }
12625 default:
12626 break;
12627 }
12628 }
12630 DAG.getVTList(ResultVTs), ResultValues);
12631 setValue(&I, V);
12632}
unsigned const MachineRegisterInfo * MRI
@ Poison
static unsigned getIntrinsicID(const SDNode *N)
unsigned RegSize
static msgpack::DocNode getNode(msgpack::DocNode DN, msgpack::Type Type, MCValue Val)
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
Function Alias Analysis Results
Atomic ordering constants.
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
This file implements the BitVector class.
BlockVerifier::State From
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
Analysis containing CSE Info
Definition: CSEInfo.cpp:27
This file contains the declarations for the subclasses of Constant, which represent the different fla...
return RetTy
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
#define LLVM_DEBUG(X)
Definition: Debug.h:101
uint64_t Size
bool End
Definition: ELF_riscv.cpp:480
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
static AttributeList getReturnAttrs(FastISel::CallLoweringInfo &CLI)
Returns an AttributeList representing the attributes applied to the return value of the given call.
Definition: FastISel.cpp:943
#define Check(C,...)
Hexagon Common GEP
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
static void getRegistersForValue(MachineFunction &MF, MachineIRBuilder &MIRBuilder, GISelAsmOperandInfo &OpInfo, GISelAsmOperandInfo &RefOpInfo)
Assign virtual/physical registers for the specified register operand.
This file defines an InstructionCost class that is used when calculating the cost of an instruction,...
static std::optional< ConstantRange > getRange(Value *V, const InstrInfoQuery &IIQ)
Helper method to get range from metadata or attribute.
#define RegName(no)
lazy value info
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
unsigned const TargetRegisterInfo * TRI
static const Function * getCalledFunction(const Value *V, bool &IsNoBuiltin)
This file provides utility analysis objects describing memory locations.
This file provides utility for Memory Model Relaxation Annotations (MMRAs).
This file contains the declarations for metadata subclasses.
#define T1
static unsigned getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
Module.h This file contains the declarations for the Module class.
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t High
uint64_t IntrinsicInst * II
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
#define P(N)
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file contains some templates that are useful if you are working with the STL at all.
static bool hasOnlySelectUsers(const Value *Cond)
static SDValue getLoadStackGuard(SelectionDAG &DAG, const SDLoc &DL, SDValue &Chain)
Create a LOAD_STACK_GUARD node, and let it carry the target specific global variable if there exists ...
static void addStackMapLiveVars(const CallBase &Call, unsigned StartIdx, const SDLoc &DL, SmallVectorImpl< SDValue > &Ops, SelectionDAGBuilder &Builder)
Add a stack map intrinsic call's live variable operands to a stackmap or patchpoint target node's ope...
static const unsigned MaxParallelChains
static void getUnderlyingArgRegs(SmallVectorImpl< std::pair< unsigned, TypeSize > > &Regs, const SDValue &N)
static SDValue expandPow(const SDLoc &dl, SDValue LHS, SDValue RHS, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
visitPow - Lower a pow intrinsic.
static bool getUniformBase(const Value *Ptr, SDValue &Base, SDValue &Index, ISD::MemIndexType &IndexType, SDValue &Scale, SelectionDAGBuilder *SDB, const BasicBlock *CurBB, uint64_t ElemSize)
static const CallBase * FindPreallocatedCall(const Value *PreallocatedSetup)
Given a @llvm.call.preallocated.setup, return the corresponding preallocated call.
static cl::opt< unsigned > SwitchPeelThreshold("switch-peel-threshold", cl::Hidden, cl::init(66), cl::desc("Set the case probability threshold for peeling the case from a " "switch statement. A value greater than 100 will void this " "optimization"))
static cl::opt< bool > InsertAssertAlign("insert-assert-align", cl::init(true), cl::desc("Insert the experimental `assertalign` node."), cl::ReallyHidden)
static unsigned getISDForVPIntrinsic(const VPIntrinsic &VPIntrin)
static bool handleDanglingVariadicDebugInfo(SelectionDAG &DAG, DILocalVariable *Variable, DebugLoc DL, unsigned Order, SmallVectorImpl< Value * > &Values, DIExpression *Expression)
static unsigned findMatchingInlineAsmOperand(unsigned OperandNo, const std::vector< SDValue > &AsmNodeOperands)
static void patchMatchingInput(const SDISelAsmOperandInfo &OpInfo, SDISelAsmOperandInfo &MatchingOpInfo, SelectionDAG &DAG)
Make sure that the output operand OpInfo and its corresponding input operand MatchingOpInfo have comp...
static void findUnwindDestinations(FunctionLoweringInfo &FuncInfo, const BasicBlock *EHPadBB, BranchProbability Prob, SmallVectorImpl< std::pair< MachineBasicBlock *, BranchProbability > > &UnwindDests)
When an invoke or a cleanupret unwinds to the next EH pad, there are many places it could ultimately ...
static unsigned FixedPointIntrinsicToOpcode(unsigned Intrinsic)
static BranchProbability scaleCaseProbality(BranchProbability CaseProb, BranchProbability PeeledCaseProb)
static SDValue expandExp2(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandExp2 - Lower an exp2 intrinsic.
static SDValue expandDivFix(unsigned Opcode, const SDLoc &DL, SDValue LHS, SDValue RHS, SDValue Scale, SelectionDAG &DAG, const TargetLowering &TLI)
static SDValue getF32Constant(SelectionDAG &DAG, unsigned Flt, const SDLoc &dl)
getF32Constant - Get 32-bit floating point constant.
static SDValue widenVectorToPartType(SelectionDAG &DAG, SDValue Val, const SDLoc &DL, EVT PartVT)
static SDValue expandLog10(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandLog10 - Lower a log10 intrinsic.
static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &dl, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, const Value *V, std::optional< CallingConv::ID > CallConv)
getCopyToPartsVector - Create a series of nodes that contain the specified value split into legal par...
static void getCopyToParts(SelectionDAG &DAG, const SDLoc &DL, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, const Value *V, std::optional< CallingConv::ID > CallConv=std::nullopt, ISD::NodeType ExtendKind=ISD::ANY_EXTEND)
getCopyToParts - Create a series of nodes that contain the specified value split into legal parts.
static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT, SelectionDAGBuilder &Builder)
static SDValue expandLog2(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandLog2 - Lower a log2 intrinsic.
static SDValue getAddressForMemoryInput(SDValue Chain, const SDLoc &Location, SDISelAsmOperandInfo &OpInfo, SelectionDAG &DAG)
Get a direct memory input to behave well as an indirect operand.
static bool isOnlyUsedInEntryBlock(const Argument *A, bool FastISel)
isOnlyUsedInEntryBlock - If the specified argument is only used in the entry block,...
static void diagnosePossiblyInvalidConstraint(LLVMContext &Ctx, const Value *V, const Twine &ErrMsg)
static bool collectInstructionDeps(SmallMapVector< const Instruction *, bool, 8 > *Deps, const Value *V, SmallMapVector< const Instruction *, bool, 8 > *Necessary=nullptr, unsigned Depth=0)
static void findArgumentCopyElisionCandidates(const DataLayout &DL, FunctionLoweringInfo *FuncInfo, ArgCopyElisionMapTy &ArgCopyElisionCandidates)
Scan the entry block of the function in FuncInfo for arguments that look like copies into a local all...
static bool isFunction(SDValue Op)
static SDValue GetExponent(SelectionDAG &DAG, SDValue Op, const TargetLowering &TLI, const SDLoc &dl)
GetExponent - Get the exponent:
static Register FollowCopyChain(MachineRegisterInfo &MRI, Register Reg)
static SDValue ExpandPowI(const SDLoc &DL, SDValue LHS, SDValue RHS, SelectionDAG &DAG)
ExpandPowI - Expand a llvm.powi intrinsic.
static void findWasmUnwindDestinations(FunctionLoweringInfo &FuncInfo, const BasicBlock *EHPadBB, BranchProbability Prob, SmallVectorImpl< std::pair< MachineBasicBlock *, BranchProbability > > &UnwindDests)
static SDValue expandLog(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandLog - Lower a log intrinsic.
static SDValue getCopyFromParts(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V, SDValue InChain, std::optional< CallingConv::ID > CC=std::nullopt, std::optional< ISD::NodeType > AssertOp=std::nullopt)
getCopyFromParts - Create a value that contains the specified legal parts combined into the value the...
static SDValue getLimitedPrecisionExp2(SDValue t0, const SDLoc &dl, SelectionDAG &DAG)
static SDValue GetSignificand(SelectionDAG &DAG, SDValue Op, const SDLoc &dl)
GetSignificand - Get the significand and build it into a floating-point number with exponent of 1:
static SDValue expandExp(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandExp - Lower an exp intrinsic.
static const MDNode * getRangeMetadata(const Instruction &I)
static cl::opt< unsigned, true > LimitFPPrecision("limit-float-precision", cl::desc("Generate low-precision inline sequences " "for some float libcalls"), cl::location(LimitFloatPrecision), cl::Hidden, cl::init(0))
static void tryToElideArgumentCopy(FunctionLoweringInfo &FuncInfo, SmallVectorImpl< SDValue > &Chains, DenseMap< int, int > &ArgCopyElisionFrameIndexMap, SmallPtrSetImpl< const Instruction * > &ElidedArgCopyInstrs, ArgCopyElisionMapTy &ArgCopyElisionCandidates, const Argument &Arg, ArrayRef< SDValue > ArgVals, bool &ArgHasUses)
Try to elide argument copies from memory into a local alloca.
static unsigned LimitFloatPrecision
LimitFloatPrecision - Generate low-precision inline sequences for some float libcalls (6,...
static SDValue getCopyFromPartsVector(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V, SDValue InChain, std::optional< CallingConv::ID > CC)
getCopyFromPartsVector - Create a value that contains the specified legal parts combined into the val...
static bool InBlock(const Value *V, const BasicBlock *BB)
This file defines the SmallPtrSet class.
This file defines the SmallSet class.
static SymbolRef::Type getType(const Symbol *Sym)
Definition: TapiFile.cpp:40
This pass exposes codegen information to IR-level passes.
Value * RHS
Value * LHS
support::ulittle16_t & Lo
Definition: aarch32.cpp:206
support::ulittle16_t & Hi
Definition: aarch32.cpp:205
bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal=false)
Checks whether the given location points to constant memory, or if OrLocal is true whether it points ...
Class for arbitrary precision integers.
Definition: APInt.h:78
APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
Definition: APInt.cpp:1010
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition: APInt.h:314
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition: APInt.h:420
an instruction to allocate memory on the stack
Definition: Instructions.h:61
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
Definition: Instructions.h:122
Type * getAllocatedType() const
Return the type that is being allocated by the instruction.
Definition: Instructions.h:115
This class represents an incoming formal argument to a Function.
Definition: Argument.h:31
bool hasAttribute(Attribute::AttrKind Kind) const
Check if an argument has a given attribute.
Definition: Function.cpp:346
unsigned getArgNo() const
Return the index of this formal argument in its containing function.
Definition: Argument.h:49
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
iterator end() const
Definition: ArrayRef.h:154
size_t size() const
size - Get the array size.
Definition: ArrayRef.h:165
iterator begin() const
Definition: ArrayRef.h:153
bool empty() const
empty - Check if the array is empty.
Definition: ArrayRef.h:160
A cache of @llvm.assume calls within a function.
An instruction that atomically checks whether a specified value is in a memory location,...
Definition: Instructions.h:495
This class represents the atomic memcpy intrinsic i.e.
an instruction that atomically reads a memory location, combines it with another value,...
Definition: Instructions.h:696
@ Add
*p = old + v
Definition: Instructions.h:712
@ FAdd
*p = old + v
Definition: Instructions.h:733
@ Min
*p = old <signed v ? old : v
Definition: Instructions.h:726
@ Or
*p = old | v
Definition: Instructions.h:720
@ Sub
*p = old - v
Definition: Instructions.h:714
@ And
*p = old & v
Definition: Instructions.h:716
@ Xor
*p = old ^ v
Definition: Instructions.h:722
@ FSub
*p = old - v
Definition: Instructions.h:736
@ UIncWrap
Increment one up to a maximum value.
Definition: Instructions.h:748
@ Max
*p = old >signed v ? old : v
Definition: Instructions.h:724
@ UMin
*p = old <unsigned v ? old : v
Definition: Instructions.h:730
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
Definition: Instructions.h:744
@ UMax
*p = old >unsigned v ? old : v
Definition: Instructions.h:728
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
Definition: Instructions.h:740
@ UDecWrap
Decrement one until a minimum value or zero.
Definition: Instructions.h:752
@ Nand
*p = ~(old & v)
Definition: Instructions.h:718
static AttributeList get(LLVMContext &C, ArrayRef< std::pair< unsigned, Attribute > > Attrs)
Create an AttributeList with the specified parameters in it.
AttributeSet getRetAttrs() const
The attributes for the ret value are returned.
bool hasFnAttr(Attribute::AttrKind Kind) const
Return true if the attribute exists for the function.
LLVM Basic Block Representation.
Definition: BasicBlock.h:61
const Instruction * getFirstNonPHI() const
Returns a pointer to the first instruction in this block that is not a PHINode instruction.
Definition: BasicBlock.cpp:365
bool isEntryBlock() const
Return true if this is the entry block of the containing function.
Definition: BasicBlock.cpp:569
const Function * getParent() const
Return the enclosing method, or null if none.
Definition: BasicBlock.h:209
const Instruction * getFirstNonPHIOrDbg(bool SkipPseudoOp=true) const
Returns a pointer to the first instruction in this block that is not a PHINode or a debug intrinsic,...
Definition: BasicBlock.cpp:384
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
Definition: BasicBlock.h:229
const Instruction & back() const
Definition: BasicBlock.h:463
This class represents a no-op cast from one type to another.
bool test(unsigned Idx) const
Definition: BitVector.h:461
void resize(unsigned N, bool t=false)
resize - Grow or shrink the bitvector.
Definition: BitVector.h:341
BitVector & set()
Definition: BitVector.h:351
size_type size() const
size - Returns the number of bits in this bitvector.
Definition: BitVector.h:159
The address of a basic block.
Definition: Constants.h:890
Conditional or Unconditional Branch instruction.
Analysis providing branch probability information.
BranchProbability getEdgeProbability(const BasicBlock *Src, unsigned IndexInSuccessors) const
Get an edge's probability, relative to other out-edges of the Src.
bool isEdgeHot(const BasicBlock *Src, const BasicBlock *Dst) const
Test if an edge is hot relative to other out-edges of the Src.
static uint32_t getDenominator()
static BranchProbability getOne()
uint32_t getNumerator() const
uint64_t scale(uint64_t Num) const
Scale a large integer.
BranchProbability getCompl() const
static BranchProbability getZero()
static void normalizeProbabilities(ProbabilityIter Begin, ProbabilityIter End)
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Definition: InstrTypes.h:1236
std::optional< OperandBundleUse > getOperandBundle(StringRef Name) const
Return an operand bundle by name, if present.
Definition: InstrTypes.h:2143
CallingConv::ID getCallingConv() const
Definition: InstrTypes.h:1523
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
Definition: InstrTypes.h:1385
bool isMustTailCall() const
Tests if this call site must be tail call optimized.
bool isIndirectCall() const
Return true if the callsite is an indirect call.
unsigned countOperandBundlesOfType(StringRef Name) const
Return the number of operand bundles with the tag Name attached to this instruction.
Definition: InstrTypes.h:2119
Value * getCalledOperand() const
Definition: InstrTypes.h:1458
Value * getArgOperand(unsigned i) const
Definition: InstrTypes.h:1410
User::op_iterator arg_end()
Return the iterator pointing to the end of the argument list.
Definition: InstrTypes.h:1391
bool isConvergent() const
Determine if the invoke is convergent.
Definition: InstrTypes.h:2027
FunctionType * getFunctionType() const
Definition: InstrTypes.h:1323
unsigned arg_size() const
Definition: InstrTypes.h:1408
AttributeList getAttributes() const
Return the parameter attributes for this call.
Definition: InstrTypes.h:1542
bool isTailCall() const
Tests if this call site is marked as a tail call.
CallBr instruction, tracking function calls that may not return control but instead transfer it to a ...
This class represents a function call, abstracting a target machine's calling convention.
This class is the base class for the comparison instructions.
Definition: InstrTypes.h:747
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition: InstrTypes.h:757
ConstantDataSequential - A vector or array constant whose element type is a simple 1/2/4/8-byte integ...
Definition: Constants.h:584
A constant value that is initialized with an expression using other constant values.
Definition: Constants.h:1084
static Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
Definition: Constants.cpp:2283
ConstantFP - Floating Point Values [float, double].
Definition: Constants.h:269
This is the shared class of boolean and integer constants.
Definition: Constants.h:81
static ConstantInt * getTrue(LLVMContext &Context)
Definition: Constants.cpp:850
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition: Constants.h:206
static ConstantInt * getFalse(LLVMContext &Context)
Definition: Constants.cpp:857
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
Definition: Constants.h:155
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition: Constants.h:146
A signed pointer, in the ptrauth sense.
Definition: Constants.h:1012
This class represents a range of values.
Definition: ConstantRange.h:47
uint64_t getZExtValue() const
Constant Vector Declarations.
Definition: Constants.h:508
This is an important base class in LLVM.
Definition: Constant.h:42
This is the common base class for constrained floating point intrinsics.
std::optional< fp::ExceptionBehavior > getExceptionBehavior() const
unsigned getNonMetadataArgCount() const
DWARF expression.
bool isEntryValue() const
Check if the expression consists of exactly one entry value operand.
static bool fragmentsOverlap(const FragmentInfo &A, const FragmentInfo &B)
Check if fragments overlap between a pair of FragmentInfos.
static DIExpression * appendOpsToArg(const DIExpression *Expr, ArrayRef< uint64_t > Ops, unsigned ArgNo, bool StackValue=false)
Create a copy of Expr by appending the given list of Ops to each instance of the operand DW_OP_LLVM_a...
static std::optional< FragmentInfo > getFragmentInfo(expr_op_iterator Start, expr_op_iterator End)
Retrieve the details of this fragment expression.
uint64_t getNumLocationOperands() const
Return the number of unique location operands referred to (via DW_OP_LLVM_arg) in this expression; th...
static std::optional< DIExpression * > createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits)
Create a DIExpression to describe one part of an aggregate variable that is fragmented across multipl...
static const DIExpression * convertToUndefExpression(const DIExpression *Expr)
Removes all elements from Expr that do not apply to an undef debug value, which includes every operat...
static DIExpression * prepend(const DIExpression *Expr, uint8_t Flags, int64_t Offset=0)
Prepend DIExpr with a deref and offset operation and optionally turn it into a stack value or/and an ...
static DIExpression * prependOpcodes(const DIExpression *Expr, SmallVectorImpl< uint64_t > &Ops, bool StackValue=false, bool EntryValue=false)
Prepend DIExpr with the given opcodes and optionally turn it into a stack value.
bool isValidLocationForIntrinsic(const DILocation *DL) const
Check that a location is valid for this variable.
Debug location.
Base class for variables.
std::optional< uint64_t > getSizeInBits() const
Determines the size of the variable's type.
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:110
const StructLayout * getStructLayout(StructType *Ty) const
Returns a StructLayout object, indicating the alignment of the struct, its size, and the offsets of i...
Definition: DataLayout.cpp:720
bool isBigEndian() const
Definition: DataLayout.h:239
unsigned getAllocaAddrSpace() const
Definition: DataLayout.h:276
unsigned getIndexSizeInBits(unsigned AS) const
Size in bits of index used for address calculation in getelementptr.
Definition: DataLayout.h:420
TypeSize getTypeStoreSize(Type *Ty) const
Returns the maximum number of bytes that may be overwritten by storing the specified type.
Definition: DataLayout.h:472
Align getPrefTypeAlign(Type *Ty) const
Returns the preferred stack/global alignment for the specified type.
Definition: DataLayout.cpp:874
This represents the llvm.dbg.label instruction.
DILabel * getLabel() const
Records a position in IR for a source label (DILabel).
Base class for non-instruction debug metadata records that have positions within IR.
DebugLoc getDebugLoc() const
This represents the llvm.dbg.value instruction.
iterator_range< location_op_iterator > getValues() const
DILocalVariable * getVariable() const
DIExpression * getExpression() const
Record of a variable value-assignment, aka a non instruction representation of the dbg....
DIExpression * getExpression() const
Value * getVariableLocationOp(unsigned OpIdx) const
DILocalVariable * getVariable() const
iterator_range< location_op_iterator > location_ops() const
Get the locations corresponding to the variable referenced by the debug info intrinsic.
A debug info location.
Definition: DebugLoc.h:33
DILocation * getInlinedAt() const
Definition: DebugLoc.cpp:39
iterator find(const_arg_type_t< KeyT > Val)
Definition: DenseMap.h:155
unsigned size() const
Definition: DenseMap.h:99
bool empty() const
Definition: DenseMap.h:98
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
Definition: DenseMap.h:151
iterator end()
Definition: DenseMap.h:84
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition: DenseMap.h:220
void reserve(size_type NumEntries)
Grow the densemap so that it can contain at least NumEntries items before resizing again.
Definition: DenseMap.h:103
static constexpr ElementCount getFixed(ScalarTy MinVal)
Definition: TypeSize.h:311
static constexpr ElementCount get(ScalarTy MinVal, bool Scalable)
Definition: TypeSize.h:317
constexpr bool isScalar() const
Exactly one element.
Definition: TypeSize.h:322
Class representing an expression and its matching format.
This instruction extracts a struct member or array element value from an aggregate value.
This instruction compares its operands according to the predicate given to the constructor.
This is a fast-path instruction selection class that generates poor code and doesn't support illegal ...
Definition: FastISel.h:66
bool allowReassoc() const
Flag queries.
Definition: FMF.h:65
An instruction for ordering other memory operations.
Definition: Instructions.h:420
static FixedVectorType * get(Type *ElementType, unsigned NumElts)
Definition: Type.cpp:692
This class represents a freeze function that returns random concrete value if an operand is either a ...
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
BranchProbabilityInfo * BPI
Register CreateRegs(const Value *V)
SmallPtrSet< const DbgVariableRecord *, 8 > PreprocessedDVRDeclares
Register DemoteRegister
DemoteRegister - if CanLowerReturn is false, DemoteRegister is a vreg allocated to hold a pointer to ...
BitVector DescribedArgs
Bitvector with a bit set if corresponding argument is described in ArgDbgValues.
DenseMap< const AllocaInst *, int > StaticAllocaMap
StaticAllocaMap - Keep track of frame indices for fixed sized allocas in the entry block.
int getArgumentFrameIndex(const Argument *A)
getArgumentFrameIndex - Get frame index for the byval argument.
DenseMap< const BasicBlock *, MachineBasicBlock * > MBBMap
MBBMap - A mapping from LLVM basic blocks to their machine code entry.
bool isExportedInst(const Value *V) const
isExportedInst - Return true if the specified value is an instruction exported from its block.
const LiveOutInfo * GetLiveOutRegInfo(Register Reg)
GetLiveOutRegInfo - Gets LiveOutInfo for a register, returning NULL if the register is a PHI destinat...
Register InitializeRegForValue(const Value *V)
unsigned ExceptionPointerVirtReg
If the current MBB is a landing pad, the exception pointer and exception selector registers are copie...
SmallPtrSet< const DbgDeclareInst *, 8 > PreprocessedDbgDeclares
Collection of dbg.declare instructions handled after argument lowering and before ISel proper.
DenseMap< const Value *, Register > ValueMap
ValueMap - Since we emit code for the function a basic block at a time, we must remember which virtua...
MachineBasicBlock::iterator InsertPt
MBB - The current insert position inside the current block.
MachineBasicBlock * MBB
MBB - The current block.
std::vector< std::pair< MachineInstr *, unsigned > > PHINodesToUpdate
PHINodesToUpdate - A list of phi instructions whose operand list will be updated after processing the...
SmallVector< MachineInstr *, 8 > ArgDbgValues
ArgDbgValues - A list of DBG_VALUE instructions created during isel for function arguments that are i...
MachineRegisterInfo * RegInfo
Register CreateReg(MVT VT, bool isDivergent=false)
CreateReg - Allocate a single virtual register for the given type.
bool CanLowerReturn
CanLowerReturn - true iff the function's return value can be lowered to registers.
DenseMap< const Value *, ISD::NodeType > PreferredExtendType
Record the preferred extend type (ISD::SIGN_EXTEND or ISD::ZERO_EXTEND) for a value.
Register getCatchPadExceptionPointerVReg(const Value *CPI, const TargetRegisterClass *RC)
Class to represent function types.
Definition: DerivedTypes.h:103
unsigned getNumParams() const
Return the number of fixed parameters this function type requires.
Definition: DerivedTypes.h:142
Type * getParamType(unsigned i) const
Parameter type accessors.
Definition: DerivedTypes.h:135
Type * getReturnType() const
Definition: DerivedTypes.h:124
Data structure describing the variable locations in a function.
const BasicBlock & getEntryBlock() const
Definition: Function.h:800
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
Definition: Function.h:242
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition: Function.h:695
bool hasGC() const
hasGC/getGC/setGC/clearGC - The name of the garbage collection algorithm to use during code generatio...
Definition: Function.h:342
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
Definition: Function.h:274
Constant * getPersonalityFn() const
Get the personality function associated with this function.
Definition: Function.cpp:1963
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition: Function.h:350
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
Definition: Function.h:247
size_t arg_size() const
Definition: Function.h:864
bool isVarArg() const
isVarArg - Return true if this function takes a variable number of arguments.
Definition: Function.h:225
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition: Function.cpp:719
Garbage collection metadata for a single function.
Definition: GCMetadata.h:78
void addStackRoot(int Num, const Constant *Metadata)
addStackRoot - Registers a root that lives on the stack.
Definition: GCMetadata.h:118
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
Definition: Instructions.h:915
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
Definition: GlobalValue.h:567
bool hasDLLImportStorageClass() const
Definition: GlobalValue.h:278
Module * getParent()
Get the module that this global value is contained inside of...
Definition: GlobalValue.h:656
This instruction compares its operands according to the predicate given to the constructor.
Indirect Branch Instruction.
This instruction inserts a struct field of array element value into an aggregate value.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
Definition: Instruction.h:466
FastMathFlags getFastMathFlags() const LLVM_READONLY
Convenience function for getting all the fast-math flags, which must be an operator which supports th...
AAMDNodes getAAMetadata() const
Returns the AA metadata for this instruction.
Definition: Metadata.cpp:1706
@ MIN_INT_BITS
Minimum number of bits that can be specified.
Definition: DerivedTypes.h:51
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
Definition: IntrinsicInst.h:55
Invoke instruction.
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:67
void emitError(uint64_t LocCookie, const Twine &ErrorStr)
emitError - Emit an error message to the currently installed error handler with optional location inf...
The landingpad instruction holds all of the information necessary to generate correct exception handl...
An instruction for reading from memory.
Definition: Instructions.h:174
This class is used to represent ISD::LOAD nodes.
static LocationSize precise(uint64_t Value)
static constexpr LocationSize beforeOrAfterPointer()
Any location before or after the base pointer (but still within the underlying object).
MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
Definition: MCContext.cpp:346
MCSymbol * getOrCreateFrameAllocSymbol(const Twine &FuncName, unsigned Idx)
Gets a symbol that will be defined to the final stack offset of a local variable after codegen.
Definition: MCContext.cpp:236
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:41
Metadata node.
Definition: Metadata.h:1067
Machine Value Type.
uint64_t getScalarSizeInBits() const
@ INVALID_SIMPLE_VALUE_TYPE
unsigned getVectorNumElements() const
bool isVector() const
Return true if this is a vector value type.
bool isInteger() const
Return true if this is an integer or a vector integer type.
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
ElementCount getVectorElementCount() const
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
bool bitsGE(MVT VT) const
Return true if this has no less bits than VT.
bool isScalarInteger() const
Return true if this is an integer, not including vectors.
static MVT getVectorVT(MVT VT, unsigned NumElements)
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
static MVT getIntegerVT(unsigned BitWidth)
void normalizeSuccProbs()
Normalize probabilities of all successors so that the sum of them becomes one.
bool isEHPad() const
Returns true if the block is a landing pad.
void setIsEHCatchretTarget(bool V=true)
Indicates if this is a target block of a catchret.
void setIsCleanupFuncletEntry(bool V=true)
Indicates if this is the entry block of a cleanup funclet.
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
void setSuccProbability(succ_iterator I, BranchProbability Prob)
Set successor probability of a given iterator.
std::vector< MachineBasicBlock * >::iterator succ_iterator
void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
void addLiveIn(MCRegister PhysReg, LaneBitmask LaneMask=LaneBitmask::getAll())
Adds the specified register as a live in.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
void setIsEHFuncletEntry(bool V=true)
Indicates if this is the entry block of an EH funclet.
void setIsEHScopeEntry(bool V=true)
Indicates if this is the entry block of an EH scope, i.e., the block that that used to have a catchpa...
void setMachineBlockAddressTaken()
Set this block to indicate that its address is used as something other than the target of a terminato...
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
bool hasVarSizedObjects() const
This method may be called any time after instruction selection is complete to determine if the stack ...
void setIsImmutableObjectIndex(int ObjectIdx, bool IsImmutable)
Marks the immutability of an object.
int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
void setHasPatchPoint(bool s=true)
void setHasStackMap(bool s=true)
bool hasOpaqueSPAdjustment() const
Returns true if the function contains opaque dynamic stack adjustments.
int getStackProtectorIndex() const
Return the index for the stack protector object.
void setStackProtectorIndex(int I)
void setIsAliasedObjectIndex(int ObjectIdx, bool IsAliased)
Set "maybe pointed to by an LLVM IR value" for an object.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
void RemoveStackObject(int ObjectIdx)
Remove or mark dead a statically sized stack object.
void setFunctionContextIndex(int I)
Description of the location of a variable whose Address is valid and unchanging during function execu...
const WinEHFuncInfo * getWinEHFuncInfo() const
getWinEHFuncInfo - Return information about how the current function uses Windows exception handling.
void setCallsUnwindInit(bool b)
bool useDebugInstrRef() const
Returns true if the function's variable locations are tracked with instruction referencing.
void setCallSiteBeginLabel(MCSymbol *BeginLabel, unsigned Site)
Map the begin label for a call site.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
void setHasEHCatchret(bool V)
void setCallsEHReturn(bool b)
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, Align base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
unsigned getTypeIDFor(const GlobalValue *TI)
Return the type id for the specified typeinfo. This is function wide.
MCContext & getContext() const
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
auto getInStackSlotVariableDbgInfo()
Returns the collection of variables for which we have debug info and that have been assigned a stack ...
void addCodeViewAnnotation(MCSymbol *Label, MDNode *MD)
Record annotations associated with a particular label.
Function & getFunction()
Return the LLVM function that this machine code represents.
MachineModuleInfo & getMMI() const
const MachineBasicBlock & front() const
void addInvoke(MachineBasicBlock *LandingPad, MCSymbol *BeginLabel, MCSymbol *EndLabel)
Provide the begin and end labels of an invoke style call and associate it with a try landing pad bloc...
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineBasicBlock - Allocate a new MachineBasicBlock.
void erase(iterator MBBI)
void insert(iterator MBBI, MachineBasicBlock *MBB)
const MachineInstrBuilder & addSym(MCSymbol *Sym, unsigned char TargetFlags=0) const
const MachineInstrBuilder & addFrameIndex(int Idx) const
Representation of each machine instruction.
Definition: MachineInstr.h:69
A description of a memory reference used in the backend.
Flags
Flags values. These may be or'd together.
@ MOVolatile
The memory access is volatile.
@ MODereferenceable
The memory access is dereferenceable (i.e., doesn't trap).
@ MOLoad
The memory access reads data.
@ MONonTemporal
The memory access is non-temporal.
@ MOInvariant
The memory access always returns the same value (or traps).
@ MOStore
The memory access writes data.
This class contains meta information specific to a module.
void setCurrentCallSite(unsigned Site)
Set the call site currently being processed.
unsigned getCurrentCallSite()
Get the call site currently being processed, if any.
static MachineOperand CreateReg(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false, bool isRenamable=false)
static MachineOperand CreateFI(int Idx)
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
ArrayRef< std::pair< MCRegister, Register > > liveins() const
An SDNode that represents everything that will be needed to construct a MachineInstr.
bool contains(const KeyT &Key) const
Definition: MapVector.h:163
std::pair< iterator, bool > try_emplace(const KeyT &Key, Ts &&...Args)
Definition: MapVector.h:118
Representation for a specific memory location.
static MemoryLocation getAfter(const Value *Ptr, const AAMDNodes &AATags=AAMDNodes())
Return a location that may access any location after Ptr, while remaining within the underlying objec...
Metadata wrapper in the Value hierarchy.
Definition: Metadata.h:176
Root of the metadata hierarchy.
Definition: Metadata.h:62
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
Utility class for integer operators which may exhibit overflow - Add, Sub, Mul, and Shl.
Definition: Operator.h:77
static PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
Definition: DerivedTypes.h:662
static PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Definition: Constants.cpp:1852
A udiv or sdiv instruction, which can be marked as "exact", indicating that no bits are destroyed.
Definition: Operator.h:152
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition: Register.h:91
static constexpr bool isVirtualRegister(unsigned Reg)
Return true if the specified register number is in the virtual register namespace.
Definition: Register.h:71
static constexpr bool isPhysicalRegister(unsigned Reg)
Return true if the specified register number is in the physical register namespace.
Definition: Register.h:65
Resume the propagation of an exception.
Return a value (possibly void), from a function.
Holds the information from a dbg_label node through SDISel.
static SDDbgOperand fromNode(SDNode *Node, unsigned ResNo)
static SDDbgOperand fromFrameIdx(unsigned FrameIdx)
static SDDbgOperand fromVReg(unsigned VReg)
static SDDbgOperand fromConst(const Value *Const)
Holds the information from a dbg_value node through SDISel.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
iterator_range< value_op_iterator > op_values() const
unsigned getIROrder() const
Return the node ordering.
uint64_t getAsZExtVal() const
Helper method returns the zero-extended integer value of a ConstantSDNode.
unsigned getNumValues() const
Return the number of values defined/returned by this operator.
const SDValue & getOperand(unsigned Num) const
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
Represents a use of a SDNode.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDNode * getNode() const
get the SDNode which holds the desired result
SDValue getValue(unsigned R) const
void dump() const
EVT getValueType() const
Return the ValueType of the referenced return value.
TypeSize getValueSizeInBits() const
Returns the size of the value in bits.
const SDValue & getOperand(unsigned i) const
unsigned getResNo() const
get the index which selects a specific result in the SDNode
MVT getSimpleValueType() const
Return the simple ValueType of the referenced return value.
unsigned getOpcode() const
SelectionDAGBuilder - This is the common target-independent lowering implementation that is parameter...
SDValue getValue(const Value *V)
getValue - Return an SDValue for the given Value.
void addDanglingDebugInfo(SmallVectorImpl< Value * > &Values, DILocalVariable *Var, DIExpression *Expr, bool IsVariadic, DebugLoc DL, unsigned Order)
Register a dbg_value which relies on a Value which we have not yet seen.
void visitDbgInfo(const Instruction &I)
void clearDanglingDebugInfo()
Clear the dangling debug information map.
void LowerCallTo(const CallBase &CB, SDValue Callee, bool IsTailCall, bool IsMustTailCall, const BasicBlock *EHPadBB=nullptr, const TargetLowering::PtrAuthInfo *PAI=nullptr)
void clear()
Clear out the current SelectionDAG and the associated state and prepare this SelectionDAGBuilder obje...
void visitBitTestHeader(SwitchCG::BitTestBlock &B, MachineBasicBlock *SwitchBB)
visitBitTestHeader - This function emits necessary code to produce value suitable for "bit tests"
void LowerStatepoint(const GCStatepointInst &I, const BasicBlock *EHPadBB=nullptr)
std::unique_ptr< SDAGSwitchLowering > SL
SDValue lowerRangeToAssertZExt(SelectionDAG &DAG, const Instruction &I, SDValue Op)
bool HasTailCall
This is set to true if a call in the current block has been translated as a tail call.
bool ShouldEmitAsBranches(const std::vector< SwitchCG::CaseBlock > &Cases)
If the set of cases should be emitted as a series of branches, return true.
void EmitBranchForMergedCondition(const Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB, BranchProbability TProb, BranchProbability FProb, bool InvertCond)
EmitBranchForMergedCondition - Helper method for FindMergedConditions.
void LowerDeoptimizeCall(const CallInst *CI)
void LowerCallSiteWithDeoptBundle(const CallBase *Call, SDValue Callee, const BasicBlock *EHPadBB)
SwiftErrorValueTracking & SwiftError
Information about the swifterror values used throughout the function.
SDValue getNonRegisterValue(const Value *V)
getNonRegisterValue - Return an SDValue for the given Value, but don't look in FuncInfo....
void CopyValueToVirtualRegister(const Value *V, unsigned Reg, ISD::NodeType ExtendType=ISD::ANY_EXTEND)
DenseMap< MachineBasicBlock *, SmallVector< unsigned, 4 > > LPadToCallSiteMap
Map a landing pad to the call site indexes.
void handleDebugDeclare(Value *Address, DILocalVariable *Variable, DIExpression *Expression, DebugLoc DL)
void visitBitTestCase(SwitchCG::BitTestBlock &BB, MachineBasicBlock *NextMBB, BranchProbability BranchProbToNext, unsigned Reg, SwitchCG::BitTestCase &B, MachineBasicBlock *SwitchBB)
visitBitTestCase - this function produces one "bit test"
bool shouldKeepJumpConditionsTogether(const FunctionLoweringInfo &FuncInfo, const BranchInst &I, Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs, TargetLoweringBase::CondMergingParams Params) const
StatepointLoweringState StatepointLowering
State used while lowering a statepoint sequence (gc_statepoint, gc_relocate, and gc_result).
void init(GCFunctionInfo *gfi, AAResults *AA, AssumptionCache *AC, const TargetLibraryInfo *li)
DenseMap< const Constant *, unsigned > ConstantsOut
void populateCallLoweringInfo(TargetLowering::CallLoweringInfo &CLI, const CallBase *Call, unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy, AttributeSet RetAttrs, bool IsPatchPoint)
Populate a CallLowerinInfo (into CLI) based on the properties of the call being lowered.
void salvageUnresolvedDbgValue(const Value *V, DanglingDebugInfo &DDI)
For the given dangling debuginfo record, perform last-ditch efforts to resolve the debuginfo to somet...
SmallVector< SDValue, 8 > PendingLoads
Loads are not emitted to the program immediately.
GCFunctionInfo * GFI
Garbage collection metadata for the function.
SDValue getRoot()
Similar to getMemoryRoot, but also flushes PendingConstrainedFP(Strict) items.
void ExportFromCurrentBlock(const Value *V)
ExportFromCurrentBlock - If this condition isn't known to be exported from the current basic block,...
void resolveOrClearDbgInfo()
Evict any dangling debug information, attempting to salvage it first.
std::pair< SDValue, SDValue > lowerInvokable(TargetLowering::CallLoweringInfo &CLI, const BasicBlock *EHPadBB=nullptr)
SDValue getMemoryRoot()
Return the current virtual root of the Selection DAG, flushing any PendingLoad items.
void resolveDanglingDebugInfo(const Value *V, SDValue Val)
If we saw an earlier dbg_value referring to V, generate the debug data structures now that we've seen...
void visit(const Instruction &I)
void dropDanglingDebugInfo(const DILocalVariable *Variable, const DIExpression *Expr)
If we have dangling debug info that describes Variable, or an overlapping part of variable considerin...
SDValue getCopyFromRegs(const Value *V, Type *Ty)
If there was virtual register allocated for the value V emit CopyFromReg of the specified type Ty.
void CopyToExportRegsIfNeeded(const Value *V)
CopyToExportRegsIfNeeded - If the given value has virtual registers created for it,...
void handleKillDebugValue(DILocalVariable *Var, DIExpression *Expr, DebugLoc DbgLoc, unsigned Order)
Create a record for a kill location debug intrinsic.
void visitJumpTable(SwitchCG::JumpTable &JT)
visitJumpTable - Emit JumpTable node in the current MBB
void visitJumpTableHeader(SwitchCG::JumpTable &JT, SwitchCG::JumpTableHeader &JTH, MachineBasicBlock *SwitchBB)
visitJumpTableHeader - This function emits necessary code to produce index in the JumpTable from swit...
void LowerCallSiteWithPtrAuthBundle(const CallBase &CB, const BasicBlock *EHPadBB)
static const unsigned LowestSDNodeOrder
Lowest valid SDNodeOrder.
FunctionLoweringInfo & FuncInfo
Information about the function as a whole.
void setValue(const Value *V, SDValue NewN)
void FindMergedConditions(const Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB, Instruction::BinaryOps Opc, BranchProbability TProb, BranchProbability FProb, bool InvertCond)
const TargetLibraryInfo * LibInfo
bool isExportableFromCurrentBlock(const Value *V, const BasicBlock *FromBB)
void visitSPDescriptorParent(StackProtectorDescriptor &SPD, MachineBasicBlock *ParentBB)
Codegen a new tail for a stack protector check ParentMBB which has had its tail spliced into a stack ...
bool handleDebugValue(ArrayRef< const Value * > Values, DILocalVariable *Var, DIExpression *Expr, DebugLoc DbgLoc, unsigned Order, bool IsVariadic)
For a given list of Values, attempt to create and record a SDDbgValue in the SelectionDAG.
SDValue getControlRoot()
Similar to getRoot, but instead of flushing all the PendingLoad items, flush all the PendingExports (...
void UpdateSplitBlock(MachineBasicBlock *First, MachineBasicBlock *Last)
When an MBB was split during scheduling, update the references that need to refer to the last resulti...
SDValue getValueImpl(const Value *V)
getValueImpl - Helper function for getValue and getNonRegisterValue.
void visitSwitchCase(SwitchCG::CaseBlock &CB, MachineBasicBlock *SwitchBB)
visitSwitchCase - Emits the necessary code to represent a single node in the binary search tree resul...
void visitSPDescriptorFailure(StackProtectorDescriptor &SPD)
Codegen the failure basic block for a stack protector check.
std::unique_ptr< FunctionLoweringInfo > FuncInfo
SmallPtrSet< const Instruction *, 4 > ElidedArgCopyInstrs
const TargetLowering * TLI
MachineFunction * MF
virtual void emitFunctionEntryCode()
SwiftErrorValueTracking * SwiftError
std::unique_ptr< SelectionDAGBuilder > SDB
Targets can subclass this to parameterize the SelectionDAG lowering and instruction selection process...
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrnlen(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src, SDValue MaxLength, MachinePointerInfo SrcPtrInfo) const
virtual std::pair< SDValue, SDValue > EmitTargetCodeForMemcmp(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, SDValue Op3, MachinePointerInfo Op1PtrInfo, MachinePointerInfo Op2PtrInfo) const
Emit target-specific code that performs a memcmp/bcmp, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrcpy(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dest, SDValue Src, MachinePointerInfo DestPtrInfo, MachinePointerInfo SrcPtrInfo, bool isStpcpy) const
Emit target-specific code that performs a strcpy or stpcpy, in cases where that is faster than a libc...
virtual std::pair< SDValue, SDValue > EmitTargetCodeForMemchr(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Src, SDValue Char, SDValue Length, MachinePointerInfo SrcPtrInfo) const
Emit target-specific code that performs a memchr, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrcmp(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, MachinePointerInfo Op1PtrInfo, MachinePointerInfo Op2PtrInfo) const
Emit target-specific code that performs a strcmp, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrlen(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src, MachinePointerInfo SrcPtrInfo) const
virtual SDValue EmitTargetCodeForSetTag(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Addr, SDValue Size, MachinePointerInfo DstPtrInfo, bool ZeroData) const
Help to insert SDNodeFlags automatically in transforming.
Definition: SelectionDAG.h:365
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
Definition: SelectionDAG.h:227
SDValue getTargetGlobalAddress(const GlobalValue *GV, const SDLoc &DL, EVT VT, int64_t offset=0, unsigned TargetFlags=0)
Definition: SelectionDAG.h:737
SDValue getExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT, unsigned Opcode)
Convert Op, which must be of integer type, to the integer type VT, by either any/sign/zero-extending ...
Definition: SelectionDAG.h:969
SDValue getLabelNode(unsigned Opcode, const SDLoc &dl, SDValue Root, MCSymbol *Label)
const SDValue & getRoot() const
Return the root tag of the SelectionDAG.
Definition: SelectionDAG.h:568
SDValue getMaskedGather(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType, ISD::LoadExtType ExtTy)
SDValue getAddrSpaceCast(const SDLoc &dl, EVT VT, SDValue Ptr, unsigned SrcAS, unsigned DestAS)
Return an AddrSpaceCastSDNode.
const TargetSubtargetInfo & getSubtarget() const
Definition: SelectionDAG.h:490
SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
BlockFrequencyInfo * getBFI() const
Definition: SelectionDAG.h:504
SDValue getShiftAmountConstant(uint64_t Val, EVT VT, const SDLoc &DL)
MachineSDNode * getMachineNode(unsigned Opcode, const SDLoc &dl, EVT VT)
These are used for target selectors to create a new node with specified return type(s),...
void ExtractVectorElements(SDValue Op, SmallVectorImpl< SDValue > &Args, unsigned Start=0, unsigned Count=0, EVT EltVT=EVT())
Append the extracted elements from Start to Count out of the vector Op in Args.
SDValue getAtomicMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Value, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo)
SDValue getVScale(const SDLoc &DL, EVT VT, APInt MulImm, bool ConstantFold=true)
Return a node that represents the runtime scaling 'MulImm * RuntimeVL'.
SDValue getPseudoProbeNode(const SDLoc &Dl, SDValue Chain, uint64_t Guid, uint64_t Index, uint32_t Attr)
Creates a PseudoProbeSDNode with function GUID Guid and the index of the block Index it is probing,...
SDValue getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVol, bool AlwaysInline, const CallInst *CI, std::optional< bool > OverrideTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), AAResults *AA=nullptr)
SDValue getMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVol, bool AlwaysInline, const CallInst *CI, MachinePointerInfo DstPtrInfo, const AAMDNodes &AAInfo=AAMDNodes())
SDValue getConstantPool(const Constant *C, EVT VT, MaybeAlign Align=std::nullopt, int Offs=0, bool isT=false, unsigned TargetFlags=0)
SDValue getStridedLoadVP(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL, SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding=false)
SDValue getAtomicCmpSwap(unsigned Opcode, const SDLoc &dl, EVT MemVT, SDVTList VTs, SDValue Chain, SDValue Ptr, SDValue Cmp, SDValue Swp, MachineMemOperand *MMO)
Gets a node for an atomic cmpxchg op.
MachineModuleInfo * getMMI() const
Definition: SelectionDAG.h:505
SDDbgValue * getVRegDbgValue(DIVariable *Var, DIExpression *Expr, unsigned VReg, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a VReg SDDbgValue node.
void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To, unsigned Num)
Like ReplaceAllUsesOfValueWith, but for multiple values at once.
SDValue getSetCC(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS, ISD::CondCode Cond, SDValue Chain=SDValue(), bool IsSignaling=false)
Helper function to make it easier to build SetCC's if you just have an ISD::CondCode instead of an SD...
void addMMRAMetadata(const SDNode *Node, MDNode *MMRA)
Set MMRAMetadata to be associated with Node.
SDValue getConstantFP(double Val, const SDLoc &DL, EVT VT, bool isTarget=false)
Create a ConstantFPSDNode wrapping a constant value.
SDValue getElementCount(const SDLoc &DL, EVT VT, ElementCount EC, bool ConstantFold=true)
SDValue getGetFPEnv(SDValue Chain, const SDLoc &dl, SDValue Ptr, EVT MemVT, MachineMemOperand *MMO)
SDValue getAssertAlign(const SDLoc &DL, SDValue V, Align A)
Return an AssertAlignSDNode.
SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr)
Loads are not normal binary operators: their result type is not determined by their operands,...
SDValue getStepVector(const SDLoc &DL, EVT ResVT, const APInt &StepVal)
Returns a vector of type ResVT whose elements contain the linear sequence <0, Step,...
SDValue getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT, SDValue Chain, SDValue Ptr, SDValue Val, MachineMemOperand *MMO)
Gets a node for an atomic op, produces result (if relevant) and chain and takes 2 operands.
Align getEVTAlign(EVT MemoryVT) const
Compute the default alignment value for the given type.
bool shouldOptForSize() const
SDValue getVPZExtOrTrunc(const SDLoc &DL, EVT VT, SDValue Op, SDValue Mask, SDValue EVL)
Convert a vector-predicated Op, which must be an integer vector, to the vector-type VT,...
const TargetLowering & getTargetLoweringInfo() const
Definition: SelectionDAG.h:494
static constexpr unsigned MaxRecursionDepth
Definition: SelectionDAG.h:452
SDValue getStridedStoreVP(SDValue Chain, const SDLoc &DL, SDValue Val, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
void AddDbgValue(SDDbgValue *DB, bool isParameter)
Add a dbg_value SDNode.
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2, SDValue InGlue, const SDLoc &DL)
Return a new CALLSEQ_END node, which always must have a glue result (to ensure it's not CSE'd).
SDValue getGatherVP(SDVTList VTs, EVT VT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Ops)
Return an ISD::BUILD_VECTOR node.
Definition: SelectionDAG.h:843
void DeleteNode(SDNode *N)
Remove the specified node from the system.
SDValue getBitcast(EVT VT, SDValue V)
Return a bitcast using the SDLoc of the value operand, and casting to the provided type.
SDDbgValue * getDbgValueList(DIVariable *Var, DIExpression *Expr, ArrayRef< SDDbgOperand > Locs, ArrayRef< SDNode * > Dependencies, bool IsIndirect, const DebugLoc &DL, unsigned O, bool IsVariadic)
Creates a SDDbgValue node from a list of locations.
SDValue getNegative(SDValue Val, const SDLoc &DL, EVT VT)
Create negative operation as (SUB 0, Val).
void setNodeMemRefs(MachineSDNode *N, ArrayRef< MachineMemOperand * > NewMemRefs)
Mutate the specified machine node's memory references to the provided list.
const DataLayout & getDataLayout() const
Definition: SelectionDAG.h:488
ProfileSummaryInfo * getPSI() const
Definition: SelectionDAG.h:503
SDValue getTargetFrameIndex(int FI, EVT VT)
Definition: SelectionDAG.h:742
SDValue getTokenFactor(const SDLoc &DL, SmallVectorImpl< SDValue > &Vals)
Creates a new TokenFactor containing Vals.
const SelectionDAGTargetInfo & getSelectionDAGInfo() const
Definition: SelectionDAG.h:496
SDValue getMaskedHistogram(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
SDValue getMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVol, const CallInst *CI, std::optional< bool > OverrideTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), AAResults *AA=nullptr)
SDDbgLabel * getDbgLabel(DILabel *Label, const DebugLoc &DL, unsigned O)
Creates a SDDbgLabel node.
SDValue getStoreVP(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
SDValue getMemBasePlusOffset(SDValue Base, TypeSize Offset, const SDLoc &DL, const SDNodeFlags Flags=SDNodeFlags())
Returns sum of the base pointer and offset.
SDValue getGlobalAddress(const GlobalValue *GV, const SDLoc &DL, EVT VT, int64_t offset=0, bool isTargetGA=false, unsigned TargetFlags=0)
SDValue getVAArg(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue SV, unsigned Align)
VAArg produces a result and token chain, and takes a pointer and a source value as input.
SDValue getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
SDValue getMDNode(const MDNode *MD)
Return an MDNodeSDNode which holds an MDNode.
void ReplaceAllUsesWith(SDValue From, SDValue To)
Modify anything using 'From' to use 'To' instead.
SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
Helper function to build ISD::STORE nodes.
SDValue getSrcValue(const Value *v)
Construct a node to track a Value* through the backend.
SDValue getSplatVector(EVT VT, const SDLoc &DL, SDValue Op)
Definition: SelectionDAG.h:877
SDValue getAtomicMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo)
MaybeAlign InferPtrAlign(SDValue Ptr) const
Infer alignment of a load / store address.
SDValue getCALLSEQ_START(SDValue Chain, uint64_t InSize, uint64_t OutSize, const SDLoc &DL)
Return a new CALLSEQ_START node, that starts new call frame, in which InSize bytes are set up inside ...
SDValue getRegister(unsigned Reg, EVT VT)
void AddDbgLabel(SDDbgLabel *DB)
Add a dbg_label SDNode.
SDValue getBasicBlock(MachineBasicBlock *MBB)
SDValue getSExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either sign-extending or trunca...
SDValue getEHLabel(const SDLoc &dl, SDValue Root, MCSymbol *Label)
SDValue getSetFPEnv(SDValue Chain, const SDLoc &dl, SDValue Ptr, EVT MemVT, MachineMemOperand *MMO)
SDValue getMaskedStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Base, SDValue Offset, SDValue Mask, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
SDValue getExternalSymbol(const char *Sym, EVT VT)
const TargetMachine & getTarget() const
Definition: SelectionDAG.h:489
SDValue getPtrExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either truncating it or perform...
SDValue getAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either any-extending or truncat...
SDValue getCopyToReg(SDValue Chain, const SDLoc &dl, unsigned Reg, SDValue N)
Definition: SelectionDAG.h:788
SDValue getBlockAddress(const BlockAddress *BA, EVT VT, int64_t Offset=0, bool isTarget=false, unsigned TargetFlags=0)
SDValue getLoadVP(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, const MDNode *Ranges=nullptr, bool IsExpanding=false)
SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
SDDbgValue * getConstantDbgValue(DIVariable *Var, DIExpression *Expr, const Value *C, const DebugLoc &DL, unsigned O)
Creates a constant SDDbgValue node.
SDValue getScatterVP(SDVTList VTs, EVT VT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
SDValue getValueType(EVT)
SDValue getTargetConstantFP(double Val, const SDLoc &DL, EVT VT)
Definition: SelectionDAG.h:723
SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
SDValue getFPExtendOrRound(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of float type, to the float type VT, by either extending or rounding (by tr...
SDValue getAtomicMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo)
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
Definition: SelectionDAG.h:691
SDDbgValue * getFrameIndexDbgValue(DIVariable *Var, DIExpression *Expr, unsigned FI, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a FrameIndex SDDbgValue node.
SDValue getJumpTable(int JTI, EVT VT, bool isTarget=false, unsigned TargetFlags=0)
SDValue getVPPtrExtOrTrunc(const SDLoc &DL, EVT VT, SDValue Op, SDValue Mask, SDValue EVL)
Convert a vector-predicated Op, which must be of integer type, to the vector-type integer type VT,...
SDValue getVectorIdxConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
MachineFunction & getMachineFunction() const
Definition: SelectionDAG.h:483
SDValue getCopyFromReg(SDValue Chain, const SDLoc &dl, unsigned Reg, EVT VT)
Definition: SelectionDAG.h:814
SDValue getPtrExtendInReg(SDValue Op, const SDLoc &DL, EVT VT)
Return the expression required to extend the Op as a pointer value assuming it was the smaller SrcTy ...
SDValue getFrameIndex(int FI, EVT VT, bool isTarget=false)
const FunctionVarLocs * getFunctionVarLocs() const
Returns the result of the AssignmentTrackingAnalysis pass if it's available, otherwise return nullptr...
Definition: SelectionDAG.h:500
SDValue getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either zero-extending or trunca...
SDValue getCondCode(ISD::CondCode Cond)
SDValue getLifetimeNode(bool IsStart, const SDLoc &dl, SDValue Chain, int FrameIndex, int64_t Size, int64_t Offset=-1)
Creates a LifetimeSDNode that starts (IsStart==true) or ends (IsStart==false) the lifetime of the por...
SDValue getObjectPtrOffset(const SDLoc &SL, SDValue Ptr, TypeSize Offset)
Create an add instruction with appropriate flags when used for addressing some offset of an object.
LLVMContext * getContext() const
Definition: SelectionDAG.h:501
const SDValue & setRoot(SDValue N)
Set the current root tag of the SelectionDAG.
Definition: SelectionDAG.h:577
void addPCSections(const SDNode *Node, MDNode *MD)
Set PCSections to be associated with Node.
SDValue getMemIntrinsicNode(unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef< SDValue > Ops, EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags Flags=MachineMemOperand::MOLoad|MachineMemOperand::MOStore, LocationSize Size=0, const AAMDNodes &AAInfo=AAMDNodes())
Creates a MemIntrinsicNode that may produce a result and takes a list of operands.
SDValue getTargetExternalSymbol(const char *Sym, EVT VT, unsigned TargetFlags=0)
SDValue getMCSymbol(MCSymbol *Sym, EVT VT)
SDValue getSetCCVP(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS, ISD::CondCode Cond, SDValue Mask, SDValue EVL)
Helper function to make it easier to build VP_SETCCs if you just have an ISD::CondCode instead of an ...
SDValue CreateStackTemporary(TypeSize Bytes, Align Alignment)
Create a stack temporary based on the size in bytes and the alignment.
SDValue getEntryNode() const
Return the token chain corresponding to the entry of the function.
Definition: SelectionDAG.h:571
SDDbgValue * getDbgValue(DIVariable *Var, DIExpression *Expr, SDNode *N, unsigned R, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a SDDbgValue node.
SDValue getMaskedLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Base, SDValue Offset, SDValue Mask, SDValue Src0, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, ISD::LoadExtType, bool IsExpanding=false)
SDValue getSplat(EVT VT, const SDLoc &DL, SDValue Op)
Returns a node representing a splat of one value into all lanes of the provided vector type.
Definition: SelectionDAG.h:893
SDValue getVectorShuffle(EVT VT, const SDLoc &dl, SDValue N1, SDValue N2, ArrayRef< int > Mask)
Return an ISD::VECTOR_SHUFFLE node.
SDValue getMaskedScatter(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType, bool IsTruncating=false)
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
Definition: SmallPtrSet.h:323
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
Definition: SmallPtrSet.h:344
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:479
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
Definition: SmallSet.h:135
bool empty() const
Definition: SmallVector.h:94
size_t size() const
Definition: SmallVector.h:91
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:586
reference emplace_back(ArgTypes &&... Args)
Definition: SmallVector.h:950
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
Definition: SmallVector.h:696
void swap(SmallVectorImpl &RHS)
Definition: SmallVector.h:981
void resize(size_type N)
Definition: SmallVector.h:651
void push_back(const T &Elt)
Definition: SmallVector.h:426
pointer data()
Return a pointer to the vector's buffer, even if empty().
Definition: SmallVector.h:299
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1209
Encapsulates all of the information needed to generate a stack protector check, and signals to isel w...
MachineBasicBlock * getSuccessMBB()
MachineBasicBlock * getFailureMBB()
void clear()
Clear the memory usage of this object.
An instruction for storing to memory.
Definition: Instructions.h:290
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
constexpr bool empty() const
empty - Check if the string is empty.
Definition: StringRef.h:134
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
Definition: StringRef.h:131
TypeSize getElementOffset(unsigned Idx) const
Definition: DataLayout.h:651
Class to represent struct types.
Definition: DerivedTypes.h:216
void setCurrentVReg(const MachineBasicBlock *MBB, const Value *, Register)
Set the swifterror virtual register in the VRegDefMap for this basic block.
Register getOrCreateVRegUseAt(const Instruction *, const MachineBasicBlock *, const Value *)
Get or create the swifterror value virtual register for a use of a swifterror by an instruction.
Register getOrCreateVRegDefAt(const Instruction *, const MachineBasicBlock *, const Value *)
Get or create the swifterror value virtual register for a def of a swifterror by an instruction.
const Value * getFunctionArg() const
Get the (unique) function argument that was marked swifterror, or nullptr if this function has no swi...
Multiway switch.
Information about stack frame layout on the target.
virtual TargetStackID::Value getStackIDForScalableVectors() const
Returns the StackID that scalable vectors should be associated with.
Align getStackAlign() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
TargetInstrInfo - Interface to description of machine instruction set.
TargetIntrinsicInfo - Interface to description of machine instruction set.
Provides information about what library functions are available for the current target.
bool hasOptimizedCodeGen(LibFunc F) const
Tests if the function is both available and a candidate for optimized code generation.
bool getLibFunc(StringRef funcName, LibFunc &F) const
Searches for a particular function name.
void setAttributes(const CallBase *Call, unsigned ArgIdx)
Set CallLoweringInfo attribute flags based on a call instruction and called function attributes.
virtual bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF, EVT) const
Return true if an FMA operation is faster than a pair of fmul and fadd instructions.
EVT getMemValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
EVT getValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Return the EVT corresponding to this LLVM type.
LegalizeAction
This enum indicates whether operations are valid for a target, and if not, what action should be used...
virtual bool useStackGuardXorFP() const
If this function returns true, stack protection checks should XOR the frame pointer (or whichever poi...
virtual const TargetRegisterClass * getRegClassFor(MVT VT, bool isDivergent=false) const
Return the register class that should be used for the specified value type.
virtual bool isLegalScaleForGatherScatter(uint64_t Scale, uint64_t ElemSize) const
virtual bool isSExtCheaperThanZExt(EVT FromTy, EVT ToTy) const
Return true if sign-extension from FromTy to ToTy is cheaper than zero-extension.
virtual MVT getVectorIdxTy(const DataLayout &DL) const
Returns the type to be used for the index operand of: ISD::INSERT_VECTOR_ELT, ISD::EXTRACT_VECTOR_ELT...
virtual CondMergingParams getJumpConditionMergingParams(Instruction::BinaryOps, const Value *, const Value *) const
const TargetMachine & getTargetMachine() const
virtual unsigned getNumRegistersForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain targets require unusual breakdowns of certain types.
virtual bool isZExtFree(Type *FromTy, Type *ToTy) const
Return true if any actual instruction that defines a value of type FromTy implicitly zero-extends the...
virtual MVT getRegisterTypeForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain combinations of ABIs, Targets and features require that types are legal for some operations a...
virtual Value * getSDagStackGuard(const Module &M) const
Return the variable that's previously inserted by insertSSPDeclarations, if any, otherwise return nul...
virtual unsigned getNumRegisters(LLVMContext &Context, EVT VT, std::optional< MVT > RegisterVT=std::nullopt) const
Return the number of registers that this ValueType will eventually require.
bool isJumpExpensive() const
Return true if Flow Control is an expensive operation that should be avoided.
unsigned getBitWidthForCttzElements(Type *RetTy, ElementCount EC, bool ZeroIsPoison, const ConstantRange *VScaleRange) const
Return the minimum number of bits required to hold the maximum possible number of trailing zero vecto...
virtual bool shouldExtendGSIndex(EVT VT, EVT &EltTy) const
Returns true if the index type for a masked gather/scatter requires extending.
virtual unsigned getVectorTypeBreakdownForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const
Certain targets such as MIPS require that some types such as vectors are always broken down into scal...
virtual Function * getSSPStackGuardCheck(const Module &M) const
If the target has a standard stack protection check function that performs validation and error handl...
Register getStackPointerRegisterToSaveRestore() const
If a physical register, this specifies the register that llvm.savestack/llvm.restorestack should save...
LegalizeAction getFixedPointOperationAction(unsigned Op, EVT VT, unsigned Scale) const
Some fixed point operations may be natively supported by the target but only for specific scales.
MachineMemOperand::Flags getAtomicMemOperandFlags(const Instruction &AI, const DataLayout &DL) const
virtual bool getTgtMemIntrinsic(IntrinsicInfo &, const CallInst &, MachineFunction &, unsigned) const
Given an intrinsic, checks if on the target the intrinsic will need to map to a MemIntrinsicNode (tou...
virtual bool allowsMisalignedMemoryAccesses(EVT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *=nullptr) const
Determine if the target supports unaligned memory accesses.
bool hasBigEndianPartOrdering(EVT VT, const DataLayout &DL) const
When splitting a value of the specified type into parts, does the Lo or Hi part come first?...
EVT getShiftAmountTy(EVT LHSTy, const DataLayout &DL) const
Returns the type for the shift amount of a shift opcode.
virtual Align getABIAlignmentForCallingConv(Type *ArgTy, const DataLayout &DL) const
Certain targets have context sensitive alignment requirements, where one type has the alignment requi...
virtual bool shouldExpandGetActiveLaneMask(EVT VT, EVT OpVT) const
Return true if the @llvm.get.active.lane.mask intrinsic should be expanded using generic code in Sele...
virtual EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const
Return the ValueType of the result of SETCC operations.
MachineMemOperand::Flags getLoadMemOperandFlags(const LoadInst &LI, const DataLayout &DL, AssumptionCache *AC=nullptr, const TargetLibraryInfo *LibInfo=nullptr) const
virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
MVT getProgramPointerTy(const DataLayout &DL) const
Return the type for code pointers, which is determined by the program address space specified through...
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
virtual MVT getFenceOperandTy(const DataLayout &DL) const
Return the type for operands of fence.
virtual bool shouldExpandGetVectorLength(EVT CountVT, unsigned VF, bool IsScalable) const
bool isOperationLegalOrCustom(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal with custom lower...
virtual uint64_t getByValTypeAlignment(Type *Ty, const DataLayout &DL) const
Return the desired alignment for ByVal or InAlloca aggregate function arguments in the caller paramet...
virtual MVT hasFastEqualityCompare(unsigned NumBits) const
Return the preferred operand type if the target has a quick way to compare integer values of the give...
MachineMemOperand::Flags getStoreMemOperandFlags(const StoreInst &SI, const DataLayout &DL) const
virtual bool shouldExpandCttzElements(EVT VT) const
Return true if the @llvm.experimental.cttz.elts intrinsic should be expanded using generic code in Se...
virtual bool signExtendConstant(const ConstantInt *C) const
Return true if this constant should be sign extended when promoting to a larger type.
LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const
Return how we should legalize values of this type, either it is already legal (return 'Legal') or we ...
virtual Register getExceptionPointerRegister(const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception address on entry to an ...
bool supportsUnalignedAtomics() const
Whether the target supports unaligned atomic operations.
std::vector< ArgListEntry > ArgListTy
bool isBeneficialToExpandPowI(int64_t Exponent, bool OptForSize) const
Return true if it is beneficial to expand an @llvm.powi.
MVT getFrameIndexTy(const DataLayout &DL) const
Return the type for frame index, which is determined by the alloca address space specified through th...
virtual Register getExceptionSelectorRegister(const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception typeid on entry to a la...
virtual MVT getPointerMemTy(const DataLayout &DL, uint32_t AS=0) const
Return the in-memory pointer type for the given address space, defaults to the pointer type from the ...
MVT getRegisterType(MVT VT) const
Return the type of registers that this ValueType will eventually require.
bool isOperationLegalOrCustomOrPromote(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal with custom lower...
unsigned getVectorTypeBreakdown(LLVMContext &Context, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const
Vector types are broken down into some number of legal first class types.
virtual MVT getVPExplicitVectorLengthTy() const
Returns the type to be used for the EVL/AVL operand of VP nodes: ISD::VP_ADD, ISD::VP_SUB,...
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
virtual bool supportKCFIBundles() const
Return true if the target supports kcfi operand bundles.
virtual bool supportPtrAuthBundles() const
Return true if the target supports ptrauth operand bundles.
virtual bool supportSwiftError() const
Return true if the target supports swifterror attribute.
virtual SDValue visitMaskedLoad(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, MachineMemOperand *MMO, SDValue &NewLoad, SDValue Ptr, SDValue PassThru, SDValue Mask) const
virtual SDValue emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val, const SDLoc &DL) const
virtual bool useLoadStackGuardNode() const
If this function returns true, SelectionDAGBuilder emits a LOAD_STACK_GUARD node when it is lowering ...
virtual EVT getTypeForExtReturn(LLVMContext &Context, EVT VT, ISD::NodeType) const
Return the type that should be used to zero or sign extend a zeroext/signext integer return value.
std::pair< SDValue, SDValue > makeLibCall(SelectionDAG &DAG, RTLIB::Libcall LC, EVT RetVT, ArrayRef< SDValue > Ops, MakeLibCallOptions CallOptions, const SDLoc &dl, SDValue Chain=SDValue()) const
Returns a pair of (return value, chain).
virtual InlineAsm::ConstraintCode getInlineAsmMemConstraint(StringRef ConstraintCode) const
std::vector< AsmOperandInfo > AsmOperandInfoVector
SDValue expandIS_FPCLASS(EVT ResultVT, SDValue Op, FPClassTest Test, SDNodeFlags Flags, const SDLoc &DL, SelectionDAG &DAG) const
Expand check for floating point class.
virtual SDValue prepareVolatileOrAtomicLoad(SDValue Chain, const SDLoc &DL, SelectionDAG &DAG) const
This callback is used to prepare for a volatile or atomic load.
virtual ConstraintType getConstraintType(StringRef Constraint) const
Given a constraint, return the type of constraint it is for this target.
virtual bool splitValueIntoRegisterParts(SelectionDAG &DAG, const SDLoc &DL, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, std::optional< CallingConv::ID > CC) const
Target-specific splitting of values into parts that fit a register storing a legal type.
virtual SDValue joinRegisterPartsIntoValue(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, std::optional< CallingConv::ID > CC) const
Target-specific combining of register parts into its original value.
virtual SDValue LowerCall(CallLoweringInfo &, SmallVectorImpl< SDValue > &) const
This hook must be implemented to lower calls into the specified DAG.
std::pair< SDValue, SDValue > LowerCallTo(CallLoweringInfo &CLI) const
This function lowers an abstract call to a function into an actual call.
virtual SDValue LowerAsmOutputForConstraint(SDValue &Chain, SDValue &Glue, const SDLoc &DL, const AsmOperandInfo &OpInfo, SelectionDAG &DAG) const
virtual std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const
Given a physical register constraint (e.g.
virtual SDValue LowerFormalArguments(SDValue, CallingConv::ID, bool, const SmallVectorImpl< ISD::InputArg > &, const SDLoc &, SelectionDAG &, SmallVectorImpl< SDValue > &) const
This hook must be implemented to lower the incoming (formal) arguments, described by the Ins array,...
virtual AsmOperandInfoVector ParseConstraints(const DataLayout &DL, const TargetRegisterInfo *TRI, const CallBase &Call) const
Split up the constraint string from the inline assembly value into the specific constraints and their...
virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const
This callback is invoked for operations that are unsupported by the target, which are registered to u...
virtual SDValue LowerReturn(SDValue, CallingConv::ID, bool, const SmallVectorImpl< ISD::OutputArg > &, const SmallVectorImpl< SDValue > &, const SDLoc &, SelectionDAG &) const
This hook must be implemented to lower outgoing return values, described by the Outs array,...
virtual bool functionArgumentNeedsConsecutiveRegisters(Type *Ty, CallingConv::ID CallConv, bool isVarArg, const DataLayout &DL) const
For some targets, an LLVM struct type must be broken down into multiple simple types,...
virtual void ComputeConstraintToUse(AsmOperandInfo &OpInfo, SDValue Op, SelectionDAG *DAG=nullptr) const
Determines the constraint code and constraint type to use for the specific AsmOperandInfo,...
virtual void CollectTargetIntrinsicOperands(const CallInst &I, SmallVectorImpl< SDValue > &Ops, SelectionDAG &DAG) const
virtual SDValue visitMaskedStore(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, MachineMemOperand *MMO, SDValue Ptr, SDValue Val, SDValue Mask) const
virtual void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint, std::vector< SDValue > &Ops, SelectionDAG &DAG) const
Lower the specified operand into the Ops vector.
virtual bool CanLowerReturn(CallingConv::ID, MachineFunction &, bool, const SmallVectorImpl< ISD::OutputArg > &, LLVMContext &) const
This hook should be implemented to check whether the return values described by the Outs array can fi...
virtual void LowerOperationWrapper(SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG) const
This callback is invoked by the type legalizer to legalize nodes with an illegal operand type but leg...
virtual bool isInlineAsmTargetBranch(const SmallVectorImpl< StringRef > &AsmStrs, unsigned OpNo) const
On x86, return true if the operand with index OpNo is a CALL or JUMP instruction, which can use eithe...
virtual const TargetIntrinsicInfo * getIntrinsicInfo() const
If intrinsic information is available, return it. If not, return null.
virtual bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const
Returns true if a cast between SrcAS and DestAS is a noop.
const Triple & getTargetTriple() const
virtual TargetTransformInfo getTargetTransformInfo(const Function &F) const
Return a TargetTransformInfo for a given function.
TargetOptions Options
CodeModel::Model getCodeModel() const
Returns the code model.
CodeGenOptLevel getOptLevel() const
Returns the optimization level: None, Less, Default, or Aggressive.
unsigned NoNaNsFPMath
NoNaNsFPMath - This flag is enabled when the -enable-no-nans-fp-math flag is specified on the command...
unsigned EnableFastISel
EnableFastISel - This flag enables fast-path instruction selection which trades away generated code q...
unsigned NoTrapAfterNoreturn
Do not emit a trap instruction for 'unreachable' IR instructions behind noreturn calls,...
unsigned TrapUnreachable
Emit target-specific trap instruction for 'unreachable' IR instructions.
FPOpFusion::FPOpFusionMode AllowFPOpFusion
AllowFPOpFusion - This flag is set by the -fp-contract=xxx option.
unsigned getID() const
Return the register class ID number.
iterator begin() const
begin/end - Return all of the registers in this class.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetInstrInfo * getInstrInfo() const
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
@ TCK_Latency
The latency of instruction.
InstructionCost getInstructionCost(const User *U, ArrayRef< const Value * > Operands, TargetCostKind CostKind) const
Estimate the cost of a given IR user when lowered.
bool hasConditionalLoadStoreForType(Type *Ty=nullptr) const
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
ArchType getArch() const
Get the parsed architecture type of this triple.
Definition: Triple.h:375
bool isPS() const
Tests whether the target is the PS4 or PS5 platform.
Definition: Triple.h:768
bool isWasm() const
Tests whether the target is wasm (32- and 64-bit).
Definition: Triple.h:1023
bool isAArch64() const
Tests whether the target is AArch64 (little and big endian).
Definition: Triple.h:913
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:81
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition: TypeSize.h:345
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
bool isVectorTy() const
True if this is an instance of VectorType.
Definition: Type.h:265
bool isPointerTy() const
True if this is an instance of PointerType.
Definition: Type.h:255
static IntegerType * getInt1Ty(LLVMContext &C)
unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
TypeID
Definitions of all of the base types for the Type system.
Definition: Type.h:54
static IntegerType * getIntNTy(LLVMContext &C, unsigned N)
static Type * getVoidTy(LLVMContext &C)
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition: Type.h:129
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition: Type.h:228
bool isTokenTy() const
Return true if this is 'token'.
Definition: Type.h:225
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Definition: Type.h:216
bool isVoidTy() const
Return true if this is 'void'.
Definition: Type.h:140
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition: Type.h:348
static UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
Definition: Constants.cpp:1833
This function has undefined behavior.
A Use represents the edge between a Value definition and its users.
Definition: Use.h:43
Value * getOperand(unsigned i) const
Definition: User.h:169
This class represents the va_arg llvm instruction, which returns an argument of the specified type gi...
CmpInst::Predicate getPredicate() const
This is the common base class for vector predication intrinsics.
static std::optional< unsigned > getVectorLengthParamPos(Intrinsic::ID IntrinsicID)
MaybeAlign getPointerAlignment() const
LLVM Value Representation.
Definition: Value.h:74
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:255
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition: Value.h:434
iterator_range< user_iterator > users()
Definition: Value.h:421
LLVMContext & getContext() const
All values hold a context through their type.
Definition: Value.cpp:1075
StringRef getName() const
Return a constant reference to the value's name.
Definition: Value.cpp:309
Base class of all SIMD vector types.
Definition: DerivedTypes.h:403
Type * getElementType() const
Definition: DerivedTypes.h:436
constexpr ScalarTy getFixedValue() const
Definition: TypeSize.h:202
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition: TypeSize.h:171
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition: TypeSize.h:168
const ParentTy * getParent() const
Definition: ilist_node.h:32
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Definition: Lint.cpp:86
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
Definition: BitmaskEnum.h:121
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
Definition: CallingConv.h:60
@ AMDGPU_CS_Chain
Used on AMDGPUs to give the middle-end more control over argument placement.
Definition: CallingConv.h:245
@ X86_VectorCall
MSVC calling convention that passes vectors and vector aggregates in SSE registers.
Definition: CallingConv.h:163
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition: CallingConv.h:24
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition: ISDOpcodes.h:40
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition: ISDOpcodes.h:243
@ STACKRESTORE
STACKRESTORE has two operands, an input chain and a pointer to restore to it returns an output chain.
Definition: ISDOpcodes.h:1169
@ STACKSAVE
STACKSAVE - STACKSAVE has one operand, an input chain.
Definition: ISDOpcodes.h:1165
@ CTLZ_ZERO_UNDEF
Definition: ISDOpcodes.h:752
@ CONVERGENCECTRL_ANCHOR
Definition: ISDOpcodes.h:1435
@ STRICT_FSETCC
STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used for floating-point operands only.
Definition: ISDOpcodes.h:490
@ ATOMIC_LOAD_FMAX
Definition: ISDOpcodes.h:1319
@ DELETED_NODE
DELETED_NODE - This is an illegal value that is used to catch errors.
Definition: ISDOpcodes.h:44
@ SET_FPENV
Sets the current floating-point environment.
Definition: ISDOpcodes.h:1041
@ VECREDUCE_SEQ_FADD
Generic reduction nodes.
Definition: ISDOpcodes.h:1382
@ VECREDUCE_SMIN
Definition: ISDOpcodes.h:1415
@ EH_SJLJ_LONGJMP
OUTCHAIN = EH_SJLJ_LONGJMP(INCHAIN, buffer) This corresponds to the eh.sjlj.longjmp intrinsic.
Definition: ISDOpcodes.h:153
@ ATOMIC_LOAD_NAND
Definition: ISDOpcodes.h:1312
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition: ISDOpcodes.h:573
@ BSWAP
Byte Swap and Counting operators.
Definition: ISDOpcodes.h:743
@ SMULFIX
RESULT = [US]MULFIX(LHS, RHS, SCALE) - Perform fixed point multiplication on 2 integers with the same...
Definition: ISDOpcodes.h:374
@ VAEND
VAEND, VASTART - VAEND and VASTART have three operands: an input chain, pointer, and a SRCVALUE.
Definition: ISDOpcodes.h:1198
@ ATOMIC_LOAD_MAX
Definition: ISDOpcodes.h:1314
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, ptr, val) This corresponds to "store atomic" instruction.
Definition: ISDOpcodes.h:1284
@ ATOMIC_LOAD_UMIN
Definition: ISDOpcodes.h:1315
@ RESET_FPENV
Set floating-point environment to default state.
Definition: ISDOpcodes.h:1045
@ ADD
Simple integer binary arithmetic operators.
Definition: ISDOpcodes.h:246
@ SMULFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
Definition: ISDOpcodes.h:380
@ SET_FPMODE
Sets the current dynamic floating-point control modes.
Definition: ISDOpcodes.h:1064
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition: ISDOpcodes.h:813
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition: ISDOpcodes.h:497
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition: ISDOpcodes.h:205
@ EH_SJLJ_SETUP_DISPATCH
OUTCHAIN = EH_SJLJ_SETUP_DISPATCH(INCHAIN) The target initializes the dispatch table here.
Definition: ISDOpcodes.h:157
@ GlobalAddress
Definition: ISDOpcodes.h:78
@ ATOMIC_CMP_SWAP_WITH_SUCCESS
Val, Success, OUTCHAIN = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) N.b.
Definition: ISDOpcodes.h:1297
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
Definition: ISDOpcodes.h:820
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition: ISDOpcodes.h:557
@ VECREDUCE_FMAX
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
Definition: ISDOpcodes.h:1400
@ FADD
Simple binary floating point operators.
Definition: ISDOpcodes.h:397
@ VECREDUCE_FMAXIMUM
FMINIMUM/FMAXIMUM nodes propatate NaNs and signed zeroes using the llvm.minimum and llvm....
Definition: ISDOpcodes.h:1404
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
Definition: ISDOpcodes.h:716
@ ATOMIC_FENCE
OUTCHAIN = ATOMIC_FENCE(INCHAIN, ordering, scope) This corresponds to the fence instruction.
Definition: ISDOpcodes.h:1276
@ RESET_FPMODE
Sets default dynamic floating-point control modes.
Definition: ISDOpcodes.h:1068
@ VECREDUCE_SMAX
Definition: ISDOpcodes.h:1414
@ STRICT_FSETCCS
Definition: ISDOpcodes.h:491
@ FPTRUNC_ROUND
FPTRUNC_ROUND - This corresponds to the fptrunc_round intrinsic.
Definition: ISDOpcodes.h:494
@ ATOMIC_LOAD_OR
Definition: ISDOpcodes.h:1310
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
Definition: ISDOpcodes.h:933
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
Definition: ISDOpcodes.h:236
@ ATOMIC_LOAD_XOR
Definition: ISDOpcodes.h:1311
@ INIT_TRAMPOLINE
INIT_TRAMPOLINE - This corresponds to the init_trampoline intrinsic.
Definition: ISDOpcodes.h:1242
@ FLDEXP
FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
Definition: ISDOpcodes.h:976
@ SDIVFIX
RESULT = [US]DIVFIX(LHS, RHS, SCALE) - Perform fixed point division on 2 integers with the same width...
Definition: ISDOpcodes.h:387
@ ATOMIC_LOAD_FADD
Definition: ISDOpcodes.h:1317
@ FrameIndex
Definition: ISDOpcodes.h:80
@ EH_LABEL
EH_LABEL - Represents a label in mid basic block used to track locations needed for debug and excepti...
Definition: ISDOpcodes.h:1145
@ EH_RETURN
OUTCHAIN = EH_RETURN(INCHAIN, OFFSET, HANDLER) - This node represents 'eh_return' gcc dwarf builtin,...
Definition: ISDOpcodes.h:141
@ ANNOTATION_LABEL
ANNOTATION_LABEL - Represents a mid basic block label used by annotations.
Definition: ISDOpcodes.h:1151
@ SET_ROUNDING
Set rounding mode.
Definition: ISDOpcodes.h:915
@ CONVERGENCECTRL_GLUE
Definition: ISDOpcodes.h:1441
@ SIGN_EXTEND
Conversion operators.
Definition: ISDOpcodes.h:804
@ PREALLOCATED_SETUP
PREALLOCATED_SETUP - This has 2 operands: an input chain and a SRCVALUE with the preallocated call Va...
Definition: ISDOpcodes.h:1203
@ READSTEADYCOUNTER
READSTEADYCOUNTER - This corresponds to the readfixedcounter intrinsic.
Definition: ISDOpcodes.h:1231
@ ADDROFRETURNADDR
ADDROFRETURNADDR - Represents the llvm.addressofreturnaddress intrinsic.
Definition: ISDOpcodes.h:107
@ CONVERGENCECTRL_ENTRY
Definition: ISDOpcodes.h:1436
@ BR
Control flow instructions. These all have token chains.
Definition: ISDOpcodes.h:1090
@ VECREDUCE_FADD
These reductions have relaxed evaluation order semantics, and have a single vector operand.
Definition: ISDOpcodes.h:1397
@ CTTZ_ZERO_UNDEF
Bit counting operators with an undefined result for zero inputs.
Definition: ISDOpcodes.h:751
@ WRITE_REGISTER
Definition: ISDOpcodes.h:125
@ PREFETCH
PREFETCH - This corresponds to a prefetch intrinsic.
Definition: ISDOpcodes.h:1264
@ VECREDUCE_FMIN
Definition: ISDOpcodes.h:1401
@ ATOMIC_LOAD_FSUB
Definition: ISDOpcodes.h:1318
@ SSUBO
Same for subtraction.
Definition: ISDOpcodes.h:334
@ ATOMIC_LOAD_MIN
Definition: ISDOpcodes.h:1313
@ PREALLOCATED_ARG
PREALLOCATED_ARG - This has 3 operands: an input chain, a SRCVALUE with the preallocated call Value,...
Definition: ISDOpcodes.h:1206
@ BRIND
BRIND - Indirect branch.
Definition: ISDOpcodes.h:1095
@ BR_JT
BR_JT - Jumptable branch.
Definition: ISDOpcodes.h:1099
@ VECTOR_INTERLEAVE
VECTOR_INTERLEAVE(VEC1, VEC2) - Returns two vectors with all input and output vectors having the same...
Definition: ISDOpcodes.h:600
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition: ISDOpcodes.h:514
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
Definition: ISDOpcodes.h:521
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition: ISDOpcodes.h:356
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition: ISDOpcodes.h:756
@ ATOMIC_LOAD
Val, OUTCHAIN = ATOMIC_LOAD(INCHAIN, ptr) This corresponds to "load atomic" instruction.
Definition: ISDOpcodes.h:1280
@ VECREDUCE_UMAX
Definition: ISDOpcodes.h:1416
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
Definition: ISDOpcodes.h:229
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition: ISDOpcodes.h:641
@ VACOPY
VACOPY - VACOPY has 5 operands: an input chain, a destination pointer, a source pointer,...
Definition: ISDOpcodes.h:1194
@ ATOMIC_LOAD_FMIN
Definition: ISDOpcodes.h:1320
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition: ISDOpcodes.h:215
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition: ISDOpcodes.h:330
@ ARITH_FENCE
ARITH_FENCE - This corresponds to a arithmetic fence intrinsic.
Definition: ISDOpcodes.h:1268
@ VECREDUCE_ADD
Integer reductions may have a result type larger than the vector element type.
Definition: ISDOpcodes.h:1409
@ GET_ROUNDING
Returns current rounding mode: -1 Undefined 0 Round to 0 1 Round to nearest, ties to even 2 Round to ...
Definition: ISDOpcodes.h:910
@ CLEANUPRET
CLEANUPRET - Represents a return from a cleanup block funclet.
Definition: ISDOpcodes.h:1160
@ GET_FPMODE
Reads the current dynamic floating-point control modes.
Definition: ISDOpcodes.h:1059
@ GET_FPENV
Gets the current floating-point environment.
Definition: ISDOpcodes.h:1036
@ SHL
Shift and rotation operations.
Definition: ISDOpcodes.h:734
@ PtrAuthGlobalAddress
A ptrauth constant.
Definition: ISDOpcodes.h:90
@ ATOMIC_LOAD_AND
Definition: ISDOpcodes.h:1308
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition: ISDOpcodes.h:587
@ EntryToken
EntryToken - This is the marker used to indicate the start of a region.
Definition: ISDOpcodes.h:47
@ READ_REGISTER
READ_REGISTER, WRITE_REGISTER - This node represents llvm.register on the DAG, which implements the n...
Definition: ISDOpcodes.h:124
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition: ISDOpcodes.h:549
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition: ISDOpcodes.h:810
@ DEBUGTRAP
DEBUGTRAP - Trap intended to get the attention of a debugger.
Definition: ISDOpcodes.h:1254
@ FP_TO_UINT_SAT
Definition: ISDOpcodes.h:886
@ VSCALE
VSCALE(IMM) - Returns the runtime scaling factor used to calculate the number of elements within a sc...
Definition: ISDOpcodes.h:1372
@ ATOMIC_LOAD_UMAX
Definition: ISDOpcodes.h:1316
@ LOCAL_RECOVER
LOCAL_RECOVER - Represents the llvm.localrecover intrinsic.
Definition: ISDOpcodes.h:120
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum or maximum on two values.
Definition: ISDOpcodes.h:1008
@ UBSANTRAP
UBSANTRAP - Trap with an immediate describing the kind of sanitizer failure.
Definition: ISDOpcodes.h:1258
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
Definition: ISDOpcodes.h:366
@ SMULO
Same for multiplication.
Definition: ISDOpcodes.h:338
@ DYNAMIC_STACKALLOC
DYNAMIC_STACKALLOC - Allocate some number of bytes on the stack aligned to a specified boundary.
Definition: ISDOpcodes.h:1084
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition: ISDOpcodes.h:696
@ VECTOR_REVERSE
VECTOR_REVERSE(VECTOR) - Returns a vector, of the same type as VECTOR, whose elements are shuffled us...
Definition: ISDOpcodes.h:605
@ SDIVFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
Definition: ISDOpcodes.h:393
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition: ISDOpcodes.h:918
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition: ISDOpcodes.h:765
@ VECREDUCE_UMIN
Definition: ISDOpcodes.h:1417
@ PCMARKER
PCMARKER - This corresponds to the pcmarker intrinsic.
Definition: ISDOpcodes.h:1217
@ INLINEASM_BR
INLINEASM_BR - Branching version of inline asm. Used by asm-goto.
Definition: ISDOpcodes.h:1140
@ EH_DWARF_CFA
EH_DWARF_CFA - This node represents the pointer to the DWARF Canonical Frame Address (CFA),...
Definition: ISDOpcodes.h:135
@ FRAMEADDR
FRAMEADDR, RETURNADDR - These nodes represent llvm.frameaddress and llvm.returnaddress on the DAG.
Definition: ISDOpcodes.h:100
@ ATOMIC_LOAD_UDEC_WRAP
Definition: ISDOpcodes.h:1322
@ ATOMIC_LOAD_ADD
Definition: ISDOpcodes.h:1306
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition: ISDOpcodes.h:479
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
Definition: ISDOpcodes.h:1027
@ ATOMIC_LOAD_SUB
Definition: ISDOpcodes.h:1307
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition: ISDOpcodes.h:866
@ READCYCLECOUNTER
READCYCLECOUNTER - This corresponds to the readcyclecounter intrinsic.
Definition: ISDOpcodes.h:1225
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition: ISDOpcodes.h:708
@ TRAP
TRAP - Trapping instruction.
Definition: ISDOpcodes.h:1251
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition: ISDOpcodes.h:190
@ SCMP
[US]CMP - 3-way comparison of signed or unsigned integers.
Definition: ISDOpcodes.h:704
@ VECREDUCE_FMUL
Definition: ISDOpcodes.h:1398
@ STRICT_FADD
Constrained versions of the binary floating point operators.
Definition: ISDOpcodes.h:407
@ FREEZE
FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or is evaluated to UNDEF),...
Definition: ISDOpcodes.h:223
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition: ISDOpcodes.h:538
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition: ISDOpcodes.h:52
@ VECTOR_SPLICE
VECTOR_SPLICE(VEC1, VEC2, IMM) - Returns a subvector of the same type as VEC1/VEC2 from CONCAT_VECTOR...
Definition: ISDOpcodes.h:626
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
Definition: ISDOpcodes.h:1305
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
Definition: ISDOpcodes.h:981
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition: ISDOpcodes.h:899
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
Definition: ISDOpcodes.h:668
@ SPONENTRY
SPONENTRY - Represents the llvm.sponentry intrinsic.
Definition: ISDOpcodes.h:112
@ CONVERGENCECTRL_LOOP
Definition: ISDOpcodes.h:1437
@ INLINEASM
INLINEASM - Represents an inline asm block.
Definition: ISDOpcodes.h:1137
@ FP_TO_SINT_SAT
FP_TO_[US]INT_SAT - Convert floating point value in operand 0 to a signed or unsigned scalar integer ...
Definition: ISDOpcodes.h:885
@ VECREDUCE_FMINIMUM
Definition: ISDOpcodes.h:1405
@ EH_SJLJ_SETJMP
RESULT, OUTCHAIN = EH_SJLJ_SETJMP(INCHAIN, buffer) This corresponds to the eh.sjlj....
Definition: ISDOpcodes.h:147
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition: ISDOpcodes.h:816
@ BRCOND
BRCOND - Conditional branch.
Definition: ISDOpcodes.h:1113
@ VECREDUCE_SEQ_FMUL
Definition: ISDOpcodes.h:1383
@ CATCHRET
CATCHRET - Represents a return from a catch block funclet.
Definition: ISDOpcodes.h:1156
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition: ISDOpcodes.h:61
@ ATOMIC_LOAD_UINC_WRAP
Definition: ISDOpcodes.h:1321
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition: ISDOpcodes.h:507
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition: ISDOpcodes.h:347
@ AssertZext
Definition: ISDOpcodes.h:62
@ VECTOR_DEINTERLEAVE
VECTOR_DEINTERLEAVE(VEC1, VEC2) - Returns two vectors with all input and output vectors having the sa...
Definition: ISDOpcodes.h:594
@ GET_DYNAMIC_AREA_OFFSET
GET_DYNAMIC_AREA_OFFSET - get offset from native SP to the address of the most recent dynamic alloca.
Definition: ISDOpcodes.h:1363
@ ADJUST_TRAMPOLINE
ADJUST_TRAMPOLINE - This corresponds to the adjust_trampoline intrinsic.
Definition: ISDOpcodes.h:1248
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition: ISDOpcodes.h:198
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition: ISDOpcodes.h:529
MemIndexType
MemIndexType enum - This enum defines how to interpret MGATHER/SCATTER's index parameter when calcula...
Definition: ISDOpcodes.h:1540
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
Definition: ISDOpcodes.h:1578
Flag
These should be considered private to the implementation of the MCInstrDesc class.
Definition: MCInstrDesc.h:148
bool match(Val *V, const Pattern &P)
Definition: PatternMatch.h:49
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
Definition: PatternMatch.h:875
TwoOps_match< Val_t, Idx_t, Instruction::ExtractElement > m_ExtractElt(const Val_t &Val, const Idx_t &Idx)
Matches ExtractElementInst.
OneUse_match< T > m_OneUse(const T &SubPattern)
Definition: PatternMatch.h:67
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
VScaleVal_match m_VScale()
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
Definition: PatternMatch.h:92
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
BinaryOp_match< cst_pred_ty< is_all_ones >, ValTy, Instruction::Xor, true > m_Not(const ValTy &V)
Matches a 'Not' as 'xor V, -1' or 'xor -1, V'.
Offsets
Offsets in bytes from the start of the input buffer.
Definition: SIInstrInfo.h:1581
std::vector< CaseCluster > CaseClusterVector
void sortAndRangeify(CaseClusterVector &Clusters)
Sort Clusters and merge adjacent cases.
CaseClusterVector::iterator CaseClusterIt
std::pair< JumpTableHeader, JumpTable > JumpTableBlock
@ CC_Range
A cluster of adjacent case labels with the same destination, or just one case.
@ CC_JumpTable
A cluster of cases suitable for jump table lowering.
@ CC_BitTests
A cluster of cases suitable for bit test lowering.
Reg
All possible values of the reg field in the ModR/M byte.
@ ReallyHidden
Definition: CommandLine.h:138
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:443
LocationClass< Ty > location(Ty &L)
Definition: CommandLine.h:463
@ DW_OP_LLVM_arg
Only used in LLVM metadata.
Definition: Dwarf.h:147
ExceptionBehavior
Exception behavior used for floating point operations.
Definition: FPEnv.h:38
@ ebStrict
This corresponds to "fpexcept.strict".
Definition: FPEnv.h:41
@ ebMayTrap
This corresponds to "fpexcept.maytrap".
Definition: FPEnv.h:40
@ ebIgnore
This corresponds to "fpexcept.ignore".
Definition: FPEnv.h:39
constexpr float log2ef
Definition: MathExtras.h:66
constexpr double e
Definition: MathExtras.h:47
constexpr float ln2f
Definition: MathExtras.h:64
NodeAddr< FuncNode * > Func
Definition: RDFGraph.h:393
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition: MathExtras.h:353
@ Offset
Definition: DWP.cpp:480
@ Length
Definition: DWP.cpp:480
ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred)
getICmpCondCode - Return the ISD condition code corresponding to the given LLVM IR integer condition ...
Definition: Analysis.cpp:233
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1722
int popcount(T Value) noexcept
Count the number of set bits in a value.
Definition: bit.h:385
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
Definition: STLExtras.h:1680
void GetReturnInfo(CallingConv::ID CC, Type *ReturnType, AttributeList attr, SmallVectorImpl< ISD::OutputArg > &Outs, const TargetLowering &TLI, const DataLayout &DL)
Given an LLVM IR type and return type attributes, compute the return value EVTs and flags,...
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition: MathExtras.h:255
bool isOnlyUsedInZeroEqualityComparison(const Instruction *CxtI)
SDValue peekThroughBitcasts(SDValue V)
Return the non-bitcasted source operand of V if it exists.
@ Done
Definition: Threading.h:61
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition: bit.h:307
void diagnoseDontCall(const CallInst &CI)
auto successors(const MachineBasicBlock *BB)
bool isIntOrFPConstant(SDValue V)
Return true if V is either a integer or FP constant.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition: STLExtras.h:2067
Value * GetPointerBaseWithConstantOffset(Value *Ptr, int64_t &Offset, const DataLayout &DL, bool AllowNonInbounds=true)
Analyze the specified pointer to see if it can be expressed as a base pointer plus a constant offset.
constexpr T alignDown(U Value, V Align, W Skew=0)
Returns the largest unsigned integer less than or equal to Value and is Skew mod Align.
Definition: MathExtras.h:547
gep_type_iterator gep_type_end(const User *GEP)
ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
bool isScopedEHPersonality(EHPersonality Pers)
Returns true if this personality uses scope-style EH IR instructions: catchswitch,...
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition: bit.h:215
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1729
llvm::SmallVector< int, 16 > createStrideMask(unsigned Start, unsigned Stride, unsigned VF)
Create a stride shuffle mask.
@ SPF_ABS
Floating point maxnum.
@ SPF_NABS
Absolute value.
@ SPF_FMAXNUM
Floating point minnum.
@ SPF_UMIN
Signed minimum.
@ SPF_UMAX
Signed maximum.
@ SPF_SMAX
Unsigned minimum.
@ SPF_FMINNUM
Unsigned maximum.
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
detail::zippy< detail::zip_first, T, U, Args... > zip_first(T &&t, U &&u, Args &&...args)
zip iterator that, for the sake of efficiency, assumes the first iteratee to be the shortest.
Definition: STLExtras.h:876
void sort(IteratorTy Start, IteratorTy End)
Definition: STLExtras.h:1647
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
SelectPatternResult matchSelectPattern(Value *V, Value *&LHS, Value *&RHS, Instruction::CastOps *CastOp=nullptr, unsigned Depth=0)
Pattern match integer [SU]MIN, [SU]MAX and ABS idioms, returning the kind and providing the out param...
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:163
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:167
bool hasSingleElement(ContainerTy &&C)
Returns true if the given container only contains a single element.
Definition: STLExtras.h:322
ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
ISD::CondCode getFCmpCondCode(FCmpInst::Predicate Pred)
getFCmpCondCode - Return the ISD condition code corresponding to the given LLVM IR floating-point con...
Definition: Analysis.cpp:199
EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
Value * salvageDebugInfoImpl(Instruction &I, uint64_t CurrentLocOps, SmallVectorImpl< uint64_t > &Ops, SmallVectorImpl< Value * > &AdditionalValues)
Definition: Local.cpp:2545
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Global
Append to llvm.global_dtors.
AtomicOrdering
Atomic ordering for LLVM's memory model.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
bool isFuncletEHPersonality(EHPersonality Pers)
Returns true if this is a personality function that invokes handler funclets (which must return to it...
bool isAssignmentTrackingEnabled(const Module &M)
Return true if assignment tracking is enabled for module M.
Definition: DebugInfo.cpp:2242
llvm::SmallVector< int, 16 > createInterleaveMask(unsigned VF, unsigned NumVecs)
Create an interleave shuffle mask.
@ UMin
Unsigned integer min implemented in terms of select(cmp()).
@ Or
Bitwise or logical OR of integers.
@ Mul
Product of integers.
@ And
Bitwise or logical AND of integers.
@ Add
Sum of integers.
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition: Alignment.h:155
@ SPNB_RETURNS_NAN
NaN behavior not applicable.
@ SPNB_RETURNS_OTHER
Given one NaN input, returns the NaN.
@ SPNB_RETURNS_ANY
Given one NaN input, returns the non-NaN.
bool isInTailCallPosition(const CallBase &Call, const TargetMachine &TM, bool ReturnsFirstArg=false)
Test if the given instruction is in a position to be optimized with a tail-call.
Definition: Analysis.cpp:535
DWARFExpression::Operation Op
ISD::CondCode getFCmpCodeWithoutNaN(ISD::CondCode CC)
getFCmpCodeWithoutNaN - Given an ISD condition code comparing floats, return the equivalent code if w...
Definition: Analysis.cpp:221
void ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, Type *Ty, SmallVectorImpl< EVT > &ValueVTs, SmallVectorImpl< EVT > *MemVTs, SmallVectorImpl< TypeSize > *Offsets=nullptr, TypeSize StartingOffset=TypeSize::getZero())
ComputeValueVTs - Given an LLVM IR type, compute a sequence of EVTs that represent all the individual...
Definition: Analysis.cpp:79
bool isAsynchronousEHPersonality(EHPersonality Pers)
Returns true if this personality function catches asynchronous exceptions.
std::optional< RoundingMode > convertStrToRoundingMode(StringRef)
Returns a valid RoundingMode enumerator when given a string that is valid as input in constrained int...
Definition: FPEnv.cpp:24
gep_type_iterator gep_type_begin(const User *GEP)
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
Definition: STLExtras.h:2051
GlobalValue * ExtractTypeInfo(Value *V)
ExtractTypeInfo - Returns the type info, possibly bitcast, encoded in V.
Definition: Analysis.cpp:177
void getUnderlyingObjects(const Value *V, SmallVectorImpl< const Value * > &Objects, const LoopInfo *LI=nullptr, unsigned MaxLookup=6)
This method is similar to getUnderlyingObject except that it can look through phi and select instruct...
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition: Alignment.h:212
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
Definition: STLExtras.h:2039
Constant * ConstantFoldLoadFromConstPtr(Constant *C, Type *Ty, APInt Offset, const DataLayout &DL)
Return the value that a load from C with offset Offset would produce if it is constant and determinab...
unsigned succ_size(const MachineBasicBlock *BB)
unsigned ComputeLinearIndex(Type *Ty, const unsigned *Indices, const unsigned *IndicesEnd, unsigned CurIndex=0)
Compute the linearized index of a member in a nested aggregate/struct/array.
Definition: Analysis.cpp:33
T bit_floor(T Value)
Returns the largest integral power of two no greater than Value if Value is nonzero.
Definition: bit.h:327
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition: BitVector.h:860
#define N
#define NC
Definition: regutils.h:42
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition: Metadata.h:760
static const fltSemantics & IEEEsingle() LLVM_READNONE
Definition: APFloat.cpp:276
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39
uint64_t value() const
This is a hole in the type system and should not be abused.
Definition: Alignment.h:85
Extended Value Type.
Definition: ValueTypes.h:34
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
Definition: ValueTypes.h:380
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
Definition: ValueTypes.h:73
uint64_t getScalarStoreSize() const
Definition: ValueTypes.h:387
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition: ValueTypes.h:274
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition: ValueTypes.h:290
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition: ValueTypes.h:146
ElementCount getVectorElementCount() const
Definition: ValueTypes.h:340
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition: ValueTypes.h:358
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition: ValueTypes.h:349
uint64_t getScalarSizeInBits() const
Definition: ValueTypes.h:370
static EVT getEVT(Type *Ty, bool HandleUnknown=false)
Return the value type corresponding to the specified type.
Definition: ValueTypes.cpp:274
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition: ValueTypes.h:306
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition: ValueTypes.h:64
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
Definition: ValueTypes.h:366
bool isFixedLengthVector() const
Definition: ValueTypes.h:177
bool isVector() const
Return true if this is a vector value type.
Definition: ValueTypes.h:167
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition: ValueTypes.h:313
bool bitsGE(EVT VT) const
Return true if this has no less bits than VT.
Definition: ValueTypes.h:282
Type * getTypeForEVT(LLVMContext &Context) const
This method returns an LLVM type corresponding to the specified EVT.
Definition: ValueTypes.cpp:203
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
Definition: ValueTypes.h:173
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition: ValueTypes.h:318
bool isScalarInteger() const
Return true if this is an integer, but not a vector.
Definition: ValueTypes.h:156
EVT changeVectorElementType(EVT EltVT) const
Return a VT for a vector type whose attributes match ourselves with the exception of the element type...
Definition: ValueTypes.h:101
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition: ValueTypes.h:326
EVT getHalfNumVectorElementsVT(LLVMContext &Context) const
Definition: ValueTypes.h:438
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition: ValueTypes.h:151
void setPointerAddrSpace(unsigned AS)
InputArg - This struct carries flags and type information about a single incoming (formal) argument o...
static const unsigned NoArgIndex
Sentinel value for implicit machine-level input arguments.
OutputArg - This struct carries flags and a value for a single outgoing (actual) argument or outgoing...
ConstraintPrefix Type
Type - The basic type of the constraint: input/output/clobber/label.
Definition: InlineAsm.h:126
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
Definition: KnownBits.h:237
This class contains a discriminated union of information about pointers in memory operands,...
static MachinePointerInfo getUnknownStack(MachineFunction &MF)
Stack memory without other information.
static MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition: Alignment.h:117
Align valueOrOne() const
For convenience, returns a valid alignment or 1 if undefined.
Definition: Alignment.h:141
This struct represents the registers (physical or virtual) that a particular set of values is assigne...
SmallVector< unsigned, 4 > Regs
This list holds the registers assigned to the values.
RegsForValue()=default
SmallVector< unsigned, 4 > RegCount
This list holds the number of registers for each value.
SmallVector< EVT, 4 > ValueVTs
The value types of the values, which may not be legal, and may need be promoted or synthesized from o...
SmallVector< std::pair< unsigned, TypeSize >, 4 > getRegsAndSizes() const
Return a list of registers and their sizes.
void AddInlineAsmOperands(InlineAsm::Kind Code, bool HasMatching, unsigned MatchingIdx, const SDLoc &dl, SelectionDAG &DAG, std::vector< SDValue > &Ops) const
Add this value to the specified inlineasm node operand list.
SDValue getCopyFromRegs(SelectionDAG &DAG, FunctionLoweringInfo &FuncInfo, const SDLoc &dl, SDValue &Chain, SDValue *Glue, const Value *V=nullptr) const
Emit a series of CopyFromReg nodes that copies from this value and returns the result as a ValueVTs v...
SmallVector< MVT, 4 > RegVTs
The value types of the registers.
void getCopyToRegs(SDValue Val, SelectionDAG &DAG, const SDLoc &dl, SDValue &Chain, SDValue *Glue, const Value *V=nullptr, ISD::NodeType PreferredExtendType=ISD::ANY_EXTEND) const
Emit a series of CopyToReg nodes that copies the specified value into the registers specified by this...
std::optional< CallingConv::ID > CallConv
Records if this value needs to be treated in an ABI dependant manner, different to normal type legali...
bool occupiesMultipleRegs() const
Check if the total RegCount is greater than one.
These are IR-level optimization flags that may be propagated to SDNodes.
void copyFMF(const FPMathOperator &FPMO)
Propagate the fast-math-flags from an IR FPMathOperator.
bool hasAllowReassociation() const
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
A MapVector that performs no allocations if smaller than a certain size.
Definition: MapVector.h:254
This structure is used to communicate between SelectionDAGBuilder and SDISel for the code generation ...
SDLoc DL
The debug location of the instruction this CaseBlock was produced from.
A cluster of case labels.
static CaseCluster range(const ConstantInt *Low, const ConstantInt *High, MachineBasicBlock *MBB, BranchProbability Prob)
This contains information for each constraint that we are lowering.
TargetLowering::ConstraintType ConstraintType
Information about the constraint code, e.g.
This structure contains all information that is necessary for lowering calls.
CallLoweringInfo & setConvergent(bool Value=true)
CallLoweringInfo & setCFIType(const ConstantInt *Type)
SmallVector< ISD::InputArg, 32 > Ins
CallLoweringInfo & setDiscardResult(bool Value=true)
CallLoweringInfo & setIsPatchPoint(bool Value=true)
CallLoweringInfo & setDebugLoc(const SDLoc &dl)
CallLoweringInfo & setTailCall(bool Value=true)
CallLoweringInfo & setIsPreallocated(bool Value=true)
CallLoweringInfo & setConvergenceControlToken(SDValue Token)
SmallVector< ISD::OutputArg, 32 > Outs
SmallVector< SDValue, 32 > OutVals
CallLoweringInfo & setChain(SDValue InChain)
CallLoweringInfo & setPtrAuth(PtrAuthInfo Value)
CallLoweringInfo & setCallee(CallingConv::ID CC, Type *ResultType, SDValue Target, ArgListTy &&ArgsList, AttributeSet ResultAttrs={})
This structure is used to pass arguments to makeLibCall function.
MakeLibCallOptions & setDiscardResult(bool Value=true)
This structure contains the information necessary for lowering pointer-authenticating indirect calls.
void addIPToStateRange(const InvokeInst *II, MCSymbol *InvokeBegin, MCSymbol *InvokeEnd)