LLVM 23.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"
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"
105#include <cstddef>
106#include <limits>
107#include <optional>
108#include <tuple>
109
110using namespace llvm;
111using namespace PatternMatch;
112using namespace SwitchCG;
113
114#define DEBUG_TYPE "isel"
115
116/// LimitFloatPrecision - Generate low-precision inline sequences for
117/// some float libcalls (6, 8 or 12 bits).
118static unsigned LimitFloatPrecision;
119
120static cl::opt<bool>
121 InsertAssertAlign("insert-assert-align", cl::init(true),
122 cl::desc("Insert the experimental `assertalign` node."),
124
126 LimitFPPrecision("limit-float-precision",
127 cl::desc("Generate low-precision inline sequences "
128 "for some float libcalls"),
130 cl::init(0));
131
133 "switch-peel-threshold", cl::Hidden, cl::init(66),
134 cl::desc("Set the case probability threshold for peeling the case from a "
135 "switch statement. A value greater than 100 will void this "
136 "optimization"));
137
138// Limit the width of DAG chains. This is important in general to prevent
139// DAG-based analysis from blowing up. For example, alias analysis and
140// load clustering may not complete in reasonable time. It is difficult to
141// recognize and avoid this situation within each individual analysis, and
142// future analyses are likely to have the same behavior. Limiting DAG width is
143// the safe approach and will be especially important with global DAGs.
144//
145// MaxParallelChains default is arbitrarily high to avoid affecting
146// optimization, but could be lowered to improve compile time. Any ld-ld-st-st
147// sequence over this should have been converted to llvm.memcpy by the
148// frontend. It is easy to induce this behavior with .ll code such as:
149// %buffer = alloca [4096 x i8]
150// %data = load [4096 x i8]* %argPtr
151// store [4096 x i8] %data, [4096 x i8]* %buffer
152static const unsigned MaxParallelChains = 64;
153
155 const SDValue *Parts, unsigned NumParts,
156 MVT PartVT, EVT ValueVT, const Value *V,
157 SDValue InChain,
158 std::optional<CallingConv::ID> CC);
159
160/// getCopyFromParts - Create a value that contains the specified legal parts
161/// combined into the value they represent. If the parts combine to a type
162/// larger than ValueVT then AssertOp can be used to specify whether the extra
163/// bits are known to be zero (ISD::AssertZext) or sign extended from ValueVT
164/// (ISD::AssertSext).
165static SDValue
166getCopyFromParts(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts,
167 unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V,
168 SDValue InChain,
169 std::optional<CallingConv::ID> CC = std::nullopt,
170 std::optional<ISD::NodeType> AssertOp = std::nullopt) {
171 // Let the target assemble the parts if it wants to
172 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
173 if (SDValue Val = TLI.joinRegisterPartsIntoValue(DAG, DL, Parts, NumParts,
174 PartVT, ValueVT, CC))
175 return Val;
176
177 if (ValueVT.isVector())
178 return getCopyFromPartsVector(DAG, DL, Parts, NumParts, PartVT, ValueVT, V,
179 InChain, CC);
180
181 assert(NumParts > 0 && "No parts to assemble!");
182 SDValue Val = Parts[0];
183
184 if (NumParts > 1) {
185 // Assemble the value from multiple parts.
186 if (ValueVT.isInteger()) {
187 unsigned PartBits = PartVT.getSizeInBits();
188 unsigned ValueBits = ValueVT.getSizeInBits();
189
190 // Assemble the power of 2 part.
191 unsigned RoundParts = llvm::bit_floor(NumParts);
192 unsigned RoundBits = PartBits * RoundParts;
193 EVT RoundVT = RoundBits == ValueBits ?
194 ValueVT : EVT::getIntegerVT(*DAG.getContext(), RoundBits);
195 SDValue Lo, Hi;
196
197 EVT HalfVT = EVT::getIntegerVT(*DAG.getContext(), RoundBits/2);
198
199 if (RoundParts > 2) {
200 Lo = getCopyFromParts(DAG, DL, Parts, RoundParts / 2, PartVT, HalfVT, V,
201 InChain);
202 Hi = getCopyFromParts(DAG, DL, Parts + RoundParts / 2, RoundParts / 2,
203 PartVT, HalfVT, V, InChain);
204 } else {
205 Lo = DAG.getNode(ISD::BITCAST, DL, HalfVT, Parts[0]);
206 Hi = DAG.getNode(ISD::BITCAST, DL, HalfVT, Parts[1]);
207 }
208
209 if (DAG.getDataLayout().isBigEndian())
210 std::swap(Lo, Hi);
211
212 Val = DAG.getNode(ISD::BUILD_PAIR, DL, RoundVT, Lo, Hi);
213
214 if (RoundParts < NumParts) {
215 // Assemble the trailing non-power-of-2 part.
216 unsigned OddParts = NumParts - RoundParts;
217 EVT OddVT = EVT::getIntegerVT(*DAG.getContext(), OddParts * PartBits);
218 Hi = getCopyFromParts(DAG, DL, Parts + RoundParts, OddParts, PartVT,
219 OddVT, V, InChain, CC);
220
221 // Combine the round and odd parts.
222 Lo = Val;
223 if (DAG.getDataLayout().isBigEndian())
224 std::swap(Lo, Hi);
225 EVT TotalVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
226 Hi = DAG.getNode(ISD::ANY_EXTEND, DL, TotalVT, Hi);
227 Hi = DAG.getNode(
228 ISD::SHL, DL, TotalVT, Hi,
229 DAG.getShiftAmountConstant(Lo.getValueSizeInBits(), TotalVT, DL));
230 Lo = DAG.getNode(ISD::ZERO_EXTEND, DL, TotalVT, Lo);
231 Val = DAG.getNode(ISD::OR, DL, TotalVT, Lo, Hi);
232 }
233 } else if (PartVT.isFloatingPoint()) {
234 // FP split into multiple FP parts (for ppcf128)
235 assert(ValueVT == EVT(MVT::ppcf128) && PartVT == MVT::f64 &&
236 "Unexpected split");
237 SDValue Lo, Hi;
238 Lo = DAG.getNode(ISD::BITCAST, DL, EVT(MVT::f64), Parts[0]);
239 Hi = DAG.getNode(ISD::BITCAST, DL, EVT(MVT::f64), Parts[1]);
240 if (TLI.hasBigEndianPartOrdering(ValueVT, DAG.getDataLayout()))
241 std::swap(Lo, Hi);
242 Val = DAG.getNode(ISD::BUILD_PAIR, DL, ValueVT, Lo, Hi);
243 } else {
244 // FP split into integer parts (soft fp)
245 assert(ValueVT.isFloatingPoint() && PartVT.isInteger() &&
246 !PartVT.isVector() && "Unexpected split");
247 EVT IntVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
248 Val = getCopyFromParts(DAG, DL, Parts, NumParts, PartVT, IntVT, V,
249 InChain, CC);
250 }
251 }
252
253 // There is now one part, held in Val. Correct it to match ValueVT.
254 // PartEVT is the type of the register class that holds the value.
255 // ValueVT is the type of the inline asm operation.
256 EVT PartEVT = Val.getValueType();
257
258 if (PartEVT == ValueVT)
259 return Val;
260
261 if (PartEVT.isInteger() && ValueVT.isFloatingPoint() &&
262 ValueVT.bitsLT(PartEVT)) {
263 // For an FP value in an integer part, we need to truncate to the right
264 // width first.
265 PartEVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
266 Val = DAG.getNode(ISD::TRUNCATE, DL, PartEVT, Val);
267 }
268
269 // Handle types that have the same size.
270 if (PartEVT.getSizeInBits() == ValueVT.getSizeInBits())
271 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
272
273 // Handle types with different sizes.
274 if (PartEVT.isInteger() && ValueVT.isInteger()) {
275 if (ValueVT.bitsLT(PartEVT)) {
276 // For a truncate, see if we have any information to
277 // indicate whether the truncated bits will always be
278 // zero or sign-extension.
279 if (AssertOp)
280 Val = DAG.getNode(*AssertOp, DL, PartEVT, Val,
281 DAG.getValueType(ValueVT));
282 return DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
283 }
284 return DAG.getNode(ISD::ANY_EXTEND, DL, ValueVT, Val);
285 }
286
287 if (PartEVT.isFloatingPoint() && ValueVT.isFloatingPoint()) {
288 // FP_ROUND's are always exact here.
289 if (ValueVT.bitsLT(Val.getValueType())) {
290
291 SDValue NoChange =
293
294 if (DAG.getMachineFunction().getFunction().getAttributes().hasFnAttr(
295 llvm::Attribute::StrictFP)) {
296 return DAG.getNode(ISD::STRICT_FP_ROUND, DL,
297 DAG.getVTList(ValueVT, MVT::Other), InChain, Val,
298 NoChange);
299 }
300
301 return DAG.getNode(ISD::FP_ROUND, DL, ValueVT, Val, NoChange);
302 }
303
304 return DAG.getNode(ISD::FP_EXTEND, DL, ValueVT, Val);
305 }
306
307 // Handle MMX to a narrower integer type by bitcasting MMX to integer and
308 // then truncating.
309 if (PartEVT == MVT::x86mmx && ValueVT.isInteger() &&
310 ValueVT.bitsLT(PartEVT)) {
311 Val = DAG.getNode(ISD::BITCAST, DL, MVT::i64, Val);
312 return DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
313 }
314
315 report_fatal_error("Unknown mismatch in getCopyFromParts!");
316}
317
319 const Twine &ErrMsg) {
321 if (!I)
322 return Ctx.emitError(ErrMsg);
323
324 if (const CallInst *CI = dyn_cast<CallInst>(I))
325 if (CI->isInlineAsm()) {
326 return Ctx.diagnose(DiagnosticInfoInlineAsm(
327 *CI, ErrMsg + ", possible invalid constraint for vector type"));
328 }
329
330 return Ctx.emitError(I, ErrMsg);
331}
332
333/// getCopyFromPartsVector - Create a value that contains the specified legal
334/// parts combined into the value they represent. If the parts combine to a
335/// type larger than ValueVT then AssertOp can be used to specify whether the
336/// extra bits are known to be zero (ISD::AssertZext) or sign extended from
337/// ValueVT (ISD::AssertSext).
339 const SDValue *Parts, unsigned NumParts,
340 MVT PartVT, EVT ValueVT, const Value *V,
341 SDValue InChain,
342 std::optional<CallingConv::ID> CallConv) {
343 assert(ValueVT.isVector() && "Not a vector value");
344 assert(NumParts > 0 && "No parts to assemble!");
345 const bool IsABIRegCopy = CallConv.has_value();
346
347 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
348 SDValue Val = Parts[0];
349
350 // Handle a multi-element vector.
351 if (NumParts > 1) {
352 EVT IntermediateVT;
353 MVT RegisterVT;
354 unsigned NumIntermediates;
355 unsigned NumRegs;
356
357 if (IsABIRegCopy) {
359 *DAG.getContext(), *CallConv, ValueVT, IntermediateVT,
360 NumIntermediates, RegisterVT);
361 } else {
362 NumRegs =
363 TLI.getVectorTypeBreakdown(*DAG.getContext(), ValueVT, IntermediateVT,
364 NumIntermediates, RegisterVT);
365 }
366
367 assert(NumRegs == NumParts && "Part count doesn't match vector breakdown!");
368 NumParts = NumRegs; // Silence a compiler warning.
369 assert(RegisterVT == PartVT && "Part type doesn't match vector breakdown!");
370 assert(RegisterVT.getSizeInBits() ==
371 Parts[0].getSimpleValueType().getSizeInBits() &&
372 "Part type sizes don't match!");
373
374 // Assemble the parts into intermediate operands.
375 SmallVector<SDValue, 8> Ops(NumIntermediates);
376 if (NumIntermediates == NumParts) {
377 // If the register was not expanded, truncate or copy the value,
378 // as appropriate.
379 for (unsigned i = 0; i != NumParts; ++i)
380 Ops[i] = getCopyFromParts(DAG, DL, &Parts[i], 1, PartVT, IntermediateVT,
381 V, InChain, CallConv);
382 } else if (NumParts > 0) {
383 // If the intermediate type was expanded, build the intermediate
384 // operands from the parts.
385 assert(NumParts % NumIntermediates == 0 &&
386 "Must expand into a divisible number of parts!");
387 unsigned Factor = NumParts / NumIntermediates;
388 for (unsigned i = 0; i != NumIntermediates; ++i)
389 Ops[i] = getCopyFromParts(DAG, DL, &Parts[i * Factor], Factor, PartVT,
390 IntermediateVT, V, InChain, CallConv);
391 }
392
393 // Build a vector with BUILD_VECTOR or CONCAT_VECTORS from the
394 // intermediate operands.
395 EVT BuiltVectorTy =
396 IntermediateVT.isVector()
398 *DAG.getContext(), IntermediateVT.getScalarType(),
399 IntermediateVT.getVectorElementCount() * NumParts)
401 IntermediateVT.getScalarType(),
402 NumIntermediates);
403 Val = DAG.getNode(IntermediateVT.isVector() ? ISD::CONCAT_VECTORS
405 DL, BuiltVectorTy, Ops);
406 }
407
408 // There is now one part, held in Val. Correct it to match ValueVT.
409 EVT PartEVT = Val.getValueType();
410
411 if (PartEVT == ValueVT)
412 return Val;
413
414 if (PartEVT.isVector()) {
415 // Vector/Vector bitcast.
416 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits())
417 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
418
419 // If the parts vector has more elements than the value vector, then we
420 // have a vector widening case (e.g. <2 x float> -> <4 x float>).
421 // Extract the elements we want.
422 if (PartEVT.getVectorElementCount() != ValueVT.getVectorElementCount()) {
425 (PartEVT.getVectorElementCount().isScalable() ==
426 ValueVT.getVectorElementCount().isScalable()) &&
427 "Cannot narrow, it would be a lossy transformation");
428 PartEVT =
430 ValueVT.getVectorElementCount());
431 Val = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, PartEVT, Val,
432 DAG.getVectorIdxConstant(0, DL));
433 if (PartEVT == ValueVT)
434 return Val;
435 if (PartEVT.isInteger() && ValueVT.isFloatingPoint())
436 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
437
438 // Vector/Vector bitcast (e.g. <2 x bfloat> -> <2 x half>).
439 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits())
440 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
441 }
442
443 // Promoted vector extract
444 return DAG.getAnyExtOrTrunc(Val, DL, ValueVT);
445 }
446
447 // Trivial bitcast if the types are the same size and the destination
448 // vector type is legal.
449 if (PartEVT.getSizeInBits() == ValueVT.getSizeInBits() &&
450 TLI.isTypeLegal(ValueVT))
451 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
452
453 if (ValueVT.getVectorNumElements() != 1) {
454 // Certain ABIs require that vectors are passed as integers. For vectors
455 // are the same size, this is an obvious bitcast.
456 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits()) {
457 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
458 } else if (ValueVT.bitsLT(PartEVT)) {
459 const uint64_t ValueSize = ValueVT.getFixedSizeInBits();
460 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
461 // Drop the extra bits.
462 Val = DAG.getNode(ISD::TRUNCATE, DL, IntermediateType, Val);
463 return DAG.getBitcast(ValueVT, Val);
464 }
465
467 *DAG.getContext(), V, "non-trivial scalar-to-vector conversion");
468 return DAG.getUNDEF(ValueVT);
469 }
470
471 // Handle cases such as i8 -> <1 x i1>
472 EVT ValueSVT = ValueVT.getVectorElementType();
473 if (ValueVT.getVectorNumElements() == 1 && ValueSVT != PartEVT) {
474 unsigned ValueSize = ValueSVT.getSizeInBits();
475 if (ValueSize == PartEVT.getSizeInBits()) {
476 Val = DAG.getNode(ISD::BITCAST, DL, ValueSVT, Val);
477 } else if (ValueSVT.isFloatingPoint() && PartEVT.isInteger()) {
478 // It's possible a scalar floating point type gets softened to integer and
479 // then promoted to a larger integer. If PartEVT is the larger integer
480 // we need to truncate it and then bitcast to the FP type.
481 assert(ValueSVT.bitsLT(PartEVT) && "Unexpected types");
482 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
483 Val = DAG.getNode(ISD::TRUNCATE, DL, IntermediateType, Val);
484 Val = DAG.getBitcast(ValueSVT, Val);
485 } else {
486 Val = ValueVT.isFloatingPoint()
487 ? DAG.getFPExtendOrRound(Val, DL, ValueSVT)
488 : DAG.getAnyExtOrTrunc(Val, DL, ValueSVT);
489 }
490 }
491
492 return DAG.getBuildVector(ValueVT, DL, Val);
493}
494
495static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &dl,
496 SDValue Val, SDValue *Parts, unsigned NumParts,
497 MVT PartVT, const Value *V,
498 std::optional<CallingConv::ID> CallConv);
499
500/// getCopyToParts - Create a series of nodes that contain the specified value
501/// split into legal parts. If the parts contain more bits than Val, then, for
502/// integers, ExtendKind can be used to specify how to generate the extra bits.
503static void
505 unsigned NumParts, MVT PartVT, const Value *V,
506 std::optional<CallingConv::ID> CallConv = std::nullopt,
507 ISD::NodeType ExtendKind = ISD::ANY_EXTEND) {
508 // Let the target split the parts if it wants to
509 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
510 if (TLI.splitValueIntoRegisterParts(DAG, DL, Val, Parts, NumParts, PartVT,
511 CallConv))
512 return;
513 EVT ValueVT = Val.getValueType();
514
515 // Handle the vector case separately.
516 if (ValueVT.isVector())
517 return getCopyToPartsVector(DAG, DL, Val, Parts, NumParts, PartVT, V,
518 CallConv);
519
520 unsigned OrigNumParts = NumParts;
522 "Copying to an illegal type!");
523
524 if (NumParts == 0)
525 return;
526
527 assert(!ValueVT.isVector() && "Vector case handled elsewhere");
528 EVT PartEVT = PartVT;
529 if (PartEVT == ValueVT) {
530 assert(NumParts == 1 && "No-op copy with multiple parts!");
531 Parts[0] = Val;
532 return;
533 }
534
535 unsigned PartBits = PartVT.getSizeInBits();
536 if (NumParts * PartBits > ValueVT.getSizeInBits()) {
537 // If the parts cover more bits than the value has, promote the value.
538 if (PartVT.isFloatingPoint() && ValueVT.isFloatingPoint()) {
539 assert(NumParts == 1 && "Do not know what to promote to!");
540 Val = DAG.getNode(ISD::FP_EXTEND, DL, PartVT, Val);
541 } else {
542 if (ValueVT.isFloatingPoint()) {
543 // FP values need to be bitcast, then extended if they are being put
544 // into a larger container.
545 ValueVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
546 Val = DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
547 }
548 assert((PartVT.isInteger() || PartVT == MVT::x86mmx) &&
549 ValueVT.isInteger() &&
550 "Unknown mismatch!");
551 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
552 Val = DAG.getNode(ExtendKind, DL, ValueVT, Val);
553 if (PartVT == MVT::x86mmx)
554 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
555 }
556 } else if (PartBits == ValueVT.getSizeInBits()) {
557 // Different types of the same size.
558 assert(NumParts == 1 && PartEVT != ValueVT);
559 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
560 } else if (NumParts * PartBits < ValueVT.getSizeInBits()) {
561 // If the parts cover less bits than value has, truncate the value.
562 assert((PartVT.isInteger() || PartVT == MVT::x86mmx) &&
563 ValueVT.isInteger() &&
564 "Unknown mismatch!");
565 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
566 Val = DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
567 if (PartVT == MVT::x86mmx)
568 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
569 }
570
571 // The value may have changed - recompute ValueVT.
572 ValueVT = Val.getValueType();
573 assert(NumParts * PartBits == ValueVT.getSizeInBits() &&
574 "Failed to tile the value with PartVT!");
575
576 if (NumParts == 1) {
577 if (PartEVT != ValueVT) {
579 "scalar-to-vector conversion failed");
580 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
581 }
582
583 Parts[0] = Val;
584 return;
585 }
586
587 // Expand the value into multiple parts.
588 if (NumParts & (NumParts - 1)) {
589 // The number of parts is not a power of 2. Split off and copy the tail.
590 assert(PartVT.isInteger() && ValueVT.isInteger() &&
591 "Do not know what to expand to!");
592 unsigned RoundParts = llvm::bit_floor(NumParts);
593 unsigned RoundBits = RoundParts * PartBits;
594 unsigned OddParts = NumParts - RoundParts;
595 SDValue OddVal = DAG.getNode(ISD::SRL, DL, ValueVT, Val,
596 DAG.getShiftAmountConstant(RoundBits, ValueVT, DL));
597
598 getCopyToParts(DAG, DL, OddVal, Parts + RoundParts, OddParts, PartVT, V,
599 CallConv);
600
601 if (DAG.getDataLayout().isBigEndian())
602 // The odd parts were reversed by getCopyToParts - unreverse them.
603 std::reverse(Parts + RoundParts, Parts + NumParts);
604
605 NumParts = RoundParts;
606 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
607 Val = DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
608 }
609
610 // The number of parts is a power of 2. Repeatedly bisect the value using
611 // EXTRACT_ELEMENT.
612 Parts[0] = DAG.getNode(ISD::BITCAST, DL,
614 ValueVT.getSizeInBits()),
615 Val);
616
617 for (unsigned StepSize = NumParts; StepSize > 1; StepSize /= 2) {
618 for (unsigned i = 0; i < NumParts; i += StepSize) {
619 unsigned ThisBits = StepSize * PartBits / 2;
620 EVT ThisVT = EVT::getIntegerVT(*DAG.getContext(), ThisBits);
621 SDValue &Part0 = Parts[i];
622 SDValue &Part1 = Parts[i+StepSize/2];
623
624 Part1 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL,
625 ThisVT, Part0, DAG.getIntPtrConstant(1, DL));
626 Part0 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL,
627 ThisVT, Part0, DAG.getIntPtrConstant(0, DL));
628
629 if (ThisBits == PartBits && ThisVT != PartVT) {
630 Part0 = DAG.getNode(ISD::BITCAST, DL, PartVT, Part0);
631 Part1 = DAG.getNode(ISD::BITCAST, DL, PartVT, Part1);
632 }
633 }
634 }
635
636 if (DAG.getDataLayout().isBigEndian())
637 std::reverse(Parts, Parts + OrigNumParts);
638}
639
641 const SDLoc &DL, EVT PartVT) {
642 if (!PartVT.isVector())
643 return SDValue();
644
645 EVT ValueVT = Val.getValueType();
646 EVT PartEVT = PartVT.getVectorElementType();
647 EVT ValueEVT = ValueVT.getVectorElementType();
648 ElementCount PartNumElts = PartVT.getVectorElementCount();
649 ElementCount ValueNumElts = ValueVT.getVectorElementCount();
650
651 // We only support widening vectors with equivalent element types and
652 // fixed/scalable properties. If a target needs to widen a fixed-length type
653 // to a scalable one, it should be possible to use INSERT_SUBVECTOR below.
654 if (ElementCount::isKnownLE(PartNumElts, ValueNumElts) ||
655 PartNumElts.isScalable() != ValueNumElts.isScalable())
656 return SDValue();
657
658 // Have a try for bf16 because some targets share its ABI with fp16.
659 if (ValueEVT == MVT::bf16 && PartEVT == MVT::f16) {
661 "Cannot widen to illegal type");
662 Val = DAG.getNode(
664 ValueVT.changeVectorElementType(*DAG.getContext(), MVT::f16), Val);
665 } else if (PartEVT != ValueEVT) {
666 return SDValue();
667 }
668
669 // Widening a scalable vector to another scalable vector is done by inserting
670 // the vector into a larger undef one.
671 if (PartNumElts.isScalable())
672 return DAG.getNode(ISD::INSERT_SUBVECTOR, DL, PartVT, DAG.getUNDEF(PartVT),
673 Val, DAG.getVectorIdxConstant(0, DL));
674
675 // Vector widening case, e.g. <2 x float> -> <4 x float>. Shuffle in
676 // undef elements.
678 DAG.ExtractVectorElements(Val, Ops);
679 SDValue EltUndef = DAG.getUNDEF(PartEVT);
680 Ops.append((PartNumElts - ValueNumElts).getFixedValue(), EltUndef);
681
682 // FIXME: Use CONCAT for 2x -> 4x.
683 return DAG.getBuildVector(PartVT, DL, Ops);
684}
685
686/// getCopyToPartsVector - Create a series of nodes that contain the specified
687/// value split into legal parts.
688static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &DL,
689 SDValue Val, SDValue *Parts, unsigned NumParts,
690 MVT PartVT, const Value *V,
691 std::optional<CallingConv::ID> CallConv) {
692 EVT ValueVT = Val.getValueType();
693 assert(ValueVT.isVector() && "Not a vector");
694 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
695 const bool IsABIRegCopy = CallConv.has_value();
696
697 if (NumParts == 1) {
698 EVT PartEVT = PartVT;
699 if (PartEVT == ValueVT) {
700 // Nothing to do.
701 } else if (PartVT.getSizeInBits() == ValueVT.getSizeInBits()) {
702 // Bitconvert vector->vector case.
703 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
704 } else if (SDValue Widened = widenVectorToPartType(DAG, Val, DL, PartVT)) {
705 Val = Widened;
706 } else if (PartVT.isVector() &&
708 ValueVT.getVectorElementType()) &&
709 PartEVT.getVectorElementCount() ==
710 ValueVT.getVectorElementCount()) {
711
712 // Promoted vector extract
713 Val = DAG.getAnyExtOrTrunc(Val, DL, PartVT);
714 } else if (PartEVT.isVector() &&
715 PartEVT.getVectorElementType() !=
716 ValueVT.getVectorElementType() &&
717 TLI.getTypeAction(*DAG.getContext(), ValueVT) ==
719 // Combination of widening and promotion.
720 EVT WidenVT =
722 PartVT.getVectorElementCount());
723 SDValue Widened = widenVectorToPartType(DAG, Val, DL, WidenVT);
724 Val = DAG.getAnyExtOrTrunc(Widened, DL, PartVT);
725 } else {
726 // Don't extract an integer from a float vector. This can happen if the
727 // FP type gets softened to integer and then promoted. The promotion
728 // prevents it from being picked up by the earlier bitcast case.
729 if (ValueVT.getVectorElementCount().isScalar() &&
730 (!ValueVT.isFloatingPoint() || !PartVT.isInteger())) {
731 // If we reach this condition and PartVT is FP, this means that
732 // ValueVT is also FP and both have a different size, otherwise we
733 // would have bitcasted them. Producing an EXTRACT_VECTOR_ELT here
734 // would be invalid since that would mean the smaller FP type has to
735 // be extended to the larger one.
736 if (PartVT.isFloatingPoint()) {
737 Val = DAG.getBitcast(ValueVT.getScalarType(), Val);
738 Val = DAG.getNode(ISD::FP_EXTEND, DL, PartVT, Val);
739 } else
740 Val = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, PartVT, Val,
741 DAG.getVectorIdxConstant(0, DL));
742 } else {
743 uint64_t ValueSize = ValueVT.getFixedSizeInBits();
744 assert(PartVT.getFixedSizeInBits() > ValueSize &&
745 "lossy conversion of vector to scalar type");
746 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
747 Val = DAG.getBitcast(IntermediateType, Val);
748 Val = DAG.getAnyExtOrTrunc(Val, DL, PartVT);
749 }
750 }
751
752 assert(Val.getValueType() == PartVT && "Unexpected vector part value type");
753 Parts[0] = Val;
754 return;
755 }
756
757 // Handle a multi-element vector.
758 EVT IntermediateVT;
759 MVT RegisterVT;
760 unsigned NumIntermediates;
761 unsigned NumRegs;
762 if (IsABIRegCopy) {
764 *DAG.getContext(), *CallConv, ValueVT, IntermediateVT, NumIntermediates,
765 RegisterVT);
766 } else {
767 NumRegs =
768 TLI.getVectorTypeBreakdown(*DAG.getContext(), ValueVT, IntermediateVT,
769 NumIntermediates, RegisterVT);
770 }
771
772 assert(NumRegs == NumParts && "Part count doesn't match vector breakdown!");
773 NumParts = NumRegs; // Silence a compiler warning.
774 assert(RegisterVT == PartVT && "Part type doesn't match vector breakdown!");
775
776 assert(IntermediateVT.isScalableVector() == ValueVT.isScalableVector() &&
777 "Mixing scalable and fixed vectors when copying in parts");
778
779 std::optional<ElementCount> DestEltCnt;
780
781 if (IntermediateVT.isVector())
782 DestEltCnt = IntermediateVT.getVectorElementCount() * NumIntermediates;
783 else
784 DestEltCnt = ElementCount::getFixed(NumIntermediates);
785
786 EVT BuiltVectorTy = EVT::getVectorVT(
787 *DAG.getContext(), IntermediateVT.getScalarType(), *DestEltCnt);
788
789 if (ValueVT == BuiltVectorTy) {
790 // Nothing to do.
791 } else if (ValueVT.getSizeInBits() == BuiltVectorTy.getSizeInBits()) {
792 // Bitconvert vector->vector case.
793 Val = DAG.getNode(ISD::BITCAST, DL, BuiltVectorTy, Val);
794 } else {
795 if (BuiltVectorTy.getVectorElementType().bitsGT(
796 ValueVT.getVectorElementType())) {
797 // Integer promotion.
798 ValueVT = EVT::getVectorVT(*DAG.getContext(),
799 BuiltVectorTy.getVectorElementType(),
800 ValueVT.getVectorElementCount());
801 Val = DAG.getNode(ISD::ANY_EXTEND, DL, ValueVT, Val);
802 }
803
804 if (SDValue Widened = widenVectorToPartType(DAG, Val, DL, BuiltVectorTy)) {
805 Val = Widened;
806 }
807 }
808
809 assert(Val.getValueType() == BuiltVectorTy && "Unexpected vector value type");
810
811 // Split the vector into intermediate operands.
812 SmallVector<SDValue, 8> Ops(NumIntermediates);
813 for (unsigned i = 0; i != NumIntermediates; ++i) {
814 if (IntermediateVT.isVector()) {
815 // This does something sensible for scalable vectors - see the
816 // definition of EXTRACT_SUBVECTOR for further details.
817 unsigned IntermediateNumElts = IntermediateVT.getVectorMinNumElements();
818 Ops[i] =
819 DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, IntermediateVT, Val,
820 DAG.getVectorIdxConstant(i * IntermediateNumElts, DL));
821 } else {
822 Ops[i] = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, IntermediateVT, Val,
823 DAG.getVectorIdxConstant(i, DL));
824 }
825 }
826
827 // Split the intermediate operands into legal parts.
828 if (NumParts == NumIntermediates) {
829 // If the register was not expanded, promote or copy the value,
830 // as appropriate.
831 for (unsigned i = 0; i != NumParts; ++i)
832 getCopyToParts(DAG, DL, Ops[i], &Parts[i], 1, PartVT, V, CallConv);
833 } else if (NumParts > 0) {
834 // If the intermediate type was expanded, split each the value into
835 // legal parts.
836 assert(NumIntermediates != 0 && "division by zero");
837 assert(NumParts % NumIntermediates == 0 &&
838 "Must expand into a divisible number of parts!");
839 unsigned Factor = NumParts / NumIntermediates;
840 for (unsigned i = 0; i != NumIntermediates; ++i)
841 getCopyToParts(DAG, DL, Ops[i], &Parts[i * Factor], Factor, PartVT, V,
842 CallConv);
843 }
844}
845
846static void failForInvalidBundles(const CallBase &I, StringRef Name,
847 ArrayRef<uint32_t> AllowedBundles) {
848 if (I.hasOperandBundlesOtherThan(AllowedBundles)) {
849 ListSeparator LS;
850 std::string Error;
852 for (unsigned i = 0, e = I.getNumOperandBundles(); i != e; ++i) {
853 OperandBundleUse U = I.getOperandBundleAt(i);
854 if (!is_contained(AllowedBundles, U.getTagID()))
855 OS << LS << U.getTagName();
856 }
858 Twine("cannot lower ", Name)
859 .concat(Twine(" with arbitrary operand bundles: ", Error)));
860 }
861}
862
864 EVT valuevt, std::optional<CallingConv::ID> CC)
865 : ValueVTs(1, valuevt), RegVTs(1, regvt), Regs(regs),
866 RegCount(1, regs.size()), CallConv(CC) {}
867
869 const DataLayout &DL, Register Reg, Type *Ty,
870 std::optional<CallingConv::ID> CC) {
871 ComputeValueVTs(TLI, DL, Ty, ValueVTs);
872
873 CallConv = CC;
874
875 for (EVT ValueVT : ValueVTs) {
876 unsigned NumRegs =
878 ? TLI.getNumRegistersForCallingConv(Context, *CC, ValueVT)
879 : TLI.getNumRegisters(Context, ValueVT);
880 MVT RegisterVT =
882 ? TLI.getRegisterTypeForCallingConv(Context, *CC, ValueVT)
883 : TLI.getRegisterType(Context, ValueVT);
884 for (unsigned i = 0; i != NumRegs; ++i)
885 Regs.push_back(Reg + i);
886 RegVTs.push_back(RegisterVT);
887 RegCount.push_back(NumRegs);
888 Reg = Reg.id() + NumRegs;
889 }
890}
891
893 FunctionLoweringInfo &FuncInfo,
894 const SDLoc &dl, SDValue &Chain,
895 SDValue *Glue, const Value *V) const {
896 // A Value with type {} or [0 x %t] needs no registers.
897 if (ValueVTs.empty())
898 return SDValue();
899
900 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
901
902 // Assemble the legal parts into the final values.
903 SmallVector<SDValue, 4> Values(ValueVTs.size());
905 for (unsigned Value = 0, Part = 0, e = ValueVTs.size(); Value != e; ++Value) {
906 // Copy the legal parts from the registers.
907 EVT ValueVT = ValueVTs[Value];
908 unsigned NumRegs = RegCount[Value];
909 MVT RegisterVT = isABIMangled()
911 *DAG.getContext(), *CallConv, RegVTs[Value])
912 : RegVTs[Value];
913
914 Parts.resize(NumRegs);
915 for (unsigned i = 0; i != NumRegs; ++i) {
916 SDValue P;
917 if (!Glue) {
918 P = DAG.getCopyFromReg(Chain, dl, Regs[Part+i], RegisterVT);
919 } else {
920 P = DAG.getCopyFromReg(Chain, dl, Regs[Part+i], RegisterVT, *Glue);
921 *Glue = P.getValue(2);
922 }
923
924 Chain = P.getValue(1);
925 Parts[i] = P;
926
927 // If the source register was virtual and if we know something about it,
928 // add an assert node.
929 if (!Regs[Part + i].isVirtual() || !RegisterVT.isInteger())
930 continue;
931
933 FuncInfo.GetLiveOutRegInfo(Regs[Part+i]);
934 if (!LOI)
935 continue;
936
937 unsigned RegSize = RegisterVT.getScalarSizeInBits();
938 unsigned NumSignBits = LOI->NumSignBits;
939 unsigned NumZeroBits = LOI->Known.countMinLeadingZeros();
940
941 if (NumZeroBits == RegSize) {
942 // The current value is a zero.
943 // Explicitly express that as it would be easier for
944 // optimizations to kick in.
945 Parts[i] = DAG.getConstant(0, dl, RegisterVT);
946 continue;
947 }
948
949 // FIXME: We capture more information than the dag can represent. For
950 // now, just use the tightest assertzext/assertsext possible.
951 bool isSExt;
952 EVT FromVT(MVT::Other);
953 if (NumZeroBits) {
954 FromVT = EVT::getIntegerVT(*DAG.getContext(), RegSize - NumZeroBits);
955 isSExt = false;
956 } else if (NumSignBits > 1) {
957 FromVT =
958 EVT::getIntegerVT(*DAG.getContext(), RegSize - NumSignBits + 1);
959 isSExt = true;
960 } else {
961 continue;
962 }
963 // Add an assertion node.
964 assert(FromVT != MVT::Other);
965 Parts[i] = DAG.getNode(isSExt ? ISD::AssertSext : ISD::AssertZext, dl,
966 RegisterVT, P, DAG.getValueType(FromVT));
967 }
968
969 Values[Value] = getCopyFromParts(DAG, dl, Parts.begin(), NumRegs,
970 RegisterVT, ValueVT, V, Chain, CallConv);
971 Part += NumRegs;
972 Parts.clear();
973 }
974
975 return DAG.getNode(ISD::MERGE_VALUES, dl, DAG.getVTList(ValueVTs), Values);
976}
977
979 const SDLoc &dl, SDValue &Chain, SDValue *Glue,
980 const Value *V,
981 ISD::NodeType PreferredExtendType) const {
982 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
983 ISD::NodeType ExtendKind = PreferredExtendType;
984
985 // Get the list of the values's legal parts.
986 unsigned NumRegs = Regs.size();
987 SmallVector<SDValue, 8> Parts(NumRegs);
988 for (unsigned Value = 0, Part = 0, e = ValueVTs.size(); Value != e; ++Value) {
989 unsigned NumParts = RegCount[Value];
990
991 MVT RegisterVT = isABIMangled()
993 *DAG.getContext(), *CallConv, RegVTs[Value])
994 : RegVTs[Value];
995
996 if (ExtendKind == ISD::ANY_EXTEND && TLI.isZExtFree(Val, RegisterVT))
997 ExtendKind = ISD::ZERO_EXTEND;
998
999 getCopyToParts(DAG, dl, Val.getValue(Val.getResNo() + Value), &Parts[Part],
1000 NumParts, RegisterVT, V, CallConv, ExtendKind);
1001 Part += NumParts;
1002 }
1003
1004 // Copy the parts into the registers.
1005 SmallVector<SDValue, 8> Chains(NumRegs);
1006 for (unsigned i = 0; i != NumRegs; ++i) {
1007 SDValue Part;
1008 if (!Glue) {
1009 Part = DAG.getCopyToReg(Chain, dl, Regs[i], Parts[i]);
1010 } else {
1011 Part = DAG.getCopyToReg(Chain, dl, Regs[i], Parts[i], *Glue);
1012 *Glue = Part.getValue(1);
1013 }
1014
1015 Chains[i] = Part.getValue(0);
1016 }
1017
1018 if (NumRegs == 1 || Glue)
1019 // If NumRegs > 1 && Glue is used then the use of the last CopyToReg is
1020 // flagged to it. That is the CopyToReg nodes and the user are considered
1021 // a single scheduling unit. If we create a TokenFactor and return it as
1022 // chain, then the TokenFactor is both a predecessor (operand) of the
1023 // user as well as a successor (the TF operands are flagged to the user).
1024 // c1, f1 = CopyToReg
1025 // c2, f2 = CopyToReg
1026 // c3 = TokenFactor c1, c2
1027 // ...
1028 // = op c3, ..., f2
1029 Chain = Chains[NumRegs-1];
1030 else
1031 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chains);
1032}
1033
1035 unsigned MatchingIdx, const SDLoc &dl,
1036 SelectionDAG &DAG,
1037 std::vector<SDValue> &Ops) const {
1038 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1039
1040 InlineAsm::Flag Flag(Code, Regs.size());
1041 if (HasMatching)
1042 Flag.setMatchingOp(MatchingIdx);
1043 else if (!Regs.empty() && Regs.front().isVirtual()) {
1044 // Put the register class of the virtual registers in the flag word. That
1045 // way, later passes can recompute register class constraints for inline
1046 // assembly as well as normal instructions.
1047 // Don't do this for tied operands that can use the regclass information
1048 // from the def.
1050 const TargetRegisterClass *RC = MRI.getRegClass(Regs.front());
1051 Flag.setRegClass(RC->getID());
1052 }
1053
1054 SDValue Res = DAG.getTargetConstant(Flag, dl, MVT::i32);
1055 Ops.push_back(Res);
1056
1057 if (Code == InlineAsm::Kind::Clobber) {
1058 // Clobbers should always have a 1:1 mapping with registers, and may
1059 // reference registers that have illegal (e.g. vector) types. Hence, we
1060 // shouldn't try to apply any sort of splitting logic to them.
1061 assert(Regs.size() == RegVTs.size() && Regs.size() == ValueVTs.size() &&
1062 "No 1:1 mapping from clobbers to regs?");
1064 (void)SP;
1065 for (unsigned I = 0, E = ValueVTs.size(); I != E; ++I) {
1066 Ops.push_back(DAG.getRegister(Regs[I], RegVTs[I]));
1067 assert(
1068 (Regs[I] != SP ||
1070 "If we clobbered the stack pointer, MFI should know about it.");
1071 }
1072 return;
1073 }
1074
1075 for (unsigned Value = 0, Reg = 0, e = ValueVTs.size(); Value != e; ++Value) {
1076 MVT RegisterVT = RegVTs[Value];
1077 unsigned NumRegs = TLI.getNumRegisters(*DAG.getContext(), ValueVTs[Value],
1078 RegisterVT);
1079 for (unsigned i = 0; i != NumRegs; ++i) {
1080 assert(Reg < Regs.size() && "Mismatch in # registers expected");
1081 Register TheReg = Regs[Reg++];
1082 Ops.push_back(DAG.getRegister(TheReg, RegisterVT));
1083 }
1084 }
1085}
1086
1090 unsigned I = 0;
1091 for (auto CountAndVT : zip_first(RegCount, RegVTs)) {
1092 unsigned RegCount = std::get<0>(CountAndVT);
1093 MVT RegisterVT = std::get<1>(CountAndVT);
1094 TypeSize RegisterSize = RegisterVT.getSizeInBits();
1095 for (unsigned E = I + RegCount; I != E; ++I)
1096 OutVec.push_back(std::make_pair(Regs[I], RegisterSize));
1097 }
1098 return OutVec;
1099}
1100
1102 AssumptionCache *ac, const TargetLibraryInfo *li,
1103 const TargetTransformInfo &TTI) {
1104 BatchAA = aa;
1105 AC = ac;
1106 GFI = gfi;
1107 LibInfo = li;
1108 Context = DAG.getContext();
1109 LPadToCallSiteMap.clear();
1110 this->TTI = &TTI;
1111 SL->init(DAG.getTargetLoweringInfo(), TM, DAG.getDataLayout());
1112 AssignmentTrackingEnabled = isAssignmentTrackingEnabled(
1113 *DAG.getMachineFunction().getFunction().getParent());
1114}
1115
1117 NodeMap.clear();
1118 UnusedArgNodeMap.clear();
1119 PendingLoads.clear();
1120 PendingExports.clear();
1121 PendingConstrainedFP.clear();
1122 PendingConstrainedFPStrict.clear();
1123 CurInst = nullptr;
1124 HasTailCall = false;
1125 SDNodeOrder = LowestSDNodeOrder;
1126 StatepointLowering.clear();
1127}
1128
1130 DanglingDebugInfoMap.clear();
1131}
1132
1133// Update DAG root to include dependencies on Pending chains.
1134SDValue SelectionDAGBuilder::updateRoot(SmallVectorImpl<SDValue> &Pending) {
1135 SDValue Root = DAG.getRoot();
1136
1137 if (Pending.empty())
1138 return Root;
1139
1140 // Add current root to PendingChains, unless we already indirectly
1141 // depend on it.
1142 if (Root.getOpcode() != ISD::EntryToken) {
1143 unsigned i = 0, e = Pending.size();
1144 for (; i != e; ++i) {
1145 assert(Pending[i].getNode()->getNumOperands() > 1);
1146 if (Pending[i].getNode()->getOperand(0) == Root)
1147 break; // Don't add the root if we already indirectly depend on it.
1148 }
1149
1150 if (i == e)
1151 Pending.push_back(Root);
1152 }
1153
1154 if (Pending.size() == 1)
1155 Root = Pending[0];
1156 else
1157 Root = DAG.getTokenFactor(getCurSDLoc(), Pending);
1158
1159 DAG.setRoot(Root);
1160 Pending.clear();
1161 return Root;
1162}
1163
1167
1169 // If the new exception behavior differs from that of the pending
1170 // ones, chain up them and update the root.
1171 switch (EB) {
1174 // Floating-point exceptions produced by such operations are not intended
1175 // to be observed, so the sequence of these operations does not need to be
1176 // preserved.
1177 //
1178 // They however must not be mixed with the instructions that have strict
1179 // exception behavior. Placing an operation with 'ebIgnore' behavior between
1180 // 'ebStrict' operations could distort the observed exception behavior.
1181 if (!PendingConstrainedFPStrict.empty()) {
1182 assert(PendingConstrainedFP.empty());
1183 updateRoot(PendingConstrainedFPStrict);
1184 }
1185 break;
1187 // Floating-point exception produced by these operations may be observed, so
1188 // they must be correctly chained. If trapping on FP exceptions is
1189 // disabled, the exceptions can be observed only by functions that read
1190 // exception flags, like 'llvm.get_fpenv' or 'fetestexcept'. It means that
1191 // the order of operations is not significant between barriers.
1192 //
1193 // If trapping is enabled, each operation becomes an implicit observation
1194 // point, so the operations must be sequenced according their original
1195 // source order.
1196 if (!PendingConstrainedFP.empty()) {
1197 assert(PendingConstrainedFPStrict.empty());
1198 updateRoot(PendingConstrainedFP);
1199 }
1200 // TODO: Add support for trapping-enabled scenarios.
1201 }
1202 return DAG.getRoot();
1203}
1204
1206 // Chain up all pending constrained intrinsics together with all
1207 // pending loads, by simply appending them to PendingLoads and
1208 // then calling getMemoryRoot().
1209 PendingLoads.reserve(PendingLoads.size() +
1210 PendingConstrainedFP.size() +
1211 PendingConstrainedFPStrict.size());
1212 PendingLoads.append(PendingConstrainedFP.begin(),
1213 PendingConstrainedFP.end());
1214 PendingLoads.append(PendingConstrainedFPStrict.begin(),
1215 PendingConstrainedFPStrict.end());
1216 PendingConstrainedFP.clear();
1217 PendingConstrainedFPStrict.clear();
1218 return getMemoryRoot();
1219}
1220
1222 // We need to emit pending fpexcept.strict constrained intrinsics,
1223 // so append them to the PendingExports list.
1224 PendingExports.append(PendingConstrainedFPStrict.begin(),
1225 PendingConstrainedFPStrict.end());
1226 PendingConstrainedFPStrict.clear();
1227 return updateRoot(PendingExports);
1228}
1229
1231 DILocalVariable *Variable,
1233 DebugLoc DL) {
1234 assert(Variable && "Missing variable");
1235
1236 // Check if address has undef value.
1237 if (!Address || isa<UndefValue>(Address) ||
1238 (Address->use_empty() && !isa<Argument>(Address))) {
1239 LLVM_DEBUG(
1240 dbgs()
1241 << "dbg_declare: Dropping debug info (bad/undef/unused-arg address)\n");
1242 return;
1243 }
1244
1245 bool IsParameter = Variable->isParameter() || isa<Argument>(Address);
1246
1247 SDValue &N = NodeMap[Address];
1248 if (!N.getNode() && isa<Argument>(Address))
1249 // Check unused arguments map.
1250 N = UnusedArgNodeMap[Address];
1251 SDDbgValue *SDV;
1252 if (N.getNode()) {
1253 if (const BitCastInst *BCI = dyn_cast<BitCastInst>(Address))
1254 Address = BCI->getOperand(0);
1255 // Parameters are handled specially.
1256 auto *FINode = dyn_cast<FrameIndexSDNode>(N.getNode());
1257 if (IsParameter && FINode) {
1258 // Byval parameter. We have a frame index at this point.
1259 SDV = DAG.getFrameIndexDbgValue(Variable, Expression, FINode->getIndex(),
1260 /*IsIndirect*/ true, DL, SDNodeOrder);
1261 } else if (isa<Argument>(Address)) {
1262 // Address is an argument, so try to emit its dbg value using
1263 // virtual register info from the FuncInfo.ValueMap.
1264 EmitFuncArgumentDbgValue(Address, Variable, Expression, DL,
1265 FuncArgumentDbgValueKind::Declare, N);
1266 return;
1267 } else {
1268 SDV = DAG.getDbgValue(Variable, Expression, N.getNode(), N.getResNo(),
1269 true, DL, SDNodeOrder);
1270 }
1271 DAG.AddDbgValue(SDV, IsParameter);
1272 } else {
1273 // If Address is an argument then try to emit its dbg value using
1274 // virtual register info from the FuncInfo.ValueMap.
1275 if (!EmitFuncArgumentDbgValue(Address, Variable, Expression, DL,
1276 FuncArgumentDbgValueKind::Declare, N)) {
1277 LLVM_DEBUG(dbgs() << "dbg_declare: Dropping debug info"
1278 << " (could not emit func-arg dbg_value)\n");
1279 }
1280 }
1281}
1282
1284 // Add SDDbgValue nodes for any var locs here. Do so before updating
1285 // SDNodeOrder, as this mapping is {Inst -> Locs BEFORE Inst}.
1286 if (FunctionVarLocs const *FnVarLocs = DAG.getFunctionVarLocs()) {
1287 // Add SDDbgValue nodes for any var locs here. Do so before updating
1288 // SDNodeOrder, as this mapping is {Inst -> Locs BEFORE Inst}.
1289 for (auto It = FnVarLocs->locs_begin(&I), End = FnVarLocs->locs_end(&I);
1290 It != End; ++It) {
1291 auto *Var = FnVarLocs->getDILocalVariable(It->VariableID);
1292 dropDanglingDebugInfo(Var, It->Expr);
1293 if (It->Values.isKillLocation(It->Expr)) {
1294 handleKillDebugValue(Var, It->Expr, It->DL, SDNodeOrder);
1295 continue;
1296 }
1297 SmallVector<Value *> Values(It->Values.location_ops());
1298 if (!handleDebugValue(Values, Var, It->Expr, It->DL, SDNodeOrder,
1299 It->Values.hasArgList())) {
1300 SmallVector<Value *, 4> Vals(It->Values.location_ops());
1302 FnVarLocs->getDILocalVariable(It->VariableID),
1303 It->Expr, Vals.size() > 1, It->DL, SDNodeOrder);
1304 }
1305 }
1306 }
1307
1308 // We must skip DbgVariableRecords if they've already been processed above as
1309 // we have just emitted the debug values resulting from assignment tracking
1310 // analysis, making any existing DbgVariableRecords redundant (and probably
1311 // less correct). We still need to process DbgLabelRecords. This does sink
1312 // DbgLabelRecords to the bottom of the group of debug records. That sholdn't
1313 // be important as it does so deterministcally and ordering between
1314 // DbgLabelRecords and DbgVariableRecords is immaterial (other than for MIR/IR
1315 // printing).
1316 bool SkipDbgVariableRecords = DAG.getFunctionVarLocs();
1317 // Is there is any debug-info attached to this instruction, in the form of
1318 // DbgRecord non-instruction debug-info records.
1319 for (DbgRecord &DR : I.getDbgRecordRange()) {
1320 if (DbgLabelRecord *DLR = dyn_cast<DbgLabelRecord>(&DR)) {
1321 assert(DLR->getLabel() && "Missing label");
1322 SDDbgLabel *SDV =
1323 DAG.getDbgLabel(DLR->getLabel(), DLR->getDebugLoc(), SDNodeOrder);
1324 DAG.AddDbgLabel(SDV);
1325 continue;
1326 }
1327
1328 if (SkipDbgVariableRecords)
1329 continue;
1331 DILocalVariable *Variable = DVR.getVariable();
1334
1336 if (FuncInfo.PreprocessedDVRDeclares.contains(&DVR))
1337 continue;
1338 LLVM_DEBUG(dbgs() << "SelectionDAG visiting dbg_declare: " << DVR
1339 << "\n");
1341 DVR.getDebugLoc());
1342 continue;
1343 }
1344
1345 // A DbgVariableRecord with no locations is a kill location.
1347 if (Values.empty()) {
1349 SDNodeOrder);
1350 continue;
1351 }
1352
1353 // A DbgVariableRecord with an undef or absent location is also a kill
1354 // location.
1355 if (llvm::any_of(Values,
1356 [](Value *V) { return !V || isa<UndefValue>(V); })) {
1358 SDNodeOrder);
1359 continue;
1360 }
1361
1362 bool IsVariadic = DVR.hasArgList();
1363 if (!handleDebugValue(Values, Variable, Expression, DVR.getDebugLoc(),
1364 SDNodeOrder, IsVariadic)) {
1365 addDanglingDebugInfo(Values, Variable, Expression, IsVariadic,
1366 DVR.getDebugLoc(), SDNodeOrder);
1367 }
1368 }
1369}
1370
1372 visitDbgInfo(I);
1373
1374 // Set up outgoing PHI node register values before emitting the terminator.
1375 if (I.isTerminator()) {
1376 HandlePHINodesInSuccessorBlocks(I.getParent());
1377 }
1378
1379 ++SDNodeOrder;
1380 CurInst = &I;
1381
1382 // Set inserted listener only if required.
1383 bool NodeInserted = false;
1384 std::unique_ptr<SelectionDAG::DAGNodeInsertedListener> InsertedListener;
1385 MDNode *PCSectionsMD = I.getMetadata(LLVMContext::MD_pcsections);
1386 MDNode *MMRA = I.getMetadata(LLVMContext::MD_mmra);
1387 if (PCSectionsMD || MMRA) {
1388 InsertedListener = std::make_unique<SelectionDAG::DAGNodeInsertedListener>(
1389 DAG, [&](SDNode *) { NodeInserted = true; });
1390 }
1391
1392 visit(I.getOpcode(), I);
1393
1394 if (!I.isTerminator() && !HasTailCall &&
1395 !isa<GCStatepointInst>(I)) // statepoints handle their exports internally
1397
1398 // Handle metadata.
1399 if (PCSectionsMD || MMRA) {
1400 auto It = NodeMap.find(&I);
1401 if (It != NodeMap.end()) {
1402 if (PCSectionsMD)
1403 DAG.addPCSections(It->second.getNode(), PCSectionsMD);
1404 if (MMRA)
1405 DAG.addMMRAMetadata(It->second.getNode(), MMRA);
1406 } else if (NodeInserted) {
1407 // This should not happen; if it does, don't let it go unnoticed so we can
1408 // fix it. Relevant visit*() function is probably missing a setValue().
1409 errs() << "warning: loosing !pcsections and/or !mmra metadata ["
1410 << I.getModule()->getName() << "]\n";
1411 LLVM_DEBUG(I.dump());
1412 assert(false);
1413 }
1414 }
1415
1416 CurInst = nullptr;
1417}
1418
1419void SelectionDAGBuilder::visitPHI(const PHINode &) {
1420 llvm_unreachable("SelectionDAGBuilder shouldn't visit PHI nodes!");
1421}
1422
1423void SelectionDAGBuilder::visit(unsigned Opcode, const User &I) {
1424 // Note: this doesn't use InstVisitor, because it has to work with
1425 // ConstantExpr's in addition to instructions.
1426 switch (Opcode) {
1427 default: llvm_unreachable("Unknown instruction type encountered!");
1428 // Build the switch statement using the Instruction.def file.
1429#define HANDLE_INST(NUM, OPCODE, CLASS) \
1430 case Instruction::OPCODE: visit##OPCODE((const CLASS&)I); break;
1431#include "llvm/IR/Instruction.def"
1432 }
1433}
1434
1436 DILocalVariable *Variable,
1437 DebugLoc DL, unsigned Order,
1440 // For variadic dbg_values we will now insert poison.
1441 // FIXME: We can potentially recover these!
1443 for (const Value *V : Values) {
1444 auto *Poison = PoisonValue::get(V->getType());
1446 }
1447 SDDbgValue *SDV = DAG.getDbgValueList(Variable, Expression, Locs, {},
1448 /*IsIndirect=*/false, DL, Order,
1449 /*IsVariadic=*/true);
1450 DAG.AddDbgValue(SDV, /*isParameter=*/false);
1451 return true;
1452}
1453
1455 DILocalVariable *Var,
1456 DIExpression *Expr,
1457 bool IsVariadic, DebugLoc DL,
1458 unsigned Order) {
1459 if (IsVariadic) {
1460 handleDanglingVariadicDebugInfo(DAG, Var, DL, Order, Values, Expr);
1461 return;
1462 }
1463 // TODO: Dangling debug info will eventually either be resolved or produce
1464 // a poison DBG_VALUE. However in the resolution case, a gap may appear
1465 // between the original dbg.value location and its resolved DBG_VALUE,
1466 // which we should ideally fill with an extra poison DBG_VALUE.
1467 assert(Values.size() == 1);
1468 DanglingDebugInfoMap[Values[0]].emplace_back(Var, Expr, DL, Order);
1469}
1470
1472 const DIExpression *Expr) {
1473 auto isMatchingDbgValue = [&](DanglingDebugInfo &DDI) {
1474 DIVariable *DanglingVariable = DDI.getVariable();
1475 DIExpression *DanglingExpr = DDI.getExpression();
1476 if (DanglingVariable == Variable && Expr->fragmentsOverlap(DanglingExpr)) {
1477 LLVM_DEBUG(dbgs() << "Dropping dangling debug info for "
1478 << printDDI(nullptr, DDI) << "\n");
1479 return true;
1480 }
1481 return false;
1482 };
1483
1484 for (auto &DDIMI : DanglingDebugInfoMap) {
1485 DanglingDebugInfoVector &DDIV = DDIMI.second;
1486
1487 // If debug info is to be dropped, run it through final checks to see
1488 // whether it can be salvaged.
1489 for (auto &DDI : DDIV)
1490 if (isMatchingDbgValue(DDI))
1491 salvageUnresolvedDbgValue(DDIMI.first, DDI);
1492
1493 erase_if(DDIV, isMatchingDbgValue);
1494 }
1495}
1496
1497// resolveDanglingDebugInfo - if we saw an earlier dbg_value referring to V,
1498// generate the debug data structures now that we've seen its definition.
1500 SDValue Val) {
1501 auto DanglingDbgInfoIt = DanglingDebugInfoMap.find(V);
1502 if (DanglingDbgInfoIt == DanglingDebugInfoMap.end())
1503 return;
1504
1505 DanglingDebugInfoVector &DDIV = DanglingDbgInfoIt->second;
1506 for (auto &DDI : DDIV) {
1507 DebugLoc DL = DDI.getDebugLoc();
1508 unsigned DbgSDNodeOrder = DDI.getSDNodeOrder();
1509 DILocalVariable *Variable = DDI.getVariable();
1510 DIExpression *Expr = DDI.getExpression();
1511 assert(Variable->isValidLocationForIntrinsic(DL) &&
1512 "Expected inlined-at fields to agree");
1513 SDDbgValue *SDV;
1514 if (Val.getNode()) {
1515 // FIXME: I doubt that it is correct to resolve a dangling DbgValue as a
1516 // FuncArgumentDbgValue (it would be hoisted to the function entry, and if
1517 // we couldn't resolve it directly when examining the DbgValue intrinsic
1518 // in the first place we should not be more successful here). Unless we
1519 // have some test case that prove this to be correct we should avoid
1520 // calling EmitFuncArgumentDbgValue here.
1521 unsigned ValSDNodeOrder = Val.getNode()->getIROrder();
1522 if (!EmitFuncArgumentDbgValue(V, Variable, Expr, DL,
1523 FuncArgumentDbgValueKind::Value, Val)) {
1524 LLVM_DEBUG(dbgs() << "Resolve dangling debug info for "
1525 << printDDI(V, DDI) << "\n");
1526 LLVM_DEBUG(dbgs() << " By mapping to:\n "; Val.dump());
1527 // Increase the SDNodeOrder for the DbgValue here to make sure it is
1528 // inserted after the definition of Val when emitting the instructions
1529 // after ISel. An alternative could be to teach
1530 // ScheduleDAGSDNodes::EmitSchedule to delay the insertion properly.
1531 LLVM_DEBUG(if (ValSDNodeOrder > DbgSDNodeOrder) dbgs()
1532 << "changing SDNodeOrder from " << DbgSDNodeOrder << " to "
1533 << ValSDNodeOrder << "\n");
1534 SDV = getDbgValue(Val, Variable, Expr, DL,
1535 std::max(DbgSDNodeOrder, ValSDNodeOrder));
1536 DAG.AddDbgValue(SDV, false);
1537 } else
1538 LLVM_DEBUG(dbgs() << "Resolved dangling debug info for "
1539 << printDDI(V, DDI)
1540 << " in EmitFuncArgumentDbgValue\n");
1541 } else {
1542 LLVM_DEBUG(dbgs() << "Dropping debug info for " << printDDI(V, DDI)
1543 << "\n");
1544 auto Poison = PoisonValue::get(V->getType());
1545 auto SDV =
1546 DAG.getConstantDbgValue(Variable, Expr, Poison, DL, DbgSDNodeOrder);
1547 DAG.AddDbgValue(SDV, false);
1548 }
1549 }
1550 DDIV.clear();
1551}
1552
1554 DanglingDebugInfo &DDI) {
1555 // TODO: For the variadic implementation, instead of only checking the fail
1556 // state of `handleDebugValue`, we need know specifically which values were
1557 // invalid, so that we attempt to salvage only those values when processing
1558 // a DIArgList.
1559 const Value *OrigV = V;
1560 DILocalVariable *Var = DDI.getVariable();
1561 DIExpression *Expr = DDI.getExpression();
1562 DebugLoc DL = DDI.getDebugLoc();
1563 unsigned SDOrder = DDI.getSDNodeOrder();
1564
1565 // Currently we consider only dbg.value intrinsics -- we tell the salvager
1566 // that DW_OP_stack_value is desired.
1567 bool StackValue = true;
1568
1569 // Can this Value can be encoded without any further work?
1570 if (handleDebugValue(V, Var, Expr, DL, SDOrder, /*IsVariadic=*/false))
1571 return;
1572
1573 // Attempt to salvage back through as many instructions as possible. Bail if
1574 // a non-instruction is seen, such as a constant expression or global
1575 // variable. FIXME: Further work could recover those too.
1576 while (isa<Instruction>(V)) {
1577 const Instruction &VAsInst = *cast<const Instruction>(V);
1578 // Temporary "0", awaiting real implementation.
1580 SmallVector<Value *, 4> AdditionalValues;
1581 V = salvageDebugInfoImpl(const_cast<Instruction &>(VAsInst),
1582 Expr->getNumLocationOperands(), Ops,
1583 AdditionalValues);
1584 // If we cannot salvage any further, and haven't yet found a suitable debug
1585 // expression, bail out.
1586 if (!V)
1587 break;
1588
1589 // TODO: If AdditionalValues isn't empty, then the salvage can only be
1590 // represented with a DBG_VALUE_LIST, so we give up. When we have support
1591 // here for variadic dbg_values, remove that condition.
1592 if (!AdditionalValues.empty())
1593 break;
1594
1595 // New value and expr now represent this debuginfo.
1596 Expr = DIExpression::appendOpsToArg(Expr, Ops, 0, StackValue);
1597
1598 // Some kind of simplification occurred: check whether the operand of the
1599 // salvaged debug expression can be encoded in this DAG.
1600 if (handleDebugValue(V, Var, Expr, DL, SDOrder, /*IsVariadic=*/false)) {
1601 LLVM_DEBUG(
1602 dbgs() << "Salvaged debug location info for:\n " << *Var << "\n"
1603 << *OrigV << "\nBy stripping back to:\n " << *V << "\n");
1604 return;
1605 }
1606 }
1607
1608 // This was the final opportunity to salvage this debug information, and it
1609 // couldn't be done. Place a poison DBG_VALUE at this location to terminate
1610 // any earlier variable location.
1611 assert(OrigV && "V shouldn't be null");
1612 auto *Poison = PoisonValue::get(OrigV->getType());
1613 auto *SDV = DAG.getConstantDbgValue(Var, Expr, Poison, DL, SDNodeOrder);
1614 DAG.AddDbgValue(SDV, false);
1615 LLVM_DEBUG(dbgs() << "Dropping debug value info for:\n "
1616 << printDDI(OrigV, DDI) << "\n");
1617}
1618
1620 DIExpression *Expr,
1621 DebugLoc DbgLoc,
1622 unsigned Order) {
1626 handleDebugValue(Poison, Var, NewExpr, DbgLoc, Order,
1627 /*IsVariadic*/ false);
1628}
1629
1631 DILocalVariable *Var,
1632 DIExpression *Expr, DebugLoc DbgLoc,
1633 unsigned Order, bool IsVariadic) {
1634 if (Values.empty())
1635 return true;
1636
1637 // Filter EntryValue locations out early.
1638 if (visitEntryValueDbgValue(Values, Var, Expr, DbgLoc))
1639 return true;
1640
1641 SmallVector<SDDbgOperand> LocationOps;
1642 SmallVector<SDNode *> Dependencies;
1643 for (const Value *V : Values) {
1644 // Constant value.
1647 LocationOps.emplace_back(SDDbgOperand::fromConst(V));
1648 continue;
1649 }
1650
1651 // Look through IntToPtr constants.
1652 if (auto *CE = dyn_cast<ConstantExpr>(V))
1653 if (CE->getOpcode() == Instruction::IntToPtr) {
1654 LocationOps.emplace_back(SDDbgOperand::fromConst(CE->getOperand(0)));
1655 continue;
1656 }
1657
1658 // If the Value is a frame index, we can create a FrameIndex debug value
1659 // without relying on the DAG at all.
1660 if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
1661 auto SI = FuncInfo.StaticAllocaMap.find(AI);
1662 if (SI != FuncInfo.StaticAllocaMap.end()) {
1663 LocationOps.emplace_back(SDDbgOperand::fromFrameIdx(SI->second));
1664 continue;
1665 }
1666 }
1667
1668 // Do not use getValue() in here; we don't want to generate code at
1669 // this point if it hasn't been done yet.
1670 SDValue N = NodeMap[V];
1671 if (!N.getNode() && isa<Argument>(V)) // Check unused arguments map.
1672 N = UnusedArgNodeMap[V];
1673
1674 if (N.getNode()) {
1675 // Only emit func arg dbg value for non-variadic dbg.values for now.
1676 if (!IsVariadic &&
1677 EmitFuncArgumentDbgValue(V, Var, Expr, DbgLoc,
1678 FuncArgumentDbgValueKind::Value, N))
1679 return true;
1680 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(N.getNode())) {
1681 // Construct a FrameIndexDbgValue for FrameIndexSDNodes so we can
1682 // describe stack slot locations.
1683 //
1684 // Consider "int x = 0; int *px = &x;". There are two kinds of
1685 // interesting debug values here after optimization:
1686 //
1687 // dbg.value(i32* %px, !"int *px", !DIExpression()), and
1688 // dbg.value(i32* %px, !"int x", !DIExpression(DW_OP_deref))
1689 //
1690 // Both describe the direct values of their associated variables.
1691 Dependencies.push_back(N.getNode());
1692 LocationOps.emplace_back(SDDbgOperand::fromFrameIdx(FISDN->getIndex()));
1693 continue;
1694 }
1695 LocationOps.emplace_back(
1696 SDDbgOperand::fromNode(N.getNode(), N.getResNo()));
1697 continue;
1698 }
1699
1700 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1701 // Special rules apply for the first dbg.values of parameter variables in a
1702 // function. Identify them by the fact they reference Argument Values, that
1703 // they're parameters, and they are parameters of the current function. We
1704 // need to let them dangle until they get an SDNode.
1705 bool IsParamOfFunc =
1706 isa<Argument>(V) && Var->isParameter() && !DbgLoc.getInlinedAt();
1707 if (IsParamOfFunc)
1708 return false;
1709
1710 // The value is not used in this block yet (or it would have an SDNode).
1711 // We still want the value to appear for the user if possible -- if it has
1712 // an associated VReg, we can refer to that instead.
1713 auto VMI = FuncInfo.ValueMap.find(V);
1714 if (VMI != FuncInfo.ValueMap.end()) {
1715 Register Reg = VMI->second;
1716 // If this is a PHI node, it may be split up into several MI PHI nodes
1717 // (in FunctionLoweringInfo::set).
1718 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), Reg,
1719 V->getType(), std::nullopt);
1720 if (RFV.occupiesMultipleRegs()) {
1721 // FIXME: We could potentially support variadic dbg_values here.
1722 if (IsVariadic)
1723 return false;
1724 unsigned Offset = 0;
1725 unsigned BitsToDescribe = 0;
1726 if (auto VarSize = Var->getSizeInBits())
1727 BitsToDescribe = *VarSize;
1728 if (auto Fragment = Expr->getFragmentInfo())
1729 BitsToDescribe = Fragment->SizeInBits;
1730 for (const auto &RegAndSize : RFV.getRegsAndSizes()) {
1731 // Bail out if all bits are described already.
1732 if (Offset >= BitsToDescribe)
1733 break;
1734 // TODO: handle scalable vectors.
1735 unsigned RegisterSize = RegAndSize.second;
1736 unsigned FragmentSize = (Offset + RegisterSize > BitsToDescribe)
1737 ? BitsToDescribe - Offset
1738 : RegisterSize;
1739 auto FragmentExpr = DIExpression::createFragmentExpression(
1740 Expr, Offset, FragmentSize);
1741 if (!FragmentExpr)
1742 continue;
1743 SDDbgValue *SDV = DAG.getVRegDbgValue(
1744 Var, *FragmentExpr, RegAndSize.first, false, DbgLoc, Order);
1745 DAG.AddDbgValue(SDV, false);
1746 Offset += RegisterSize;
1747 }
1748 return true;
1749 }
1750 // We can use simple vreg locations for variadic dbg_values as well.
1751 LocationOps.emplace_back(SDDbgOperand::fromVReg(Reg));
1752 continue;
1753 }
1754 // We failed to create a SDDbgOperand for V.
1755 return false;
1756 }
1757
1758 // We have created a SDDbgOperand for each Value in Values.
1759 assert(!LocationOps.empty());
1760 SDDbgValue *SDV =
1761 DAG.getDbgValueList(Var, Expr, LocationOps, Dependencies,
1762 /*IsIndirect=*/false, DbgLoc, Order, IsVariadic);
1763 DAG.AddDbgValue(SDV, /*isParameter=*/false);
1764 return true;
1765}
1766
1768 // Try to fixup any remaining dangling debug info -- and drop it if we can't.
1769 for (auto &Pair : DanglingDebugInfoMap)
1770 for (auto &DDI : Pair.second)
1771 salvageUnresolvedDbgValue(const_cast<Value *>(Pair.first), DDI);
1773}
1774
1775/// getCopyFromRegs - If there was virtual register allocated for the value V
1776/// emit CopyFromReg of the specified type Ty. Return empty SDValue() otherwise.
1779 SDValue Result;
1780
1781 if (It != FuncInfo.ValueMap.end()) {
1782 Register InReg = It->second;
1783
1784 RegsForValue RFV(*DAG.getContext(), DAG.getTargetLoweringInfo(),
1785 DAG.getDataLayout(), InReg, Ty,
1786 std::nullopt); // This is not an ABI copy.
1787 SDValue Chain = DAG.getEntryNode();
1788 Result = RFV.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(), Chain, nullptr,
1789 V);
1790 resolveDanglingDebugInfo(V, Result);
1791 }
1792
1793 return Result;
1794}
1795
1796/// getValue - Return an SDValue for the given Value.
1798 // If we already have an SDValue for this value, use it. It's important
1799 // to do this first, so that we don't create a CopyFromReg if we already
1800 // have a regular SDValue.
1801 SDValue &N = NodeMap[V];
1802 if (N.getNode()) return N;
1803
1804 // If there's a virtual register allocated and initialized for this
1805 // value, use it.
1806 if (SDValue copyFromReg = getCopyFromRegs(V, V->getType()))
1807 return copyFromReg;
1808
1809 // Otherwise create a new SDValue and remember it.
1810 SDValue Val = getValueImpl(V);
1811 NodeMap[V] = Val;
1813 return Val;
1814}
1815
1816/// getNonRegisterValue - Return an SDValue for the given Value, but
1817/// don't look in FuncInfo.ValueMap for a virtual register.
1819 // If we already have an SDValue for this value, use it.
1820 SDValue &N = NodeMap[V];
1821 if (N.getNode()) {
1822 if (isIntOrFPConstant(N)) {
1823 // Remove the debug location from the node as the node is about to be used
1824 // in a location which may differ from the original debug location. This
1825 // is relevant to Constant and ConstantFP nodes because they can appear
1826 // as constant expressions inside PHI nodes.
1827 N->setDebugLoc(DebugLoc());
1828 }
1829 return N;
1830 }
1831
1832 // Otherwise create a new SDValue and remember it.
1833 SDValue Val = getValueImpl(V);
1834 NodeMap[V] = Val;
1836 return Val;
1837}
1838
1839/// getValueImpl - Helper function for getValue and getNonRegisterValue.
1840/// Create an SDValue for the given value.
1842 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1843
1844 if (const Constant *C = dyn_cast<Constant>(V)) {
1845 EVT VT = TLI.getValueType(DAG.getDataLayout(), V->getType(), true);
1846
1847 if (const ConstantInt *CI = dyn_cast<ConstantInt>(C)) {
1848 SDLoc DL = getCurSDLoc();
1849
1850 // DAG.getConstant() may attempt to legalise the vector constant which can
1851 // significantly change the combines applied to the DAG. To reduce the
1852 // divergence when enabling ConstantInt based vectors we try to construct
1853 // the DAG in the same way as shufflevector based splats. TODO: The
1854 // divergence sometimes leads to better optimisations. Ideally we should
1855 // prevent DAG.getConstant() from legalising too early but there are some
1856 // degradations preventing this.
1857 if (VT.isScalableVector())
1858 return DAG.getNode(
1859 ISD::SPLAT_VECTOR, DL, VT,
1860 DAG.getConstant(CI->getValue(), DL, VT.getVectorElementType()));
1861 if (VT.isFixedLengthVector())
1862 return DAG.getSplatBuildVector(
1863 VT, DL,
1864 DAG.getConstant(CI->getValue(), DL, VT.getVectorElementType()));
1865 return DAG.getConstant(*CI, DL, VT);
1866 }
1867
1868 if (const ConstantByte *CB = dyn_cast<ConstantByte>(C))
1869 return DAG.getConstant(CB->getValue(), getCurSDLoc(), VT);
1870
1871 if (const GlobalValue *GV = dyn_cast<GlobalValue>(C))
1872 return DAG.getGlobalAddress(GV, getCurSDLoc(), VT);
1873
1874 if (const ConstantPtrAuth *CPA = dyn_cast<ConstantPtrAuth>(C)) {
1875 return DAG.getNode(ISD::PtrAuthGlobalAddress, getCurSDLoc(), VT,
1876 getValue(CPA->getPointer()), getValue(CPA->getKey()),
1877 getValue(CPA->getAddrDiscriminator()),
1878 getValue(CPA->getDiscriminator()));
1879 }
1880
1882 return DAG.getConstant(0, getCurSDLoc(), VT);
1883
1884 if (match(C, m_VScale()))
1885 return DAG.getVScale(getCurSDLoc(), VT, APInt(VT.getSizeInBits(), 1));
1886
1887 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C))
1888 return DAG.getConstantFP(*CFP, getCurSDLoc(), VT);
1889
1890 if (isa<UndefValue>(C) && !V->getType()->isAggregateType())
1891 return isa<PoisonValue>(C) ? DAG.getPOISON(VT) : DAG.getUNDEF(VT);
1892
1893 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
1894 visit(CE->getOpcode(), *CE);
1895 SDValue N1 = NodeMap[V];
1896 assert(N1.getNode() && "visit didn't populate the NodeMap!");
1897 return N1;
1898 }
1899
1901 SmallVector<SDValue, 4> Constants;
1902 for (const Use &U : C->operands()) {
1903 SDNode *Val = getValue(U).getNode();
1904 // If the operand is an empty aggregate, there are no values.
1905 if (!Val) continue;
1906 // Add each leaf value from the operand to the Constants list
1907 // to form a flattened list of all the values.
1908 for (unsigned i = 0, e = Val->getNumValues(); i != e; ++i)
1909 Constants.push_back(SDValue(Val, i));
1910 }
1911
1912 return DAG.getMergeValues(Constants, getCurSDLoc());
1913 }
1914
1915 if (const ConstantDataSequential *CDS =
1918 for (uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i) {
1919 SDNode *Val = getValue(CDS->getElementAsConstant(i)).getNode();
1920 // Add each leaf value from the operand to the Constants list
1921 // to form a flattened list of all the values.
1922 for (unsigned i = 0, e = Val->getNumValues(); i != e; ++i)
1923 Ops.push_back(SDValue(Val, i));
1924 }
1925
1926 if (isa<ArrayType>(CDS->getType()))
1927 return DAG.getMergeValues(Ops, getCurSDLoc());
1928 return DAG.getBuildVector(VT, getCurSDLoc(), Ops);
1929 }
1930
1931 if (C->getType()->isStructTy() || C->getType()->isArrayTy()) {
1933 "Unknown struct or array constant!");
1934
1935 SmallVector<EVT, 4> ValueVTs;
1936 ComputeValueVTs(TLI, DAG.getDataLayout(), C->getType(), ValueVTs);
1937 unsigned NumElts = ValueVTs.size();
1938 if (NumElts == 0)
1939 return SDValue(); // empty struct
1940 SmallVector<SDValue, 4> Constants(NumElts);
1941 for (unsigned i = 0; i != NumElts; ++i) {
1942 EVT EltVT = ValueVTs[i];
1943 if (isa<UndefValue>(C))
1944 Constants[i] = DAG.getUNDEF(EltVT);
1945 else if (EltVT.isFloatingPoint())
1946 Constants[i] = DAG.getConstantFP(0, getCurSDLoc(), EltVT);
1947 else
1948 Constants[i] = DAG.getConstant(0, getCurSDLoc(), EltVT);
1949 }
1950
1951 return DAG.getMergeValues(Constants, getCurSDLoc());
1952 }
1953
1954 if (const BlockAddress *BA = dyn_cast<BlockAddress>(C))
1955 return DAG.getBlockAddress(BA, VT);
1956
1957 if (const auto *Equiv = dyn_cast<DSOLocalEquivalent>(C))
1958 return getValue(Equiv->getGlobalValue());
1959
1960 if (const auto *NC = dyn_cast<NoCFIValue>(C))
1961 return getValue(NC->getGlobalValue());
1962
1963 if (VT == MVT::aarch64svcount) {
1964 assert(C->isNullValue() && "Can only zero this target type!");
1965 return DAG.getNode(ISD::BITCAST, getCurSDLoc(), VT,
1966 DAG.getConstant(0, getCurSDLoc(), MVT::nxv16i1));
1967 }
1968
1969 if (VT.isRISCVVectorTuple()) {
1970 assert(C->isNullValue() && "Can only zero this target type!");
1971 return DAG.getNode(
1973 DAG.getNode(
1975 EVT::getVectorVT(*DAG.getContext(), MVT::i8,
1976 VT.getSizeInBits().getKnownMinValue() / 8, true),
1977 DAG.getConstant(0, getCurSDLoc(), MVT::getIntegerVT(8))));
1978 }
1979
1980 VectorType *VecTy = cast<VectorType>(V->getType());
1981
1982 // Now that we know the number and type of the elements, get that number of
1983 // elements into the Ops array based on what kind of constant it is.
1984 if (const ConstantVector *CV = dyn_cast<ConstantVector>(C)) {
1986 unsigned NumElements = cast<FixedVectorType>(VecTy)->getNumElements();
1987 for (unsigned i = 0; i != NumElements; ++i)
1988 Ops.push_back(getValue(CV->getOperand(i)));
1989
1990 return DAG.getBuildVector(VT, getCurSDLoc(), Ops);
1991 }
1992
1994 EVT EltVT =
1995 TLI.getValueType(DAG.getDataLayout(), VecTy->getElementType());
1996
1997 SDValue Op;
1998 if (EltVT.isFloatingPoint())
1999 Op = DAG.getConstantFP(0, getCurSDLoc(), EltVT);
2000 else
2001 Op = DAG.getConstant(0, getCurSDLoc(), EltVT);
2002
2003 return DAG.getSplat(VT, getCurSDLoc(), Op);
2004 }
2005
2006 llvm_unreachable("Unknown vector constant");
2007 }
2008
2009 // If this is a static alloca, generate it as the frameindex instead of
2010 // computation.
2011 if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
2013 FuncInfo.StaticAllocaMap.find(AI);
2014 if (SI != FuncInfo.StaticAllocaMap.end())
2015 return DAG.getFrameIndex(
2016 SI->second, TLI.getValueType(DAG.getDataLayout(), AI->getType()));
2017 }
2018
2019 // If this is an instruction which fast-isel has deferred, select it now.
2020 if (const Instruction *Inst = dyn_cast<Instruction>(V)) {
2021 Register InReg = FuncInfo.InitializeRegForValue(Inst);
2022 RegsForValue RFV(*DAG.getContext(), TLI, DAG.getDataLayout(), InReg,
2023 Inst->getType(), std::nullopt);
2024 SDValue Chain = DAG.getEntryNode();
2025 return RFV.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(), Chain, nullptr, V);
2026 }
2027
2028 if (const MetadataAsValue *MD = dyn_cast<MetadataAsValue>(V))
2029 return DAG.getMDNode(cast<MDNode>(MD->getMetadata()));
2030
2031 if (const auto *BB = dyn_cast<BasicBlock>(V))
2032 return DAG.getBasicBlock(FuncInfo.getMBB(BB));
2033
2034 llvm_unreachable("Can't get register for value!");
2035}
2036
2037void SelectionDAGBuilder::visitCatchPad(const CatchPadInst &I) {
2039 bool IsMSVCCXX = Pers == EHPersonality::MSVC_CXX;
2040 bool IsCoreCLR = Pers == EHPersonality::CoreCLR;
2041 bool IsSEH = isAsynchronousEHPersonality(Pers);
2042 MachineBasicBlock *CatchPadMBB = FuncInfo.MBB;
2043 if (IsSEH) {
2044 // For SEH, EHCont Guard needs to know that this catchpad is a target.
2045 CatchPadMBB->setIsEHContTarget(true);
2047 } else
2048 CatchPadMBB->setIsEHScopeEntry();
2049 // In MSVC C++ and CoreCLR, catchblocks are funclets and need prologues.
2050 if (IsMSVCCXX || IsCoreCLR)
2051 CatchPadMBB->setIsEHFuncletEntry();
2052}
2053
2054void SelectionDAGBuilder::visitCatchRet(const CatchReturnInst &I) {
2055 // Update machine-CFG edge.
2056 MachineBasicBlock *TargetMBB = FuncInfo.getMBB(I.getSuccessor());
2057 FuncInfo.MBB->addSuccessor(TargetMBB);
2058
2059 auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn());
2060 bool IsSEH = isAsynchronousEHPersonality(Pers);
2061 if (IsSEH) {
2062 // If this is not a fall-through branch or optimizations are switched off,
2063 // emit the branch.
2064 if (TargetMBB != NextBlock(FuncInfo.MBB) ||
2065 TM.getOptLevel() == CodeGenOptLevel::None)
2066 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
2067 getControlRoot(), DAG.getBasicBlock(TargetMBB)));
2068 return;
2069 }
2070
2071 // For non-SEH, EHCont Guard needs to know that this catchret is a target.
2072 TargetMBB->setIsEHContTarget(true);
2073 DAG.getMachineFunction().setHasEHContTarget(true);
2074
2075 // Figure out the funclet membership for the catchret's successor.
2076 // This will be used by the FuncletLayout pass to determine how to order the
2077 // BB's.
2078 // A 'catchret' returns to the outer scope's color.
2079 Value *ParentPad = I.getCatchSwitchParentPad();
2080 const BasicBlock *SuccessorColor;
2081 if (isa<ConstantTokenNone>(ParentPad))
2082 SuccessorColor = &FuncInfo.Fn->getEntryBlock();
2083 else
2084 SuccessorColor = cast<Instruction>(ParentPad)->getParent();
2085 assert(SuccessorColor && "No parent funclet for catchret!");
2086 MachineBasicBlock *SuccessorColorMBB = FuncInfo.getMBB(SuccessorColor);
2087 assert(SuccessorColorMBB && "No MBB for SuccessorColor!");
2088
2089 // Create the terminator node.
2090 SDValue Ret = DAG.getNode(ISD::CATCHRET, getCurSDLoc(), MVT::Other,
2091 getControlRoot(), DAG.getBasicBlock(TargetMBB),
2092 DAG.getBasicBlock(SuccessorColorMBB));
2093 DAG.setRoot(Ret);
2094}
2095
2096void SelectionDAGBuilder::visitCleanupPad(const CleanupPadInst &CPI) {
2097 // Don't emit any special code for the cleanuppad instruction. It just marks
2098 // the start of an EH scope/funclet.
2099 FuncInfo.MBB->setIsEHScopeEntry();
2100 auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn());
2101 if (Pers != EHPersonality::Wasm_CXX) {
2102 FuncInfo.MBB->setIsEHFuncletEntry();
2103 FuncInfo.MBB->setIsCleanupFuncletEntry();
2104 }
2105}
2106
2107/// When an invoke or a cleanupret unwinds to the next EH pad, there are
2108/// many places it could ultimately go. In the IR, we have a single unwind
2109/// destination, but in the machine CFG, we enumerate all the possible blocks.
2110/// This function skips over imaginary basic blocks that hold catchswitch
2111/// instructions, and finds all the "real" machine
2112/// basic block destinations. As those destinations may not be successors of
2113/// EHPadBB, here we also calculate the edge probability to those destinations.
2114/// The passed-in Prob is the edge probability to EHPadBB.
2116 FunctionLoweringInfo &FuncInfo, const BasicBlock *EHPadBB,
2117 BranchProbability Prob,
2118 SmallVectorImpl<std::pair<MachineBasicBlock *, BranchProbability>>
2119 &UnwindDests) {
2120 EHPersonality Personality =
2122 bool IsMSVCCXX = Personality == EHPersonality::MSVC_CXX;
2123 bool IsCoreCLR = Personality == EHPersonality::CoreCLR;
2124 bool IsWasmCXX = Personality == EHPersonality::Wasm_CXX;
2125 bool IsSEH = isAsynchronousEHPersonality(Personality);
2126
2127 while (EHPadBB) {
2129 BasicBlock *NewEHPadBB = nullptr;
2130 if (isa<LandingPadInst>(Pad)) {
2131 // Stop on landingpads. They are not funclets.
2132 UnwindDests.emplace_back(FuncInfo.getMBB(EHPadBB), Prob);
2133 break;
2134 } else if (isa<CleanupPadInst>(Pad)) {
2135 // Stop on cleanup pads. Cleanups are always funclet entries for all known
2136 // personalities except Wasm. And in Wasm this becomes a catch_all(_ref),
2137 // which always catches an exception.
2138 UnwindDests.emplace_back(FuncInfo.getMBB(EHPadBB), Prob);
2139 UnwindDests.back().first->setIsEHScopeEntry();
2140 // In Wasm, EH scopes are not funclets
2141 if (!IsWasmCXX)
2142 UnwindDests.back().first->setIsEHFuncletEntry();
2143 break;
2144 } else if (const auto *CatchSwitch = dyn_cast<CatchSwitchInst>(Pad)) {
2145 // Add the catchpad handlers to the possible destinations.
2146 for (const BasicBlock *CatchPadBB : CatchSwitch->handlers()) {
2147 UnwindDests.emplace_back(FuncInfo.getMBB(CatchPadBB), Prob);
2148 // For MSVC++ and the CLR, catchblocks are funclets and need prologues.
2149 if (IsMSVCCXX || IsCoreCLR)
2150 UnwindDests.back().first->setIsEHFuncletEntry();
2151 if (!IsSEH)
2152 UnwindDests.back().first->setIsEHScopeEntry();
2153 }
2154 NewEHPadBB = CatchSwitch->getUnwindDest();
2155 } else {
2156 continue;
2157 }
2158
2159 BranchProbabilityInfo *BPI = FuncInfo.BPI;
2160 if (BPI && NewEHPadBB)
2161 Prob *= BPI->getEdgeProbability(EHPadBB, NewEHPadBB);
2162 EHPadBB = NewEHPadBB;
2163 }
2164}
2165
2166void SelectionDAGBuilder::visitCleanupRet(const CleanupReturnInst &I) {
2167 // Update successor info.
2169 auto UnwindDest = I.getUnwindDest();
2170 BranchProbabilityInfo *BPI = FuncInfo.BPI;
2171 BranchProbability UnwindDestProb =
2172 (BPI && UnwindDest)
2173 ? BPI->getEdgeProbability(FuncInfo.MBB->getBasicBlock(), UnwindDest)
2175 findUnwindDestinations(FuncInfo, UnwindDest, UnwindDestProb, UnwindDests);
2176 for (auto &UnwindDest : UnwindDests) {
2177 UnwindDest.first->setIsEHPad();
2178 addSuccessorWithProb(FuncInfo.MBB, UnwindDest.first, UnwindDest.second);
2179 }
2180 FuncInfo.MBB->normalizeSuccProbs();
2181
2182 // Create the terminator node.
2183 MachineBasicBlock *CleanupPadMBB =
2184 FuncInfo.getMBB(I.getCleanupPad()->getParent());
2185 SDValue Ret = DAG.getNode(ISD::CLEANUPRET, getCurSDLoc(), MVT::Other,
2186 getControlRoot(), DAG.getBasicBlock(CleanupPadMBB));
2187 DAG.setRoot(Ret);
2188}
2189
2190void SelectionDAGBuilder::visitCatchSwitch(const CatchSwitchInst &CSI) {
2191 report_fatal_error("visitCatchSwitch not yet implemented!");
2192}
2193
2194void SelectionDAGBuilder::visitRet(const ReturnInst &I) {
2195 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
2196 auto &DL = DAG.getDataLayout();
2197 SDValue Chain = getControlRoot();
2200
2201 // Calls to @llvm.experimental.deoptimize don't generate a return value, so
2202 // lower
2203 //
2204 // %val = call <ty> @llvm.experimental.deoptimize()
2205 // ret <ty> %val
2206 //
2207 // differently.
2208 if (I.getParent()->getTerminatingDeoptimizeCall()) {
2210 return;
2211 }
2212
2213 if (!FuncInfo.CanLowerReturn) {
2214 Register DemoteReg = FuncInfo.DemoteRegister;
2215
2216 // Emit a store of the return value through the virtual register.
2217 // Leave Outs empty so that LowerReturn won't try to load return
2218 // registers the usual way.
2219 MVT PtrValueVT = TLI.getPointerTy(DL, DL.getAllocaAddrSpace());
2220 SDValue RetPtr =
2221 DAG.getCopyFromReg(Chain, getCurSDLoc(), DemoteReg, PtrValueVT);
2222 SDValue RetOp = getValue(I.getOperand(0));
2223
2224 SmallVector<EVT, 4> ValueVTs, MemVTs;
2225 SmallVector<uint64_t, 4> Offsets;
2226 ComputeValueVTs(TLI, DL, I.getOperand(0)->getType(), ValueVTs, &MemVTs,
2227 &Offsets, 0);
2228 unsigned NumValues = ValueVTs.size();
2229
2230 SmallVector<SDValue, 4> Chains(NumValues);
2231 Align BaseAlign = DL.getPrefTypeAlign(I.getOperand(0)->getType());
2232 for (unsigned i = 0; i != NumValues; ++i) {
2233 // An aggregate return value cannot wrap around the address space, so
2234 // offsets to its parts don't wrap either.
2235 SDValue Ptr = DAG.getObjectPtrOffset(getCurSDLoc(), RetPtr,
2236 TypeSize::getFixed(Offsets[i]));
2237
2238 SDValue Val = RetOp.getValue(RetOp.getResNo() + i);
2239 if (MemVTs[i] != ValueVTs[i])
2240 Val = DAG.getPtrExtOrTrunc(Val, getCurSDLoc(), MemVTs[i]);
2241 Chains[i] = DAG.getStore(
2242 Chain, getCurSDLoc(), Val,
2243 // FIXME: better loc info would be nice.
2244 Ptr, MachinePointerInfo::getUnknownStack(DAG.getMachineFunction()),
2245 commonAlignment(BaseAlign, Offsets[i]));
2246 }
2247
2248 Chain = DAG.getNode(ISD::TokenFactor, getCurSDLoc(),
2249 MVT::Other, Chains);
2250 } else if (I.getNumOperands() != 0) {
2252 ComputeValueTypes(DL, I.getOperand(0)->getType(), Types);
2253 unsigned NumValues = Types.size();
2254 if (NumValues) {
2255 SDValue RetOp = getValue(I.getOperand(0));
2256
2257 const Function *F = I.getParent()->getParent();
2258
2259 bool NeedsRegBlock = TLI.functionArgumentNeedsConsecutiveRegisters(
2260 I.getOperand(0)->getType(), F->getCallingConv(),
2261 /*IsVarArg*/ false, DL);
2262
2263 ISD::NodeType ExtendKind = ISD::ANY_EXTEND;
2264 if (F->getAttributes().hasRetAttr(Attribute::SExt))
2265 ExtendKind = ISD::SIGN_EXTEND;
2266 else if (F->getAttributes().hasRetAttr(Attribute::ZExt))
2267 ExtendKind = ISD::ZERO_EXTEND;
2268
2269 LLVMContext &Context = F->getContext();
2270 bool RetInReg = F->getAttributes().hasRetAttr(Attribute::InReg);
2271
2272 for (unsigned j = 0; j != NumValues; ++j) {
2273 EVT VT = TLI.getValueType(DL, Types[j]);
2274
2275 if (ExtendKind != ISD::ANY_EXTEND && VT.isInteger())
2276 VT = TLI.getTypeForExtReturn(Context, VT, ExtendKind);
2277
2278 CallingConv::ID CC = F->getCallingConv();
2279
2280 unsigned NumParts = TLI.getNumRegistersForCallingConv(Context, CC, VT);
2281 MVT PartVT = TLI.getRegisterTypeForCallingConv(Context, CC, VT);
2282 SmallVector<SDValue, 4> Parts(NumParts);
2284 SDValue(RetOp.getNode(), RetOp.getResNo() + j),
2285 &Parts[0], NumParts, PartVT, &I, CC, ExtendKind);
2286
2287 // 'inreg' on function refers to return value
2288 ISD::ArgFlagsTy Flags = ISD::ArgFlagsTy();
2289 if (RetInReg)
2290 Flags.setInReg();
2291
2292 if (I.getOperand(0)->getType()->isPointerTy()) {
2293 Flags.setPointer();
2294 Flags.setPointerAddrSpace(
2295 cast<PointerType>(I.getOperand(0)->getType())->getAddressSpace());
2296 }
2297
2298 if (NeedsRegBlock) {
2299 Flags.setInConsecutiveRegs();
2300 if (j == NumValues - 1)
2301 Flags.setInConsecutiveRegsLast();
2302 }
2303
2304 // Propagate extension type if any
2305 if (ExtendKind == ISD::SIGN_EXTEND)
2306 Flags.setSExt();
2307 else if (ExtendKind == ISD::ZERO_EXTEND)
2308 Flags.setZExt();
2309 else if (F->getAttributes().hasRetAttr(Attribute::NoExt))
2310 Flags.setNoExt();
2311
2312 for (unsigned i = 0; i < NumParts; ++i) {
2313 Outs.push_back(ISD::OutputArg(Flags,
2314 Parts[i].getValueType().getSimpleVT(),
2315 VT, Types[j], 0, 0));
2316 OutVals.push_back(Parts[i]);
2317 }
2318 }
2319 }
2320 }
2321
2322 // Push in swifterror virtual register as the last element of Outs. This makes
2323 // sure swifterror virtual register will be returned in the swifterror
2324 // physical register.
2325 const Function *F = I.getParent()->getParent();
2326 if (TLI.supportSwiftError() &&
2327 F->getAttributes().hasAttrSomewhere(Attribute::SwiftError)) {
2328 assert(SwiftError.getFunctionArg() && "Need a swift error argument");
2329 ISD::ArgFlagsTy Flags = ISD::ArgFlagsTy();
2330 Flags.setSwiftError();
2331 Outs.push_back(ISD::OutputArg(Flags, /*vt=*/TLI.getPointerTy(DL),
2332 /*argvt=*/EVT(TLI.getPointerTy(DL)),
2333 PointerType::getUnqual(*DAG.getContext()),
2334 /*origidx=*/1, /*partOffs=*/0));
2335 // Create SDNode for the swifterror virtual register.
2336 OutVals.push_back(
2337 DAG.getRegister(SwiftError.getOrCreateVRegUseAt(
2338 &I, FuncInfo.MBB, SwiftError.getFunctionArg()),
2339 EVT(TLI.getPointerTy(DL))));
2340 }
2341
2342 bool isVarArg = DAG.getMachineFunction().getFunction().isVarArg();
2343 CallingConv::ID CallConv =
2344 DAG.getMachineFunction().getFunction().getCallingConv();
2345 Chain = DAG.getTargetLoweringInfo().LowerReturn(
2346 Chain, CallConv, isVarArg, Outs, OutVals, getCurSDLoc(), DAG);
2347
2348 // Verify that the target's LowerReturn behaved as expected.
2349 assert(Chain.getNode() && Chain.getValueType() == MVT::Other &&
2350 "LowerReturn didn't return a valid chain!");
2351
2352 // Update the DAG with the new chain value resulting from return lowering.
2353 DAG.setRoot(Chain);
2354}
2355
2356/// CopyToExportRegsIfNeeded - If the given value has virtual registers
2357/// created for it, emit nodes to copy the value into the virtual
2358/// registers.
2360 // Skip empty types
2361 if (V->getType()->isEmptyTy())
2362 return;
2363
2365 if (VMI != FuncInfo.ValueMap.end()) {
2366 assert((!V->use_empty() || isa<CallBrInst>(V)) &&
2367 "Unused value assigned virtual registers!");
2368 CopyValueToVirtualRegister(V, VMI->second);
2369 }
2370}
2371
2372/// ExportFromCurrentBlock - If this condition isn't known to be exported from
2373/// the current basic block, add it to ValueMap now so that we'll get a
2374/// CopyTo/FromReg.
2376 // No need to export constants.
2377 if (!isa<Instruction>(V) && !isa<Argument>(V)) return;
2378
2379 // Already exported?
2380 if (FuncInfo.isExportedInst(V)) return;
2381
2382 Register Reg = FuncInfo.InitializeRegForValue(V);
2384}
2385
2387 const BasicBlock *FromBB) {
2388 // The operands of the setcc have to be in this block. We don't know
2389 // how to export them from some other block.
2390 if (const Instruction *VI = dyn_cast<Instruction>(V)) {
2391 // Can export from current BB.
2392 if (VI->getParent() == FromBB)
2393 return true;
2394
2395 // Is already exported, noop.
2396 return FuncInfo.isExportedInst(V);
2397 }
2398
2399 // If this is an argument, we can export it if the BB is the entry block or
2400 // if it is already exported.
2401 if (isa<Argument>(V)) {
2402 if (FromBB->isEntryBlock())
2403 return true;
2404
2405 // Otherwise, can only export this if it is already exported.
2406 return FuncInfo.isExportedInst(V);
2407 }
2408
2409 // Otherwise, constants can always be exported.
2410 return true;
2411}
2412
2413/// Return branch probability calculated by BranchProbabilityInfo for IR blocks.
2415SelectionDAGBuilder::getEdgeProbability(const MachineBasicBlock *Src,
2416 const MachineBasicBlock *Dst) const {
2418 const BasicBlock *SrcBB = Src->getBasicBlock();
2419 const BasicBlock *DstBB = Dst->getBasicBlock();
2420 if (!BPI) {
2421 // If BPI is not available, set the default probability as 1 / N, where N is
2422 // the number of successors.
2423 auto SuccSize = std::max<uint32_t>(succ_size(SrcBB), 1);
2424 return BranchProbability(1, SuccSize);
2425 }
2426 return BPI->getEdgeProbability(SrcBB, DstBB);
2427}
2428
2429void SelectionDAGBuilder::addSuccessorWithProb(MachineBasicBlock *Src,
2430 MachineBasicBlock *Dst,
2431 BranchProbability Prob) {
2432 if (!FuncInfo.BPI)
2433 Src->addSuccessorWithoutProb(Dst);
2434 else {
2435 if (Prob.isUnknown())
2436 Prob = getEdgeProbability(Src, Dst);
2437 Src->addSuccessor(Dst, Prob);
2438 }
2439}
2440
2441static bool InBlock(const Value *V, const BasicBlock *BB) {
2442 if (const Instruction *I = dyn_cast<Instruction>(V))
2443 return I->getParent() == BB;
2444 return true;
2445}
2446
2447/// EmitBranchForMergedCondition - Helper method for FindMergedConditions.
2448/// This function emits a branch and is used at the leaves of an OR or an
2449/// AND operator tree.
2450void
2453 MachineBasicBlock *FBB,
2454 MachineBasicBlock *CurBB,
2455 MachineBasicBlock *SwitchBB,
2456 BranchProbability TProb,
2457 BranchProbability FProb,
2458 bool InvertCond) {
2459 const BasicBlock *BB = CurBB->getBasicBlock();
2460
2461 // If the leaf of the tree is a comparison, merge the condition into
2462 // the caseblock.
2463 if (const CmpInst *BOp = dyn_cast<CmpInst>(Cond)) {
2464 // The operands of the cmp have to be in this block. We don't know
2465 // how to export them from some other block. If this is the first block
2466 // of the sequence, no exporting is needed.
2467 if (CurBB == SwitchBB ||
2468 (isExportableFromCurrentBlock(BOp->getOperand(0), BB) &&
2469 isExportableFromCurrentBlock(BOp->getOperand(1), BB))) {
2470 ISD::CondCode Condition;
2471 if (const ICmpInst *IC = dyn_cast<ICmpInst>(Cond)) {
2472 ICmpInst::Predicate Pred =
2473 InvertCond ? IC->getInversePredicate() : IC->getPredicate();
2474 Condition = getICmpCondCode(Pred);
2475 } else {
2476 const FCmpInst *FC = cast<FCmpInst>(Cond);
2477 FCmpInst::Predicate Pred =
2478 InvertCond ? FC->getInversePredicate() : FC->getPredicate();
2479 Condition = getFCmpCondCode(Pred);
2480 if (FC->hasNoNaNs() ||
2481 (isKnownNeverNaN(FC->getOperand(0),
2482 SimplifyQuery(DAG.getDataLayout(), FC)) &&
2483 isKnownNeverNaN(FC->getOperand(1),
2484 SimplifyQuery(DAG.getDataLayout(), FC))))
2485 Condition = getFCmpCodeWithoutNaN(Condition);
2486 }
2487
2488 CaseBlock CB(Condition, BOp->getOperand(0), BOp->getOperand(1), nullptr,
2489 TBB, FBB, CurBB, getCurSDLoc(), TProb, FProb);
2490 SL->SwitchCases.push_back(CB);
2491 return;
2492 }
2493 }
2494
2495 // Create a CaseBlock record representing this branch.
2496 ISD::CondCode Opc = InvertCond ? ISD::SETNE : ISD::SETEQ;
2497 CaseBlock CB(Opc, Cond, ConstantInt::getTrue(*DAG.getContext()),
2498 nullptr, TBB, FBB, CurBB, getCurSDLoc(), TProb, FProb);
2499 SL->SwitchCases.push_back(CB);
2500}
2501
2502// Collect dependencies on V recursively. This is used for the cost analysis in
2503// `shouldKeepJumpConditionsTogether`.
2507 unsigned Depth = 0) {
2508 // Return false if we have an incomplete count.
2510 return false;
2511
2512 auto *I = dyn_cast<Instruction>(V);
2513 if (I == nullptr)
2514 return true;
2515
2516 if (Necessary != nullptr) {
2517 // This instruction is necessary for the other side of the condition so
2518 // don't count it.
2519 if (Necessary->contains(I))
2520 return true;
2521 }
2522
2523 // Already added this dep.
2524 if (!Deps->try_emplace(I, false).second)
2525 return true;
2526
2527 for (unsigned OpIdx = 0, E = I->getNumOperands(); OpIdx < E; ++OpIdx)
2528 if (!collectInstructionDeps(Deps, I->getOperand(OpIdx), Necessary,
2529 Depth + 1))
2530 return false;
2531 return true;
2532}
2533
2536 Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs,
2538 if (Params.BaseCost < 0)
2539 return false;
2540
2541 // Baseline cost.
2542 InstructionCost CostThresh = Params.BaseCost;
2543
2544 BranchProbabilityInfo *BPI = nullptr;
2545 if (Params.LikelyBias || Params.UnlikelyBias)
2546 BPI = FuncInfo.BPI;
2547 if (BPI != nullptr) {
2548 // See if we are either likely to get an early out or compute both lhs/rhs
2549 // of the condition.
2550 BasicBlock *IfFalse = I.getSuccessor(0);
2551 BasicBlock *IfTrue = I.getSuccessor(1);
2552
2553 std::optional<bool> Likely;
2554 if (BPI->isEdgeHot(I.getParent(), IfTrue))
2555 Likely = true;
2556 else if (BPI->isEdgeHot(I.getParent(), IfFalse))
2557 Likely = false;
2558
2559 if (Likely) {
2560 if (Opc == (*Likely ? Instruction::And : Instruction::Or))
2561 // Its likely we will have to compute both lhs and rhs of condition
2562 CostThresh += Params.LikelyBias;
2563 else {
2564 if (Params.UnlikelyBias < 0)
2565 return false;
2566 // Its likely we will get an early out.
2567 CostThresh -= Params.UnlikelyBias;
2568 }
2569 }
2570 }
2571
2572 if (CostThresh <= 0)
2573 return false;
2574
2575 // Collect "all" instructions that lhs condition is dependent on.
2576 // Use map for stable iteration (to avoid non-determanism of iteration of
2577 // SmallPtrSet). The `bool` value is just a dummy.
2579 collectInstructionDeps(&LhsDeps, Lhs);
2580 // Collect "all" instructions that rhs condition is dependent on AND are
2581 // dependencies of lhs. This gives us an estimate on which instructions we
2582 // stand to save by splitting the condition.
2583 if (!collectInstructionDeps(&RhsDeps, Rhs, &LhsDeps))
2584 return false;
2585 // Add the compare instruction itself unless its a dependency on the LHS.
2586 if (const auto *RhsI = dyn_cast<Instruction>(Rhs))
2587 if (!LhsDeps.contains(RhsI))
2588 RhsDeps.try_emplace(RhsI, false);
2589
2590 InstructionCost CostOfIncluding = 0;
2591 // See if this instruction will need to computed independently of whether RHS
2592 // is.
2593 Value *BrCond = I.getCondition();
2594 auto ShouldCountInsn = [&RhsDeps, &BrCond](const Instruction *Ins) {
2595 for (const auto *U : Ins->users()) {
2596 // If user is independent of RHS calculation we don't need to count it.
2597 if (auto *UIns = dyn_cast<Instruction>(U))
2598 if (UIns != BrCond && !RhsDeps.contains(UIns))
2599 return false;
2600 }
2601 return true;
2602 };
2603
2604 // Prune instructions from RHS Deps that are dependencies of unrelated
2605 // instructions. The value (SelectionDAG::MaxRecursionDepth) is fairly
2606 // arbitrary and just meant to cap the how much time we spend in the pruning
2607 // loop. Its highly unlikely to come into affect.
2608 const unsigned MaxPruneIters = SelectionDAG::MaxRecursionDepth;
2609 // Stop after a certain point. No incorrectness from including too many
2610 // instructions.
2611 for (unsigned PruneIters = 0; PruneIters < MaxPruneIters; ++PruneIters) {
2612 const Instruction *ToDrop = nullptr;
2613 for (const auto &InsPair : RhsDeps) {
2614 if (!ShouldCountInsn(InsPair.first)) {
2615 ToDrop = InsPair.first;
2616 break;
2617 }
2618 }
2619 if (ToDrop == nullptr)
2620 break;
2621 RhsDeps.erase(ToDrop);
2622 }
2623
2624 for (const auto &InsPair : RhsDeps) {
2625 // Finally accumulate latency that we can only attribute to computing the
2626 // RHS condition. Use latency because we are essentially trying to calculate
2627 // the cost of the dependency chain.
2628 // Possible TODO: We could try to estimate ILP and make this more precise.
2629 CostOfIncluding += TTI->getInstructionCost(
2630 InsPair.first, TargetTransformInfo::TCK_Latency);
2631
2632 if (CostOfIncluding > CostThresh)
2633 return false;
2634 }
2635 return true;
2636}
2637
2640 MachineBasicBlock *FBB,
2641 MachineBasicBlock *CurBB,
2642 MachineBasicBlock *SwitchBB,
2644 BranchProbability TProb,
2645 BranchProbability FProb,
2646 bool InvertCond) {
2647 // Skip over not part of the tree and remember to invert op and operands at
2648 // next level.
2649 Value *NotCond;
2650 if (match(Cond, m_OneUse(m_Not(m_Value(NotCond)))) &&
2651 InBlock(NotCond, CurBB->getBasicBlock())) {
2652 FindMergedConditions(NotCond, TBB, FBB, CurBB, SwitchBB, Opc, TProb, FProb,
2653 !InvertCond);
2654 return;
2655 }
2656
2658 const Value *BOpOp0, *BOpOp1;
2659 // Compute the effective opcode for Cond, taking into account whether it needs
2660 // to be inverted, e.g.
2661 // and (not (or A, B)), C
2662 // gets lowered as
2663 // and (and (not A, not B), C)
2665 if (BOp) {
2666 BOpc = match(BOp, m_LogicalAnd(m_Value(BOpOp0), m_Value(BOpOp1)))
2667 ? Instruction::And
2668 : (match(BOp, m_LogicalOr(m_Value(BOpOp0), m_Value(BOpOp1)))
2669 ? Instruction::Or
2671 if (InvertCond) {
2672 if (BOpc == Instruction::And)
2673 BOpc = Instruction::Or;
2674 else if (BOpc == Instruction::Or)
2675 BOpc = Instruction::And;
2676 }
2677 }
2678
2679 // If this node is not part of the or/and tree, emit it as a branch.
2680 // Note that all nodes in the tree should have same opcode.
2681 bool BOpIsInOrAndTree = BOpc && BOpc == Opc && BOp->hasOneUse();
2682 if (!BOpIsInOrAndTree || BOp->getParent() != CurBB->getBasicBlock() ||
2683 !InBlock(BOpOp0, CurBB->getBasicBlock()) ||
2684 !InBlock(BOpOp1, CurBB->getBasicBlock())) {
2685 EmitBranchForMergedCondition(Cond, TBB, FBB, CurBB, SwitchBB,
2686 TProb, FProb, InvertCond);
2687 return;
2688 }
2689
2690 // Create TmpBB after CurBB.
2691 MachineFunction::iterator BBI(CurBB);
2692 MachineFunction &MF = DAG.getMachineFunction();
2694 CurBB->getParent()->insert(++BBI, TmpBB);
2695
2696 if (Opc == Instruction::Or) {
2697 // Codegen X | Y as:
2698 // BB1:
2699 // jmp_if_X TBB
2700 // jmp TmpBB
2701 // TmpBB:
2702 // jmp_if_Y TBB
2703 // jmp FBB
2704 //
2705
2706 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
2707 // The requirement is that
2708 // TrueProb for BB1 + (FalseProb for BB1 * TrueProb for TmpBB)
2709 // = TrueProb for original BB.
2710 // Assuming the original probabilities are A and B, one choice is to set
2711 // BB1's probabilities to A/2 and A/2+B, and set TmpBB's probabilities to
2712 // A/(1+B) and 2B/(1+B). This choice assumes that
2713 // TrueProb for BB1 == FalseProb for BB1 * TrueProb for TmpBB.
2714 // Another choice is to assume TrueProb for BB1 equals to TrueProb for
2715 // TmpBB, but the math is more complicated.
2716
2717 auto NewTrueProb = TProb / 2;
2718 auto NewFalseProb = TProb / 2 + FProb;
2719 // Emit the LHS condition.
2720 FindMergedConditions(BOpOp0, TBB, TmpBB, CurBB, SwitchBB, Opc, NewTrueProb,
2721 NewFalseProb, InvertCond);
2722
2723 // Normalize A/2 and B to get A/(1+B) and 2B/(1+B).
2724 SmallVector<BranchProbability, 2> Probs{TProb / 2, FProb};
2726 // Emit the RHS condition into TmpBB.
2727 FindMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
2728 Probs[1], InvertCond);
2729 } else {
2730 assert(Opc == Instruction::And && "Unknown merge op!");
2731 // Codegen X & Y as:
2732 // BB1:
2733 // jmp_if_X TmpBB
2734 // jmp FBB
2735 // TmpBB:
2736 // jmp_if_Y TBB
2737 // jmp FBB
2738 //
2739 // This requires creation of TmpBB after CurBB.
2740
2741 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
2742 // The requirement is that
2743 // FalseProb for BB1 + (TrueProb for BB1 * FalseProb for TmpBB)
2744 // = FalseProb for original BB.
2745 // Assuming the original probabilities are A and B, one choice is to set
2746 // BB1's probabilities to A+B/2 and B/2, and set TmpBB's probabilities to
2747 // 2A/(1+A) and B/(1+A). This choice assumes that FalseProb for BB1 ==
2748 // TrueProb for BB1 * FalseProb for TmpBB.
2749
2750 auto NewTrueProb = TProb + FProb / 2;
2751 auto NewFalseProb = FProb / 2;
2752 // Emit the LHS condition.
2753 FindMergedConditions(BOpOp0, TmpBB, FBB, CurBB, SwitchBB, Opc, NewTrueProb,
2754 NewFalseProb, InvertCond);
2755
2756 // Normalize A and B/2 to get 2A/(1+A) and B/(1+A).
2757 SmallVector<BranchProbability, 2> Probs{TProb, FProb / 2};
2759 // Emit the RHS condition into TmpBB.
2760 FindMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
2761 Probs[1], InvertCond);
2762 }
2763}
2764
2765/// If the set of cases should be emitted as a series of branches, return true.
2766/// If we should emit this as a bunch of and/or'd together conditions, return
2767/// false.
2768bool
2769SelectionDAGBuilder::ShouldEmitAsBranches(const std::vector<CaseBlock> &Cases) {
2770 if (Cases.size() != 2) return true;
2771
2772 // If this is two comparisons of the same values or'd or and'd together, they
2773 // will get folded into a single comparison, so don't emit two blocks.
2774 if ((Cases[0].CmpLHS == Cases[1].CmpLHS &&
2775 Cases[0].CmpRHS == Cases[1].CmpRHS) ||
2776 (Cases[0].CmpRHS == Cases[1].CmpLHS &&
2777 Cases[0].CmpLHS == Cases[1].CmpRHS)) {
2778 return false;
2779 }
2780
2781 // Handle: (X != null) | (Y != null) --> (X|Y) != 0
2782 // Handle: (X == null) & (Y == null) --> (X|Y) == 0
2783 if (Cases[0].CmpRHS == Cases[1].CmpRHS &&
2784 Cases[0].CC == Cases[1].CC &&
2785 isa<Constant>(Cases[0].CmpRHS) &&
2786 cast<Constant>(Cases[0].CmpRHS)->isNullValue()) {
2787 if (Cases[0].CC == ISD::SETEQ && Cases[0].TrueBB == Cases[1].ThisBB)
2788 return false;
2789 if (Cases[0].CC == ISD::SETNE && Cases[0].FalseBB == Cases[1].ThisBB)
2790 return false;
2791 }
2792
2793 return true;
2794}
2795
2796void SelectionDAGBuilder::visitUncondBr(const UncondBrInst &I) {
2798
2799 MachineBasicBlock *Succ0MBB = FuncInfo.getMBB(I.getSuccessor(0));
2800
2801 // Update machine-CFG edges.
2802 BrMBB->addSuccessor(Succ0MBB);
2803
2804 // If this is not a fall-through branch or optimizations are switched off,
2805 // emit the branch.
2806 if (Succ0MBB != NextBlock(BrMBB) ||
2808 auto Br = DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other, getControlRoot(),
2809 DAG.getBasicBlock(Succ0MBB));
2810 setValue(&I, Br);
2811 DAG.setRoot(Br);
2812 }
2813}
2814
2815void SelectionDAGBuilder::visitCondBr(const CondBrInst &I) {
2816 MachineBasicBlock *BrMBB = FuncInfo.MBB;
2817
2818 MachineBasicBlock *Succ0MBB = FuncInfo.getMBB(I.getSuccessor(0));
2819
2820 // If this condition is one of the special cases we handle, do special stuff
2821 // now.
2822 const Value *CondVal = I.getCondition();
2823 MachineBasicBlock *Succ1MBB = FuncInfo.getMBB(I.getSuccessor(1));
2824
2825 // If this is a series of conditions that are or'd or and'd together, emit
2826 // this as a sequence of branches instead of setcc's with and/or operations.
2827 // As long as jumps are not expensive (exceptions for multi-use logic ops,
2828 // unpredictable branches, and vector extracts because those jumps are likely
2829 // expensive for any target), this should improve performance.
2830 // For example, instead of something like:
2831 // cmp A, B
2832 // C = seteq
2833 // cmp D, E
2834 // F = setle
2835 // or C, F
2836 // jnz foo
2837 // Emit:
2838 // cmp A, B
2839 // je foo
2840 // cmp D, E
2841 // jle foo
2842 bool IsUnpredictable = I.hasMetadata(LLVMContext::MD_unpredictable);
2843 const Instruction *BOp = dyn_cast<Instruction>(CondVal);
2844 if (!DAG.getTargetLoweringInfo().isJumpExpensive() && BOp &&
2845 BOp->hasOneUse() && !IsUnpredictable) {
2846 Value *Vec;
2847 const Value *BOp0, *BOp1;
2849 if (match(BOp, m_LogicalAnd(m_Value(BOp0), m_Value(BOp1))))
2850 Opcode = Instruction::And;
2851 else if (match(BOp, m_LogicalOr(m_Value(BOp0), m_Value(BOp1))))
2852 Opcode = Instruction::Or;
2853
2854 if (Opcode &&
2855 !(match(BOp0, m_ExtractElt(m_Value(Vec), m_Value())) &&
2856 match(BOp1, m_ExtractElt(m_Specific(Vec), m_Value()))) &&
2858 FuncInfo, I, Opcode, BOp0, BOp1,
2859 DAG.getTargetLoweringInfo().getJumpConditionMergingParams(
2860 Opcode, BOp0, BOp1))) {
2861 FindMergedConditions(BOp, Succ0MBB, Succ1MBB, BrMBB, BrMBB, Opcode,
2862 getEdgeProbability(BrMBB, Succ0MBB),
2863 getEdgeProbability(BrMBB, Succ1MBB),
2864 /*InvertCond=*/false);
2865 // If the compares in later blocks need to use values not currently
2866 // exported from this block, export them now. This block should always
2867 // be the first entry.
2868 assert(SL->SwitchCases[0].ThisBB == BrMBB && "Unexpected lowering!");
2869
2870 // Allow some cases to be rejected.
2871 if (ShouldEmitAsBranches(SL->SwitchCases)) {
2872 for (unsigned i = 1, e = SL->SwitchCases.size(); i != e; ++i) {
2873 ExportFromCurrentBlock(SL->SwitchCases[i].CmpLHS);
2874 ExportFromCurrentBlock(SL->SwitchCases[i].CmpRHS);
2875 }
2876
2877 // Emit the branch for this block.
2878 visitSwitchCase(SL->SwitchCases[0], BrMBB);
2879 SL->SwitchCases.erase(SL->SwitchCases.begin());
2880 return;
2881 }
2882
2883 // Okay, we decided not to do this, remove any inserted MBB's and clear
2884 // SwitchCases.
2885 for (unsigned i = 1, e = SL->SwitchCases.size(); i != e; ++i)
2886 FuncInfo.MF->erase(SL->SwitchCases[i].ThisBB);
2887
2888 SL->SwitchCases.clear();
2889 }
2890 }
2891
2892 // Create a CaseBlock record representing this branch.
2893 CaseBlock CB(ISD::SETEQ, CondVal, ConstantInt::getTrue(*DAG.getContext()),
2894 nullptr, Succ0MBB, Succ1MBB, BrMBB, getCurSDLoc(),
2896 IsUnpredictable);
2897
2898 // Use visitSwitchCase to actually insert the fast branch sequence for this
2899 // cond branch.
2900 visitSwitchCase(CB, BrMBB);
2901}
2902
2903/// visitSwitchCase - Emits the necessary code to represent a single node in
2904/// the binary search tree resulting from lowering a switch instruction.
2906 MachineBasicBlock *SwitchBB) {
2907 SDValue Cond;
2908 SDValue CondLHS = getValue(CB.CmpLHS);
2909 SDLoc dl = CB.DL;
2910
2911 if (CB.CC == ISD::SETTRUE) {
2912 // Branch or fall through to TrueBB.
2913 addSuccessorWithProb(SwitchBB, CB.TrueBB, CB.TrueProb);
2914 SwitchBB->normalizeSuccProbs();
2915 if (CB.TrueBB != NextBlock(SwitchBB)) {
2916 DAG.setRoot(DAG.getNode(ISD::BR, dl, MVT::Other, getControlRoot(),
2917 DAG.getBasicBlock(CB.TrueBB)));
2918 }
2919 return;
2920 }
2921
2922 auto &TLI = DAG.getTargetLoweringInfo();
2923 EVT MemVT = TLI.getMemValueType(DAG.getDataLayout(), CB.CmpLHS->getType());
2924
2925 // Build the setcc now.
2926 if (!CB.CmpMHS) {
2927 // Fold "(X == true)" to X and "(X == false)" to !X to
2928 // handle common cases produced by branch lowering.
2929 if (CB.CmpRHS == ConstantInt::getTrue(*DAG.getContext()) &&
2930 CB.CC == ISD::SETEQ)
2931 Cond = CondLHS;
2932 else if (CB.CmpRHS == ConstantInt::getFalse(*DAG.getContext()) &&
2933 CB.CC == ISD::SETEQ) {
2934 SDValue True = DAG.getConstant(1, dl, CondLHS.getValueType());
2935 Cond = DAG.getNode(ISD::XOR, dl, CondLHS.getValueType(), CondLHS, True);
2936 } else {
2937 SDValue CondRHS = getValue(CB.CmpRHS);
2938
2939 // If a pointer's DAG type is larger than its memory type then the DAG
2940 // values are zero-extended. This breaks signed comparisons so truncate
2941 // back to the underlying type before doing the compare.
2942 if (CondLHS.getValueType() != MemVT) {
2943 CondLHS = DAG.getPtrExtOrTrunc(CondLHS, getCurSDLoc(), MemVT);
2944 CondRHS = DAG.getPtrExtOrTrunc(CondRHS, getCurSDLoc(), MemVT);
2945 }
2946 Cond = DAG.getSetCC(dl, MVT::i1, CondLHS, CondRHS, CB.CC);
2947 }
2948 } else {
2949 assert(CB.CC == ISD::SETLE && "Can handle only LE ranges now");
2950
2951 const APInt& Low = cast<ConstantInt>(CB.CmpLHS)->getValue();
2952 const APInt& High = cast<ConstantInt>(CB.CmpRHS)->getValue();
2953
2954 SDValue CmpOp = getValue(CB.CmpMHS);
2955 EVT VT = CmpOp.getValueType();
2956
2957 if (cast<ConstantInt>(CB.CmpLHS)->isMinValue(true)) {
2958 Cond = DAG.getSetCC(dl, MVT::i1, CmpOp, DAG.getConstant(High, dl, VT),
2959 ISD::SETLE);
2960 } else {
2961 SDValue SUB = DAG.getNode(ISD::SUB, dl,
2962 VT, CmpOp, DAG.getConstant(Low, dl, VT));
2963 Cond = DAG.getSetCC(dl, MVT::i1, SUB,
2964 DAG.getConstant(High-Low, dl, VT), ISD::SETULE);
2965 }
2966 }
2967
2968 // Update successor info
2969 addSuccessorWithProb(SwitchBB, CB.TrueBB, CB.TrueProb);
2970 // TrueBB and FalseBB are always different unless the incoming IR is
2971 // degenerate. This only happens when running llc on weird IR.
2972 if (CB.TrueBB != CB.FalseBB)
2973 addSuccessorWithProb(SwitchBB, CB.FalseBB, CB.FalseProb);
2974 SwitchBB->normalizeSuccProbs();
2975
2976 // If the lhs block is the next block, invert the condition so that we can
2977 // fall through to the lhs instead of the rhs block.
2978 if (CB.TrueBB == NextBlock(SwitchBB)) {
2979 std::swap(CB.TrueBB, CB.FalseBB);
2980 SDValue True = DAG.getConstant(1, dl, Cond.getValueType());
2981 Cond = DAG.getNode(ISD::XOR, dl, Cond.getValueType(), Cond, True);
2982 }
2983
2984 SDNodeFlags Flags;
2986 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl, MVT::Other, getControlRoot(),
2987 Cond, DAG.getBasicBlock(CB.TrueBB), Flags);
2988
2989 setValue(CurInst, BrCond);
2990
2991 // Insert the false branch. Do this even if it's a fall through branch,
2992 // this makes it easier to do DAG optimizations which require inverting
2993 // the branch condition.
2994 BrCond = DAG.getNode(ISD::BR, dl, MVT::Other, BrCond,
2995 DAG.getBasicBlock(CB.FalseBB));
2996
2997 DAG.setRoot(BrCond);
2998}
2999
3000/// visitJumpTable - Emit JumpTable node in the current MBB
3002 // Emit the code for the jump table
3003 assert(JT.SL && "Should set SDLoc for SelectionDAG!");
3004 assert(JT.Reg && "Should lower JT Header first!");
3005 EVT PTy = DAG.getTargetLoweringInfo().getJumpTableRegTy(DAG.getDataLayout());
3006 SDValue Index = DAG.getCopyFromReg(getControlRoot(), *JT.SL, JT.Reg, PTy);
3007 SDValue Table = DAG.getJumpTable(JT.JTI, PTy);
3008 SDValue BrJumpTable = DAG.getNode(ISD::BR_JT, *JT.SL, MVT::Other,
3009 Index.getValue(1), Table, Index);
3010 DAG.setRoot(BrJumpTable);
3011}
3012
3013/// visitJumpTableHeader - This function emits necessary code to produce index
3014/// in the JumpTable from switch case.
3016 JumpTableHeader &JTH,
3017 MachineBasicBlock *SwitchBB) {
3018 assert(JT.SL && "Should set SDLoc for SelectionDAG!");
3019 const SDLoc &dl = *JT.SL;
3020
3021 // Subtract the lowest switch case value from the value being switched on.
3022 SDValue SwitchOp = getValue(JTH.SValue);
3023 EVT VT = SwitchOp.getValueType();
3024 SDValue Sub = DAG.getNode(ISD::SUB, dl, VT, SwitchOp,
3025 DAG.getConstant(JTH.First, dl, VT));
3026
3027 // The SDNode we just created, which holds the value being switched on minus
3028 // the smallest case value, needs to be copied to a virtual register so it
3029 // can be used as an index into the jump table in a subsequent basic block.
3030 // This value may be smaller or larger than the target's pointer type, and
3031 // therefore require extension or truncating.
3032 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3033 SwitchOp =
3034 DAG.getZExtOrTrunc(Sub, dl, TLI.getJumpTableRegTy(DAG.getDataLayout()));
3035
3036 Register JumpTableReg =
3037 FuncInfo.CreateReg(TLI.getJumpTableRegTy(DAG.getDataLayout()));
3038 SDValue CopyTo =
3039 DAG.getCopyToReg(getControlRoot(), dl, JumpTableReg, SwitchOp);
3040 JT.Reg = JumpTableReg;
3041
3042 if (!JTH.FallthroughUnreachable) {
3043 // Emit the range check for the jump table, and branch to the default block
3044 // for the switch statement if the value being switched on exceeds the
3045 // largest case in the switch.
3046 SDValue CMP = DAG.getSetCC(
3047 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
3048 Sub.getValueType()),
3049 Sub, DAG.getConstant(JTH.Last - JTH.First, dl, VT), ISD::SETUGT);
3050
3051 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl,
3052 MVT::Other, CopyTo, CMP,
3053 DAG.getBasicBlock(JT.Default));
3054
3055 // Avoid emitting unnecessary branches to the next block.
3056 if (JT.MBB != NextBlock(SwitchBB))
3057 BrCond = DAG.getNode(ISD::BR, dl, MVT::Other, BrCond,
3058 DAG.getBasicBlock(JT.MBB));
3059
3060 DAG.setRoot(BrCond);
3061 } else {
3062 // Avoid emitting unnecessary branches to the next block.
3063 if (JT.MBB != NextBlock(SwitchBB))
3064 DAG.setRoot(DAG.getNode(ISD::BR, dl, MVT::Other, CopyTo,
3065 DAG.getBasicBlock(JT.MBB)));
3066 else
3067 DAG.setRoot(CopyTo);
3068 }
3069}
3070
3071/// Create a LOAD_STACK_GUARD node, and let it carry the target specific global
3072/// variable if there exists one.
3074 SDValue &Chain) {
3075 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3076 EVT PtrTy = TLI.getPointerTy(DAG.getDataLayout());
3077 EVT PtrMemTy = TLI.getPointerMemTy(DAG.getDataLayout());
3079 Value *Global =
3082 DAG.getMachineNode(TargetOpcode::LOAD_STACK_GUARD, DL, PtrTy, Chain);
3083 if (Global) {
3084 MachinePointerInfo MPInfo(Global);
3088 MPInfo, Flags, PtrTy.getSizeInBits() / 8, DAG.getEVTAlign(PtrTy));
3089 DAG.setNodeMemRefs(Node, {MemRef});
3090 }
3091 if (PtrTy != PtrMemTy)
3092 return DAG.getPtrExtOrTrunc(SDValue(Node, 0), DL, PtrMemTy);
3093 return SDValue(Node, 0);
3094}
3095
3096/// Codegen a new tail for a stack protector check ParentMBB which has had its
3097/// tail spliced into a stack protector check success bb.
3098///
3099/// For a high level explanation of how this fits into the stack protector
3100/// generation see the comment on the declaration of class
3101/// StackProtectorDescriptor.
3103 MachineBasicBlock *ParentBB) {
3104
3105 // First create the loads to the guard/stack slot for the comparison.
3106 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3107 auto &DL = DAG.getDataLayout();
3108 EVT PtrTy = TLI.getFrameIndexTy(DL);
3109 EVT PtrMemTy = TLI.getPointerMemTy(DL, DL.getAllocaAddrSpace());
3110
3111 MachineFrameInfo &MFI = ParentBB->getParent()->getFrameInfo();
3112 int FI = MFI.getStackProtectorIndex();
3113
3114 SDValue Guard;
3115 SDLoc dl = getCurSDLoc();
3116 SDValue StackSlotPtr = DAG.getFrameIndex(FI, PtrTy);
3117 const Module &M = *ParentBB->getParent()->getFunction().getParent();
3118 Align Align = DL.getPrefTypeAlign(
3119 PointerType::get(M.getContext(), DL.getAllocaAddrSpace()));
3120
3121 // Generate code to load the content of the guard slot.
3122 SDValue GuardVal = DAG.getLoad(
3123 PtrMemTy, dl, DAG.getEntryNode(), StackSlotPtr,
3124 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI), Align,
3126
3127 if (TLI.useStackGuardXorFP())
3128 GuardVal = TLI.emitStackGuardXorFP(DAG, GuardVal, dl);
3129
3130 // If we're using function-based instrumentation, call the guard check
3131 // function
3133 // Get the guard check function from the target and verify it exists since
3134 // we're using function-based instrumentation
3135 const Function *GuardCheckFn =
3136 TLI.getSSPStackGuardCheck(M, DAG.getLibcalls());
3137 assert(GuardCheckFn && "Guard check function is null");
3138
3139 // The target provides a guard check function to validate the guard value.
3140 // Generate a call to that function with the content of the guard slot as
3141 // argument.
3142 FunctionType *FnTy = GuardCheckFn->getFunctionType();
3143 assert(FnTy->getNumParams() == 1 && "Invalid function signature");
3144
3146 TargetLowering::ArgListEntry Entry(GuardVal, FnTy->getParamType(0));
3147 if (GuardCheckFn->hasParamAttribute(0, Attribute::AttrKind::InReg))
3148 Entry.IsInReg = true;
3149 Args.push_back(Entry);
3150
3153 .setChain(DAG.getEntryNode())
3154 .setCallee(GuardCheckFn->getCallingConv(), FnTy->getReturnType(),
3155 getValue(GuardCheckFn), std::move(Args));
3156
3157 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
3158 DAG.setRoot(Result.second);
3159 return;
3160 }
3161
3162 // If useLoadStackGuardNode returns true, generate LOAD_STACK_GUARD.
3163 // Otherwise, emit a volatile load to retrieve the stack guard value.
3164 SDValue Chain = DAG.getEntryNode();
3165 if (TLI.useLoadStackGuardNode(M)) {
3166 Guard = getLoadStackGuard(DAG, dl, Chain);
3167 } else {
3168 if (const Value *IRGuard = TLI.getSDagStackGuard(M, DAG.getLibcalls())) {
3169 SDValue GuardPtr = getValue(IRGuard);
3170 Guard = DAG.getLoad(PtrMemTy, dl, Chain, GuardPtr,
3171 MachinePointerInfo(IRGuard, 0), Align,
3173 } else {
3174 LLVMContext &Ctx = *DAG.getContext();
3175 Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
3176 Guard = DAG.getPOISON(PtrMemTy);
3177 }
3178 }
3179
3180 // Perform the comparison via a getsetcc.
3181 SDValue Cmp = DAG.getSetCC(
3182 dl, TLI.getSetCCResultType(DL, *DAG.getContext(), Guard.getValueType()),
3183 Guard, GuardVal, ISD::SETNE);
3184
3185 // If the guard/stackslot do not equal, branch to failure MBB.
3186 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl, MVT::Other, getControlRoot(),
3187 Cmp, DAG.getBasicBlock(SPD.getFailureMBB()));
3188 // Otherwise branch to success MBB.
3189 SDValue Br = DAG.getNode(ISD::BR, dl,
3190 MVT::Other, BrCond,
3191 DAG.getBasicBlock(SPD.getSuccessMBB()));
3192
3193 DAG.setRoot(Br);
3194}
3195
3196/// Codegen the failure basic block for a stack protector check.
3197///
3198/// A failure stack protector machine basic block consists simply of a call to
3199/// __stack_chk_fail().
3200///
3201/// For a high level explanation of how this fits into the stack protector
3202/// generation see the comment on the declaration of class
3203/// StackProtectorDescriptor.
3206
3207 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3208 MachineBasicBlock *ParentBB = SPD.getParentMBB();
3209 const Module &M = *ParentBB->getParent()->getFunction().getParent();
3210 SDValue Chain;
3211
3212 // For -Oz builds with a guard check function, we use function-based
3213 // instrumentation. Otherwise, if we have a guard check function, we call it
3214 // in the failure block.
3215 auto *GuardCheckFn = TLI.getSSPStackGuardCheck(M, DAG.getLibcalls());
3216 if (GuardCheckFn && !SPD.shouldEmitFunctionBasedCheckStackProtector()) {
3217 // First create the loads to the guard/stack slot for the comparison.
3218 auto &DL = DAG.getDataLayout();
3219 EVT PtrTy = TLI.getFrameIndexTy(DL);
3220 EVT PtrMemTy = TLI.getPointerMemTy(DL, DL.getAllocaAddrSpace());
3221
3222 MachineFrameInfo &MFI = ParentBB->getParent()->getFrameInfo();
3223 int FI = MFI.getStackProtectorIndex();
3224
3225 SDLoc dl = getCurSDLoc();
3226 SDValue StackSlotPtr = DAG.getFrameIndex(FI, PtrTy);
3227 Align Align = DL.getPrefTypeAlign(
3228 PointerType::get(M.getContext(), DL.getAllocaAddrSpace()));
3229
3230 // Generate code to load the content of the guard slot.
3231 SDValue GuardVal = DAG.getLoad(
3232 PtrMemTy, dl, DAG.getEntryNode(), StackSlotPtr,
3233 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI), Align,
3235
3236 if (TLI.useStackGuardXorFP())
3237 GuardVal = TLI.emitStackGuardXorFP(DAG, GuardVal, dl);
3238
3239 // The target provides a guard check function to validate the guard value.
3240 // Generate a call to that function with the content of the guard slot as
3241 // argument.
3242 FunctionType *FnTy = GuardCheckFn->getFunctionType();
3243 assert(FnTy->getNumParams() == 1 && "Invalid function signature");
3244
3246 TargetLowering::ArgListEntry Entry(GuardVal, FnTy->getParamType(0));
3247 if (GuardCheckFn->hasParamAttribute(0, Attribute::AttrKind::InReg))
3248 Entry.IsInReg = true;
3249 Args.push_back(Entry);
3250
3253 .setChain(DAG.getEntryNode())
3254 .setCallee(GuardCheckFn->getCallingConv(), FnTy->getReturnType(),
3255 getValue(GuardCheckFn), std::move(Args));
3256
3257 Chain = TLI.LowerCallTo(CLI).second;
3258 } else {
3260 CallOptions.setDiscardResult(true);
3261 Chain = TLI.makeLibCall(DAG, RTLIB::STACKPROTECTOR_CHECK_FAIL, MVT::isVoid,
3262 {}, CallOptions, getCurSDLoc())
3263 .second;
3264 }
3265
3266 // Emit a trap instruction if we are required to do so.
3267 const TargetOptions &TargetOpts = DAG.getTarget().Options;
3268 if (TargetOpts.TrapUnreachable && !TargetOpts.NoTrapAfterNoreturn)
3269 Chain = DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, Chain);
3270
3271 DAG.setRoot(Chain);
3272}
3273
3274/// visitBitTestHeader - This function emits necessary code to produce value
3275/// suitable for "bit tests"
3277 MachineBasicBlock *SwitchBB) {
3278 SDLoc dl = getCurSDLoc();
3279
3280 // Subtract the minimum value.
3281 SDValue SwitchOp = getValue(B.SValue);
3282 EVT VT = SwitchOp.getValueType();
3283 SDValue RangeSub =
3284 DAG.getNode(ISD::SUB, dl, VT, SwitchOp, DAG.getConstant(B.First, dl, VT));
3285
3286 // Determine the type of the test operands.
3287 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3288 bool UsePtrType = false;
3289 if (!TLI.isTypeLegal(VT)) {
3290 UsePtrType = true;
3291 } else {
3292 for (const BitTestCase &Case : B.Cases)
3293 if (!isUIntN(VT.getSizeInBits(), Case.Mask)) {
3294 // Switch table case range are encoded into series of masks.
3295 // Just use pointer type, it's guaranteed to fit.
3296 UsePtrType = true;
3297 break;
3298 }
3299 }
3300 SDValue Sub = RangeSub;
3301 if (UsePtrType) {
3302 VT = TLI.getPointerTy(DAG.getDataLayout());
3303 Sub = DAG.getZExtOrTrunc(Sub, dl, VT);
3304 }
3305
3306 B.RegVT = VT.getSimpleVT();
3307 B.Reg = FuncInfo.CreateReg(B.RegVT);
3308 SDValue CopyTo = DAG.getCopyToReg(getControlRoot(), dl, B.Reg, Sub);
3309
3310 MachineBasicBlock* MBB = B.Cases[0].ThisBB;
3311
3312 if (!B.FallthroughUnreachable)
3313 addSuccessorWithProb(SwitchBB, B.Default, B.DefaultProb);
3314 addSuccessorWithProb(SwitchBB, MBB, B.Prob);
3315 SwitchBB->normalizeSuccProbs();
3316
3317 SDValue Root = CopyTo;
3318 if (!B.FallthroughUnreachable) {
3319 // Conditional branch to the default block.
3320 SDValue RangeCmp = DAG.getSetCC(dl,
3321 TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
3322 RangeSub.getValueType()),
3323 RangeSub, DAG.getConstant(B.Range, dl, RangeSub.getValueType()),
3324 ISD::SETUGT);
3325
3326 Root = DAG.getNode(ISD::BRCOND, dl, MVT::Other, Root, RangeCmp,
3327 DAG.getBasicBlock(B.Default));
3328 }
3329
3330 // Avoid emitting unnecessary branches to the next block.
3331 if (MBB != NextBlock(SwitchBB))
3332 Root = DAG.getNode(ISD::BR, dl, MVT::Other, Root, DAG.getBasicBlock(MBB));
3333
3334 DAG.setRoot(Root);
3335}
3336
3337/// visitBitTestCase - this function produces one "bit test"
3339 MachineBasicBlock *NextMBB,
3340 BranchProbability BranchProbToNext,
3341 Register Reg, BitTestCase &B,
3342 MachineBasicBlock *SwitchBB) {
3343 SDLoc dl = getCurSDLoc();
3344 MVT VT = BB.RegVT;
3345 SDValue ShiftOp = DAG.getCopyFromReg(getControlRoot(), dl, Reg, VT);
3346 SDValue Cmp;
3347 unsigned PopCount = llvm::popcount(B.Mask);
3348 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3349 if (PopCount == 1) {
3350 // Testing for a single bit; just compare the shift count with what it
3351 // would need to be to shift a 1 bit in that position.
3352 Cmp = DAG.getSetCC(
3353 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3354 ShiftOp, DAG.getConstant(llvm::countr_zero(B.Mask), dl, VT),
3355 ISD::SETEQ);
3356 } else if (PopCount == BB.Range) {
3357 // There is only one zero bit in the range, test for it directly.
3358 Cmp = DAG.getSetCC(
3359 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3360 ShiftOp, DAG.getConstant(llvm::countr_one(B.Mask), dl, VT), ISD::SETNE);
3361 } else {
3362 // Make desired shift
3363 SDValue SwitchVal = DAG.getNode(ISD::SHL, dl, VT,
3364 DAG.getConstant(1, dl, VT), ShiftOp);
3365
3366 // Emit bit tests and jumps
3367 SDValue AndOp = DAG.getNode(ISD::AND, dl,
3368 VT, SwitchVal, DAG.getConstant(B.Mask, dl, VT));
3369 Cmp = DAG.getSetCC(
3370 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3371 AndOp, DAG.getConstant(0, dl, VT), ISD::SETNE);
3372 }
3373
3374 // The branch probability from SwitchBB to B.TargetBB is B.ExtraProb.
3375 addSuccessorWithProb(SwitchBB, B.TargetBB, B.ExtraProb);
3376 // The branch probability from SwitchBB to NextMBB is BranchProbToNext.
3377 addSuccessorWithProb(SwitchBB, NextMBB, BranchProbToNext);
3378 // It is not guaranteed that the sum of B.ExtraProb and BranchProbToNext is
3379 // one as they are relative probabilities (and thus work more like weights),
3380 // and hence we need to normalize them to let the sum of them become one.
3381 SwitchBB->normalizeSuccProbs();
3382
3383 SDValue BrAnd = DAG.getNode(ISD::BRCOND, dl,
3384 MVT::Other, getControlRoot(),
3385 Cmp, DAG.getBasicBlock(B.TargetBB));
3386
3387 // Avoid emitting unnecessary branches to the next block.
3388 if (NextMBB != NextBlock(SwitchBB))
3389 BrAnd = DAG.getNode(ISD::BR, dl, MVT::Other, BrAnd,
3390 DAG.getBasicBlock(NextMBB));
3391
3392 DAG.setRoot(BrAnd);
3393}
3394
3395void SelectionDAGBuilder::visitInvoke(const InvokeInst &I) {
3396 MachineBasicBlock *InvokeMBB = FuncInfo.MBB;
3397
3398 // Retrieve successors. Look through artificial IR level blocks like
3399 // catchswitch for successors.
3400 MachineBasicBlock *Return = FuncInfo.getMBB(I.getSuccessor(0));
3401 const BasicBlock *EHPadBB = I.getSuccessor(1);
3402 MachineBasicBlock *EHPadMBB = FuncInfo.getMBB(EHPadBB);
3403
3404 // Deopt and ptrauth bundles are lowered in helper functions, and we don't
3405 // have to do anything here to lower funclet bundles.
3406 failForInvalidBundles(I, "invokes",
3412
3413 const Value *Callee(I.getCalledOperand());
3414 const Function *Fn = dyn_cast<Function>(Callee);
3415 if (isa<InlineAsm>(Callee))
3416 visitInlineAsm(I, EHPadBB);
3417 else if (Fn && Fn->isIntrinsic()) {
3418 switch (Fn->getIntrinsicID()) {
3419 default:
3420 llvm_unreachable("Cannot invoke this intrinsic");
3421 case Intrinsic::donothing:
3422 // Ignore invokes to @llvm.donothing: jump directly to the next BB.
3423 case Intrinsic::seh_try_begin:
3424 case Intrinsic::seh_scope_begin:
3425 case Intrinsic::seh_try_end:
3426 case Intrinsic::seh_scope_end:
3427 if (EHPadMBB)
3428 // a block referenced by EH table
3429 // so dtor-funclet not removed by opts
3430 EHPadMBB->setMachineBlockAddressTaken();
3431 break;
3432 case Intrinsic::experimental_patchpoint_void:
3433 case Intrinsic::experimental_patchpoint:
3434 visitPatchpoint(I, EHPadBB);
3435 break;
3436 case Intrinsic::experimental_gc_statepoint:
3438 break;
3439 // wasm_throw, wasm_rethrow: This is usually done in visitTargetIntrinsic,
3440 // but these intrinsics are special because they can be invoked, so we
3441 // manually lower it to a DAG node here.
3442 case Intrinsic::wasm_throw: {
3444 std::array<SDValue, 4> Ops = {
3445 getControlRoot(), // inchain for the terminator node
3446 DAG.getTargetConstant(Intrinsic::wasm_throw, getCurSDLoc(),
3448 getValue(I.getArgOperand(0)), // tag
3449 getValue(I.getArgOperand(1)) // thrown value
3450 };
3451 SDVTList VTs = DAG.getVTList(ArrayRef<EVT>({MVT::Other})); // outchain
3452 DAG.setRoot(DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops));
3453 break;
3454 }
3455 case Intrinsic::wasm_rethrow: {
3456 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3457 std::array<SDValue, 2> Ops = {
3458 getControlRoot(), // inchain for the terminator node
3459 DAG.getTargetConstant(Intrinsic::wasm_rethrow, getCurSDLoc(),
3460 TLI.getPointerTy(DAG.getDataLayout()))};
3461 SDVTList VTs = DAG.getVTList(ArrayRef<EVT>({MVT::Other})); // outchain
3462 DAG.setRoot(DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops));
3463 break;
3464 }
3465 }
3466 } else if (I.hasDeoptState()) {
3467 // Currently we do not lower any intrinsic calls with deopt operand bundles.
3468 // Eventually we will support lowering the @llvm.experimental.deoptimize
3469 // intrinsic, and right now there are no plans to support other intrinsics
3470 // with deopt state.
3471 LowerCallSiteWithDeoptBundle(&I, getValue(Callee), EHPadBB);
3472 } else if (I.countOperandBundlesOfType(LLVMContext::OB_ptrauth)) {
3474 } else {
3475 LowerCallTo(I, getValue(Callee), false, false, EHPadBB);
3476 }
3477
3478 // If the value of the invoke is used outside of its defining block, make it
3479 // available as a virtual register.
3480 // We already took care of the exported value for the statepoint instruction
3481 // during call to the LowerStatepoint.
3482 if (!isa<GCStatepointInst>(I)) {
3484 }
3485
3487 BranchProbabilityInfo *BPI = FuncInfo.BPI;
3488 BranchProbability EHPadBBProb =
3489 BPI ? BPI->getEdgeProbability(InvokeMBB->getBasicBlock(), EHPadBB)
3491 findUnwindDestinations(FuncInfo, EHPadBB, EHPadBBProb, UnwindDests);
3492
3493 // Update successor info.
3494 addSuccessorWithProb(InvokeMBB, Return);
3495 for (auto &UnwindDest : UnwindDests) {
3496 UnwindDest.first->setIsEHPad();
3497 addSuccessorWithProb(InvokeMBB, UnwindDest.first, UnwindDest.second);
3498 }
3499 InvokeMBB->normalizeSuccProbs();
3500
3501 // Drop into normal successor.
3502 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other, getControlRoot(),
3503 DAG.getBasicBlock(Return)));
3504}
3505
3506/// The intrinsics currently supported by callbr are implicit control flow
3507/// intrinsics such as amdgcn.kill.
3508/// - they should be called (no "dontcall-" attributes)
3509/// - they do not touch memory on the target (= !TLI.getTgtMemIntrinsic())
3510/// - they do not need custom argument handling (no
3511/// TLI.CollectTargetIntrinsicOperands())
3512void SelectionDAGBuilder::visitCallBrIntrinsic(const CallBrInst &I) {
3513#ifndef NDEBUG
3515 DAG.getTargetLoweringInfo().getTgtMemIntrinsic(
3516 Infos, I, DAG.getMachineFunction(), I.getIntrinsicID());
3517 assert(Infos.empty() && "Intrinsic touches memory");
3518#endif
3519
3520 auto [HasChain, OnlyLoad] = getTargetIntrinsicCallProperties(I);
3521
3523 getTargetIntrinsicOperands(I, HasChain, OnlyLoad);
3524 SDVTList VTs = getTargetIntrinsicVTList(I, HasChain);
3525
3526 // Create the node.
3527 SDValue Result =
3528 getTargetNonMemIntrinsicNode(*I.getType(), HasChain, Ops, VTs);
3529 Result = handleTargetIntrinsicRet(I, HasChain, OnlyLoad, Result);
3530
3531 setValue(&I, Result);
3532}
3533
3534void SelectionDAGBuilder::visitCallBr(const CallBrInst &I) {
3535 MachineBasicBlock *CallBrMBB = FuncInfo.MBB;
3536
3537 if (I.isInlineAsm()) {
3538 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
3539 // have to do anything here to lower funclet bundles.
3540 failForInvalidBundles(I, "callbrs",
3542 visitInlineAsm(I);
3543 } else {
3544 assert(!I.hasOperandBundles() &&
3545 "Can't have operand bundles for intrinsics");
3546 visitCallBrIntrinsic(I);
3547 }
3549
3550 // Retrieve successors.
3551 SmallPtrSet<BasicBlock *, 8> Dests;
3552 Dests.insert(I.getDefaultDest());
3553 MachineBasicBlock *Return = FuncInfo.getMBB(I.getDefaultDest());
3554
3555 // Update successor info.
3556 addSuccessorWithProb(CallBrMBB, Return, BranchProbability::getOne());
3557 // TODO: For most of the cases where there is an intrinsic callbr, we're
3558 // having exactly one indirect target, which will be unreachable. As soon as
3559 // this changes, we might need to enhance
3560 // Target->setIsInlineAsmBrIndirectTarget or add something similar for
3561 // intrinsic indirect branches.
3562 if (I.isInlineAsm()) {
3563 for (BasicBlock *Dest : I.getIndirectDests()) {
3564 MachineBasicBlock *Target = FuncInfo.getMBB(Dest);
3565 Target->setIsInlineAsmBrIndirectTarget();
3566 // If we introduce a type of asm goto statement that is permitted to use
3567 // an indirect call instruction to jump to its labels, then we should add
3568 // a call to Target->setMachineBlockAddressTaken() here, to mark the
3569 // target block as requiring a BTI.
3570
3571 Target->setLabelMustBeEmitted();
3572 // Don't add duplicate machine successors.
3573 if (Dests.insert(Dest).second)
3574 addSuccessorWithProb(CallBrMBB, Target, BranchProbability::getZero());
3575 }
3576 }
3577 CallBrMBB->normalizeSuccProbs();
3578
3579 // Drop into default successor.
3580 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(),
3581 MVT::Other, getControlRoot(),
3582 DAG.getBasicBlock(Return)));
3583}
3584
3585void SelectionDAGBuilder::visitResume(const ResumeInst &RI) {
3586 llvm_unreachable("SelectionDAGBuilder shouldn't visit resume instructions!");
3587}
3588
3589void SelectionDAGBuilder::visitLandingPad(const LandingPadInst &LP) {
3590 assert(FuncInfo.MBB->isEHPad() &&
3591 "Call to landingpad not in landing pad!");
3592
3593 // If there aren't registers to copy the values into (e.g., during SjLj
3594 // exceptions), then don't bother to create these DAG nodes.
3595 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3596 const Constant *PersonalityFn = FuncInfo.Fn->getPersonalityFn();
3597 if (TLI.getExceptionPointerRegister(PersonalityFn) == 0 &&
3598 TLI.getExceptionSelectorRegister(PersonalityFn) == 0)
3599 return;
3600
3601 // If landingpad's return type is token type, we don't create DAG nodes
3602 // for its exception pointer and selector value. The extraction of exception
3603 // pointer or selector value from token type landingpads is not currently
3604 // supported.
3605 if (LP.getType()->isTokenTy())
3606 return;
3607
3608 SmallVector<EVT, 2> ValueVTs;
3609 SDLoc dl = getCurSDLoc();
3610 ComputeValueVTs(TLI, DAG.getDataLayout(), LP.getType(), ValueVTs);
3611 assert(ValueVTs.size() == 2 && "Only two-valued landingpads are supported");
3612
3613 // Get the two live-in registers as SDValues. The physregs have already been
3614 // copied into virtual registers.
3615 SDValue Ops[2];
3616 if (FuncInfo.ExceptionPointerVirtReg) {
3617 Ops[0] = DAG.getZExtOrTrunc(
3618 DAG.getCopyFromReg(DAG.getEntryNode(), dl,
3619 FuncInfo.ExceptionPointerVirtReg,
3620 TLI.getPointerTy(DAG.getDataLayout())),
3621 dl, ValueVTs[0]);
3622 } else {
3623 Ops[0] = DAG.getConstant(0, dl, TLI.getPointerTy(DAG.getDataLayout()));
3624 }
3625 Ops[1] = DAG.getZExtOrTrunc(
3626 DAG.getCopyFromReg(DAG.getEntryNode(), dl,
3627 FuncInfo.ExceptionSelectorVirtReg,
3628 TLI.getPointerTy(DAG.getDataLayout())),
3629 dl, ValueVTs[1]);
3630
3631 // Merge into one.
3632 SDValue Res = DAG.getNode(ISD::MERGE_VALUES, dl,
3633 DAG.getVTList(ValueVTs), Ops);
3634 setValue(&LP, Res);
3635}
3636
3639 // Update JTCases.
3640 for (JumpTableBlock &JTB : SL->JTCases)
3641 if (JTB.first.HeaderBB == First)
3642 JTB.first.HeaderBB = Last;
3643
3644 // Update BitTestCases.
3645 for (BitTestBlock &BTB : SL->BitTestCases)
3646 if (BTB.Parent == First)
3647 BTB.Parent = Last;
3648}
3649
3650void SelectionDAGBuilder::visitIndirectBr(const IndirectBrInst &I) {
3651 MachineBasicBlock *IndirectBrMBB = FuncInfo.MBB;
3652
3653 // Update machine-CFG edges with unique successors.
3655 for (unsigned i = 0, e = I.getNumSuccessors(); i != e; ++i) {
3656 BasicBlock *BB = I.getSuccessor(i);
3657 bool Inserted = Done.insert(BB).second;
3658 if (!Inserted)
3659 continue;
3660
3661 MachineBasicBlock *Succ = FuncInfo.getMBB(BB);
3662 addSuccessorWithProb(IndirectBrMBB, Succ);
3663 }
3664 IndirectBrMBB->normalizeSuccProbs();
3665
3667 MVT::Other, getControlRoot(),
3668 getValue(I.getAddress())));
3669}
3670
3671void SelectionDAGBuilder::visitUnreachable(const UnreachableInst &I) {
3672 if (!I.shouldLowerToTrap(DAG.getTarget().Options.TrapUnreachable,
3673 DAG.getTarget().Options.NoTrapAfterNoreturn))
3674 return;
3675
3676 DAG.setRoot(DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, DAG.getRoot()));
3677}
3678
3679void SelectionDAGBuilder::visitUnary(const User &I, unsigned Opcode) {
3680 SDNodeFlags Flags;
3681 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3682 Flags.copyFMF(*FPOp);
3683
3684 SDValue Op = getValue(I.getOperand(0));
3685 SDValue UnNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op.getValueType(),
3686 Op, Flags);
3687 setValue(&I, UnNodeValue);
3688}
3689
3690void SelectionDAGBuilder::visitBinary(const User &I, unsigned Opcode) {
3691 SDNodeFlags Flags;
3692 if (auto *OFBinOp = dyn_cast<OverflowingBinaryOperator>(&I)) {
3693 Flags.setNoSignedWrap(OFBinOp->hasNoSignedWrap());
3694 Flags.setNoUnsignedWrap(OFBinOp->hasNoUnsignedWrap());
3695 }
3696 if (auto *ExactOp = dyn_cast<PossiblyExactOperator>(&I))
3697 Flags.setExact(ExactOp->isExact());
3698 if (auto *DisjointOp = dyn_cast<PossiblyDisjointInst>(&I))
3699 Flags.setDisjoint(DisjointOp->isDisjoint());
3700 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3701 Flags.copyFMF(*FPOp);
3702
3703 SDValue Op1 = getValue(I.getOperand(0));
3704 SDValue Op2 = getValue(I.getOperand(1));
3705 SDValue BinNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(),
3706 Op1, Op2, Flags);
3707 setValue(&I, BinNodeValue);
3708}
3709
3710void SelectionDAGBuilder::visitShift(const User &I, unsigned Opcode) {
3711 SDValue Op1 = getValue(I.getOperand(0));
3712 SDValue Op2 = getValue(I.getOperand(1));
3713
3714 EVT ShiftTy = DAG.getTargetLoweringInfo().getShiftAmountTy(
3715 Op1.getValueType(), DAG.getDataLayout());
3716
3717 // Coerce the shift amount to the right type if we can. This exposes the
3718 // truncate or zext to optimization early.
3719 if (!I.getType()->isVectorTy() && Op2.getValueType() != ShiftTy) {
3721 "Unexpected shift type");
3722 Op2 = DAG.getZExtOrTrunc(Op2, getCurSDLoc(), ShiftTy);
3723 }
3724
3725 bool nuw = false;
3726 bool nsw = false;
3727 bool exact = false;
3728
3729 if (Opcode == ISD::SRL || Opcode == ISD::SRA || Opcode == ISD::SHL) {
3730
3731 if (const OverflowingBinaryOperator *OFBinOp =
3733 nuw = OFBinOp->hasNoUnsignedWrap();
3734 nsw = OFBinOp->hasNoSignedWrap();
3735 }
3736 if (const PossiblyExactOperator *ExactOp =
3738 exact = ExactOp->isExact();
3739 }
3740 SDNodeFlags Flags;
3741 Flags.setExact(exact);
3742 Flags.setNoSignedWrap(nsw);
3743 Flags.setNoUnsignedWrap(nuw);
3744 SDValue Res = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(), Op1, Op2,
3745 Flags);
3746 setValue(&I, Res);
3747}
3748
3749void SelectionDAGBuilder::visitSDiv(const User &I) {
3750 SDValue Op1 = getValue(I.getOperand(0));
3751 SDValue Op2 = getValue(I.getOperand(1));
3752
3753 SDNodeFlags Flags;
3754 Flags.setExact(isa<PossiblyExactOperator>(&I) &&
3755 cast<PossiblyExactOperator>(&I)->isExact());
3756 setValue(&I, DAG.getNode(ISD::SDIV, getCurSDLoc(), Op1.getValueType(), Op1,
3757 Op2, Flags));
3758}
3759
3760void SelectionDAGBuilder::visitICmp(const ICmpInst &I) {
3761 ICmpInst::Predicate predicate = I.getPredicate();
3762 SDValue Op1 = getValue(I.getOperand(0));
3763 SDValue Op2 = getValue(I.getOperand(1));
3764 ISD::CondCode Opcode = getICmpCondCode(predicate);
3765
3766 auto &TLI = DAG.getTargetLoweringInfo();
3767 EVT MemVT =
3768 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
3769
3770 // If a pointer's DAG type is larger than its memory type then the DAG values
3771 // are zero-extended. This breaks signed comparisons so truncate back to the
3772 // underlying type before doing the compare.
3773 if (Op1.getValueType() != MemVT) {
3774 Op1 = DAG.getPtrExtOrTrunc(Op1, getCurSDLoc(), MemVT);
3775 Op2 = DAG.getPtrExtOrTrunc(Op2, getCurSDLoc(), MemVT);
3776 }
3777
3778 SDNodeFlags Flags;
3779 Flags.setSameSign(I.hasSameSign());
3780 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
3781
3782 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3783 I.getType());
3784 setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Opcode));
3785}
3786
3787void SelectionDAGBuilder::visitFCmp(const FCmpInst &I) {
3788 FCmpInst::Predicate predicate = I.getPredicate();
3789 SDValue Op1 = getValue(I.getOperand(0));
3790 SDValue Op2 = getValue(I.getOperand(1));
3791
3792 ISD::CondCode Condition = getFCmpCondCode(predicate);
3793 auto *FPMO = cast<FPMathOperator>(&I);
3794 if (FPMO->hasNoNaNs() ||
3795 (DAG.isKnownNeverNaN(Op1) && DAG.isKnownNeverNaN(Op2)))
3796 Condition = getFCmpCodeWithoutNaN(Condition);
3797
3798 SDNodeFlags Flags;
3799 Flags.copyFMF(*FPMO);
3800 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
3801
3802 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3803 I.getType());
3804 setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Condition,
3805 /*Chian=*/{}, /*IsSignaling=*/false, Flags));
3806}
3807
3808// Check if the condition of the select has one use or two users that are both
3809// selects with the same condition.
3810static bool hasOnlySelectUsers(const Value *Cond) {
3811 return llvm::all_of(Cond->users(), [](const Value *V) {
3812 return isa<SelectInst>(V);
3813 });
3814}
3815
3816void SelectionDAGBuilder::visitSelect(const User &I) {
3817 SmallVector<EVT, 4> ValueVTs;
3818 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
3819 ValueVTs);
3820 unsigned NumValues = ValueVTs.size();
3821 if (NumValues == 0) return;
3822
3823 SmallVector<SDValue, 4> Values(NumValues);
3824 SDValue Cond = getValue(I.getOperand(0));
3825 SDValue LHSVal = getValue(I.getOperand(1));
3826 SDValue RHSVal = getValue(I.getOperand(2));
3827 SmallVector<SDValue, 1> BaseOps(1, Cond);
3829 Cond.getValueType().isVector() ? ISD::VSELECT : ISD::SELECT;
3830
3831 bool IsUnaryAbs = false;
3832 bool Negate = false;
3833
3834 SDNodeFlags Flags;
3835 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3836 Flags.copyFMF(*FPOp);
3837
3838 Flags.setUnpredictable(
3839 cast<SelectInst>(I).getMetadata(LLVMContext::MD_unpredictable));
3840
3841 // Min/max matching is only viable if all output VTs are the same.
3842 if (all_equal(ValueVTs)) {
3843 EVT VT = ValueVTs[0];
3844 LLVMContext &Ctx = *DAG.getContext();
3845 auto &TLI = DAG.getTargetLoweringInfo();
3846
3847 // We care about the legality of the operation after it has been type
3848 // legalized.
3849 while (TLI.getTypeAction(Ctx, VT) != TargetLoweringBase::TypeLegal)
3850 VT = TLI.getTypeToTransformTo(Ctx, VT);
3851
3852 // If the vselect is legal, assume we want to leave this as a vector setcc +
3853 // vselect. Otherwise, if this is going to be scalarized, we want to see if
3854 // min/max is legal on the scalar type.
3855 bool UseScalarMinMax = VT.isVector() &&
3857
3858 // ValueTracking's select pattern matching does not account for -0.0,
3859 // so we can't lower to FMINIMUM/FMAXIMUM because those nodes specify that
3860 // -0.0 is less than +0.0.
3861 const Value *LHS, *RHS;
3862 auto SPR = matchSelectPattern(&I, LHS, RHS);
3864 switch (SPR.Flavor) {
3865 case SPF_UMAX: Opc = ISD::UMAX; break;
3866 case SPF_UMIN: Opc = ISD::UMIN; break;
3867 case SPF_SMAX: Opc = ISD::SMAX; break;
3868 case SPF_SMIN: Opc = ISD::SMIN; break;
3869 case SPF_FMINNUM:
3871 break;
3872
3873 switch (SPR.NaNBehavior) {
3874 case SPNB_NA: llvm_unreachable("No NaN behavior for FP op?");
3875 case SPNB_RETURNS_NAN: break;
3876 case SPNB_RETURNS_OTHER:
3878 Flags.setNoSignedZeros(true);
3879 break;
3880 case SPNB_RETURNS_ANY:
3882 (UseScalarMinMax &&
3884 Opc = ISD::FMINNUM;
3885 break;
3886 }
3887 break;
3888 case SPF_FMAXNUM:
3890 break;
3891
3892 switch (SPR.NaNBehavior) {
3893 case SPNB_NA: llvm_unreachable("No NaN behavior for FP op?");
3894 case SPNB_RETURNS_NAN: break;
3895 case SPNB_RETURNS_OTHER:
3897 Flags.setNoSignedZeros(true);
3898 break;
3899 case SPNB_RETURNS_ANY:
3901 (UseScalarMinMax &&
3903 Opc = ISD::FMAXNUM;
3904 break;
3905 }
3906 break;
3907 case SPF_NABS:
3908 Negate = true;
3909 [[fallthrough]];
3910 case SPF_ABS:
3911 IsUnaryAbs = true;
3912 Opc = ISD::ABS;
3913 break;
3914 default: break;
3915 }
3916
3917 if (!IsUnaryAbs && Opc != ISD::DELETED_NODE &&
3918 (TLI.isOperationLegalOrCustom(Opc, VT) ||
3919 (UseScalarMinMax &&
3921 // If the underlying comparison instruction is used by any other
3922 // instruction, the consumed instructions won't be destroyed, so it is
3923 // not profitable to convert to a min/max.
3925 OpCode = Opc;
3926 LHSVal = getValue(LHS);
3927 RHSVal = getValue(RHS);
3928 BaseOps.clear();
3929 }
3930
3931 if (IsUnaryAbs) {
3932 OpCode = Opc;
3933 LHSVal = getValue(LHS);
3934 BaseOps.clear();
3935 }
3936 }
3937
3938 if (IsUnaryAbs) {
3939 for (unsigned i = 0; i != NumValues; ++i) {
3940 SDLoc dl = getCurSDLoc();
3941 EVT VT = LHSVal.getNode()->getValueType(LHSVal.getResNo() + i);
3942 Values[i] =
3943 DAG.getNode(OpCode, dl, VT, LHSVal.getValue(LHSVal.getResNo() + i));
3944 if (Negate)
3945 Values[i] = DAG.getNegative(Values[i], dl, VT);
3946 }
3947 } else {
3948 for (unsigned i = 0; i != NumValues; ++i) {
3949 SmallVector<SDValue, 3> Ops(BaseOps.begin(), BaseOps.end());
3950 Ops.push_back(SDValue(LHSVal.getNode(), LHSVal.getResNo() + i));
3951 Ops.push_back(SDValue(RHSVal.getNode(), RHSVal.getResNo() + i));
3952 Values[i] = DAG.getNode(
3953 OpCode, getCurSDLoc(),
3954 LHSVal.getNode()->getValueType(LHSVal.getResNo() + i), Ops, Flags);
3955 }
3956 }
3957
3959 DAG.getVTList(ValueVTs), Values));
3960}
3961
3962void SelectionDAGBuilder::visitTrunc(const User &I) {
3963 // TruncInst cannot be a no-op cast because sizeof(src) > sizeof(dest).
3964 SDValue N = getValue(I.getOperand(0));
3965 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3966 I.getType());
3967 SDNodeFlags Flags;
3968 if (auto *Trunc = dyn_cast<TruncInst>(&I)) {
3969 Flags.setNoSignedWrap(Trunc->hasNoSignedWrap());
3970 Flags.setNoUnsignedWrap(Trunc->hasNoUnsignedWrap());
3971 }
3972
3973 setValue(&I, DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), DestVT, N, Flags));
3974}
3975
3976void SelectionDAGBuilder::visitZExt(const User &I) {
3977 // ZExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
3978 // ZExt also can't be a cast to bool for same reason. So, nothing much to do
3979 SDValue N = getValue(I.getOperand(0));
3980 auto &TLI = DAG.getTargetLoweringInfo();
3981 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
3982
3983 SDNodeFlags Flags;
3984 if (auto *PNI = dyn_cast<PossiblyNonNegInst>(&I))
3985 Flags.setNonNeg(PNI->hasNonNeg());
3986
3987 // Eagerly use nonneg information to canonicalize towards sign_extend if
3988 // that is the target's preference.
3989 // TODO: Let the target do this later.
3990 if (Flags.hasNonNeg() &&
3991 TLI.isSExtCheaperThanZExt(N.getValueType(), DestVT)) {
3992 setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));
3993 return;
3994 }
3995
3996 setValue(&I, DAG.getNode(ISD::ZERO_EXTEND, getCurSDLoc(), DestVT, N, Flags));
3997}
3998
3999void SelectionDAGBuilder::visitSExt(const User &I) {
4000 // SExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
4001 // SExt also can't be a cast to bool for same reason. So, nothing much to do
4002 SDValue N = getValue(I.getOperand(0));
4003 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4004 I.getType());
4005 setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));
4006}
4007
4008void SelectionDAGBuilder::visitFPTrunc(const User &I) {
4009 // FPTrunc is never a no-op cast, no need to check
4010 SDValue N = getValue(I.getOperand(0));
4011 SDLoc dl = getCurSDLoc();
4012 SDNodeFlags Flags;
4013 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
4014 Flags.copyFMF(*FPOp);
4015 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4016 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4017 setValue(&I, DAG.getNode(ISD::FP_ROUND, dl, DestVT, N,
4018 DAG.getTargetConstant(
4019 0, dl, TLI.getPointerTy(DAG.getDataLayout())),
4020 Flags));
4021}
4022
4023void SelectionDAGBuilder::visitFPExt(const User &I) {
4024 // FPExt is never a no-op cast, no need to check
4025 SDValue N = getValue(I.getOperand(0));
4026 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4027 I.getType());
4028 SDNodeFlags Flags;
4029 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
4030 Flags.copyFMF(*FPOp);
4031 setValue(&I, DAG.getNode(ISD::FP_EXTEND, getCurSDLoc(), DestVT, N, Flags));
4032}
4033
4034void SelectionDAGBuilder::visitFPToUI(const User &I) {
4035 // FPToUI is never a no-op cast, no need to check
4036 SDValue N = getValue(I.getOperand(0));
4037 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4038 I.getType());
4039 setValue(&I, DAG.getNode(ISD::FP_TO_UINT, getCurSDLoc(), DestVT, N));
4040}
4041
4042void SelectionDAGBuilder::visitFPToSI(const User &I) {
4043 // FPToSI is never a no-op cast, no need to check
4044 SDValue N = getValue(I.getOperand(0));
4045 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4046 I.getType());
4047 setValue(&I, DAG.getNode(ISD::FP_TO_SINT, getCurSDLoc(), DestVT, N));
4048}
4049
4050void SelectionDAGBuilder::visitUIToFP(const User &I) {
4051 // UIToFP is never a no-op cast, no need to check
4052 SDValue N = getValue(I.getOperand(0));
4053 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4054 I.getType());
4055 SDNodeFlags Flags;
4056 if (auto *PNI = dyn_cast<PossiblyNonNegInst>(&I))
4057 Flags.setNonNeg(PNI->hasNonNeg());
4058
4059 setValue(&I, DAG.getNode(ISD::UINT_TO_FP, getCurSDLoc(), DestVT, N, Flags));
4060}
4061
4062void SelectionDAGBuilder::visitSIToFP(const User &I) {
4063 // SIToFP is never a no-op cast, no need to check
4064 SDValue N = getValue(I.getOperand(0));
4065 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4066 I.getType());
4067 setValue(&I, DAG.getNode(ISD::SINT_TO_FP, getCurSDLoc(), DestVT, N));
4068}
4069
4070void SelectionDAGBuilder::visitPtrToAddr(const User &I) {
4071 SDValue N = getValue(I.getOperand(0));
4072 // By definition the type of the ptrtoaddr must be equal to the address type.
4073 const auto &TLI = DAG.getTargetLoweringInfo();
4074 EVT AddrVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4075 // The address width must be smaller or equal to the pointer representation
4076 // width, so we lower ptrtoaddr as a truncate (possibly folded to a no-op).
4077 N = DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), AddrVT, N);
4078 setValue(&I, N);
4079}
4080
4081void SelectionDAGBuilder::visitPtrToInt(const User &I) {
4082 // What to do depends on the size of the integer and the size of the pointer.
4083 // We can either truncate, zero extend, or no-op, accordingly.
4084 SDValue N = getValue(I.getOperand(0));
4085 auto &TLI = DAG.getTargetLoweringInfo();
4086 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4087 I.getType());
4088 EVT PtrMemVT =
4089 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
4090 N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), PtrMemVT);
4091 N = DAG.getZExtOrTrunc(N, getCurSDLoc(), DestVT);
4092 setValue(&I, N);
4093}
4094
4095void SelectionDAGBuilder::visitIntToPtr(const User &I) {
4096 // What to do depends on the size of the integer and the size of the pointer.
4097 // We can either truncate, zero extend, or no-op, accordingly.
4098 SDValue N = getValue(I.getOperand(0));
4099 auto &TLI = DAG.getTargetLoweringInfo();
4100 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4101 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(), I.getType());
4102 N = DAG.getZExtOrTrunc(N, getCurSDLoc(), PtrMemVT);
4103 N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), DestVT);
4104 setValue(&I, N);
4105}
4106
4107void SelectionDAGBuilder::visitBitCast(const User &I) {
4108 SDValue N = getValue(I.getOperand(0));
4109 SDLoc dl = getCurSDLoc();
4110 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4111 I.getType());
4112
4113 // BitCast assures us that source and destination are the same size so this is
4114 // either a BITCAST or a no-op.
4115 if (DestVT != N.getValueType())
4116 setValue(&I, DAG.getNode(ISD::BITCAST, dl,
4117 DestVT, N)); // convert types.
4118 // Check if the original LLVM IR Operand was a ConstantInt, because getValue()
4119 // might fold any kind of constant expression to an integer constant and that
4120 // is not what we are looking for. Only recognize a bitcast of a genuine
4121 // constant integer as an opaque constant.
4122 else if(ConstantInt *C = dyn_cast<ConstantInt>(I.getOperand(0)))
4123 setValue(&I, DAG.getConstant(C->getValue(), dl, DestVT, /*isTarget=*/false,
4124 /*isOpaque*/true));
4125 else
4126 setValue(&I, N); // noop cast.
4127}
4128
4129void SelectionDAGBuilder::visitAddrSpaceCast(const User &I) {
4130 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4131 const Value *SV = I.getOperand(0);
4132 SDValue N = getValue(SV);
4133 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4134
4135 unsigned SrcAS = SV->getType()->getPointerAddressSpace();
4136 unsigned DestAS = I.getType()->getPointerAddressSpace();
4137
4138 if (!TM.isNoopAddrSpaceCast(SrcAS, DestAS))
4139 N = DAG.getAddrSpaceCast(getCurSDLoc(), DestVT, N, SrcAS, DestAS);
4140
4141 setValue(&I, N);
4142}
4143
4144void SelectionDAGBuilder::visitInsertElement(const User &I) {
4145 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4146 SDValue InVec = getValue(I.getOperand(0));
4147 SDValue InVal = getValue(I.getOperand(1));
4148 SDValue InIdx = DAG.getZExtOrTrunc(getValue(I.getOperand(2)), getCurSDLoc(),
4149 TLI.getVectorIdxTy(DAG.getDataLayout()));
4151 TLI.getValueType(DAG.getDataLayout(), I.getType()),
4152 InVec, InVal, InIdx));
4153}
4154
4155void SelectionDAGBuilder::visitExtractElement(const User &I) {
4156 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4157 SDValue InVec = getValue(I.getOperand(0));
4158 SDValue InIdx = DAG.getZExtOrTrunc(getValue(I.getOperand(1)), getCurSDLoc(),
4159 TLI.getVectorIdxTy(DAG.getDataLayout()));
4161 TLI.getValueType(DAG.getDataLayout(), I.getType()),
4162 InVec, InIdx));
4163}
4164
4165void SelectionDAGBuilder::visitShuffleVector(const User &I) {
4166 SDValue Src1 = getValue(I.getOperand(0));
4167 SDValue Src2 = getValue(I.getOperand(1));
4168 ArrayRef<int> Mask;
4169 if (auto *SVI = dyn_cast<ShuffleVectorInst>(&I))
4170 Mask = SVI->getShuffleMask();
4171 else
4172 Mask = cast<ConstantExpr>(I).getShuffleMask();
4173 SDLoc DL = getCurSDLoc();
4174 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4175 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4176 EVT SrcVT = Src1.getValueType();
4177
4178 if (all_of(Mask, equal_to(0)) && VT.isScalableVector()) {
4179 // Canonical splat form of first element of first input vector.
4180 SDValue FirstElt =
4181 DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, SrcVT.getScalarType(), Src1,
4182 DAG.getVectorIdxConstant(0, DL));
4183 setValue(&I, DAG.getNode(ISD::SPLAT_VECTOR, DL, VT, FirstElt));
4184 return;
4185 }
4186
4187 // For now, we only handle splats for scalable vectors.
4188 // The DAGCombiner will perform a BUILD_VECTOR -> SPLAT_VECTOR transformation
4189 // for targets that support a SPLAT_VECTOR for non-scalable vector types.
4190 assert(!VT.isScalableVector() && "Unsupported scalable vector shuffle");
4191
4192 unsigned SrcNumElts = SrcVT.getVectorNumElements();
4193 unsigned MaskNumElts = Mask.size();
4194
4195 if (SrcNumElts == MaskNumElts) {
4196 setValue(&I, DAG.getVectorShuffle(VT, DL, Src1, Src2, Mask));
4197 return;
4198 }
4199
4200 // Normalize the shuffle vector since mask and vector length don't match.
4201 if (SrcNumElts < MaskNumElts) {
4202 // Mask is longer than the source vectors. We can use concatenate vector to
4203 // make the mask and vectors lengths match.
4204
4205 if (MaskNumElts % SrcNumElts == 0) {
4206 // Mask length is a multiple of the source vector length.
4207 // Check if the shuffle is some kind of concatenation of the input
4208 // vectors.
4209 unsigned NumConcat = MaskNumElts / SrcNumElts;
4210 bool IsConcat = true;
4211 SmallVector<int, 8> ConcatSrcs(NumConcat, -1);
4212 for (unsigned i = 0; i != MaskNumElts; ++i) {
4213 int Idx = Mask[i];
4214 if (Idx < 0)
4215 continue;
4216 // Ensure the indices in each SrcVT sized piece are sequential and that
4217 // the same source is used for the whole piece.
4218 if ((Idx % SrcNumElts != (i % SrcNumElts)) ||
4219 (ConcatSrcs[i / SrcNumElts] >= 0 &&
4220 ConcatSrcs[i / SrcNumElts] != (int)(Idx / SrcNumElts))) {
4221 IsConcat = false;
4222 break;
4223 }
4224 // Remember which source this index came from.
4225 ConcatSrcs[i / SrcNumElts] = Idx / SrcNumElts;
4226 }
4227
4228 // The shuffle is concatenating multiple vectors together. Just emit
4229 // a CONCAT_VECTORS operation.
4230 if (IsConcat) {
4231 SmallVector<SDValue, 8> ConcatOps;
4232 for (auto Src : ConcatSrcs) {
4233 if (Src < 0)
4234 ConcatOps.push_back(DAG.getUNDEF(SrcVT));
4235 else if (Src == 0)
4236 ConcatOps.push_back(Src1);
4237 else
4238 ConcatOps.push_back(Src2);
4239 }
4240 setValue(&I, DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, ConcatOps));
4241 return;
4242 }
4243 }
4244
4245 unsigned PaddedMaskNumElts = alignTo(MaskNumElts, SrcNumElts);
4246 unsigned NumConcat = PaddedMaskNumElts / SrcNumElts;
4247 EVT PaddedVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(),
4248 PaddedMaskNumElts);
4249
4250 // Pad both vectors with undefs to make them the same length as the mask.
4251 SDValue UndefVal = DAG.getUNDEF(SrcVT);
4252
4253 SmallVector<SDValue, 8> MOps1(NumConcat, UndefVal);
4254 SmallVector<SDValue, 8> MOps2(NumConcat, UndefVal);
4255 MOps1[0] = Src1;
4256 MOps2[0] = Src2;
4257
4258 Src1 = DAG.getNode(ISD::CONCAT_VECTORS, DL, PaddedVT, MOps1);
4259 Src2 = DAG.getNode(ISD::CONCAT_VECTORS, DL, PaddedVT, MOps2);
4260
4261 // Readjust mask for new input vector length.
4262 SmallVector<int, 8> MappedOps(PaddedMaskNumElts, -1);
4263 for (unsigned i = 0; i != MaskNumElts; ++i) {
4264 int Idx = Mask[i];
4265 if (Idx >= (int)SrcNumElts)
4266 Idx -= SrcNumElts - PaddedMaskNumElts;
4267 MappedOps[i] = Idx;
4268 }
4269
4270 SDValue Result = DAG.getVectorShuffle(PaddedVT, DL, Src1, Src2, MappedOps);
4271
4272 // If the concatenated vector was padded, extract a subvector with the
4273 // correct number of elements.
4274 if (MaskNumElts != PaddedMaskNumElts)
4275 Result = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Result,
4276 DAG.getVectorIdxConstant(0, DL));
4277
4278 setValue(&I, Result);
4279 return;
4280 }
4281
4282 assert(SrcNumElts > MaskNumElts);
4283
4284 // Analyze the access pattern of the vector to see if we can extract
4285 // two subvectors and do the shuffle.
4286 int StartIdx[2] = {-1, -1}; // StartIdx to extract from
4287 bool CanExtract = true;
4288 for (int Idx : Mask) {
4289 unsigned Input = 0;
4290 if (Idx < 0)
4291 continue;
4292
4293 if (Idx >= (int)SrcNumElts) {
4294 Input = 1;
4295 Idx -= SrcNumElts;
4296 }
4297
4298 // If all the indices come from the same MaskNumElts sized portion of
4299 // the sources we can use extract. Also make sure the extract wouldn't
4300 // extract past the end of the source.
4301 int NewStartIdx = alignDown(Idx, MaskNumElts);
4302 if (NewStartIdx + MaskNumElts > SrcNumElts ||
4303 (StartIdx[Input] >= 0 && StartIdx[Input] != NewStartIdx))
4304 CanExtract = false;
4305 // Make sure we always update StartIdx as we use it to track if all
4306 // elements are undef.
4307 StartIdx[Input] = NewStartIdx;
4308 }
4309
4310 if (StartIdx[0] < 0 && StartIdx[1] < 0) {
4311 setValue(&I, DAG.getUNDEF(VT)); // Vectors are not used.
4312 return;
4313 }
4314 if (CanExtract) {
4315 // Extract appropriate subvector and generate a vector shuffle
4316 for (unsigned Input = 0; Input < 2; ++Input) {
4317 SDValue &Src = Input == 0 ? Src1 : Src2;
4318 if (StartIdx[Input] < 0)
4319 Src = DAG.getUNDEF(VT);
4320 else {
4321 Src = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Src,
4322 DAG.getVectorIdxConstant(StartIdx[Input], DL));
4323 }
4324 }
4325
4326 // Calculate new mask.
4327 SmallVector<int, 8> MappedOps(Mask);
4328 for (int &Idx : MappedOps) {
4329 if (Idx >= (int)SrcNumElts)
4330 Idx -= SrcNumElts + StartIdx[1] - MaskNumElts;
4331 else if (Idx >= 0)
4332 Idx -= StartIdx[0];
4333 }
4334
4335 setValue(&I, DAG.getVectorShuffle(VT, DL, Src1, Src2, MappedOps));
4336 return;
4337 }
4338
4339 // We can't use either concat vectors or extract subvectors so fall back to
4340 // replacing the shuffle with extract and build vector.
4341 // to insert and build vector.
4342 EVT EltVT = VT.getVectorElementType();
4344 for (int Idx : Mask) {
4345 SDValue Res;
4346
4347 if (Idx < 0) {
4348 Res = DAG.getUNDEF(EltVT);
4349 } else {
4350 SDValue &Src = Idx < (int)SrcNumElts ? Src1 : Src2;
4351 if (Idx >= (int)SrcNumElts) Idx -= SrcNumElts;
4352
4353 Res = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Src,
4354 DAG.getVectorIdxConstant(Idx, DL));
4355 }
4356
4357 Ops.push_back(Res);
4358 }
4359
4360 setValue(&I, DAG.getBuildVector(VT, DL, Ops));
4361}
4362
4363void SelectionDAGBuilder::visitInsertValue(const InsertValueInst &I) {
4364 ArrayRef<unsigned> Indices = I.getIndices();
4365 const Value *Op0 = I.getOperand(0);
4366 const Value *Op1 = I.getOperand(1);
4367 Type *AggTy = I.getType();
4368 Type *ValTy = Op1->getType();
4369 bool IntoUndef = isa<UndefValue>(Op0);
4370 bool FromUndef = isa<UndefValue>(Op1);
4371
4372 unsigned LinearIndex = ComputeLinearIndex(AggTy, Indices);
4373
4374 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4375 SmallVector<EVT, 4> AggValueVTs;
4376 ComputeValueVTs(TLI, DAG.getDataLayout(), AggTy, AggValueVTs);
4377 SmallVector<EVT, 4> ValValueVTs;
4378 ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);
4379
4380 unsigned NumAggValues = AggValueVTs.size();
4381 unsigned NumValValues = ValValueVTs.size();
4382 SmallVector<SDValue, 4> Values(NumAggValues);
4383
4384 // Ignore an insertvalue that produces an empty object
4385 if (!NumAggValues) {
4386 setValue(&I, DAG.getUNDEF(MVT(MVT::Other)));
4387 return;
4388 }
4389
4390 SDValue Agg = getValue(Op0);
4391 unsigned i = 0;
4392 // Copy the beginning value(s) from the original aggregate.
4393 for (; i != LinearIndex; ++i)
4394 Values[i] = IntoUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4395 SDValue(Agg.getNode(), Agg.getResNo() + i);
4396 // Copy values from the inserted value(s).
4397 if (NumValValues) {
4398 SDValue Val = getValue(Op1);
4399 for (; i != LinearIndex + NumValValues; ++i)
4400 Values[i] = FromUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4401 SDValue(Val.getNode(), Val.getResNo() + i - LinearIndex);
4402 }
4403 // Copy remaining value(s) from the original aggregate.
4404 for (; i != NumAggValues; ++i)
4405 Values[i] = IntoUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4406 SDValue(Agg.getNode(), Agg.getResNo() + i);
4407
4409 DAG.getVTList(AggValueVTs), Values));
4410}
4411
4412void SelectionDAGBuilder::visitExtractValue(const ExtractValueInst &I) {
4413 ArrayRef<unsigned> Indices = I.getIndices();
4414 const Value *Op0 = I.getOperand(0);
4415 Type *AggTy = Op0->getType();
4416 Type *ValTy = I.getType();
4417 bool OutOfUndef = isa<UndefValue>(Op0);
4418
4419 unsigned LinearIndex = ComputeLinearIndex(AggTy, Indices);
4420
4421 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4422 SmallVector<EVT, 4> ValValueVTs;
4423 ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);
4424
4425 unsigned NumValValues = ValValueVTs.size();
4426
4427 // Ignore a extractvalue that produces an empty object
4428 if (!NumValValues) {
4429 setValue(&I, DAG.getUNDEF(MVT(MVT::Other)));
4430 return;
4431 }
4432
4433 SmallVector<SDValue, 4> Values(NumValValues);
4434
4435 SDValue Agg = getValue(Op0);
4436 // Copy out the selected value(s).
4437 for (unsigned i = LinearIndex; i != LinearIndex + NumValValues; ++i)
4438 Values[i - LinearIndex] =
4439 OutOfUndef ?
4440 DAG.getUNDEF(Agg.getNode()->getValueType(Agg.getResNo() + i)) :
4441 SDValue(Agg.getNode(), Agg.getResNo() + i);
4442
4444 DAG.getVTList(ValValueVTs), Values));
4445}
4446
4447void SelectionDAGBuilder::visitGetElementPtr(const User &I) {
4448 Value *Op0 = I.getOperand(0);
4449 // Note that the pointer operand may be a vector of pointers. Take the scalar
4450 // element which holds a pointer.
4451 unsigned AS = Op0->getType()->getScalarType()->getPointerAddressSpace();
4452 SDValue N = getValue(Op0);
4453 SDLoc dl = getCurSDLoc();
4454 auto &TLI = DAG.getTargetLoweringInfo();
4455 GEPNoWrapFlags NW = cast<GEPOperator>(I).getNoWrapFlags();
4456
4457 // For a vector GEP, keep the prefix scalar as long as possible, then
4458 // convert any scalars encountered after the first vector operand to vectors.
4459 bool IsVectorGEP = I.getType()->isVectorTy();
4460 ElementCount VectorElementCount =
4461 IsVectorGEP ? cast<VectorType>(I.getType())->getElementCount()
4463
4465 GTI != E; ++GTI) {
4466 const Value *Idx = GTI.getOperand();
4467 if (StructType *StTy = GTI.getStructTypeOrNull()) {
4468 unsigned Field = cast<Constant>(Idx)->getUniqueInteger().getZExtValue();
4469 if (Field) {
4470 // N = N + Offset
4471 uint64_t Offset =
4472 DAG.getDataLayout().getStructLayout(StTy)->getElementOffset(Field);
4473
4474 // In an inbounds GEP with an offset that is nonnegative even when
4475 // interpreted as signed, assume there is no unsigned overflow.
4476 SDNodeFlags Flags;
4477 if (NW.hasNoUnsignedWrap() ||
4478 (int64_t(Offset) >= 0 && NW.hasNoUnsignedSignedWrap()))
4480 Flags.setInBounds(NW.isInBounds());
4481
4482 N = DAG.getMemBasePlusOffset(
4483 N, DAG.getConstant(Offset, dl, N.getValueType()), dl, Flags);
4484 }
4485 } else {
4486 // IdxSize is the width of the arithmetic according to IR semantics.
4487 // In SelectionDAG, we may prefer to do arithmetic in a wider bitwidth
4488 // (and fix up the result later).
4489 unsigned IdxSize = DAG.getDataLayout().getIndexSizeInBits(AS);
4490 MVT IdxTy = MVT::getIntegerVT(IdxSize);
4491 TypeSize ElementSize =
4492 GTI.getSequentialElementStride(DAG.getDataLayout());
4493 // We intentionally mask away the high bits here; ElementSize may not
4494 // fit in IdxTy.
4495 APInt ElementMul(IdxSize, ElementSize.getKnownMinValue(),
4496 /*isSigned=*/false, /*implicitTrunc=*/true);
4497 bool ElementScalable = ElementSize.isScalable();
4498
4499 // If this is a scalar constant or a splat vector of constants,
4500 // handle it quickly.
4501 const auto *C = dyn_cast<Constant>(Idx);
4502 if (C && isa<VectorType>(C->getType()))
4503 C = C->getSplatValue();
4504
4505 const auto *CI = dyn_cast_or_null<ConstantInt>(C);
4506 if (CI && CI->isZero())
4507 continue;
4508 if (CI && !ElementScalable) {
4509 APInt Offs = ElementMul * CI->getValue().sextOrTrunc(IdxSize);
4510 LLVMContext &Context = *DAG.getContext();
4511 SDValue OffsVal;
4512 if (N.getValueType().isVector())
4513 OffsVal = DAG.getConstant(
4514 Offs, dl, EVT::getVectorVT(Context, IdxTy, VectorElementCount));
4515 else
4516 OffsVal = DAG.getConstant(Offs, dl, IdxTy);
4517
4518 // In an inbounds GEP with an offset that is nonnegative even when
4519 // interpreted as signed, assume there is no unsigned overflow.
4520 SDNodeFlags Flags;
4521 if (NW.hasNoUnsignedWrap() ||
4522 (Offs.isNonNegative() && NW.hasNoUnsignedSignedWrap()))
4523 Flags.setNoUnsignedWrap(true);
4524 Flags.setInBounds(NW.isInBounds());
4525
4526 OffsVal = DAG.getSExtOrTrunc(OffsVal, dl, N.getValueType());
4527
4528 N = DAG.getMemBasePlusOffset(N, OffsVal, dl, Flags);
4529 continue;
4530 }
4531
4532 // N = N + Idx * ElementMul;
4533 SDValue IdxN = getValue(Idx);
4534
4535 if (IdxN.getValueType().isVector() != N.getValueType().isVector()) {
4536 if (N.getValueType().isVector()) {
4537 EVT VT = EVT::getVectorVT(*Context, IdxN.getValueType(),
4538 VectorElementCount);
4539 IdxN = DAG.getSplat(VT, dl, IdxN);
4540 } else {
4541 EVT VT =
4542 EVT::getVectorVT(*Context, N.getValueType(), VectorElementCount);
4543 N = DAG.getSplat(VT, dl, N);
4544 }
4545 }
4546
4547 // If the index is smaller or larger than intptr_t, truncate or extend
4548 // it.
4549 IdxN = DAG.getSExtOrTrunc(IdxN, dl, N.getValueType());
4550
4551 SDNodeFlags ScaleFlags;
4552 // The multiplication of an index by the type size does not wrap the
4553 // pointer index type in a signed sense (mul nsw).
4555
4556 // The multiplication of an index by the type size does not wrap the
4557 // pointer index type in an unsigned sense (mul nuw).
4558 ScaleFlags.setNoUnsignedWrap(NW.hasNoUnsignedWrap());
4559
4560 if (ElementScalable) {
4561 EVT VScaleTy = N.getValueType().getScalarType();
4562 SDValue VScale = DAG.getNode(
4563 ISD::VSCALE, dl, VScaleTy,
4564 DAG.getConstant(ElementMul.getZExtValue(), dl, VScaleTy));
4565 if (N.getValueType().isVector())
4566 VScale = DAG.getSplatVector(N.getValueType(), dl, VScale);
4567 IdxN = DAG.getNode(ISD::MUL, dl, N.getValueType(), IdxN, VScale,
4568 ScaleFlags);
4569 } else {
4570 // If this is a multiply by a power of two, turn it into a shl
4571 // immediately. This is a very common case.
4572 if (ElementMul != 1) {
4573 if (ElementMul.isPowerOf2()) {
4574 unsigned Amt = ElementMul.logBase2();
4575 IdxN = DAG.getNode(
4576 ISD::SHL, dl, N.getValueType(), IdxN,
4577 DAG.getShiftAmountConstant(Amt, N.getValueType(), dl),
4578 ScaleFlags);
4579 } else {
4580 SDValue Scale = DAG.getConstant(ElementMul.getZExtValue(), dl,
4581 IdxN.getValueType());
4582 IdxN = DAG.getNode(ISD::MUL, dl, N.getValueType(), IdxN, Scale,
4583 ScaleFlags);
4584 }
4585 }
4586 }
4587
4588 // The successive addition of the current address, truncated to the
4589 // pointer index type and interpreted as an unsigned number, and each
4590 // offset, also interpreted as an unsigned number, does not wrap the
4591 // pointer index type (add nuw).
4592 SDNodeFlags AddFlags;
4593 AddFlags.setNoUnsignedWrap(NW.hasNoUnsignedWrap());
4594 AddFlags.setInBounds(NW.isInBounds());
4595
4596 N = DAG.getMemBasePlusOffset(N, IdxN, dl, AddFlags);
4597 }
4598 }
4599
4600 if (IsVectorGEP && !N.getValueType().isVector()) {
4601 EVT VT = EVT::getVectorVT(*Context, N.getValueType(), VectorElementCount);
4602 N = DAG.getSplat(VT, dl, N);
4603 }
4604
4605 MVT PtrTy = TLI.getPointerTy(DAG.getDataLayout(), AS);
4606 MVT PtrMemTy = TLI.getPointerMemTy(DAG.getDataLayout(), AS);
4607 if (IsVectorGEP) {
4608 PtrTy = MVT::getVectorVT(PtrTy, VectorElementCount);
4609 PtrMemTy = MVT::getVectorVT(PtrMemTy, VectorElementCount);
4610 }
4611
4612 if (PtrMemTy != PtrTy && !cast<GEPOperator>(I).isInBounds())
4613 N = DAG.getPtrExtendInReg(N, dl, PtrMemTy);
4614
4615 setValue(&I, N);
4616}
4617
4618void SelectionDAGBuilder::visitAlloca(const AllocaInst &I) {
4619 // If this is a fixed sized alloca in the entry block of the function,
4620 // allocate it statically on the stack.
4621 if (FuncInfo.StaticAllocaMap.count(&I))
4622 return; // getValue will auto-populate this.
4623
4624 SDLoc dl = getCurSDLoc();
4625 Type *Ty = I.getAllocatedType();
4626 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4627 auto &DL = DAG.getDataLayout();
4628 TypeSize TySize = DL.getTypeAllocSize(Ty);
4629 MaybeAlign Alignment = I.getAlign();
4630
4631 SDValue AllocSize = getValue(I.getArraySize());
4632
4633 EVT IntPtr = TLI.getPointerTy(DL, I.getAddressSpace());
4634 if (AllocSize.getValueType() != IntPtr)
4635 AllocSize = DAG.getZExtOrTrunc(AllocSize, dl, IntPtr);
4636
4637 AllocSize = DAG.getNode(
4638 ISD::MUL, dl, IntPtr, AllocSize,
4639 DAG.getZExtOrTrunc(DAG.getTypeSize(dl, MVT::i64, TySize), dl, IntPtr));
4640
4641 // Handle alignment. If the requested alignment is less than or equal to
4642 // the stack alignment, ignore it. If the size is greater than or equal to
4643 // the stack alignment, we note this in the DYNAMIC_STACKALLOC node.
4644 Align StackAlign = DAG.getSubtarget().getFrameLowering()->getStackAlign();
4645 if (*Alignment <= StackAlign)
4646 Alignment = std::nullopt;
4647
4648 const uint64_t StackAlignMask = StackAlign.value() - 1U;
4649 // Round the size of the allocation up to the stack alignment size
4650 // by add SA-1 to the size. This doesn't overflow because we're computing
4651 // an address inside an alloca.
4652 AllocSize = DAG.getNode(ISD::ADD, dl, AllocSize.getValueType(), AllocSize,
4653 DAG.getConstant(StackAlignMask, dl, IntPtr),
4655
4656 // Mask out the low bits for alignment purposes.
4657 AllocSize = DAG.getNode(ISD::AND, dl, AllocSize.getValueType(), AllocSize,
4658 DAG.getSignedConstant(~StackAlignMask, dl, IntPtr));
4659
4660 SDValue Ops[] = {
4661 getRoot(), AllocSize,
4662 DAG.getConstant(Alignment ? Alignment->value() : 0, dl, IntPtr)};
4663 SDVTList VTs = DAG.getVTList(AllocSize.getValueType(), MVT::Other);
4664 SDValue DSA = DAG.getNode(ISD::DYNAMIC_STACKALLOC, dl, VTs, Ops);
4665 setValue(&I, DSA);
4666 DAG.setRoot(DSA.getValue(1));
4667
4668 assert(FuncInfo.MF->getFrameInfo().hasVarSizedObjects());
4669}
4670
4671static const MDNode *getRangeMetadata(const Instruction &I) {
4672 return I.getMetadata(LLVMContext::MD_range);
4673}
4674
4675static std::optional<ConstantRange> getRange(const Instruction &I) {
4676 if (const auto *CB = dyn_cast<CallBase>(&I))
4677 if (std::optional<ConstantRange> CR = CB->getRange())
4678 return CR;
4679 if (const MDNode *Range = getRangeMetadata(I))
4681 return std::nullopt;
4682}
4683
4685 if (const auto *CB = dyn_cast<CallBase>(&I))
4686 return CB->getRetNoFPClass();
4687 return fcNone;
4688}
4689
4690void SelectionDAGBuilder::visitLoad(const LoadInst &I) {
4691 if (I.isAtomic())
4692 return visitAtomicLoad(I);
4693
4694 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4695 const Value *SV = I.getOperand(0);
4696 if (TLI.supportSwiftError()) {
4697 // Swifterror values can come from either a function parameter with
4698 // swifterror attribute or an alloca with swifterror attribute.
4699 if (const Argument *Arg = dyn_cast<Argument>(SV)) {
4700 if (Arg->hasSwiftErrorAttr())
4701 return visitLoadFromSwiftError(I);
4702 }
4703
4704 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(SV)) {
4705 if (Alloca->isSwiftError())
4706 return visitLoadFromSwiftError(I);
4707 }
4708 }
4709
4710 SDValue Ptr = getValue(SV);
4711
4712 Type *Ty = I.getType();
4713 SmallVector<EVT, 4> ValueVTs, MemVTs;
4715 ComputeValueVTs(TLI, DAG.getDataLayout(), Ty, ValueVTs, &MemVTs, &Offsets);
4716 unsigned NumValues = ValueVTs.size();
4717 if (NumValues == 0)
4718 return;
4719
4720 Align Alignment = I.getAlign();
4721 AAMDNodes AAInfo = I.getAAMetadata();
4722 const MDNode *Ranges = getRangeMetadata(I);
4723 bool isVolatile = I.isVolatile();
4724 MachineMemOperand::Flags MMOFlags =
4725 TLI.getLoadMemOperandFlags(I, DAG.getDataLayout(), AC, LibInfo);
4726
4727 SDValue Root;
4728 bool ConstantMemory = false;
4729 if (isVolatile)
4730 // Serialize volatile loads with other side effects.
4731 Root = getRoot();
4732 else if (NumValues > MaxParallelChains)
4733 Root = getMemoryRoot();
4734 else if (BatchAA &&
4735 BatchAA->pointsToConstantMemory(MemoryLocation(
4736 SV,
4737 LocationSize::precise(DAG.getDataLayout().getTypeStoreSize(Ty)),
4738 AAInfo))) {
4739 // Do not serialize (non-volatile) loads of constant memory with anything.
4740 Root = DAG.getEntryNode();
4741 ConstantMemory = true;
4743 } else {
4744 // Do not serialize non-volatile loads against each other.
4745 Root = DAG.getRoot();
4746 }
4747
4748 SDLoc dl = getCurSDLoc();
4749
4750 if (isVolatile)
4751 Root = TLI.prepareVolatileOrAtomicLoad(Root, dl, DAG);
4752
4753 SmallVector<SDValue, 4> Values(NumValues);
4754 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4755
4756 unsigned ChainI = 0;
4757 for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
4758 // Serializing loads here may result in excessive register pressure, and
4759 // TokenFactor places arbitrary choke points on the scheduler. SD scheduling
4760 // could recover a bit by hoisting nodes upward in the chain by recognizing
4761 // they are side-effect free or do not alias. The optimizer should really
4762 // avoid this case by converting large object/array copies to llvm.memcpy
4763 // (MaxParallelChains should always remain as failsafe).
4764 if (ChainI == MaxParallelChains) {
4765 assert(PendingLoads.empty() && "PendingLoads must be serialized first");
4766 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4767 ArrayRef(Chains.data(), ChainI));
4768 Root = Chain;
4769 ChainI = 0;
4770 }
4771
4772 // TODO: MachinePointerInfo only supports a fixed length offset.
4773 MachinePointerInfo PtrInfo =
4774 !Offsets[i].isScalable() || Offsets[i].isZero()
4775 ? MachinePointerInfo(SV, Offsets[i].getKnownMinValue())
4776 : MachinePointerInfo();
4777
4778 SDValue A = DAG.getObjectPtrOffset(dl, Ptr, Offsets[i]);
4779 SDValue L = DAG.getLoad(MemVTs[i], dl, Root, A, PtrInfo, Alignment,
4780 MMOFlags, AAInfo, Ranges);
4781 Chains[ChainI] = L.getValue(1);
4782
4783 if (MemVTs[i] != ValueVTs[i])
4784 L = DAG.getPtrExtOrTrunc(L, dl, ValueVTs[i]);
4785
4786 if (MDNode *NoFPClassMD = I.getMetadata(LLVMContext::MD_nofpclass)) {
4787 uint64_t FPTestInt =
4788 cast<ConstantInt>(
4789 cast<ConstantAsMetadata>(NoFPClassMD->getOperand(0))->getValue())
4790 ->getZExtValue();
4791 if (FPTestInt != fcNone) {
4792 SDValue FPTestConst =
4793 DAG.getTargetConstant(FPTestInt, SDLoc(), MVT::i32);
4794 L = DAG.getNode(ISD::AssertNoFPClass, dl, L.getValueType(), L,
4795 FPTestConst);
4796 }
4797 }
4798 Values[i] = L;
4799 }
4800
4801 if (!ConstantMemory) {
4802 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4803 ArrayRef(Chains.data(), ChainI));
4804 if (isVolatile)
4805 DAG.setRoot(Chain);
4806 else
4807 PendingLoads.push_back(Chain);
4808 }
4809
4810 setValue(&I, DAG.getNode(ISD::MERGE_VALUES, dl,
4811 DAG.getVTList(ValueVTs), Values));
4812}
4813
4814void SelectionDAGBuilder::visitStoreToSwiftError(const StoreInst &I) {
4815 assert(DAG.getTargetLoweringInfo().supportSwiftError() &&
4816 "call visitStoreToSwiftError when backend supports swifterror");
4817
4818 SmallVector<EVT, 4> ValueVTs;
4819 SmallVector<uint64_t, 4> Offsets;
4820 const Value *SrcV = I.getOperand(0);
4821 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(),
4822 SrcV->getType(), ValueVTs, /*MemVTs=*/nullptr, &Offsets, 0);
4823 assert(ValueVTs.size() == 1 && Offsets[0] == 0 &&
4824 "expect a single EVT for swifterror");
4825
4826 SDValue Src = getValue(SrcV);
4827 // Create a virtual register, then update the virtual register.
4828 Register VReg =
4829 SwiftError.getOrCreateVRegDefAt(&I, FuncInfo.MBB, I.getPointerOperand());
4830 // Chain, DL, Reg, N or Chain, DL, Reg, N, Glue
4831 // Chain can be getRoot or getControlRoot.
4832 SDValue CopyNode = DAG.getCopyToReg(getRoot(), getCurSDLoc(), VReg,
4833 SDValue(Src.getNode(), Src.getResNo()));
4834 DAG.setRoot(CopyNode);
4835}
4836
4837void SelectionDAGBuilder::visitLoadFromSwiftError(const LoadInst &I) {
4838 assert(DAG.getTargetLoweringInfo().supportSwiftError() &&
4839 "call visitLoadFromSwiftError when backend supports swifterror");
4840
4841 assert(!I.isVolatile() &&
4842 !I.hasMetadata(LLVMContext::MD_nontemporal) &&
4843 !I.hasMetadata(LLVMContext::MD_invariant_load) &&
4844 "Support volatile, non temporal, invariant for load_from_swift_error");
4845
4846 const Value *SV = I.getOperand(0);
4847 Type *Ty = I.getType();
4848 assert(
4849 (!BatchAA ||
4850 !BatchAA->pointsToConstantMemory(MemoryLocation(
4851 SV, LocationSize::precise(DAG.getDataLayout().getTypeStoreSize(Ty)),
4852 I.getAAMetadata()))) &&
4853 "load_from_swift_error should not be constant memory");
4854
4855 SmallVector<EVT, 4> ValueVTs;
4856 SmallVector<uint64_t, 4> Offsets;
4857 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), Ty,
4858 ValueVTs, /*MemVTs=*/nullptr, &Offsets, 0);
4859 assert(ValueVTs.size() == 1 && Offsets[0] == 0 &&
4860 "expect a single EVT for swifterror");
4861
4862 // Chain, DL, Reg, VT, Glue or Chain, DL, Reg, VT
4863 SDValue L = DAG.getCopyFromReg(
4864 getRoot(), getCurSDLoc(),
4865 SwiftError.getOrCreateVRegUseAt(&I, FuncInfo.MBB, SV), ValueVTs[0]);
4866
4867 setValue(&I, L);
4868}
4869
4870void SelectionDAGBuilder::visitStore(const StoreInst &I) {
4871 if (I.isAtomic())
4872 return visitAtomicStore(I);
4873
4874 const Value *SrcV = I.getOperand(0);
4875 const Value *PtrV = I.getOperand(1);
4876
4877 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4878 if (TLI.supportSwiftError()) {
4879 // Swifterror values can come from either a function parameter with
4880 // swifterror attribute or an alloca with swifterror attribute.
4881 if (const Argument *Arg = dyn_cast<Argument>(PtrV)) {
4882 if (Arg->hasSwiftErrorAttr())
4883 return visitStoreToSwiftError(I);
4884 }
4885
4886 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(PtrV)) {
4887 if (Alloca->isSwiftError())
4888 return visitStoreToSwiftError(I);
4889 }
4890 }
4891
4892 SmallVector<EVT, 4> ValueVTs, MemVTs;
4894 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(),
4895 SrcV->getType(), ValueVTs, &MemVTs, &Offsets);
4896 unsigned NumValues = ValueVTs.size();
4897 if (NumValues == 0)
4898 return;
4899
4900 // Get the lowered operands. Note that we do this after
4901 // checking if NumResults is zero, because with zero results
4902 // the operands won't have values in the map.
4903 SDValue Src = getValue(SrcV);
4904 SDValue Ptr = getValue(PtrV);
4905
4906 SDValue Root = I.isVolatile() ? getRoot() : getMemoryRoot();
4907 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4908 SDLoc dl = getCurSDLoc();
4909 Align Alignment = I.getAlign();
4910 AAMDNodes AAInfo = I.getAAMetadata();
4911
4912 auto MMOFlags = TLI.getStoreMemOperandFlags(I, DAG.getDataLayout());
4913
4914 unsigned ChainI = 0;
4915 for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
4916 // See visitLoad comments.
4917 if (ChainI == MaxParallelChains) {
4918 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4919 ArrayRef(Chains.data(), ChainI));
4920 Root = Chain;
4921 ChainI = 0;
4922 }
4923
4924 // TODO: MachinePointerInfo only supports a fixed length offset.
4925 MachinePointerInfo PtrInfo =
4926 !Offsets[i].isScalable() || Offsets[i].isZero()
4927 ? MachinePointerInfo(PtrV, Offsets[i].getKnownMinValue())
4928 : MachinePointerInfo();
4929
4930 SDValue Add = DAG.getObjectPtrOffset(dl, Ptr, Offsets[i]);
4931 SDValue Val = SDValue(Src.getNode(), Src.getResNo() + i);
4932 if (MemVTs[i] != ValueVTs[i])
4933 Val = DAG.getPtrExtOrTrunc(Val, dl, MemVTs[i]);
4934 SDValue St =
4935 DAG.getStore(Root, dl, Val, Add, PtrInfo, Alignment, MMOFlags, AAInfo);
4936 Chains[ChainI] = St;
4937 }
4938
4939 SDValue StoreNode = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4940 ArrayRef(Chains.data(), ChainI));
4941 setValue(&I, StoreNode);
4942 DAG.setRoot(StoreNode);
4943}
4944
4945void SelectionDAGBuilder::visitMaskedStore(const CallInst &I,
4946 bool IsCompressing) {
4947 SDLoc sdl = getCurSDLoc();
4948
4949 Value *Src0Operand = I.getArgOperand(0);
4950 Value *PtrOperand = I.getArgOperand(1);
4951 Value *MaskOperand = I.getArgOperand(2);
4952 Align Alignment = I.getParamAlign(1).valueOrOne();
4953
4954 SDValue Ptr = getValue(PtrOperand);
4955 SDValue Src0 = getValue(Src0Operand);
4956 SDValue Mask = getValue(MaskOperand);
4957 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
4958
4959 EVT VT = Src0.getValueType();
4960
4961 auto MMOFlags = MachineMemOperand::MOStore;
4962 if (I.hasMetadata(LLVMContext::MD_nontemporal))
4964
4965 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
4966 MachinePointerInfo(PtrOperand), MMOFlags,
4967 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata());
4968
4969 const auto &TLI = DAG.getTargetLoweringInfo();
4970
4971 SDValue StoreNode =
4972 !IsCompressing && TTI->hasConditionalLoadStoreForType(
4973 I.getArgOperand(0)->getType(), /*IsStore=*/true)
4974 ? TLI.visitMaskedStore(DAG, sdl, getMemoryRoot(), MMO, Ptr, Src0,
4975 Mask)
4976 : DAG.getMaskedStore(getMemoryRoot(), sdl, Src0, Ptr, Offset, Mask,
4977 VT, MMO, ISD::UNINDEXED, /*Truncating=*/false,
4978 IsCompressing);
4979 DAG.setRoot(StoreNode);
4980 setValue(&I, StoreNode);
4981}
4982
4983// Get a uniform base for the Gather/Scatter intrinsic.
4984// The first argument of the Gather/Scatter intrinsic is a vector of pointers.
4985// We try to represent it as a base pointer + vector of indices.
4986// Usually, the vector of pointers comes from a 'getelementptr' instruction.
4987// The first operand of the GEP may be a single pointer or a vector of pointers
4988// Example:
4989// %gep.ptr = getelementptr i32, <8 x i32*> %vptr, <8 x i32> %ind
4990// or
4991// %gep.ptr = getelementptr i32, i32* %ptr, <8 x i32> %ind
4992// %res = call <8 x i32> @llvm.masked.gather.v8i32(<8 x i32*> %gep.ptr, ..
4993//
4994// When the first GEP operand is a single pointer - it is the uniform base we
4995// are looking for. If first operand of the GEP is a splat vector - we
4996// extract the splat value and use it as a uniform base.
4997// In all other cases the function returns 'false'.
4998static bool getUniformBase(const Value *Ptr, SDValue &Base, SDValue &Index,
4999 SDValue &Scale, SelectionDAGBuilder *SDB,
5000 const BasicBlock *CurBB, uint64_t ElemSize) {
5001 SelectionDAG& DAG = SDB->DAG;
5002 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5003 const DataLayout &DL = DAG.getDataLayout();
5004
5005 assert(Ptr->getType()->isVectorTy() && "Unexpected pointer type");
5006
5007 // Handle splat constant pointer.
5008 if (auto *C = dyn_cast<Constant>(Ptr)) {
5009 C = C->getSplatValue();
5010 if (!C)
5011 return false;
5012
5013 Base = SDB->getValue(C);
5014
5015 ElementCount NumElts = cast<VectorType>(Ptr->getType())->getElementCount();
5016 EVT VT = EVT::getVectorVT(*DAG.getContext(), TLI.getPointerTy(DL), NumElts);
5017 Index = DAG.getConstant(0, SDB->getCurSDLoc(), VT);
5018 Scale = DAG.getTargetConstant(1, SDB->getCurSDLoc(), TLI.getPointerTy(DL));
5019 return true;
5020 }
5021
5023 if (!GEP || GEP->getParent() != CurBB)
5024 return false;
5025
5026 if (GEP->getNumOperands() != 2)
5027 return false;
5028
5029 const Value *BasePtr = GEP->getPointerOperand();
5030 const Value *IndexVal = GEP->getOperand(GEP->getNumOperands() - 1);
5031
5032 // Make sure the base is scalar and the index is a vector.
5033 if (BasePtr->getType()->isVectorTy() || !IndexVal->getType()->isVectorTy())
5034 return false;
5035
5036 TypeSize ScaleVal = DL.getTypeAllocSize(GEP->getResultElementType());
5037 if (ScaleVal.isScalable())
5038 return false;
5039
5040 // Target may not support the required addressing mode.
5041 if (ScaleVal != 1 &&
5042 !TLI.isLegalScaleForGatherScatter(ScaleVal.getFixedValue(), ElemSize))
5043 return false;
5044
5045 Base = SDB->getValue(BasePtr);
5046 Index = SDB->getValue(IndexVal);
5047
5048 Scale =
5049 DAG.getTargetConstant(ScaleVal, SDB->getCurSDLoc(), TLI.getPointerTy(DL));
5050 return true;
5051}
5052
5053void SelectionDAGBuilder::visitMaskedScatter(const CallInst &I) {
5054 SDLoc sdl = getCurSDLoc();
5055
5056 // llvm.masked.scatter.*(Src0, Ptrs, Mask)
5057 const Value *Ptr = I.getArgOperand(1);
5058 SDValue Src0 = getValue(I.getArgOperand(0));
5059 SDValue Mask = getValue(I.getArgOperand(2));
5060 EVT VT = Src0.getValueType();
5061 Align Alignment = I.getParamAlign(1).valueOrOne();
5062 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5063
5064 SDValue Base;
5065 SDValue Index;
5066 SDValue Scale;
5067 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
5068 I.getParent(), VT.getScalarStoreSize());
5069
5070 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
5071 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5072 MachinePointerInfo(AS), MachineMemOperand::MOStore,
5073 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata());
5074 if (!UniformBase) {
5075 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5076 Index = getValue(Ptr);
5077 Scale =
5078 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5079 }
5080
5081 EVT IdxVT = Index.getValueType();
5082 EVT EltTy = IdxVT.getVectorElementType();
5083 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
5084 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
5085 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
5086 }
5087
5088 SDValue Ops[] = { getMemoryRoot(), Src0, Mask, Base, Index, Scale };
5089 SDValue Scatter = DAG.getMaskedScatter(DAG.getVTList(MVT::Other), VT, sdl,
5090 Ops, MMO, ISD::SIGNED_SCALED, false);
5091 DAG.setRoot(Scatter);
5092 setValue(&I, Scatter);
5093}
5094
5095void SelectionDAGBuilder::visitMaskedLoad(const CallInst &I, bool IsExpanding) {
5096 SDLoc sdl = getCurSDLoc();
5097
5098 Value *PtrOperand = I.getArgOperand(0);
5099 Value *MaskOperand = I.getArgOperand(1);
5100 Value *Src0Operand = I.getArgOperand(2);
5101 Align Alignment = I.getParamAlign(0).valueOrOne();
5102
5103 SDValue Ptr = getValue(PtrOperand);
5104 SDValue Src0 = getValue(Src0Operand);
5105 SDValue Mask = getValue(MaskOperand);
5106 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
5107
5108 EVT VT = Src0.getValueType();
5109 AAMDNodes AAInfo = I.getAAMetadata();
5110 const MDNode *Ranges = getRangeMetadata(I);
5111
5112 // Do not serialize masked loads of constant memory with anything.
5113 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
5114 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
5115
5116 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
5117
5118 auto MMOFlags = MachineMemOperand::MOLoad;
5119 if (I.hasMetadata(LLVMContext::MD_nontemporal))
5121 if (I.hasMetadata(LLVMContext::MD_invariant_load))
5123
5124 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5125 MachinePointerInfo(PtrOperand), MMOFlags,
5126 VT.getStoreSize(), Alignment, AAInfo, Ranges);
5127
5128 const auto &TLI = DAG.getTargetLoweringInfo();
5129
5130 // The Load/Res may point to different values and both of them are output
5131 // variables.
5132 SDValue Load;
5133 SDValue Res;
5134 if (!IsExpanding &&
5135 TTI->hasConditionalLoadStoreForType(Src0Operand->getType(),
5136 /*IsStore=*/false))
5137 Res = TLI.visitMaskedLoad(DAG, sdl, InChain, MMO, Load, Ptr, Src0, Mask);
5138 else
5139 Res = Load =
5140 DAG.getMaskedLoad(VT, sdl, InChain, Ptr, Offset, Mask, Src0, VT, MMO,
5141 ISD::UNINDEXED, ISD::NON_EXTLOAD, IsExpanding);
5142 if (AddToChain)
5143 PendingLoads.push_back(Load.getValue(1));
5144 setValue(&I, Res);
5145}
5146
5147void SelectionDAGBuilder::visitMaskedGather(const CallInst &I) {
5148 SDLoc sdl = getCurSDLoc();
5149
5150 // @llvm.masked.gather.*(Ptrs, Mask, Src0)
5151 const Value *Ptr = I.getArgOperand(0);
5152 SDValue Src0 = getValue(I.getArgOperand(2));
5153 SDValue Mask = getValue(I.getArgOperand(1));
5154
5155 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5156 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
5157 Align Alignment = I.getParamAlign(0).valueOrOne();
5158
5159 const MDNode *Ranges = getRangeMetadata(I);
5160
5161 SDValue Root = DAG.getRoot();
5162 SDValue Base;
5163 SDValue Index;
5164 SDValue Scale;
5165 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
5166 I.getParent(), VT.getScalarStoreSize());
5167 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
5168 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5169 MachinePointerInfo(AS), MachineMemOperand::MOLoad,
5170 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata(),
5171 Ranges);
5172
5173 if (!UniformBase) {
5174 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5175 Index = getValue(Ptr);
5176 Scale =
5177 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5178 }
5179
5180 EVT IdxVT = Index.getValueType();
5181 EVT EltTy = IdxVT.getVectorElementType();
5182 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
5183 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
5184 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
5185 }
5186
5187 SDValue Ops[] = { Root, Src0, Mask, Base, Index, Scale };
5188 SDValue Gather =
5189 DAG.getMaskedGather(DAG.getVTList(VT, MVT::Other), VT, sdl, Ops, MMO,
5191
5192 PendingLoads.push_back(Gather.getValue(1));
5193 setValue(&I, Gather);
5194}
5195
5196void SelectionDAGBuilder::visitAtomicCmpXchg(const AtomicCmpXchgInst &I) {
5197 SDLoc dl = getCurSDLoc();
5198 AtomicOrdering SuccessOrdering = I.getSuccessOrdering();
5199 AtomicOrdering FailureOrdering = I.getFailureOrdering();
5200 SyncScope::ID SSID = I.getSyncScopeID();
5201
5202 SDValue InChain = getRoot();
5203
5204 MVT MemVT = getValue(I.getCompareOperand()).getSimpleValueType();
5205 SDVTList VTs = DAG.getVTList(MemVT, MVT::i1, MVT::Other);
5206
5207 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5208 auto Flags = TLI.getAtomicMemOperandFlags(I, DAG.getDataLayout());
5209
5210 MachineFunction &MF = DAG.getMachineFunction();
5211 MachineMemOperand *MMO = MF.getMachineMemOperand(
5212 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5213 DAG.getEVTAlign(MemVT), AAMDNodes(), nullptr, SSID, SuccessOrdering,
5214 FailureOrdering);
5215
5217 dl, MemVT, VTs, InChain,
5218 getValue(I.getPointerOperand()),
5219 getValue(I.getCompareOperand()),
5220 getValue(I.getNewValOperand()), MMO);
5221
5222 SDValue OutChain = L.getValue(2);
5223
5224 setValue(&I, L);
5225 DAG.setRoot(OutChain);
5226}
5227
5228void SelectionDAGBuilder::visitAtomicRMW(const AtomicRMWInst &I) {
5229 SDLoc dl = getCurSDLoc();
5231 switch (I.getOperation()) {
5232 default: llvm_unreachable("Unknown atomicrmw operation");
5250 break;
5253 break;
5256 break;
5259 break;
5262 break;
5265 break;
5268 break;
5271 break;
5272 }
5273 AtomicOrdering Ordering = I.getOrdering();
5274 SyncScope::ID SSID = I.getSyncScopeID();
5275
5276 SDValue InChain = getRoot();
5277
5278 auto MemVT = getValue(I.getValOperand()).getSimpleValueType();
5279 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5280 auto Flags = TLI.getAtomicMemOperandFlags(I, DAG.getDataLayout());
5281
5282 MachineFunction &MF = DAG.getMachineFunction();
5283 MachineMemOperand *MMO = MF.getMachineMemOperand(
5284 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5285 DAG.getEVTAlign(MemVT), AAMDNodes(), nullptr, SSID, Ordering);
5286
5287 SDValue L =
5288 DAG.getAtomic(NT, dl, MemVT, InChain,
5289 getValue(I.getPointerOperand()), getValue(I.getValOperand()),
5290 MMO);
5291
5292 SDValue OutChain = L.getValue(1);
5293
5294 setValue(&I, L);
5295 DAG.setRoot(OutChain);
5296}
5297
5298void SelectionDAGBuilder::visitFence(const FenceInst &I) {
5299 SDLoc dl = getCurSDLoc();
5300 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5301 SDValue Ops[3];
5302 Ops[0] = getRoot();
5303 Ops[1] = DAG.getTargetConstant((unsigned)I.getOrdering(), dl,
5304 TLI.getFenceOperandTy(DAG.getDataLayout()));
5305 Ops[2] = DAG.getTargetConstant(I.getSyncScopeID(), dl,
5306 TLI.getFenceOperandTy(DAG.getDataLayout()));
5307 SDValue N = DAG.getNode(ISD::ATOMIC_FENCE, dl, MVT::Other, Ops);
5308 setValue(&I, N);
5309 DAG.setRoot(N);
5310}
5311
5312void SelectionDAGBuilder::visitAtomicLoad(const LoadInst &I) {
5313 SDLoc dl = getCurSDLoc();
5314 AtomicOrdering Order = I.getOrdering();
5315 SyncScope::ID SSID = I.getSyncScopeID();
5316
5317 SDValue InChain = getRoot();
5318
5319 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5320 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
5321 EVT MemVT = TLI.getMemValueType(DAG.getDataLayout(), I.getType());
5322
5323 if (!TLI.supportsUnalignedAtomics() &&
5324 I.getAlign().value() < MemVT.getSizeInBits() / 8)
5325 report_fatal_error("Cannot generate unaligned atomic load");
5326
5327 auto Flags = TLI.getLoadMemOperandFlags(I, DAG.getDataLayout(), AC, LibInfo);
5328
5329 const MDNode *Ranges = getRangeMetadata(I);
5330 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5331 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5332 I.getAlign(), AAMDNodes(), Ranges, SSID, Order);
5333
5334 InChain = TLI.prepareVolatileOrAtomicLoad(InChain, dl, DAG);
5335
5336 SDValue Ptr = getValue(I.getPointerOperand());
5337 SDValue L =
5338 DAG.getAtomicLoad(ISD::NON_EXTLOAD, dl, MemVT, MemVT, InChain, Ptr, MMO);
5339
5340 SDValue OutChain = L.getValue(1);
5341 if (MemVT != VT)
5342 L = DAG.getPtrExtOrTrunc(L, dl, VT);
5343
5344 setValue(&I, L);
5345 DAG.setRoot(OutChain);
5346}
5347
5348void SelectionDAGBuilder::visitAtomicStore(const StoreInst &I) {
5349 SDLoc dl = getCurSDLoc();
5350
5351 AtomicOrdering Ordering = I.getOrdering();
5352 SyncScope::ID SSID = I.getSyncScopeID();
5353
5354 SDValue InChain = getRoot();
5355
5356 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5357 EVT MemVT =
5358 TLI.getMemValueType(DAG.getDataLayout(), I.getValueOperand()->getType());
5359
5360 if (!TLI.supportsUnalignedAtomics() &&
5361 I.getAlign().value() < MemVT.getSizeInBits() / 8)
5362 report_fatal_error("Cannot generate unaligned atomic store");
5363
5364 auto Flags = TLI.getStoreMemOperandFlags(I, DAG.getDataLayout());
5365
5366 MachineFunction &MF = DAG.getMachineFunction();
5367 MachineMemOperand *MMO = MF.getMachineMemOperand(
5368 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5369 I.getAlign(), AAMDNodes(), nullptr, SSID, Ordering);
5370
5371 SDValue Val = getValue(I.getValueOperand());
5372 if (Val.getValueType() != MemVT)
5373 Val = DAG.getPtrExtOrTrunc(Val, dl, MemVT);
5374 SDValue Ptr = getValue(I.getPointerOperand());
5375
5376 SDValue OutChain =
5377 DAG.getAtomic(ISD::ATOMIC_STORE, dl, MemVT, InChain, Val, Ptr, MMO);
5378
5379 setValue(&I, OutChain);
5380 DAG.setRoot(OutChain);
5381}
5382
5383/// Check if this intrinsic call depends on the chain (1st return value)
5384/// and if it only *loads* memory.
5385/// Ignore the callsite's attributes. A specific call site may be marked with
5386/// readnone, but the lowering code will expect the chain based on the
5387/// definition.
5388std::pair<bool, bool>
5389SelectionDAGBuilder::getTargetIntrinsicCallProperties(const CallBase &I) {
5390 const Function *F = I.getCalledFunction();
5391 bool HasChain = !F->doesNotAccessMemory();
5392 bool OnlyLoad =
5393 HasChain && F->onlyReadsMemory() && F->willReturn() && F->doesNotThrow();
5394
5395 return {HasChain, OnlyLoad};
5396}
5397
5398SmallVector<SDValue, 8> SelectionDAGBuilder::getTargetIntrinsicOperands(
5399 const CallBase &I, bool HasChain, bool OnlyLoad,
5400 TargetLowering::IntrinsicInfo *TgtMemIntrinsicInfo) {
5401 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5402
5403 // Build the operand list.
5405 if (HasChain) { // If this intrinsic has side-effects, chainify it.
5406 if (OnlyLoad) {
5407 // We don't need to serialize loads against other loads.
5408 Ops.push_back(DAG.getRoot());
5409 } else {
5410 Ops.push_back(getRoot());
5411 }
5412 }
5413
5414 // Add the intrinsic ID as an integer operand if it's not a target intrinsic.
5415 if (!TgtMemIntrinsicInfo || TgtMemIntrinsicInfo->opc == ISD::INTRINSIC_VOID ||
5416 TgtMemIntrinsicInfo->opc == ISD::INTRINSIC_W_CHAIN)
5417 Ops.push_back(DAG.getTargetConstant(I.getIntrinsicID(), getCurSDLoc(),
5418 TLI.getPointerTy(DAG.getDataLayout())));
5419
5420 // Add all operands of the call to the operand list.
5421 for (unsigned i = 0, e = I.arg_size(); i != e; ++i) {
5422 const Value *Arg = I.getArgOperand(i);
5423 if (!I.paramHasAttr(i, Attribute::ImmArg)) {
5424 Ops.push_back(getValue(Arg));
5425 continue;
5426 }
5427
5428 // Use TargetConstant instead of a regular constant for immarg.
5429 EVT VT = TLI.getValueType(DAG.getDataLayout(), Arg->getType(), true);
5430 if (const ConstantInt *CI = dyn_cast<ConstantInt>(Arg)) {
5431 assert(CI->getBitWidth() <= 64 &&
5432 "large intrinsic immediates not handled");
5433 Ops.push_back(DAG.getTargetConstant(*CI, SDLoc(), VT));
5434 } else {
5435 Ops.push_back(
5436 DAG.getTargetConstantFP(*cast<ConstantFP>(Arg), SDLoc(), VT));
5437 }
5438 }
5439
5440 if (std::optional<OperandBundleUse> Bundle =
5441 I.getOperandBundle(LLVMContext::OB_deactivation_symbol)) {
5442 auto *Sym = Bundle->Inputs[0].get();
5443 SDValue SDSym = getValue(Sym);
5444 SDSym = DAG.getDeactivationSymbol(cast<GlobalValue>(Sym));
5445 Ops.push_back(SDSym);
5446 }
5447
5448 if (std::optional<OperandBundleUse> Bundle =
5449 I.getOperandBundle(LLVMContext::OB_convergencectrl)) {
5450 Value *Token = Bundle->Inputs[0].get();
5451 SDValue ConvControlToken = getValue(Token);
5452 assert(Ops.back().getValueType() != MVT::Glue &&
5453 "Did not expect another glue node here.");
5454 ConvControlToken =
5455 DAG.getNode(ISD::CONVERGENCECTRL_GLUE, {}, MVT::Glue, ConvControlToken);
5456 Ops.push_back(ConvControlToken);
5457 }
5458
5459 return Ops;
5460}
5461
5462SDVTList SelectionDAGBuilder::getTargetIntrinsicVTList(const CallBase &I,
5463 bool HasChain) {
5464 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5465
5466 SmallVector<EVT, 4> ValueVTs;
5467 ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);
5468
5469 if (HasChain)
5470 ValueVTs.push_back(MVT::Other);
5471
5472 return DAG.getVTList(ValueVTs);
5473}
5474
5475/// Get an INTRINSIC node for a target intrinsic which does not touch memory.
5476SDValue SelectionDAGBuilder::getTargetNonMemIntrinsicNode(
5477 const Type &IntrinsicVT, bool HasChain, ArrayRef<SDValue> Ops,
5478 const SDVTList &VTs) {
5479 if (!HasChain)
5480 return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, getCurSDLoc(), VTs, Ops);
5481 if (!IntrinsicVT.isVoidTy())
5482 return DAG.getNode(ISD::INTRINSIC_W_CHAIN, getCurSDLoc(), VTs, Ops);
5483 return DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops);
5484}
5485
5486/// Set root, convert return type if necessary and check alignment.
5487SDValue SelectionDAGBuilder::handleTargetIntrinsicRet(const CallBase &I,
5488 bool HasChain,
5489 bool OnlyLoad,
5490 SDValue Result) {
5491 if (HasChain) {
5492 SDValue Chain = Result.getValue(Result.getNode()->getNumValues() - 1);
5493 if (OnlyLoad)
5494 PendingLoads.push_back(Chain);
5495 else
5496 DAG.setRoot(Chain);
5497 }
5498
5499 if (I.getType()->isVoidTy())
5500 return Result;
5501
5502 if (MaybeAlign Alignment = I.getRetAlign(); InsertAssertAlign && Alignment) {
5503 // Insert `assertalign` node if there's an alignment.
5504 Result = DAG.getAssertAlign(getCurSDLoc(), Result, Alignment.valueOrOne());
5505 } else if (!isa<VectorType>(I.getType())) {
5506 Result = lowerRangeToAssertZExt(DAG, I, Result);
5507 }
5508
5509 return Result;
5510}
5511
5512/// visitTargetIntrinsic - Lower a call of a target intrinsic to an INTRINSIC
5513/// node.
5514void SelectionDAGBuilder::visitTargetIntrinsic(const CallInst &I,
5515 unsigned Intrinsic) {
5516 auto [HasChain, OnlyLoad] = getTargetIntrinsicCallProperties(I);
5517
5518 // Infos is set by getTgtMemIntrinsic.
5520 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5521 TLI.getTgtMemIntrinsic(Infos, I, DAG.getMachineFunction(), Intrinsic);
5522 // Use the first (primary) info determines the node opcode.
5523 TargetLowering::IntrinsicInfo *Info = !Infos.empty() ? &Infos[0] : nullptr;
5524
5526 getTargetIntrinsicOperands(I, HasChain, OnlyLoad, Info);
5527 SDVTList VTs = getTargetIntrinsicVTList(I, HasChain);
5528
5529 // Propagate fast-math-flags from IR to node(s).
5530 SDNodeFlags Flags;
5531 if (auto *FPMO = dyn_cast<FPMathOperator>(&I))
5532 Flags.copyFMF(*FPMO);
5533 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
5534
5535 // Create the node.
5537
5538 // In some cases, custom collection of operands from CallInst I may be needed.
5540 if (!Infos.empty()) {
5541 // This is target intrinsic that touches memory
5542 // Create MachineMemOperands for each memory access described by the target.
5543 MachineFunction &MF = DAG.getMachineFunction();
5545 for (const auto &Info : Infos) {
5546 // TODO: We currently just fallback to address space 0 if
5547 // getTgtMemIntrinsic didn't yield anything useful.
5548 MachinePointerInfo MPI;
5549 if (Info.ptrVal)
5550 MPI = MachinePointerInfo(Info.ptrVal, Info.offset);
5551 else if (Info.fallbackAddressSpace)
5552 MPI = MachinePointerInfo(*Info.fallbackAddressSpace);
5553 EVT MemVT = Info.memVT;
5554 LocationSize Size = LocationSize::precise(Info.size);
5555 if (Size.hasValue() && !Size.getValue())
5557 Align Alignment = Info.align.value_or(DAG.getEVTAlign(MemVT));
5558 MachineMemOperand *MMO = MF.getMachineMemOperand(
5559 MPI, Info.flags, Size, Alignment, I.getAAMetadata(),
5560 /*Ranges=*/nullptr, Info.ssid, Info.order, Info.failureOrder);
5561 MMOs.push_back(MMO);
5562 }
5563
5564 Result = DAG.getMemIntrinsicNode(Info->opc, getCurSDLoc(), VTs, Ops,
5565 Info->memVT, MMOs);
5566 } else {
5567 Result = getTargetNonMemIntrinsicNode(*I.getType(), HasChain, Ops, VTs);
5568 }
5569
5570 Result = handleTargetIntrinsicRet(I, HasChain, OnlyLoad, Result);
5571
5572 setValue(&I, Result);
5573}
5574
5575/// GetSignificand - Get the significand and build it into a floating-point
5576/// number with exponent of 1:
5577///
5578/// Op = (Op & 0x007fffff) | 0x3f800000;
5579///
5580/// where Op is the hexadecimal representation of floating point value.
5582 SDValue t1 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
5583 DAG.getConstant(0x007fffff, dl, MVT::i32));
5584 SDValue t2 = DAG.getNode(ISD::OR, dl, MVT::i32, t1,
5585 DAG.getConstant(0x3f800000, dl, MVT::i32));
5586 return DAG.getNode(ISD::BITCAST, dl, MVT::f32, t2);
5587}
5588
5589/// GetExponent - Get the exponent:
5590///
5591/// (float)(int)(((Op & 0x7f800000) >> 23) - 127);
5592///
5593/// where Op is the hexadecimal representation of floating point value.
5595 const TargetLowering &TLI, const SDLoc &dl) {
5596 SDValue t0 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
5597 DAG.getConstant(0x7f800000, dl, MVT::i32));
5598 SDValue t1 = DAG.getNode(ISD::SRL, dl, MVT::i32, t0,
5599 DAG.getShiftAmountConstant(23, MVT::i32, dl));
5600 SDValue t2 = DAG.getNode(ISD::SUB, dl, MVT::i32, t1,
5601 DAG.getConstant(127, dl, MVT::i32));
5602 return DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, t2);
5603}
5604
5605/// getF32Constant - Get 32-bit floating point constant.
5606static SDValue getF32Constant(SelectionDAG &DAG, unsigned Flt,
5607 const SDLoc &dl) {
5608 return DAG.getConstantFP(APFloat(APFloat::IEEEsingle(), APInt(32, Flt)), dl,
5609 MVT::f32);
5610}
5611
5613 SelectionDAG &DAG) {
5614 // TODO: What fast-math-flags should be set on the floating-point nodes?
5615
5616 // IntegerPartOfX = ((int32_t)(t0);
5617 SDValue IntegerPartOfX = DAG.getNode(ISD::FP_TO_SINT, dl, MVT::i32, t0);
5618
5619 // FractionalPartOfX = t0 - (float)IntegerPartOfX;
5620 SDValue t1 = DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, IntegerPartOfX);
5621 SDValue X = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0, t1);
5622
5623 // IntegerPartOfX <<= 23;
5624 IntegerPartOfX = DAG.getNode(ISD::SHL, dl, MVT::i32, IntegerPartOfX,
5625 DAG.getShiftAmountConstant(23, MVT::i32, dl));
5626
5627 SDValue TwoToFractionalPartOfX;
5628 if (LimitFloatPrecision <= 6) {
5629 // For floating-point precision of 6:
5630 //
5631 // TwoToFractionalPartOfX =
5632 // 0.997535578f +
5633 // (0.735607626f + 0.252464424f * x) * x;
5634 //
5635 // error 0.0144103317, which is 6 bits
5636 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5637 getF32Constant(DAG, 0x3e814304, dl));
5638 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5639 getF32Constant(DAG, 0x3f3c50c8, dl));
5640 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5641 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5642 getF32Constant(DAG, 0x3f7f5e7e, dl));
5643 } else if (LimitFloatPrecision <= 12) {
5644 // For floating-point precision of 12:
5645 //
5646 // TwoToFractionalPartOfX =
5647 // 0.999892986f +
5648 // (0.696457318f +
5649 // (0.224338339f + 0.792043434e-1f * x) * x) * x;
5650 //
5651 // error 0.000107046256, which is 13 to 14 bits
5652 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5653 getF32Constant(DAG, 0x3da235e3, dl));
5654 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5655 getF32Constant(DAG, 0x3e65b8f3, dl));
5656 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5657 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5658 getF32Constant(DAG, 0x3f324b07, dl));
5659 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5660 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5661 getF32Constant(DAG, 0x3f7ff8fd, dl));
5662 } else { // LimitFloatPrecision <= 18
5663 // For floating-point precision of 18:
5664 //
5665 // TwoToFractionalPartOfX =
5666 // 0.999999982f +
5667 // (0.693148872f +
5668 // (0.240227044f +
5669 // (0.554906021e-1f +
5670 // (0.961591928e-2f +
5671 // (0.136028312e-2f + 0.157059148e-3f *x)*x)*x)*x)*x)*x;
5672 // error 2.47208000*10^(-7), which is better than 18 bits
5673 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5674 getF32Constant(DAG, 0x3924b03e, dl));
5675 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5676 getF32Constant(DAG, 0x3ab24b87, 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, 0x3c1d8c17, dl));
5680 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5681 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5682 getF32Constant(DAG, 0x3d634a1d, 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, 0x3e75fe14, dl));
5686 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5687 SDValue t11 = DAG.getNode(ISD::FADD, dl, MVT::f32, t10,
5688 getF32Constant(DAG, 0x3f317234, dl));
5689 SDValue t12 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t11, X);
5690 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t12,
5691 getF32Constant(DAG, 0x3f800000, dl));
5692 }
5693
5694 // Add the exponent into the result in integer domain.
5695 SDValue t13 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, TwoToFractionalPartOfX);
5696 return DAG.getNode(ISD::BITCAST, dl, MVT::f32,
5697 DAG.getNode(ISD::ADD, dl, MVT::i32, t13, IntegerPartOfX));
5698}
5699
5700/// expandExp - Lower an exp intrinsic. Handles the special sequences for
5701/// limited-precision mode.
5703 const TargetLowering &TLI, SDNodeFlags Flags) {
5704 if (Op.getValueType() == MVT::f32 &&
5706
5707 // Put the exponent in the right bit position for later addition to the
5708 // final result:
5709 //
5710 // t0 = Op * log2(e)
5711
5712 // TODO: What fast-math-flags should be set here?
5713 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, Op,
5714 DAG.getConstantFP(numbers::log2ef, dl, MVT::f32));
5715 return getLimitedPrecisionExp2(t0, dl, DAG);
5716 }
5717
5718 // No special expansion.
5719 return DAG.getNode(ISD::FEXP, dl, Op.getValueType(), Op, Flags);
5720}
5721
5722/// expandLog - Lower a log intrinsic. Handles the special sequences for
5723/// limited-precision mode.
5725 const TargetLowering &TLI, SDNodeFlags Flags) {
5726 // TODO: What fast-math-flags should be set on the floating-point nodes?
5727
5728 if (Op.getValueType() == MVT::f32 &&
5730 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5731
5732 // Scale the exponent by log(2).
5733 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5734 SDValue LogOfExponent =
5735 DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5736 DAG.getConstantFP(numbers::ln2f, dl, MVT::f32));
5737
5738 // Get the significand and build it into a floating-point number with
5739 // exponent of 1.
5740 SDValue X = GetSignificand(DAG, Op1, dl);
5741
5742 SDValue LogOfMantissa;
5743 if (LimitFloatPrecision <= 6) {
5744 // For floating-point precision of 6:
5745 //
5746 // LogofMantissa =
5747 // -1.1609546f +
5748 // (1.4034025f - 0.23903021f * x) * x;
5749 //
5750 // error 0.0034276066, which is better than 8 bits
5751 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5752 getF32Constant(DAG, 0xbe74c456, dl));
5753 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5754 getF32Constant(DAG, 0x3fb3a2b1, dl));
5755 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5756 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5757 getF32Constant(DAG, 0x3f949a29, dl));
5758 } else if (LimitFloatPrecision <= 12) {
5759 // For floating-point precision of 12:
5760 //
5761 // LogOfMantissa =
5762 // -1.7417939f +
5763 // (2.8212026f +
5764 // (-1.4699568f +
5765 // (0.44717955f - 0.56570851e-1f * x) * x) * x) * x;
5766 //
5767 // error 0.000061011436, which is 14 bits
5768 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5769 getF32Constant(DAG, 0xbd67b6d6, dl));
5770 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5771 getF32Constant(DAG, 0x3ee4f4b8, dl));
5772 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5773 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5774 getF32Constant(DAG, 0x3fbc278b, dl));
5775 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5776 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5777 getF32Constant(DAG, 0x40348e95, dl));
5778 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5779 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5780 getF32Constant(DAG, 0x3fdef31a, dl));
5781 } else { // LimitFloatPrecision <= 18
5782 // For floating-point precision of 18:
5783 //
5784 // LogOfMantissa =
5785 // -2.1072184f +
5786 // (4.2372794f +
5787 // (-3.7029485f +
5788 // (2.2781945f +
5789 // (-0.87823314f +
5790 // (0.19073739f - 0.17809712e-1f * x) * x) * x) * x) * x)*x;
5791 //
5792 // error 0.0000023660568, which is better than 18 bits
5793 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5794 getF32Constant(DAG, 0xbc91e5ac, dl));
5795 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5796 getF32Constant(DAG, 0x3e4350aa, dl));
5797 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5798 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5799 getF32Constant(DAG, 0x3f60d3e3, dl));
5800 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5801 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5802 getF32Constant(DAG, 0x4011cdf0, dl));
5803 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5804 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5805 getF32Constant(DAG, 0x406cfd1c, dl));
5806 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5807 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5808 getF32Constant(DAG, 0x408797cb, dl));
5809 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5810 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t10,
5811 getF32Constant(DAG, 0x4006dcab, dl));
5812 }
5813
5814 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, LogOfMantissa);
5815 }
5816
5817 // No special expansion.
5818 return DAG.getNode(ISD::FLOG, dl, Op.getValueType(), Op, Flags);
5819}
5820
5821/// expandLog2 - Lower a log2 intrinsic. Handles the special sequences for
5822/// limited-precision mode.
5824 const TargetLowering &TLI, SDNodeFlags Flags) {
5825 // TODO: What fast-math-flags should be set on the floating-point nodes?
5826
5827 if (Op.getValueType() == MVT::f32 &&
5829 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5830
5831 // Get the exponent.
5832 SDValue LogOfExponent = GetExponent(DAG, Op1, TLI, dl);
5833
5834 // Get the significand and build it into a floating-point number with
5835 // exponent of 1.
5836 SDValue X = GetSignificand(DAG, Op1, dl);
5837
5838 // Different possible minimax approximations of significand in
5839 // floating-point for various degrees of accuracy over [1,2].
5840 SDValue Log2ofMantissa;
5841 if (LimitFloatPrecision <= 6) {
5842 // For floating-point precision of 6:
5843 //
5844 // Log2ofMantissa = -1.6749035f + (2.0246817f - .34484768f * x) * x;
5845 //
5846 // error 0.0049451742, which is more than 7 bits
5847 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5848 getF32Constant(DAG, 0xbeb08fe0, dl));
5849 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5850 getF32Constant(DAG, 0x40019463, dl));
5851 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5852 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5853 getF32Constant(DAG, 0x3fd6633d, dl));
5854 } else if (LimitFloatPrecision <= 12) {
5855 // For floating-point precision of 12:
5856 //
5857 // Log2ofMantissa =
5858 // -2.51285454f +
5859 // (4.07009056f +
5860 // (-2.12067489f +
5861 // (.645142248f - 0.816157886e-1f * x) * x) * x) * x;
5862 //
5863 // error 0.0000876136000, which is better than 13 bits
5864 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5865 getF32Constant(DAG, 0xbda7262e, dl));
5866 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5867 getF32Constant(DAG, 0x3f25280b, dl));
5868 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5869 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5870 getF32Constant(DAG, 0x4007b923, dl));
5871 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5872 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5873 getF32Constant(DAG, 0x40823e2f, dl));
5874 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5875 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5876 getF32Constant(DAG, 0x4020d29c, dl));
5877 } else { // LimitFloatPrecision <= 18
5878 // For floating-point precision of 18:
5879 //
5880 // Log2ofMantissa =
5881 // -3.0400495f +
5882 // (6.1129976f +
5883 // (-5.3420409f +
5884 // (3.2865683f +
5885 // (-1.2669343f +
5886 // (0.27515199f -
5887 // 0.25691327e-1f * x) * x) * x) * x) * x) * x;
5888 //
5889 // error 0.0000018516, which is better than 18 bits
5890 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5891 getF32Constant(DAG, 0xbcd2769e, dl));
5892 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5893 getF32Constant(DAG, 0x3e8ce0b9, dl));
5894 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5895 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5896 getF32Constant(DAG, 0x3fa22ae7, dl));
5897 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5898 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5899 getF32Constant(DAG, 0x40525723, dl));
5900 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5901 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5902 getF32Constant(DAG, 0x40aaf200, dl));
5903 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5904 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5905 getF32Constant(DAG, 0x40c39dad, dl));
5906 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5907 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t10,
5908 getF32Constant(DAG, 0x4042902c, dl));
5909 }
5910
5911 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, Log2ofMantissa);
5912 }
5913
5914 // No special expansion.
5915 return DAG.getNode(ISD::FLOG2, dl, Op.getValueType(), Op, Flags);
5916}
5917
5918/// expandLog10 - Lower a log10 intrinsic. Handles the special sequences for
5919/// limited-precision mode.
5921 const TargetLowering &TLI, SDNodeFlags Flags) {
5922 // TODO: What fast-math-flags should be set on the floating-point nodes?
5923
5924 if (Op.getValueType() == MVT::f32 &&
5926 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5927
5928 // Scale the exponent by log10(2) [0.30102999f].
5929 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5930 SDValue LogOfExponent = DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5931 getF32Constant(DAG, 0x3e9a209a, dl));
5932
5933 // Get the significand and build it into a floating-point number with
5934 // exponent of 1.
5935 SDValue X = GetSignificand(DAG, Op1, dl);
5936
5937 SDValue Log10ofMantissa;
5938 if (LimitFloatPrecision <= 6) {
5939 // For floating-point precision of 6:
5940 //
5941 // Log10ofMantissa =
5942 // -0.50419619f +
5943 // (0.60948995f - 0.10380950f * x) * x;
5944 //
5945 // error 0.0014886165, which is 6 bits
5946 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5947 getF32Constant(DAG, 0xbdd49a13, dl));
5948 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5949 getF32Constant(DAG, 0x3f1c0789, dl));
5950 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5951 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5952 getF32Constant(DAG, 0x3f011300, dl));
5953 } else if (LimitFloatPrecision <= 12) {
5954 // For floating-point precision of 12:
5955 //
5956 // Log10ofMantissa =
5957 // -0.64831180f +
5958 // (0.91751397f +
5959 // (-0.31664806f + 0.47637168e-1f * x) * x) * x;
5960 //
5961 // error 0.00019228036, which is better than 12 bits
5962 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5963 getF32Constant(DAG, 0x3d431f31, dl));
5964 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
5965 getF32Constant(DAG, 0x3ea21fb2, dl));
5966 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5967 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5968 getF32Constant(DAG, 0x3f6ae232, dl));
5969 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5970 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
5971 getF32Constant(DAG, 0x3f25f7c3, dl));
5972 } else { // LimitFloatPrecision <= 18
5973 // For floating-point precision of 18:
5974 //
5975 // Log10ofMantissa =
5976 // -0.84299375f +
5977 // (1.5327582f +
5978 // (-1.0688956f +
5979 // (0.49102474f +
5980 // (-0.12539807f + 0.13508273e-1f * x) * x) * x) * x) * x;
5981 //
5982 // error 0.0000037995730, which is better than 18 bits
5983 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5984 getF32Constant(DAG, 0x3c5d51ce, dl));
5985 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
5986 getF32Constant(DAG, 0x3e00685a, dl));
5987 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5988 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5989 getF32Constant(DAG, 0x3efb6798, dl));
5990 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5991 SDValue t5 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
5992 getF32Constant(DAG, 0x3f88d192, dl));
5993 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5994 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5995 getF32Constant(DAG, 0x3fc4316c, dl));
5996 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5997 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t8,
5998 getF32Constant(DAG, 0x3f57ce70, dl));
5999 }
6000
6001 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, Log10ofMantissa);
6002 }
6003
6004 // No special expansion.
6005 return DAG.getNode(ISD::FLOG10, dl, Op.getValueType(), Op, Flags);
6006}
6007
6008/// expandExp2 - Lower an exp2 intrinsic. Handles the special sequences for
6009/// limited-precision mode.
6011 const TargetLowering &TLI, SDNodeFlags Flags) {
6012 if (Op.getValueType() == MVT::f32 &&
6014 return getLimitedPrecisionExp2(Op, dl, DAG);
6015
6016 // No special expansion.
6017 return DAG.getNode(ISD::FEXP2, dl, Op.getValueType(), Op, Flags);
6018}
6019
6020/// visitPow - Lower a pow intrinsic. Handles the special sequences for
6021/// limited-precision mode with x == 10.0f.
6023 SelectionDAG &DAG, const TargetLowering &TLI,
6024 SDNodeFlags Flags) {
6025 bool IsExp10 = false;
6026 if (LHS.getValueType() == MVT::f32 && RHS.getValueType() == MVT::f32 &&
6029 APFloat Ten(10.0f);
6030 IsExp10 = LHSC->isExactlyValue(Ten);
6031 }
6032 }
6033
6034 // TODO: What fast-math-flags should be set on the FMUL node?
6035 if (IsExp10) {
6036 // Put the exponent in the right bit position for later addition to the
6037 // final result:
6038 //
6039 // #define LOG2OF10 3.3219281f
6040 // t0 = Op * LOG2OF10;
6041 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, RHS,
6042 getF32Constant(DAG, 0x40549a78, dl));
6043 return getLimitedPrecisionExp2(t0, dl, DAG);
6044 }
6045
6046 // No special expansion.
6047 return DAG.getNode(ISD::FPOW, dl, LHS.getValueType(), LHS, RHS, Flags);
6048}
6049
6050/// ExpandPowI - Expand a llvm.powi intrinsic.
6052 SelectionDAG &DAG) {
6053 // If RHS is a constant, we can expand this out to a multiplication tree if
6054 // it's beneficial on the target, otherwise we end up lowering to a call to
6055 // __powidf2 (for example).
6057 unsigned Val = RHSC->getSExtValue();
6058
6059 // powi(x, 0) -> 1.0
6060 if (Val == 0)
6061 return DAG.getConstantFP(1.0, DL, LHS.getValueType());
6062
6064 Val, DAG.shouldOptForSize())) {
6065 // Get the exponent as a positive value.
6066 if ((int)Val < 0)
6067 Val = -Val;
6068 // We use the simple binary decomposition method to generate the multiply
6069 // sequence. There are more optimal ways to do this (for example,
6070 // powi(x,15) generates one more multiply than it should), but this has
6071 // the benefit of being both really simple and much better than a libcall.
6072 SDValue Res; // Logically starts equal to 1.0
6073 SDValue CurSquare = LHS;
6074 // TODO: Intrinsics should have fast-math-flags that propagate to these
6075 // nodes.
6076 while (Val) {
6077 if (Val & 1) {
6078 if (Res.getNode())
6079 Res =
6080 DAG.getNode(ISD::FMUL, DL, Res.getValueType(), Res, CurSquare);
6081 else
6082 Res = CurSquare; // 1.0*CurSquare.
6083 }
6084
6085 CurSquare = DAG.getNode(ISD::FMUL, DL, CurSquare.getValueType(),
6086 CurSquare, CurSquare);
6087 Val >>= 1;
6088 }
6089
6090 // If the original was negative, invert the result, producing 1/(x*x*x).
6091 if (RHSC->getSExtValue() < 0)
6092 Res = DAG.getNode(ISD::FDIV, DL, LHS.getValueType(),
6093 DAG.getConstantFP(1.0, DL, LHS.getValueType()), Res);
6094 return Res;
6095 }
6096 }
6097
6098 // Otherwise, expand to a libcall.
6099 return DAG.getNode(ISD::FPOWI, DL, LHS.getValueType(), LHS, RHS);
6100}
6101
6102static SDValue expandDivFix(unsigned Opcode, const SDLoc &DL,
6103 SDValue LHS, SDValue RHS, SDValue Scale,
6104 SelectionDAG &DAG, const TargetLowering &TLI) {
6105 EVT VT = LHS.getValueType();
6106 bool Signed = Opcode == ISD::SDIVFIX || Opcode == ISD::SDIVFIXSAT;
6107 bool Saturating = Opcode == ISD::SDIVFIXSAT || Opcode == ISD::UDIVFIXSAT;
6108 LLVMContext &Ctx = *DAG.getContext();
6109
6110 // If the type is legal but the operation isn't, this node might survive all
6111 // the way to operation legalization. If we end up there and we do not have
6112 // the ability to widen the type (if VT*2 is not legal), we cannot expand the
6113 // node.
6114
6115 // Coax the legalizer into expanding the node during type legalization instead
6116 // by bumping the size by one bit. This will force it to Promote, enabling the
6117 // early expansion and avoiding the need to expand later.
6118
6119 // We don't have to do this if Scale is 0; that can always be expanded, unless
6120 // it's a saturating signed operation. Those can experience true integer
6121 // division overflow, a case which we must avoid.
6122
6123 // FIXME: We wouldn't have to do this (or any of the early
6124 // expansion/promotion) if it was possible to expand a libcall of an
6125 // illegal type during operation legalization. But it's not, so things
6126 // get a bit hacky.
6127 unsigned ScaleInt = Scale->getAsZExtVal();
6128 if ((ScaleInt > 0 || (Saturating && Signed)) &&
6129 (TLI.isTypeLegal(VT) ||
6130 (VT.isVector() && TLI.isTypeLegal(VT.getVectorElementType())))) {
6132 Opcode, VT, ScaleInt);
6133 if (Action != TargetLowering::Legal && Action != TargetLowering::Custom) {
6134 EVT PromVT;
6135 if (VT.isScalarInteger())
6136 PromVT = EVT::getIntegerVT(Ctx, VT.getSizeInBits() + 1);
6137 else if (VT.isVector()) {
6138 PromVT = VT.getVectorElementType();
6139 PromVT = EVT::getIntegerVT(Ctx, PromVT.getSizeInBits() + 1);
6140 PromVT = EVT::getVectorVT(Ctx, PromVT, VT.getVectorElementCount());
6141 } else
6142 llvm_unreachable("Wrong VT for DIVFIX?");
6143 LHS = DAG.getExtOrTrunc(Signed, LHS, DL, PromVT);
6144 RHS = DAG.getExtOrTrunc(Signed, RHS, DL, PromVT);
6145 EVT ShiftTy = TLI.getShiftAmountTy(PromVT, DAG.getDataLayout());
6146 // For saturating operations, we need to shift up the LHS to get the
6147 // proper saturation width, and then shift down again afterwards.
6148 if (Saturating)
6149 LHS = DAG.getNode(ISD::SHL, DL, PromVT, LHS,
6150 DAG.getConstant(1, DL, ShiftTy));
6151 SDValue Res = DAG.getNode(Opcode, DL, PromVT, LHS, RHS, Scale);
6152 if (Saturating)
6153 Res = DAG.getNode(Signed ? ISD::SRA : ISD::SRL, DL, PromVT, Res,
6154 DAG.getConstant(1, DL, ShiftTy));
6155 return DAG.getZExtOrTrunc(Res, DL, VT);
6156 }
6157 }
6158
6159 return DAG.getNode(Opcode, DL, VT, LHS, RHS, Scale);
6160}
6161
6162// getUnderlyingArgRegs - Find underlying registers used for a truncated,
6163// bitcasted, or split argument. Returns a list of <Register, size in bits>
6164static void
6165getUnderlyingArgRegs(SmallVectorImpl<std::pair<Register, TypeSize>> &Regs,
6166 const SDValue &N) {
6167 switch (N.getOpcode()) {
6168 case ISD::CopyFromReg: {
6169 SDValue Op = N.getOperand(1);
6170 Regs.emplace_back(cast<RegisterSDNode>(Op)->getReg(),
6171 Op.getValueType().getSizeInBits());
6172 return;
6173 }
6174 case ISD::BITCAST:
6175 case ISD::AssertZext:
6176 case ISD::AssertSext:
6177 case ISD::TRUNCATE:
6178 getUnderlyingArgRegs(Regs, N.getOperand(0));
6179 return;
6180 case ISD::BUILD_PAIR:
6181 case ISD::BUILD_VECTOR:
6183 for (SDValue Op : N->op_values())
6184 getUnderlyingArgRegs(Regs, Op);
6185 return;
6186 default:
6187 return;
6188 }
6189}
6190
6191/// If the DbgValueInst is a dbg_value of a function argument, create the
6192/// corresponding DBG_VALUE machine instruction for it now. At the end of
6193/// instruction selection, they will be inserted to the entry BB.
6194/// We don't currently support this for variadic dbg_values, as they shouldn't
6195/// appear for function arguments or in the prologue.
6196bool SelectionDAGBuilder::EmitFuncArgumentDbgValue(
6197 const Value *V, DILocalVariable *Variable, DIExpression *Expr,
6198 DILocation *DL, FuncArgumentDbgValueKind Kind, const SDValue &N) {
6199 const Argument *Arg = dyn_cast<Argument>(V);
6200 if (!Arg)
6201 return false;
6202
6203 MachineFunction &MF = DAG.getMachineFunction();
6204 const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo();
6205
6206 // Helper to create DBG_INSTR_REFs or DBG_VALUEs, depending on what kind
6207 // we've been asked to pursue.
6208 auto MakeVRegDbgValue = [&](Register Reg, DIExpression *FragExpr,
6209 bool Indirect) {
6210 if (Reg.isVirtual() && MF.useDebugInstrRef()) {
6211 // For VRegs, in instruction referencing mode, create a DBG_INSTR_REF
6212 // pointing at the VReg, which will be patched up later.
6213 auto &Inst = TII->get(TargetOpcode::DBG_INSTR_REF);
6215 /* Reg */ Reg, /* isDef */ false, /* isImp */ false,
6216 /* isKill */ false, /* isDead */ false,
6217 /* isUndef */ false, /* isEarlyClobber */ false,
6218 /* SubReg */ 0, /* isDebug */ true)});
6219
6220 auto *NewDIExpr = FragExpr;
6221 // We don't have an "Indirect" field in DBG_INSTR_REF, fold that into
6222 // the DIExpression.
6223 if (Indirect)
6224 NewDIExpr = DIExpression::prepend(FragExpr, DIExpression::DerefBefore);
6226 NewDIExpr = DIExpression::prependOpcodes(NewDIExpr, Ops);
6227 return BuildMI(MF, DL, Inst, false, MOs, Variable, NewDIExpr);
6228 } else {
6229 // Create a completely standard DBG_VALUE.
6230 auto &Inst = TII->get(TargetOpcode::DBG_VALUE);
6231 return BuildMI(MF, DL, Inst, Indirect, Reg, Variable, FragExpr);
6232 }
6233 };
6234
6235 if (Kind == FuncArgumentDbgValueKind::Value) {
6236 // ArgDbgValues are hoisted to the beginning of the entry block. So we
6237 // should only emit as ArgDbgValue if the dbg.value intrinsic is found in
6238 // the entry block.
6239 bool IsInEntryBlock = FuncInfo.MBB == &FuncInfo.MF->front();
6240 if (!IsInEntryBlock)
6241 return false;
6242
6243 // ArgDbgValues are hoisted to the beginning of the entry block. So we
6244 // should only emit as ArgDbgValue if the dbg.value intrinsic describes a
6245 // variable that also is a param.
6246 //
6247 // Although, if we are at the top of the entry block already, we can still
6248 // emit using ArgDbgValue. This might catch some situations when the
6249 // dbg.value refers to an argument that isn't used in the entry block, so
6250 // any CopyToReg node would be optimized out and the only way to express
6251 // this DBG_VALUE is by using the physical reg (or FI) as done in this
6252 // method. ArgDbgValues are hoisted to the beginning of the entry block. So
6253 // we should only emit as ArgDbgValue if the Variable is an argument to the
6254 // current function, and the dbg.value intrinsic is found in the entry
6255 // block.
6256 bool VariableIsFunctionInputArg = Variable->isParameter() &&
6257 !DL->getInlinedAt();
6258 bool IsInPrologue = SDNodeOrder == LowestSDNodeOrder;
6259 if (!IsInPrologue && !VariableIsFunctionInputArg)
6260 return false;
6261
6262 // Here we assume that a function argument on IR level only can be used to
6263 // describe one input parameter on source level. If we for example have
6264 // source code like this
6265 //
6266 // struct A { long x, y; };
6267 // void foo(struct A a, long b) {
6268 // ...
6269 // b = a.x;
6270 // ...
6271 // }
6272 //
6273 // and IR like this
6274 //
6275 // define void @foo(i32 %a1, i32 %a2, i32 %b) {
6276 // entry:
6277 // call void @llvm.dbg.value(metadata i32 %a1, "a", DW_OP_LLVM_fragment
6278 // call void @llvm.dbg.value(metadata i32 %a2, "a", DW_OP_LLVM_fragment
6279 // call void @llvm.dbg.value(metadata i32 %b, "b",
6280 // ...
6281 // call void @llvm.dbg.value(metadata i32 %a1, "b"
6282 // ...
6283 //
6284 // then the last dbg.value is describing a parameter "b" using a value that
6285 // is an argument. But since we already has used %a1 to describe a parameter
6286 // we should not handle that last dbg.value here (that would result in an
6287 // incorrect hoisting of the DBG_VALUE to the function entry).
6288 // Notice that we allow one dbg.value per IR level argument, to accommodate
6289 // for the situation with fragments above.
6290 // If there is no node for the value being handled, we return true to skip
6291 // the normal generation of debug info, as it would kill existing debug
6292 // info for the parameter in case of duplicates.
6293 if (VariableIsFunctionInputArg) {
6294 unsigned ArgNo = Arg->getArgNo();
6295 if (ArgNo >= FuncInfo.DescribedArgs.size())
6296 FuncInfo.DescribedArgs.resize(ArgNo + 1, false);
6297 else if (!IsInPrologue && FuncInfo.DescribedArgs.test(ArgNo))
6298 return !NodeMap[V].getNode();
6299 FuncInfo.DescribedArgs.set(ArgNo);
6300 }
6301 }
6302
6303 bool IsIndirect = false;
6304 std::optional<MachineOperand> Op;
6305 // Some arguments' frame index is recorded during argument lowering.
6306 int FI = FuncInfo.getArgumentFrameIndex(Arg);
6307 if (FI != std::numeric_limits<int>::max())
6309
6311 if (!Op && N.getNode()) {
6312 getUnderlyingArgRegs(ArgRegsAndSizes, N);
6313 Register Reg;
6314 if (ArgRegsAndSizes.size() == 1)
6315 Reg = ArgRegsAndSizes.front().first;
6316
6317 if (Reg && Reg.isVirtual()) {
6318 MachineRegisterInfo &RegInfo = MF.getRegInfo();
6319 Register PR = RegInfo.getLiveInPhysReg(Reg);
6320 if (PR)
6321 Reg = PR;
6322 }
6323 if (Reg) {
6325 IsIndirect = Kind != FuncArgumentDbgValueKind::Value;
6326 }
6327 }
6328
6329 if (!Op && N.getNode()) {
6330 // Check if frame index is available.
6331 SDValue LCandidate = peekThroughBitcasts(N);
6332 if (LoadSDNode *LNode = dyn_cast<LoadSDNode>(LCandidate.getNode()))
6333 if (FrameIndexSDNode *FINode =
6334 dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
6335 Op = MachineOperand::CreateFI(FINode->getIndex());
6336 }
6337
6338 if (!Op) {
6339 // Create a DBG_VALUE for each decomposed value in ArgRegs to cover Reg
6340 auto splitMultiRegDbgValue =
6341 [&](ArrayRef<std::pair<Register, TypeSize>> SplitRegs) -> bool {
6342 unsigned Offset = 0;
6343 for (const auto &[Reg, RegSizeInBits] : SplitRegs) {
6344 // FIXME: Scalable sizes are not supported in fragment expressions.
6345 if (RegSizeInBits.isScalable())
6346 return false;
6347
6348 // If the expression is already a fragment, the current register
6349 // offset+size might extend beyond the fragment. In this case, only
6350 // the register bits that are inside the fragment are relevant.
6351 int RegFragmentSizeInBits = RegSizeInBits.getFixedValue();
6352 if (auto ExprFragmentInfo = Expr->getFragmentInfo()) {
6353 uint64_t ExprFragmentSizeInBits = ExprFragmentInfo->SizeInBits;
6354 // The register is entirely outside the expression fragment,
6355 // so is irrelevant for debug info.
6356 if (Offset >= ExprFragmentSizeInBits)
6357 break;
6358 // The register is partially outside the expression fragment, only
6359 // the low bits within the fragment are relevant for debug info.
6360 if (Offset + RegFragmentSizeInBits > ExprFragmentSizeInBits) {
6361 RegFragmentSizeInBits = ExprFragmentSizeInBits - Offset;
6362 }
6363 }
6364
6365 auto FragmentExpr = DIExpression::createFragmentExpression(
6366 Expr, Offset, RegFragmentSizeInBits);
6367 Offset += RegSizeInBits.getFixedValue();
6368 // If a valid fragment expression cannot be created, the variable's
6369 // correct value cannot be determined and so it is set as poison.
6370 if (!FragmentExpr) {
6371 SDDbgValue *SDV = DAG.getConstantDbgValue(
6372 Variable, Expr, PoisonValue::get(V->getType()), DL, SDNodeOrder);
6373 DAG.AddDbgValue(SDV, false);
6374 continue;
6375 }
6376 MachineInstr *NewMI = MakeVRegDbgValue(
6377 Reg, *FragmentExpr, Kind != FuncArgumentDbgValueKind::Value);
6378 FuncInfo.ArgDbgValues.push_back(NewMI);
6379 }
6380
6381 return true;
6382 };
6383
6384 // Check if ValueMap has reg number.
6386 VMI = FuncInfo.ValueMap.find(V);
6387 if (VMI != FuncInfo.ValueMap.end()) {
6388 const auto &TLI = DAG.getTargetLoweringInfo();
6389 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), VMI->second,
6390 V->getType(), std::nullopt);
6391 if (RFV.occupiesMultipleRegs())
6392 return splitMultiRegDbgValue(RFV.getRegsAndSizes());
6393
6394 Op = MachineOperand::CreateReg(VMI->second, false);
6395 IsIndirect = Kind != FuncArgumentDbgValueKind::Value;
6396 } else if (ArgRegsAndSizes.size() > 1) {
6397 // This was split due to the calling convention, and no virtual register
6398 // mapping exists for the value.
6399 return splitMultiRegDbgValue(ArgRegsAndSizes);
6400 }
6401 }
6402
6403 if (!Op)
6404 return false;
6405
6406 assert(Variable->isValidLocationForIntrinsic(DL) &&
6407 "Expected inlined-at fields to agree");
6408 MachineInstr *NewMI = nullptr;
6409
6410 if (Op->isReg())
6411 NewMI = MakeVRegDbgValue(Op->getReg(), Expr, IsIndirect);
6412 else
6413 NewMI = BuildMI(MF, DL, TII->get(TargetOpcode::DBG_VALUE), true, *Op,
6414 Variable, Expr);
6415
6416 // Otherwise, use ArgDbgValues.
6417 FuncInfo.ArgDbgValues.push_back(NewMI);
6418 return true;
6419}
6420
6421/// Return the appropriate SDDbgValue based on N.
6422SDDbgValue *SelectionDAGBuilder::getDbgValue(SDValue N,
6423 DILocalVariable *Variable,
6424 DIExpression *Expr,
6425 const DebugLoc &dl,
6426 unsigned DbgSDNodeOrder) {
6427 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(N.getNode())) {
6428 // Construct a FrameIndexDbgValue for FrameIndexSDNodes so we can describe
6429 // stack slot locations.
6430 //
6431 // Consider "int x = 0; int *px = &x;". There are two kinds of interesting
6432 // debug values here after optimization:
6433 //
6434 // dbg.value(i32* %px, !"int *px", !DIExpression()), and
6435 // dbg.value(i32* %px, !"int x", !DIExpression(DW_OP_deref))
6436 //
6437 // Both describe the direct values of their associated variables.
6438 return DAG.getFrameIndexDbgValue(Variable, Expr, FISDN->getIndex(),
6439 /*IsIndirect*/ false, dl, DbgSDNodeOrder);
6440 }
6441 return DAG.getDbgValue(Variable, Expr, N.getNode(), N.getResNo(),
6442 /*IsIndirect*/ false, dl, DbgSDNodeOrder);
6443}
6444
6445static unsigned FixedPointIntrinsicToOpcode(unsigned Intrinsic) {
6446 switch (Intrinsic) {
6447 case Intrinsic::smul_fix:
6448 return ISD::SMULFIX;
6449 case Intrinsic::umul_fix:
6450 return ISD::UMULFIX;
6451 case Intrinsic::smul_fix_sat:
6452 return ISD::SMULFIXSAT;
6453 case Intrinsic::umul_fix_sat:
6454 return ISD::UMULFIXSAT;
6455 case Intrinsic::sdiv_fix:
6456 return ISD::SDIVFIX;
6457 case Intrinsic::udiv_fix:
6458 return ISD::UDIVFIX;
6459 case Intrinsic::sdiv_fix_sat:
6460 return ISD::SDIVFIXSAT;
6461 case Intrinsic::udiv_fix_sat:
6462 return ISD::UDIVFIXSAT;
6463 default:
6464 llvm_unreachable("Unhandled fixed point intrinsic");
6465 }
6466}
6467
6468/// Given a @llvm.call.preallocated.setup, return the corresponding
6469/// preallocated call.
6470static const CallBase *FindPreallocatedCall(const Value *PreallocatedSetup) {
6471 assert(cast<CallBase>(PreallocatedSetup)
6473 ->getIntrinsicID() == Intrinsic::call_preallocated_setup &&
6474 "expected call_preallocated_setup Value");
6475 for (const auto *U : PreallocatedSetup->users()) {
6476 auto *UseCall = cast<CallBase>(U);
6477 const Function *Fn = UseCall->getCalledFunction();
6478 if (!Fn || Fn->getIntrinsicID() != Intrinsic::call_preallocated_arg) {
6479 return UseCall;
6480 }
6481 }
6482 llvm_unreachable("expected corresponding call to preallocated setup/arg");
6483}
6484
6485/// If DI is a debug value with an EntryValue expression, lower it using the
6486/// corresponding physical register of the associated Argument value
6487/// (guaranteed to exist by the verifier).
6488bool SelectionDAGBuilder::visitEntryValueDbgValue(
6489 ArrayRef<const Value *> Values, DILocalVariable *Variable,
6490 DIExpression *Expr, DebugLoc DbgLoc) {
6491 if (!Expr->isEntryValue() || !hasSingleElement(Values))
6492 return false;
6493
6494 // These properties are guaranteed by the verifier.
6495 const Argument *Arg = cast<Argument>(Values[0]);
6496 assert(Arg->hasAttribute(Attribute::AttrKind::SwiftAsync));
6497
6498 auto ArgIt = FuncInfo.ValueMap.find(Arg);
6499 if (ArgIt == FuncInfo.ValueMap.end()) {
6500 LLVM_DEBUG(
6501 dbgs() << "Dropping dbg.value: expression is entry_value but "
6502 "couldn't find an associated register for the Argument\n");
6503 return true;
6504 }
6505 Register ArgVReg = ArgIt->getSecond();
6506
6507 for (auto [PhysReg, VirtReg] : FuncInfo.RegInfo->liveins())
6508 if (ArgVReg == VirtReg || ArgVReg == PhysReg) {
6509 SDDbgValue *SDV = DAG.getVRegDbgValue(
6510 Variable, Expr, PhysReg, false /*IsIndidrect*/, DbgLoc, SDNodeOrder);
6511 DAG.AddDbgValue(SDV, false /*treat as dbg.declare byval parameter*/);
6512 return true;
6513 }
6514 LLVM_DEBUG(dbgs() << "Dropping dbg.value: expression is entry_value but "
6515 "couldn't find a physical register\n");
6516 return true;
6517}
6518
6519/// Lower the call to the specified intrinsic function.
6520void SelectionDAGBuilder::visitConvergenceControl(const CallInst &I,
6521 unsigned Intrinsic) {
6522 SDLoc sdl = getCurSDLoc();
6523 switch (Intrinsic) {
6524 case Intrinsic::experimental_convergence_anchor:
6525 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_ANCHOR, sdl, MVT::Untyped));
6526 break;
6527 case Intrinsic::experimental_convergence_entry:
6528 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_ENTRY, sdl, MVT::Untyped));
6529 break;
6530 case Intrinsic::experimental_convergence_loop: {
6531 auto Bundle = I.getOperandBundle(LLVMContext::OB_convergencectrl);
6532 auto *Token = Bundle->Inputs[0].get();
6533 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_LOOP, sdl, MVT::Untyped,
6534 getValue(Token)));
6535 break;
6536 }
6537 }
6538}
6539
6540void SelectionDAGBuilder::visitVectorHistogram(const CallInst &I,
6541 unsigned IntrinsicID) {
6542 // For now, we're only lowering an 'add' histogram.
6543 // We can add others later, e.g. saturating adds, min/max.
6544 assert(IntrinsicID == Intrinsic::experimental_vector_histogram_add &&
6545 "Tried to lower unsupported histogram type");
6546 SDLoc sdl = getCurSDLoc();
6547 Value *Ptr = I.getOperand(0);
6548 SDValue Inc = getValue(I.getOperand(1));
6549 SDValue Mask = getValue(I.getOperand(2));
6550
6551 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6552 DataLayout TargetDL = DAG.getDataLayout();
6553 EVT VT = Inc.getValueType();
6554 Align Alignment = DAG.getEVTAlign(VT);
6555
6556 const MDNode *Ranges = getRangeMetadata(I);
6557
6558 SDValue Root = DAG.getRoot();
6559 SDValue Base;
6560 SDValue Index;
6561 SDValue Scale;
6562 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
6563 I.getParent(), VT.getScalarStoreSize());
6564
6565 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
6566
6567 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
6568 MachinePointerInfo(AS),
6570 MemoryLocation::UnknownSize, Alignment, I.getAAMetadata(), Ranges);
6571
6572 if (!UniformBase) {
6573 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
6574 Index = getValue(Ptr);
6575 Scale =
6576 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
6577 }
6578
6579 EVT IdxVT = Index.getValueType();
6580
6581 // Avoid using e.g. i32 as index type when the increment must be performed
6582 // on i64's.
6583 bool MustExtendIndex = VT.getScalarSizeInBits() > IdxVT.getScalarSizeInBits();
6584 EVT EltTy = MustExtendIndex ? VT : IdxVT.getVectorElementType();
6585 if (MustExtendIndex || TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
6586 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
6587 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
6588 }
6589
6590 SDValue ID = DAG.getTargetConstant(IntrinsicID, sdl, MVT::i32);
6591
6592 SDValue Ops[] = {Root, Inc, Mask, Base, Index, Scale, ID};
6593 SDValue Histogram = DAG.getMaskedHistogram(DAG.getVTList(MVT::Other), VT, sdl,
6594 Ops, MMO, ISD::SIGNED_SCALED);
6595
6596 setValue(&I, Histogram);
6597 DAG.setRoot(Histogram);
6598}
6599
6600void SelectionDAGBuilder::visitVectorExtractLastActive(const CallInst &I,
6601 unsigned Intrinsic) {
6602 assert(Intrinsic == Intrinsic::experimental_vector_extract_last_active &&
6603 "Tried lowering invalid vector extract last");
6604 SDLoc sdl = getCurSDLoc();
6605 const DataLayout &Layout = DAG.getDataLayout();
6606 SDValue Data = getValue(I.getOperand(0));
6607 SDValue Mask = getValue(I.getOperand(1));
6608
6609 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6610 EVT ResVT = TLI.getValueType(Layout, I.getType());
6611
6612 EVT ExtVT = TLI.getVectorIdxTy(Layout);
6613 SDValue Idx = DAG.getNode(ISD::VECTOR_FIND_LAST_ACTIVE, sdl, ExtVT, Mask);
6614 SDValue Result = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, sdl, ResVT, Data, Idx);
6615
6616 Value *Default = I.getOperand(2);
6618 SDValue PassThru = getValue(Default);
6619 EVT BoolVT = Mask.getValueType().getScalarType();
6620 SDValue AnyActive = DAG.getNode(ISD::VECREDUCE_OR, sdl, BoolVT, Mask);
6621 Result = DAG.getSelect(sdl, ResVT, AnyActive, Result, PassThru);
6622 }
6623
6624 setValue(&I, Result);
6625}
6626
6627/// Lower the call to the specified intrinsic function.
6628void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
6629 unsigned Intrinsic) {
6630 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6631 SDLoc sdl = getCurSDLoc();
6632 DebugLoc dl = getCurDebugLoc();
6633 SDValue Res;
6634
6635 SDNodeFlags Flags;
6636 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
6637 Flags.copyFMF(*FPOp);
6638
6639 switch (Intrinsic) {
6640 default:
6641 // By default, turn this into a target intrinsic node.
6642 visitTargetIntrinsic(I, Intrinsic);
6643 return;
6644 case Intrinsic::vscale: {
6645 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6646 setValue(&I, DAG.getVScale(sdl, VT, APInt(VT.getSizeInBits(), 1)));
6647 return;
6648 }
6649 case Intrinsic::vastart: visitVAStart(I); return;
6650 case Intrinsic::vaend: visitVAEnd(I); return;
6651 case Intrinsic::vacopy: visitVACopy(I); return;
6652 case Intrinsic::returnaddress:
6653 setValue(&I, DAG.getNode(ISD::RETURNADDR, sdl,
6654 TLI.getValueType(DAG.getDataLayout(), I.getType()),
6655 getValue(I.getArgOperand(0))));
6656 return;
6657 case Intrinsic::addressofreturnaddress:
6658 setValue(&I,
6659 DAG.getNode(ISD::ADDROFRETURNADDR, sdl,
6660 TLI.getValueType(DAG.getDataLayout(), I.getType())));
6661 return;
6662 case Intrinsic::sponentry:
6663 setValue(&I,
6664 DAG.getNode(ISD::SPONENTRY, sdl,
6665 TLI.getValueType(DAG.getDataLayout(), I.getType())));
6666 return;
6667 case Intrinsic::frameaddress:
6668 setValue(&I, DAG.getNode(ISD::FRAMEADDR, sdl,
6669 TLI.getFrameIndexTy(DAG.getDataLayout()),
6670 getValue(I.getArgOperand(0))));
6671 return;
6672 case Intrinsic::read_volatile_register:
6673 case Intrinsic::read_register: {
6674 Value *Reg = I.getArgOperand(0);
6675 SDValue Chain = getRoot();
6677 DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
6678 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6679 Res = DAG.getNode(ISD::READ_REGISTER, sdl,
6680 DAG.getVTList(VT, MVT::Other), Chain, RegName);
6681 setValue(&I, Res);
6682 DAG.setRoot(Res.getValue(1));
6683 return;
6684 }
6685 case Intrinsic::write_register: {
6686 Value *Reg = I.getArgOperand(0);
6687 Value *RegValue = I.getArgOperand(1);
6688 SDValue Chain = getRoot();
6690 DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
6691 DAG.setRoot(DAG.getNode(ISD::WRITE_REGISTER, sdl, MVT::Other, Chain,
6692 RegName, getValue(RegValue)));
6693 return;
6694 }
6695 case Intrinsic::memcpy:
6696 case Intrinsic::memcpy_inline: {
6697 const auto &MCI = cast<MemCpyInst>(I);
6698 SDValue Dst = getValue(I.getArgOperand(0));
6699 SDValue Src = getValue(I.getArgOperand(1));
6700 SDValue Size = getValue(I.getArgOperand(2));
6701 assert((!MCI.isForceInlined() || isa<ConstantSDNode>(Size)) &&
6702 "memcpy_inline needs constant size");
6703 // @llvm.memcpy.inline defines 0 and 1 to both mean no alignment.
6704 Align DstAlign = MCI.getDestAlign().valueOrOne();
6705 Align SrcAlign = MCI.getSourceAlign().valueOrOne();
6706 Align Alignment = std::min(DstAlign, SrcAlign);
6707 bool isVol = MCI.isVolatile();
6708 // FIXME: Support passing different dest/src alignments to the memcpy DAG
6709 // node.
6710 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6711 SDValue MC = DAG.getMemcpy(Root, sdl, Dst, Src, Size, Alignment, isVol,
6712 MCI.isForceInlined(), &I, std::nullopt,
6713 MachinePointerInfo(I.getArgOperand(0)),
6714 MachinePointerInfo(I.getArgOperand(1)),
6715 I.getAAMetadata(), BatchAA);
6716 updateDAGForMaybeTailCall(MC);
6717 return;
6718 }
6719 case Intrinsic::memset:
6720 case Intrinsic::memset_inline: {
6721 const auto &MSII = cast<MemSetInst>(I);
6722 SDValue Dst = getValue(I.getArgOperand(0));
6723 SDValue Value = getValue(I.getArgOperand(1));
6724 SDValue Size = getValue(I.getArgOperand(2));
6725 assert((!MSII.isForceInlined() || isa<ConstantSDNode>(Size)) &&
6726 "memset_inline needs constant size");
6727 // @llvm.memset defines 0 and 1 to both mean no alignment.
6728 Align DstAlign = MSII.getDestAlign().valueOrOne();
6729 bool isVol = MSII.isVolatile();
6730 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6731 SDValue MC = DAG.getMemset(
6732 Root, sdl, Dst, Value, Size, DstAlign, isVol, MSII.isForceInlined(),
6733 &I, MachinePointerInfo(I.getArgOperand(0)), I.getAAMetadata());
6734 updateDAGForMaybeTailCall(MC);
6735 return;
6736 }
6737 case Intrinsic::memmove: {
6738 const auto &MMI = cast<MemMoveInst>(I);
6739 SDValue Op1 = getValue(I.getArgOperand(0));
6740 SDValue Op2 = getValue(I.getArgOperand(1));
6741 SDValue Op3 = getValue(I.getArgOperand(2));
6742 // @llvm.memmove defines 0 and 1 to both mean no alignment.
6743 Align DstAlign = MMI.getDestAlign().valueOrOne();
6744 Align SrcAlign = MMI.getSourceAlign().valueOrOne();
6745 Align Alignment = std::min(DstAlign, SrcAlign);
6746 bool isVol = MMI.isVolatile();
6747 // FIXME: Support passing different dest/src alignments to the memmove DAG
6748 // node.
6749 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6750 SDValue MM = DAG.getMemmove(Root, sdl, Op1, Op2, Op3, Alignment, isVol, &I,
6751 /* OverrideTailCall */ std::nullopt,
6752 MachinePointerInfo(I.getArgOperand(0)),
6753 MachinePointerInfo(I.getArgOperand(1)),
6754 I.getAAMetadata(), BatchAA);
6755 updateDAGForMaybeTailCall(MM);
6756 return;
6757 }
6758 case Intrinsic::memcpy_element_unordered_atomic: {
6759 auto &MI = cast<AnyMemCpyInst>(I);
6760 SDValue Dst = getValue(MI.getRawDest());
6761 SDValue Src = getValue(MI.getRawSource());
6762 SDValue Length = getValue(MI.getLength());
6763
6764 Type *LengthTy = MI.getLength()->getType();
6765 unsigned ElemSz = MI.getElementSizeInBytes();
6766 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6767 SDValue MC =
6768 DAG.getAtomicMemcpy(getRoot(), sdl, Dst, Src, Length, LengthTy, ElemSz,
6769 isTC, MachinePointerInfo(MI.getRawDest()),
6770 MachinePointerInfo(MI.getRawSource()));
6771 updateDAGForMaybeTailCall(MC);
6772 return;
6773 }
6774 case Intrinsic::memmove_element_unordered_atomic: {
6775 auto &MI = cast<AnyMemMoveInst>(I);
6776 SDValue Dst = getValue(MI.getRawDest());
6777 SDValue Src = getValue(MI.getRawSource());
6778 SDValue Length = getValue(MI.getLength());
6779
6780 Type *LengthTy = MI.getLength()->getType();
6781 unsigned ElemSz = MI.getElementSizeInBytes();
6782 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6783 SDValue MC =
6784 DAG.getAtomicMemmove(getRoot(), sdl, Dst, Src, Length, LengthTy, ElemSz,
6785 isTC, MachinePointerInfo(MI.getRawDest()),
6786 MachinePointerInfo(MI.getRawSource()));
6787 updateDAGForMaybeTailCall(MC);
6788 return;
6789 }
6790 case Intrinsic::memset_element_unordered_atomic: {
6791 auto &MI = cast<AnyMemSetInst>(I);
6792 SDValue Dst = getValue(MI.getRawDest());
6793 SDValue Val = getValue(MI.getValue());
6794 SDValue Length = getValue(MI.getLength());
6795
6796 Type *LengthTy = MI.getLength()->getType();
6797 unsigned ElemSz = MI.getElementSizeInBytes();
6798 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6799 SDValue MC =
6800 DAG.getAtomicMemset(getRoot(), sdl, Dst, Val, Length, LengthTy, ElemSz,
6801 isTC, MachinePointerInfo(MI.getRawDest()));
6802 updateDAGForMaybeTailCall(MC);
6803 return;
6804 }
6805 case Intrinsic::call_preallocated_setup: {
6806 const CallBase *PreallocatedCall = FindPreallocatedCall(&I);
6807 SDValue SrcValue = DAG.getSrcValue(PreallocatedCall);
6808 SDValue Res = DAG.getNode(ISD::PREALLOCATED_SETUP, sdl, MVT::Other,
6809 getRoot(), SrcValue);
6810 setValue(&I, Res);
6811 DAG.setRoot(Res);
6812 return;
6813 }
6814 case Intrinsic::call_preallocated_arg: {
6815 const CallBase *PreallocatedCall = FindPreallocatedCall(I.getOperand(0));
6816 SDValue SrcValue = DAG.getSrcValue(PreallocatedCall);
6817 SDValue Ops[3];
6818 Ops[0] = getRoot();
6819 Ops[1] = SrcValue;
6820 Ops[2] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(1)), sdl,
6821 MVT::i32); // arg index
6822 SDValue Res = DAG.getNode(
6824 DAG.getVTList(TLI.getPointerTy(DAG.getDataLayout()), MVT::Other), Ops);
6825 setValue(&I, Res);
6826 DAG.setRoot(Res.getValue(1));
6827 return;
6828 }
6829
6830 case Intrinsic::eh_typeid_for: {
6831 // Find the type id for the given typeinfo.
6832 GlobalValue *GV = ExtractTypeInfo(I.getArgOperand(0));
6833 unsigned TypeID = DAG.getMachineFunction().getTypeIDFor(GV);
6834 Res = DAG.getConstant(TypeID, sdl, MVT::i32);
6835 setValue(&I, Res);
6836 return;
6837 }
6838
6839 case Intrinsic::eh_return_i32:
6840 case Intrinsic::eh_return_i64:
6841 DAG.getMachineFunction().setCallsEHReturn(true);
6842 DAG.setRoot(DAG.getNode(ISD::EH_RETURN, sdl,
6843 MVT::Other,
6845 getValue(I.getArgOperand(0)),
6846 getValue(I.getArgOperand(1))));
6847 return;
6848 case Intrinsic::eh_unwind_init:
6849 DAG.getMachineFunction().setCallsUnwindInit(true);
6850 return;
6851 case Intrinsic::eh_dwarf_cfa:
6852 setValue(&I, DAG.getNode(ISD::EH_DWARF_CFA, sdl,
6853 TLI.getPointerTy(DAG.getDataLayout()),
6854 getValue(I.getArgOperand(0))));
6855 return;
6856 case Intrinsic::eh_sjlj_callsite: {
6857 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(0));
6858 assert(FuncInfo.getCurrentCallSite() == 0 && "Overlapping call sites!");
6859
6860 FuncInfo.setCurrentCallSite(CI->getZExtValue());
6861 return;
6862 }
6863 case Intrinsic::eh_sjlj_functioncontext: {
6864 // Get and store the index of the function context.
6865 MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo();
6866 AllocaInst *FnCtx =
6867 cast<AllocaInst>(I.getArgOperand(0)->stripPointerCasts());
6868 int FI = FuncInfo.StaticAllocaMap[FnCtx];
6870 return;
6871 }
6872 case Intrinsic::eh_sjlj_setjmp: {
6873 SDValue Ops[2];
6874 Ops[0] = getRoot();
6875 Ops[1] = getValue(I.getArgOperand(0));
6876 SDValue Op = DAG.getNode(ISD::EH_SJLJ_SETJMP, sdl,
6877 DAG.getVTList(MVT::i32, MVT::Other), Ops);
6878 setValue(&I, Op.getValue(0));
6879 DAG.setRoot(Op.getValue(1));
6880 return;
6881 }
6882 case Intrinsic::eh_sjlj_longjmp:
6883 DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_LONGJMP, sdl, MVT::Other,
6884 getRoot(), getValue(I.getArgOperand(0))));
6885 return;
6886 case Intrinsic::eh_sjlj_setup_dispatch:
6887 DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_SETUP_DISPATCH, sdl, MVT::Other,
6888 getRoot()));
6889 return;
6890 case Intrinsic::masked_gather:
6891 visitMaskedGather(I);
6892 return;
6893 case Intrinsic::masked_load:
6894 visitMaskedLoad(I);
6895 return;
6896 case Intrinsic::masked_scatter:
6897 visitMaskedScatter(I);
6898 return;
6899 case Intrinsic::masked_store:
6900 visitMaskedStore(I);
6901 return;
6902 case Intrinsic::masked_expandload:
6903 visitMaskedLoad(I, true /* IsExpanding */);
6904 return;
6905 case Intrinsic::masked_compressstore:
6906 visitMaskedStore(I, true /* IsCompressing */);
6907 return;
6908 case Intrinsic::powi:
6909 setValue(&I, ExpandPowI(sdl, getValue(I.getArgOperand(0)),
6910 getValue(I.getArgOperand(1)), DAG));
6911 return;
6912 case Intrinsic::log:
6913 setValue(&I, expandLog(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6914 return;
6915 case Intrinsic::log2:
6916 setValue(&I,
6917 expandLog2(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6918 return;
6919 case Intrinsic::log10:
6920 setValue(&I,
6921 expandLog10(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6922 return;
6923 case Intrinsic::exp:
6924 setValue(&I, expandExp(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6925 return;
6926 case Intrinsic::exp2:
6927 setValue(&I,
6928 expandExp2(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6929 return;
6930 case Intrinsic::pow:
6931 setValue(&I, expandPow(sdl, getValue(I.getArgOperand(0)),
6932 getValue(I.getArgOperand(1)), DAG, TLI, Flags));
6933 return;
6934 case Intrinsic::sqrt:
6935 case Intrinsic::fabs:
6936 case Intrinsic::sin:
6937 case Intrinsic::cos:
6938 case Intrinsic::tan:
6939 case Intrinsic::asin:
6940 case Intrinsic::acos:
6941 case Intrinsic::atan:
6942 case Intrinsic::sinh:
6943 case Intrinsic::cosh:
6944 case Intrinsic::tanh:
6945 case Intrinsic::exp10:
6946 case Intrinsic::floor:
6947 case Intrinsic::ceil:
6948 case Intrinsic::trunc:
6949 case Intrinsic::rint:
6950 case Intrinsic::nearbyint:
6951 case Intrinsic::round:
6952 case Intrinsic::roundeven:
6953 case Intrinsic::canonicalize: {
6954 unsigned Opcode;
6955 // clang-format off
6956 switch (Intrinsic) {
6957 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
6958 case Intrinsic::sqrt: Opcode = ISD::FSQRT; break;
6959 case Intrinsic::fabs: Opcode = ISD::FABS; break;
6960 case Intrinsic::sin: Opcode = ISD::FSIN; break;
6961 case Intrinsic::cos: Opcode = ISD::FCOS; break;
6962 case Intrinsic::tan: Opcode = ISD::FTAN; break;
6963 case Intrinsic::asin: Opcode = ISD::FASIN; break;
6964 case Intrinsic::acos: Opcode = ISD::FACOS; break;
6965 case Intrinsic::atan: Opcode = ISD::FATAN; break;
6966 case Intrinsic::sinh: Opcode = ISD::FSINH; break;
6967 case Intrinsic::cosh: Opcode = ISD::FCOSH; break;
6968 case Intrinsic::tanh: Opcode = ISD::FTANH; break;
6969 case Intrinsic::exp10: Opcode = ISD::FEXP10; break;
6970 case Intrinsic::floor: Opcode = ISD::FFLOOR; break;
6971 case Intrinsic::ceil: Opcode = ISD::FCEIL; break;
6972 case Intrinsic::trunc: Opcode = ISD::FTRUNC; break;
6973 case Intrinsic::rint: Opcode = ISD::FRINT; break;
6974 case Intrinsic::nearbyint: Opcode = ISD::FNEARBYINT; break;
6975 case Intrinsic::round: Opcode = ISD::FROUND; break;
6976 case Intrinsic::roundeven: Opcode = ISD::FROUNDEVEN; break;
6977 case Intrinsic::canonicalize: Opcode = ISD::FCANONICALIZE; break;
6978 }
6979 // clang-format on
6980
6981 setValue(&I, DAG.getNode(Opcode, sdl,
6982 getValue(I.getArgOperand(0)).getValueType(),
6983 getValue(I.getArgOperand(0)), Flags));
6984 return;
6985 }
6986 case Intrinsic::atan2:
6987 setValue(&I, DAG.getNode(ISD::FATAN2, sdl,
6988 getValue(I.getArgOperand(0)).getValueType(),
6989 getValue(I.getArgOperand(0)),
6990 getValue(I.getArgOperand(1)), Flags));
6991 return;
6992 case Intrinsic::lround:
6993 case Intrinsic::llround:
6994 case Intrinsic::lrint:
6995 case Intrinsic::llrint: {
6996 unsigned Opcode;
6997 // clang-format off
6998 switch (Intrinsic) {
6999 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
7000 case Intrinsic::lround: Opcode = ISD::LROUND; break;
7001 case Intrinsic::llround: Opcode = ISD::LLROUND; break;
7002 case Intrinsic::lrint: Opcode = ISD::LRINT; break;
7003 case Intrinsic::llrint: Opcode = ISD::LLRINT; break;
7004 }
7005 // clang-format on
7006
7007 EVT RetVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7008 setValue(&I, DAG.getNode(Opcode, sdl, RetVT,
7009 getValue(I.getArgOperand(0))));
7010 return;
7011 }
7012 case Intrinsic::minnum:
7013 setValue(&I, DAG.getNode(ISD::FMINNUM, sdl,
7014 getValue(I.getArgOperand(0)).getValueType(),
7015 getValue(I.getArgOperand(0)),
7016 getValue(I.getArgOperand(1)), Flags));
7017 return;
7018 case Intrinsic::maxnum:
7019 setValue(&I, DAG.getNode(ISD::FMAXNUM, sdl,
7020 getValue(I.getArgOperand(0)).getValueType(),
7021 getValue(I.getArgOperand(0)),
7022 getValue(I.getArgOperand(1)), Flags));
7023 return;
7024 case Intrinsic::minimum:
7025 setValue(&I, DAG.getNode(ISD::FMINIMUM, sdl,
7026 getValue(I.getArgOperand(0)).getValueType(),
7027 getValue(I.getArgOperand(0)),
7028 getValue(I.getArgOperand(1)), Flags));
7029 return;
7030 case Intrinsic::maximum:
7031 setValue(&I, DAG.getNode(ISD::FMAXIMUM, sdl,
7032 getValue(I.getArgOperand(0)).getValueType(),
7033 getValue(I.getArgOperand(0)),
7034 getValue(I.getArgOperand(1)), Flags));
7035 return;
7036 case Intrinsic::minimumnum:
7037 setValue(&I, DAG.getNode(ISD::FMINIMUMNUM, sdl,
7038 getValue(I.getArgOperand(0)).getValueType(),
7039 getValue(I.getArgOperand(0)),
7040 getValue(I.getArgOperand(1)), Flags));
7041 return;
7042 case Intrinsic::maximumnum:
7043 setValue(&I, DAG.getNode(ISD::FMAXIMUMNUM, sdl,
7044 getValue(I.getArgOperand(0)).getValueType(),
7045 getValue(I.getArgOperand(0)),
7046 getValue(I.getArgOperand(1)), Flags));
7047 return;
7048 case Intrinsic::copysign:
7049 setValue(&I, DAG.getNode(ISD::FCOPYSIGN, sdl,
7050 getValue(I.getArgOperand(0)).getValueType(),
7051 getValue(I.getArgOperand(0)),
7052 getValue(I.getArgOperand(1)), Flags));
7053 return;
7054 case Intrinsic::ldexp:
7055 setValue(&I, DAG.getNode(ISD::FLDEXP, sdl,
7056 getValue(I.getArgOperand(0)).getValueType(),
7057 getValue(I.getArgOperand(0)),
7058 getValue(I.getArgOperand(1)), Flags));
7059 return;
7060 case Intrinsic::modf:
7061 case Intrinsic::sincos:
7062 case Intrinsic::sincospi:
7063 case Intrinsic::frexp: {
7064 unsigned Opcode;
7065 switch (Intrinsic) {
7066 default:
7067 llvm_unreachable("unexpected intrinsic");
7068 case Intrinsic::sincos:
7069 Opcode = ISD::FSINCOS;
7070 break;
7071 case Intrinsic::sincospi:
7072 Opcode = ISD::FSINCOSPI;
7073 break;
7074 case Intrinsic::modf:
7075 Opcode = ISD::FMODF;
7076 break;
7077 case Intrinsic::frexp:
7078 Opcode = ISD::FFREXP;
7079 break;
7080 }
7081 SmallVector<EVT, 2> ValueVTs;
7082 ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);
7083 SDVTList VTs = DAG.getVTList(ValueVTs);
7084 setValue(
7085 &I, DAG.getNode(Opcode, sdl, VTs, getValue(I.getArgOperand(0)), Flags));
7086 return;
7087 }
7088 case Intrinsic::arithmetic_fence: {
7089 setValue(&I, DAG.getNode(ISD::ARITH_FENCE, sdl,
7090 getValue(I.getArgOperand(0)).getValueType(),
7091 getValue(I.getArgOperand(0)), Flags));
7092 return;
7093 }
7094 case Intrinsic::fma:
7095 setValue(&I, DAG.getNode(
7096 ISD::FMA, sdl, getValue(I.getArgOperand(0)).getValueType(),
7097 getValue(I.getArgOperand(0)), getValue(I.getArgOperand(1)),
7098 getValue(I.getArgOperand(2)), Flags));
7099 return;
7100#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
7101 case Intrinsic::INTRINSIC:
7102#include "llvm/IR/ConstrainedOps.def"
7103 visitConstrainedFPIntrinsic(cast<ConstrainedFPIntrinsic>(I));
7104 return;
7105#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID:
7106#include "llvm/IR/VPIntrinsics.def"
7107 visitVectorPredicationIntrinsic(cast<VPIntrinsic>(I));
7108 return;
7109 case Intrinsic::fptrunc_round: {
7110 // Get the last argument, the metadata and convert it to an integer in the
7111 // call
7112 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(1))->getMetadata();
7113 std::optional<RoundingMode> RoundMode =
7114 convertStrToRoundingMode(cast<MDString>(MD)->getString());
7115
7116 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7117
7118 // Propagate fast-math-flags from IR to node(s).
7119 SDNodeFlags Flags;
7120 Flags.copyFMF(*cast<FPMathOperator>(&I));
7121 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
7122
7124 Result = DAG.getNode(
7125 ISD::FPTRUNC_ROUND, sdl, VT, getValue(I.getArgOperand(0)),
7126 DAG.getTargetConstant((int)*RoundMode, sdl, MVT::i32));
7127 setValue(&I, Result);
7128
7129 return;
7130 }
7131 case Intrinsic::fmuladd: {
7132 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7133 if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
7134 TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), VT)) {
7135 setValue(&I, DAG.getNode(ISD::FMA, sdl,
7136 getValue(I.getArgOperand(0)).getValueType(),
7137 getValue(I.getArgOperand(0)),
7138 getValue(I.getArgOperand(1)),
7139 getValue(I.getArgOperand(2)), Flags));
7140 } else if (TLI.isOperationLegalOrCustom(ISD::FMULADD, VT)) {
7141 // TODO: Support splitting the vector.
7142 setValue(&I, DAG.getNode(ISD::FMULADD, sdl,
7143 getValue(I.getArgOperand(0)).getValueType(),
7144 getValue(I.getArgOperand(0)),
7145 getValue(I.getArgOperand(1)),
7146 getValue(I.getArgOperand(2)), Flags));
7147 } else {
7148 // TODO: Intrinsic calls should have fast-math-flags.
7149 SDValue Mul = DAG.getNode(
7150 ISD::FMUL, sdl, getValue(I.getArgOperand(0)).getValueType(),
7151 getValue(I.getArgOperand(0)), getValue(I.getArgOperand(1)), Flags);
7152 SDValue Add = DAG.getNode(ISD::FADD, sdl,
7153 getValue(I.getArgOperand(0)).getValueType(),
7154 Mul, getValue(I.getArgOperand(2)), Flags);
7155 setValue(&I, Add);
7156 }
7157 return;
7158 }
7159 case Intrinsic::fptosi_sat: {
7160 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7161 setValue(&I, DAG.getNode(ISD::FP_TO_SINT_SAT, sdl, VT,
7162 getValue(I.getArgOperand(0)),
7163 DAG.getValueType(VT.getScalarType())));
7164 return;
7165 }
7166 case Intrinsic::fptoui_sat: {
7167 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7168 setValue(&I, DAG.getNode(ISD::FP_TO_UINT_SAT, sdl, VT,
7169 getValue(I.getArgOperand(0)),
7170 DAG.getValueType(VT.getScalarType())));
7171 return;
7172 }
7173 case Intrinsic::convert_from_arbitrary_fp: {
7174 // Extract format metadata and convert to semantics enum.
7175 EVT DstVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7176 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(1))->getMetadata();
7177 StringRef FormatStr = cast<MDString>(MD)->getString();
7178 const fltSemantics *SrcSem =
7180 if (!SrcSem) {
7181 DAG.getContext()->emitError(
7182 "convert_from_arbitrary_fp: not implemented format '" + FormatStr +
7183 "'");
7184 setValue(&I, DAG.getPOISON(DstVT));
7185 return;
7186 }
7188
7189 SDValue IntVal = getValue(I.getArgOperand(0));
7190
7191 // Emit ISD::CONVERT_FROM_ARBITRARY_FP node.
7192 SDValue SemConst =
7193 DAG.getTargetConstant(static_cast<int>(SemEnum), sdl, MVT::i32);
7194 setValue(&I, DAG.getNode(ISD::CONVERT_FROM_ARBITRARY_FP, sdl, DstVT, IntVal,
7195 SemConst));
7196 return;
7197 }
7198 case Intrinsic::set_rounding:
7199 Res = DAG.getNode(ISD::SET_ROUNDING, sdl, MVT::Other,
7200 {getRoot(), getValue(I.getArgOperand(0))});
7201 setValue(&I, Res);
7202 DAG.setRoot(Res.getValue(0));
7203 return;
7204 case Intrinsic::is_fpclass: {
7205 const DataLayout DLayout = DAG.getDataLayout();
7206 EVT DestVT = TLI.getValueType(DLayout, I.getType());
7207 EVT ArgVT = TLI.getValueType(DLayout, I.getArgOperand(0)->getType());
7208 FPClassTest Test = static_cast<FPClassTest>(
7209 cast<ConstantInt>(I.getArgOperand(1))->getZExtValue());
7210 MachineFunction &MF = DAG.getMachineFunction();
7211 const Function &F = MF.getFunction();
7212 SDValue Op = getValue(I.getArgOperand(0));
7213 SDNodeFlags Flags;
7214 Flags.setNoFPExcept(
7215 !F.getAttributes().hasFnAttr(llvm::Attribute::StrictFP));
7216 // If ISD::IS_FPCLASS should be expanded, do it right now, because the
7217 // expansion can use illegal types. Making expansion early allows
7218 // legalizing these types prior to selection.
7219 if (!TLI.isOperationLegal(ISD::IS_FPCLASS, ArgVT) &&
7220 !TLI.isOperationCustom(ISD::IS_FPCLASS, ArgVT)) {
7221 SDValue Result = TLI.expandIS_FPCLASS(DestVT, Op, Test, Flags, sdl, DAG);
7222 setValue(&I, Result);
7223 return;
7224 }
7225
7226 SDValue Check = DAG.getTargetConstant(Test, sdl, MVT::i32);
7227 SDValue V = DAG.getNode(ISD::IS_FPCLASS, sdl, DestVT, {Op, Check}, Flags);
7228 setValue(&I, V);
7229 return;
7230 }
7231 case Intrinsic::get_fpenv: {
7232 const DataLayout DLayout = DAG.getDataLayout();
7233 EVT EnvVT = TLI.getValueType(DLayout, I.getType());
7234 Align TempAlign = DAG.getEVTAlign(EnvVT);
7235 SDValue Chain = getRoot();
7236 // Use GET_FPENV if it is legal or custom. Otherwise use memory-based node
7237 // and temporary storage in stack.
7238 if (TLI.isOperationLegalOrCustom(ISD::GET_FPENV, EnvVT)) {
7239 Res = DAG.getNode(
7240 ISD::GET_FPENV, sdl,
7241 DAG.getVTList(TLI.getValueType(DAG.getDataLayout(), I.getType()),
7242 MVT::Other),
7243 Chain);
7244 } else {
7245 SDValue Temp = DAG.CreateStackTemporary(EnvVT, TempAlign.value());
7246 int SPFI = cast<FrameIndexSDNode>(Temp.getNode())->getIndex();
7247 auto MPI =
7248 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI);
7249 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
7251 TempAlign);
7252 Chain = DAG.getGetFPEnv(Chain, sdl, Temp, EnvVT, MMO);
7253 Res = DAG.getLoad(EnvVT, sdl, Chain, Temp, MPI);
7254 }
7255 setValue(&I, Res);
7256 DAG.setRoot(Res.getValue(1));
7257 return;
7258 }
7259 case Intrinsic::set_fpenv: {
7260 const DataLayout DLayout = DAG.getDataLayout();
7261 SDValue Env = getValue(I.getArgOperand(0));
7262 EVT EnvVT = Env.getValueType();
7263 Align TempAlign = DAG.getEVTAlign(EnvVT);
7264 SDValue Chain = getRoot();
7265 // If SET_FPENV is custom or legal, use it. Otherwise use loading
7266 // environment from memory.
7267 if (TLI.isOperationLegalOrCustom(ISD::SET_FPENV, EnvVT)) {
7268 Chain = DAG.getNode(ISD::SET_FPENV, sdl, MVT::Other, Chain, Env);
7269 } else {
7270 // Allocate space in stack, copy environment bits into it and use this
7271 // memory in SET_FPENV_MEM.
7272 SDValue Temp = DAG.CreateStackTemporary(EnvVT, TempAlign.value());
7273 int SPFI = cast<FrameIndexSDNode>(Temp.getNode())->getIndex();
7274 auto MPI =
7275 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI);
7276 Chain = DAG.getStore(Chain, sdl, Env, Temp, MPI, TempAlign,
7278 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
7280 TempAlign);
7281 Chain = DAG.getSetFPEnv(Chain, sdl, Temp, EnvVT, MMO);
7282 }
7283 DAG.setRoot(Chain);
7284 return;
7285 }
7286 case Intrinsic::reset_fpenv:
7287 DAG.setRoot(DAG.getNode(ISD::RESET_FPENV, sdl, MVT::Other, getRoot()));
7288 return;
7289 case Intrinsic::get_fpmode:
7290 Res = DAG.getNode(
7291 ISD::GET_FPMODE, sdl,
7292 DAG.getVTList(TLI.getValueType(DAG.getDataLayout(), I.getType()),
7293 MVT::Other),
7294 DAG.getRoot());
7295 setValue(&I, Res);
7296 DAG.setRoot(Res.getValue(1));
7297 return;
7298 case Intrinsic::set_fpmode:
7299 Res = DAG.getNode(ISD::SET_FPMODE, sdl, MVT::Other, {DAG.getRoot()},
7300 getValue(I.getArgOperand(0)));
7301 DAG.setRoot(Res);
7302 return;
7303 case Intrinsic::reset_fpmode: {
7304 Res = DAG.getNode(ISD::RESET_FPMODE, sdl, MVT::Other, getRoot());
7305 DAG.setRoot(Res);
7306 return;
7307 }
7308 case Intrinsic::pcmarker: {
7309 SDValue Tmp = getValue(I.getArgOperand(0));
7310 DAG.setRoot(DAG.getNode(ISD::PCMARKER, sdl, MVT::Other, getRoot(), Tmp));
7311 return;
7312 }
7313 case Intrinsic::readcyclecounter: {
7314 SDValue Op = getRoot();
7315 Res = DAG.getNode(ISD::READCYCLECOUNTER, sdl,
7316 DAG.getVTList(MVT::i64, MVT::Other), Op);
7317 setValue(&I, Res);
7318 DAG.setRoot(Res.getValue(1));
7319 return;
7320 }
7321 case Intrinsic::readsteadycounter: {
7322 SDValue Op = getRoot();
7323 Res = DAG.getNode(ISD::READSTEADYCOUNTER, sdl,
7324 DAG.getVTList(MVT::i64, MVT::Other), Op);
7325 setValue(&I, Res);
7326 DAG.setRoot(Res.getValue(1));
7327 return;
7328 }
7329 case Intrinsic::bitreverse:
7330 setValue(&I, DAG.getNode(ISD::BITREVERSE, sdl,
7331 getValue(I.getArgOperand(0)).getValueType(),
7332 getValue(I.getArgOperand(0))));
7333 return;
7334 case Intrinsic::bswap:
7335 setValue(&I, DAG.getNode(ISD::BSWAP, sdl,
7336 getValue(I.getArgOperand(0)).getValueType(),
7337 getValue(I.getArgOperand(0))));
7338 return;
7339 case Intrinsic::cttz: {
7340 SDValue Arg = getValue(I.getArgOperand(0));
7341 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
7342 EVT Ty = Arg.getValueType();
7343 setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTTZ : ISD::CTTZ_ZERO_UNDEF,
7344 sdl, Ty, Arg));
7345 return;
7346 }
7347 case Intrinsic::ctlz: {
7348 SDValue Arg = getValue(I.getArgOperand(0));
7349 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
7350 EVT Ty = Arg.getValueType();
7351 setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTLZ : ISD::CTLZ_ZERO_UNDEF,
7352 sdl, Ty, Arg));
7353 return;
7354 }
7355 case Intrinsic::ctpop: {
7356 SDValue Arg = getValue(I.getArgOperand(0));
7357 EVT Ty = Arg.getValueType();
7358 setValue(&I, DAG.getNode(ISD::CTPOP, sdl, Ty, Arg));
7359 return;
7360 }
7361 case Intrinsic::fshl:
7362 case Intrinsic::fshr: {
7363 bool IsFSHL = Intrinsic == Intrinsic::fshl;
7364 SDValue X = getValue(I.getArgOperand(0));
7365 SDValue Y = getValue(I.getArgOperand(1));
7366 SDValue Z = getValue(I.getArgOperand(2));
7367 EVT VT = X.getValueType();
7368
7369 if (X == Y) {
7370 auto RotateOpcode = IsFSHL ? ISD::ROTL : ISD::ROTR;
7371 setValue(&I, DAG.getNode(RotateOpcode, sdl, VT, X, Z));
7372 } else {
7373 auto FunnelOpcode = IsFSHL ? ISD::FSHL : ISD::FSHR;
7374 setValue(&I, DAG.getNode(FunnelOpcode, sdl, VT, X, Y, Z));
7375 }
7376 return;
7377 }
7378 case Intrinsic::clmul: {
7379 SDValue X = getValue(I.getArgOperand(0));
7380 SDValue Y = getValue(I.getArgOperand(1));
7381 setValue(&I, DAG.getNode(ISD::CLMUL, sdl, X.getValueType(), X, Y));
7382 return;
7383 }
7384 case Intrinsic::sadd_sat: {
7385 SDValue Op1 = getValue(I.getArgOperand(0));
7386 SDValue Op2 = getValue(I.getArgOperand(1));
7387 setValue(&I, DAG.getNode(ISD::SADDSAT, sdl, Op1.getValueType(), Op1, Op2));
7388 return;
7389 }
7390 case Intrinsic::uadd_sat: {
7391 SDValue Op1 = getValue(I.getArgOperand(0));
7392 SDValue Op2 = getValue(I.getArgOperand(1));
7393 setValue(&I, DAG.getNode(ISD::UADDSAT, sdl, Op1.getValueType(), Op1, Op2));
7394 return;
7395 }
7396 case Intrinsic::ssub_sat: {
7397 SDValue Op1 = getValue(I.getArgOperand(0));
7398 SDValue Op2 = getValue(I.getArgOperand(1));
7399 setValue(&I, DAG.getNode(ISD::SSUBSAT, sdl, Op1.getValueType(), Op1, Op2));
7400 return;
7401 }
7402 case Intrinsic::usub_sat: {
7403 SDValue Op1 = getValue(I.getArgOperand(0));
7404 SDValue Op2 = getValue(I.getArgOperand(1));
7405 setValue(&I, DAG.getNode(ISD::USUBSAT, sdl, Op1.getValueType(), Op1, Op2));
7406 return;
7407 }
7408 case Intrinsic::sshl_sat:
7409 case Intrinsic::ushl_sat: {
7410 SDValue Op1 = getValue(I.getArgOperand(0));
7411 SDValue Op2 = getValue(I.getArgOperand(1));
7412
7413 EVT ShiftTy = DAG.getTargetLoweringInfo().getShiftAmountTy(
7414 Op1.getValueType(), DAG.getDataLayout());
7415
7416 // Coerce the shift amount to the right type if we can. This exposes the
7417 // truncate or zext to optimization early.
7418 if (!I.getType()->isVectorTy() && Op2.getValueType() != ShiftTy) {
7419 assert(ShiftTy.getSizeInBits() >=
7421 "Unexpected shift type");
7422 Op2 = DAG.getZExtOrTrunc(Op2, getCurSDLoc(), ShiftTy);
7423 }
7424
7425 unsigned Opc =
7426 Intrinsic == Intrinsic::sshl_sat ? ISD::SSHLSAT : ISD::USHLSAT;
7427 setValue(&I, DAG.getNode(Opc, sdl, Op1.getValueType(), Op1, Op2));
7428 return;
7429 }
7430 case Intrinsic::smul_fix:
7431 case Intrinsic::umul_fix:
7432 case Intrinsic::smul_fix_sat:
7433 case Intrinsic::umul_fix_sat: {
7434 SDValue Op1 = getValue(I.getArgOperand(0));
7435 SDValue Op2 = getValue(I.getArgOperand(1));
7436 SDValue Op3 = getValue(I.getArgOperand(2));
7437 setValue(&I, DAG.getNode(FixedPointIntrinsicToOpcode(Intrinsic), sdl,
7438 Op1.getValueType(), Op1, Op2, Op3));
7439 return;
7440 }
7441 case Intrinsic::sdiv_fix:
7442 case Intrinsic::udiv_fix:
7443 case Intrinsic::sdiv_fix_sat:
7444 case Intrinsic::udiv_fix_sat: {
7445 SDValue Op1 = getValue(I.getArgOperand(0));
7446 SDValue Op2 = getValue(I.getArgOperand(1));
7447 SDValue Op3 = getValue(I.getArgOperand(2));
7449 Op1, Op2, Op3, DAG, TLI));
7450 return;
7451 }
7452 case Intrinsic::smax: {
7453 SDValue Op1 = getValue(I.getArgOperand(0));
7454 SDValue Op2 = getValue(I.getArgOperand(1));
7455 setValue(&I, DAG.getNode(ISD::SMAX, sdl, Op1.getValueType(), Op1, Op2));
7456 return;
7457 }
7458 case Intrinsic::smin: {
7459 SDValue Op1 = getValue(I.getArgOperand(0));
7460 SDValue Op2 = getValue(I.getArgOperand(1));
7461 setValue(&I, DAG.getNode(ISD::SMIN, sdl, Op1.getValueType(), Op1, Op2));
7462 return;
7463 }
7464 case Intrinsic::umax: {
7465 SDValue Op1 = getValue(I.getArgOperand(0));
7466 SDValue Op2 = getValue(I.getArgOperand(1));
7467 setValue(&I, DAG.getNode(ISD::UMAX, sdl, Op1.getValueType(), Op1, Op2));
7468 return;
7469 }
7470 case Intrinsic::umin: {
7471 SDValue Op1 = getValue(I.getArgOperand(0));
7472 SDValue Op2 = getValue(I.getArgOperand(1));
7473 setValue(&I, DAG.getNode(ISD::UMIN, sdl, Op1.getValueType(), Op1, Op2));
7474 return;
7475 }
7476 case Intrinsic::abs: {
7477 // TODO: Preserve "int min is poison" arg in SDAG?
7478 SDValue Op1 = getValue(I.getArgOperand(0));
7479 setValue(&I, DAG.getNode(ISD::ABS, sdl, Op1.getValueType(), Op1));
7480 return;
7481 }
7482 case Intrinsic::scmp: {
7483 SDValue Op1 = getValue(I.getArgOperand(0));
7484 SDValue Op2 = getValue(I.getArgOperand(1));
7485 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7486 setValue(&I, DAG.getNode(ISD::SCMP, sdl, DestVT, Op1, Op2));
7487 break;
7488 }
7489 case Intrinsic::ucmp: {
7490 SDValue Op1 = getValue(I.getArgOperand(0));
7491 SDValue Op2 = getValue(I.getArgOperand(1));
7492 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7493 setValue(&I, DAG.getNode(ISD::UCMP, sdl, DestVT, Op1, Op2));
7494 break;
7495 }
7496 case Intrinsic::stackaddress:
7497 case Intrinsic::stacksave: {
7498 unsigned SDOpcode = Intrinsic == Intrinsic::stackaddress ? ISD::STACKADDRESS
7500 SDValue Op = getRoot();
7501 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7502 Res = DAG.getNode(SDOpcode, sdl, DAG.getVTList(VT, MVT::Other), Op);
7503 setValue(&I, Res);
7504 DAG.setRoot(Res.getValue(1));
7505 return;
7506 }
7507 case Intrinsic::stackrestore:
7508 Res = getValue(I.getArgOperand(0));
7509 DAG.setRoot(DAG.getNode(ISD::STACKRESTORE, sdl, MVT::Other, getRoot(), Res));
7510 return;
7511 case Intrinsic::get_dynamic_area_offset: {
7512 SDValue Op = getRoot();
7513 EVT ResTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
7514 Res = DAG.getNode(ISD::GET_DYNAMIC_AREA_OFFSET, sdl, DAG.getVTList(ResTy),
7515 Op);
7516 DAG.setRoot(Op);
7517 setValue(&I, Res);
7518 return;
7519 }
7520 case Intrinsic::stackguard: {
7521 MachineFunction &MF = DAG.getMachineFunction();
7522 const Module &M = *MF.getFunction().getParent();
7523 EVT PtrTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
7524 SDValue Chain = getRoot();
7525 if (TLI.useLoadStackGuardNode(M)) {
7526 Res = getLoadStackGuard(DAG, sdl, Chain);
7527 Res = DAG.getPtrExtOrTrunc(Res, sdl, PtrTy);
7528 } else {
7529 const Value *Global = TLI.getSDagStackGuard(M, DAG.getLibcalls());
7530 if (!Global) {
7531 LLVMContext &Ctx = *DAG.getContext();
7532 Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
7533 setValue(&I, DAG.getPOISON(PtrTy));
7534 return;
7535 }
7536
7537 Align Align = DAG.getDataLayout().getPrefTypeAlign(Global->getType());
7538 Res = DAG.getLoad(PtrTy, sdl, Chain, getValue(Global),
7539 MachinePointerInfo(Global, 0), Align,
7541 }
7542 if (TLI.useStackGuardXorFP())
7543 Res = TLI.emitStackGuardXorFP(DAG, Res, sdl);
7544 DAG.setRoot(Chain);
7545 setValue(&I, Res);
7546 return;
7547 }
7548 case Intrinsic::stackprotector: {
7549 // Emit code into the DAG to store the stack guard onto the stack.
7550 MachineFunction &MF = DAG.getMachineFunction();
7551 MachineFrameInfo &MFI = MF.getFrameInfo();
7552 const Module &M = *MF.getFunction().getParent();
7553 SDValue Src, Chain = getRoot();
7554
7555 if (TLI.useLoadStackGuardNode(M))
7556 Src = getLoadStackGuard(DAG, sdl, Chain);
7557 else
7558 Src = getValue(I.getArgOperand(0)); // The guard's value.
7559
7560 AllocaInst *Slot = cast<AllocaInst>(I.getArgOperand(1));
7561
7562 int FI = FuncInfo.StaticAllocaMap[Slot];
7563 MFI.setStackProtectorIndex(FI);
7564 EVT PtrTy = TLI.getFrameIndexTy(DAG.getDataLayout());
7565
7566 SDValue FIN = DAG.getFrameIndex(FI, PtrTy);
7567
7568 // Store the stack protector onto the stack.
7569 Res = DAG.getStore(
7570 Chain, sdl, Src, FIN,
7571 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI),
7572 MaybeAlign(), MachineMemOperand::MOVolatile);
7573 setValue(&I, Res);
7574 DAG.setRoot(Res);
7575 return;
7576 }
7577 case Intrinsic::objectsize:
7578 llvm_unreachable("llvm.objectsize.* should have been lowered already");
7579
7580 case Intrinsic::is_constant:
7581 llvm_unreachable("llvm.is.constant.* should have been lowered already");
7582
7583 case Intrinsic::annotation:
7584 case Intrinsic::ptr_annotation:
7585 case Intrinsic::launder_invariant_group:
7586 case Intrinsic::strip_invariant_group:
7587 // Drop the intrinsic, but forward the value
7588 setValue(&I, getValue(I.getOperand(0)));
7589 return;
7590
7591 case Intrinsic::type_test:
7592 case Intrinsic::public_type_test:
7593 reportFatalUsageError("llvm.type.test intrinsic must be lowered by the "
7594 "LowerTypeTests pass before code generation");
7595 return;
7596
7597 case Intrinsic::assume:
7598 case Intrinsic::experimental_noalias_scope_decl:
7599 case Intrinsic::var_annotation:
7600 case Intrinsic::sideeffect:
7601 // Discard annotate attributes, noalias scope declarations, assumptions, and
7602 // artificial side-effects.
7603 return;
7604
7605 case Intrinsic::codeview_annotation: {
7606 // Emit a label associated with this metadata.
7607 MachineFunction &MF = DAG.getMachineFunction();
7608 MCSymbol *Label = MF.getContext().createTempSymbol("annotation", true);
7609 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(0))->getMetadata();
7610 MF.addCodeViewAnnotation(Label, cast<MDNode>(MD));
7611 Res = DAG.getLabelNode(ISD::ANNOTATION_LABEL, sdl, getRoot(), Label);
7612 DAG.setRoot(Res);
7613 return;
7614 }
7615
7616 case Intrinsic::init_trampoline: {
7617 const Function *F = cast<Function>(I.getArgOperand(1)->stripPointerCasts());
7618
7619 SDValue Ops[6];
7620 Ops[0] = getRoot();
7621 Ops[1] = getValue(I.getArgOperand(0));
7622 Ops[2] = getValue(I.getArgOperand(1));
7623 Ops[3] = getValue(I.getArgOperand(2));
7624 Ops[4] = DAG.getSrcValue(I.getArgOperand(0));
7625 Ops[5] = DAG.getSrcValue(F);
7626
7627 Res = DAG.getNode(ISD::INIT_TRAMPOLINE, sdl, MVT::Other, Ops);
7628
7629 DAG.setRoot(Res);
7630 return;
7631 }
7632 case Intrinsic::adjust_trampoline:
7633 setValue(&I, DAG.getNode(ISD::ADJUST_TRAMPOLINE, sdl,
7634 TLI.getPointerTy(DAG.getDataLayout()),
7635 getValue(I.getArgOperand(0))));
7636 return;
7637 case Intrinsic::gcroot: {
7638 assert(DAG.getMachineFunction().getFunction().hasGC() &&
7639 "only valid in functions with gc specified, enforced by Verifier");
7640 assert(GFI && "implied by previous");
7641 const Value *Alloca = I.getArgOperand(0)->stripPointerCasts();
7642 const Constant *TypeMap = cast<Constant>(I.getArgOperand(1));
7643
7644 FrameIndexSDNode *FI = cast<FrameIndexSDNode>(getValue(Alloca).getNode());
7645 GFI->addStackRoot(FI->getIndex(), TypeMap);
7646 return;
7647 }
7648 case Intrinsic::gcread:
7649 case Intrinsic::gcwrite:
7650 llvm_unreachable("GC failed to lower gcread/gcwrite intrinsics!");
7651 case Intrinsic::get_rounding:
7652 Res = DAG.getNode(ISD::GET_ROUNDING, sdl, {MVT::i32, MVT::Other}, getRoot());
7653 setValue(&I, Res);
7654 DAG.setRoot(Res.getValue(1));
7655 return;
7656
7657 case Intrinsic::expect:
7658 case Intrinsic::expect_with_probability:
7659 // Just replace __builtin_expect(exp, c) and
7660 // __builtin_expect_with_probability(exp, c, p) with EXP.
7661 setValue(&I, getValue(I.getArgOperand(0)));
7662 return;
7663
7664 case Intrinsic::ubsantrap:
7665 case Intrinsic::debugtrap:
7666 case Intrinsic::trap: {
7667 StringRef TrapFuncName =
7668 I.getAttributes().getFnAttr("trap-func-name").getValueAsString();
7669 if (TrapFuncName.empty()) {
7670 switch (Intrinsic) {
7671 case Intrinsic::trap:
7672 DAG.setRoot(DAG.getNode(ISD::TRAP, sdl, MVT::Other, getRoot()));
7673 break;
7674 case Intrinsic::debugtrap:
7675 DAG.setRoot(DAG.getNode(ISD::DEBUGTRAP, sdl, MVT::Other, getRoot()));
7676 break;
7677 case Intrinsic::ubsantrap:
7678 DAG.setRoot(DAG.getNode(
7679 ISD::UBSANTRAP, sdl, MVT::Other, getRoot(),
7680 DAG.getTargetConstant(
7681 cast<ConstantInt>(I.getArgOperand(0))->getZExtValue(), sdl,
7682 MVT::i32)));
7683 break;
7684 default: llvm_unreachable("unknown trap intrinsic");
7685 }
7686 DAG.addNoMergeSiteInfo(DAG.getRoot().getNode(),
7687 I.hasFnAttr(Attribute::NoMerge));
7688 return;
7689 }
7691 if (Intrinsic == Intrinsic::ubsantrap) {
7692 Value *Arg = I.getArgOperand(0);
7693 Args.emplace_back(Arg, getValue(Arg));
7694 }
7695
7696 TargetLowering::CallLoweringInfo CLI(DAG);
7697 CLI.setDebugLoc(sdl).setChain(getRoot()).setLibCallee(
7698 CallingConv::C, I.getType(),
7699 DAG.getExternalSymbol(TrapFuncName.data(),
7700 TLI.getPointerTy(DAG.getDataLayout())),
7701 std::move(Args));
7702 CLI.NoMerge = I.hasFnAttr(Attribute::NoMerge);
7703 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
7704 DAG.setRoot(Result.second);
7705 return;
7706 }
7707
7708 case Intrinsic::allow_runtime_check:
7709 case Intrinsic::allow_ubsan_check:
7710 setValue(&I, getValue(ConstantInt::getTrue(I.getType())));
7711 return;
7712
7713 case Intrinsic::uadd_with_overflow:
7714 case Intrinsic::sadd_with_overflow:
7715 case Intrinsic::usub_with_overflow:
7716 case Intrinsic::ssub_with_overflow:
7717 case Intrinsic::umul_with_overflow:
7718 case Intrinsic::smul_with_overflow: {
7720 switch (Intrinsic) {
7721 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
7722 case Intrinsic::uadd_with_overflow: Op = ISD::UADDO; break;
7723 case Intrinsic::sadd_with_overflow: Op = ISD::SADDO; break;
7724 case Intrinsic::usub_with_overflow: Op = ISD::USUBO; break;
7725 case Intrinsic::ssub_with_overflow: Op = ISD::SSUBO; break;
7726 case Intrinsic::umul_with_overflow: Op = ISD::UMULO; break;
7727 case Intrinsic::smul_with_overflow: Op = ISD::SMULO; break;
7728 }
7729 SDValue Op1 = getValue(I.getArgOperand(0));
7730 SDValue Op2 = getValue(I.getArgOperand(1));
7731
7732 EVT ResultVT = Op1.getValueType();
7733 EVT OverflowVT = ResultVT.changeElementType(*Context, MVT::i1);
7734
7735 SDVTList VTs = DAG.getVTList(ResultVT, OverflowVT);
7736 setValue(&I, DAG.getNode(Op, sdl, VTs, Op1, Op2));
7737 return;
7738 }
7739 case Intrinsic::prefetch: {
7740 SDValue Ops[5];
7741 unsigned rw = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
7743 Ops[0] = DAG.getRoot();
7744 Ops[1] = getValue(I.getArgOperand(0));
7745 Ops[2] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(1)), sdl,
7746 MVT::i32);
7747 Ops[3] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(2)), sdl,
7748 MVT::i32);
7749 Ops[4] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(3)), sdl,
7750 MVT::i32);
7751 SDValue Result = DAG.getMemIntrinsicNode(
7752 ISD::PREFETCH, sdl, DAG.getVTList(MVT::Other), Ops,
7753 EVT::getIntegerVT(*Context, 8), MachinePointerInfo(I.getArgOperand(0)),
7754 /* align */ std::nullopt, Flags);
7755
7756 // Chain the prefetch in parallel with any pending loads, to stay out of
7757 // the way of later optimizations.
7758 PendingLoads.push_back(Result);
7759 Result = getRoot();
7760 DAG.setRoot(Result);
7761 return;
7762 }
7763 case Intrinsic::lifetime_start:
7764 case Intrinsic::lifetime_end: {
7765 bool IsStart = (Intrinsic == Intrinsic::lifetime_start);
7766 // Stack coloring is not enabled in O0, discard region information.
7767 if (TM.getOptLevel() == CodeGenOptLevel::None)
7768 return;
7769
7770 const AllocaInst *LifetimeObject = dyn_cast<AllocaInst>(I.getArgOperand(0));
7771 if (!LifetimeObject)
7772 return;
7773
7774 // First check that the Alloca is static, otherwise it won't have a
7775 // valid frame index.
7776 auto SI = FuncInfo.StaticAllocaMap.find(LifetimeObject);
7777 if (SI == FuncInfo.StaticAllocaMap.end())
7778 return;
7779
7780 const int FrameIndex = SI->second;
7781 Res = DAG.getLifetimeNode(IsStart, sdl, getRoot(), FrameIndex);
7782 DAG.setRoot(Res);
7783 return;
7784 }
7785 case Intrinsic::pseudoprobe: {
7786 auto Guid = cast<ConstantInt>(I.getArgOperand(0))->getZExtValue();
7787 auto Index = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
7788 auto Attr = cast<ConstantInt>(I.getArgOperand(2))->getZExtValue();
7789 Res = DAG.getPseudoProbeNode(sdl, getRoot(), Guid, Index, Attr);
7790 DAG.setRoot(Res);
7791 return;
7792 }
7793 case Intrinsic::invariant_start:
7794 // Discard region information.
7795 setValue(&I,
7796 DAG.getUNDEF(TLI.getValueType(DAG.getDataLayout(), I.getType())));
7797 return;
7798 case Intrinsic::invariant_end:
7799 // Discard region information.
7800 return;
7801 case Intrinsic::clear_cache: {
7802 SDValue InputChain = DAG.getRoot();
7803 SDValue StartVal = getValue(I.getArgOperand(0));
7804 SDValue EndVal = getValue(I.getArgOperand(1));
7805 Res = DAG.getNode(ISD::CLEAR_CACHE, sdl, DAG.getVTList(MVT::Other),
7806 {InputChain, StartVal, EndVal});
7807 setValue(&I, Res);
7808 DAG.setRoot(Res);
7809 return;
7810 }
7811 case Intrinsic::donothing:
7812 case Intrinsic::seh_try_begin:
7813 case Intrinsic::seh_scope_begin:
7814 case Intrinsic::seh_try_end:
7815 case Intrinsic::seh_scope_end:
7816 // ignore
7817 return;
7818 case Intrinsic::experimental_stackmap:
7819 visitStackmap(I);
7820 return;
7821 case Intrinsic::experimental_patchpoint_void:
7822 case Intrinsic::experimental_patchpoint:
7823 visitPatchpoint(I);
7824 return;
7825 case Intrinsic::experimental_gc_statepoint:
7827 return;
7828 case Intrinsic::experimental_gc_result:
7829 visitGCResult(cast<GCResultInst>(I));
7830 return;
7831 case Intrinsic::experimental_gc_relocate:
7832 visitGCRelocate(cast<GCRelocateInst>(I));
7833 return;
7834 case Intrinsic::instrprof_cover:
7835 llvm_unreachable("instrprof failed to lower a cover");
7836 case Intrinsic::instrprof_increment:
7837 llvm_unreachable("instrprof failed to lower an increment");
7838 case Intrinsic::instrprof_timestamp:
7839 llvm_unreachable("instrprof failed to lower a timestamp");
7840 case Intrinsic::instrprof_value_profile:
7841 llvm_unreachable("instrprof failed to lower a value profiling call");
7842 case Intrinsic::instrprof_mcdc_parameters:
7843 llvm_unreachable("instrprof failed to lower mcdc parameters");
7844 case Intrinsic::instrprof_mcdc_tvbitmap_update:
7845 llvm_unreachable("instrprof failed to lower an mcdc tvbitmap update");
7846 case Intrinsic::localescape: {
7847 MachineFunction &MF = DAG.getMachineFunction();
7848 const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo();
7849
7850 // Directly emit some LOCAL_ESCAPE machine instrs. Label assignment emission
7851 // is the same on all targets.
7852 for (unsigned Idx = 0, E = I.arg_size(); Idx < E; ++Idx) {
7853 Value *Arg = I.getArgOperand(Idx)->stripPointerCasts();
7854 if (isa<ConstantPointerNull>(Arg))
7855 continue; // Skip null pointers. They represent a hole in index space.
7856 AllocaInst *Slot = cast<AllocaInst>(Arg);
7857 assert(FuncInfo.StaticAllocaMap.count(Slot) &&
7858 "can only escape static allocas");
7859 int FI = FuncInfo.StaticAllocaMap[Slot];
7860 MCSymbol *FrameAllocSym = MF.getContext().getOrCreateFrameAllocSymbol(
7862 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, dl,
7863 TII->get(TargetOpcode::LOCAL_ESCAPE))
7864 .addSym(FrameAllocSym)
7865 .addFrameIndex(FI);
7866 }
7867
7868 return;
7869 }
7870
7871 case Intrinsic::localrecover: {
7872 // i8* @llvm.localrecover(i8* %fn, i8* %fp, i32 %idx)
7873 MachineFunction &MF = DAG.getMachineFunction();
7874
7875 // Get the symbol that defines the frame offset.
7876 auto *Fn = cast<Function>(I.getArgOperand(0)->stripPointerCasts());
7877 auto *Idx = cast<ConstantInt>(I.getArgOperand(2));
7878 unsigned IdxVal =
7879 unsigned(Idx->getLimitedValue(std::numeric_limits<int>::max()));
7880 MCSymbol *FrameAllocSym = MF.getContext().getOrCreateFrameAllocSymbol(
7882
7883 Value *FP = I.getArgOperand(1);
7884 SDValue FPVal = getValue(FP);
7885 EVT PtrVT = FPVal.getValueType();
7886
7887 // Create a MCSymbol for the label to avoid any target lowering
7888 // that would make this PC relative.
7889 SDValue OffsetSym = DAG.getMCSymbol(FrameAllocSym, PtrVT);
7890 SDValue OffsetVal =
7891 DAG.getNode(ISD::LOCAL_RECOVER, sdl, PtrVT, OffsetSym);
7892
7893 // Add the offset to the FP.
7894 SDValue Add = DAG.getMemBasePlusOffset(FPVal, OffsetVal, sdl);
7895 setValue(&I, Add);
7896
7897 return;
7898 }
7899
7900 case Intrinsic::fake_use: {
7901 Value *V = I.getArgOperand(0);
7902 SDValue Ops[2];
7903 // For Values not declared or previously used in this basic block, the
7904 // NodeMap will not have an entry, and `getValue` will assert if V has no
7905 // valid register value.
7906 auto FakeUseValue = [&]() -> SDValue {
7907 SDValue &N = NodeMap[V];
7908 if (N.getNode())
7909 return N;
7910
7911 // If there's a virtual register allocated and initialized for this
7912 // value, use it.
7913 if (SDValue copyFromReg = getCopyFromRegs(V, V->getType()))
7914 return copyFromReg;
7915 // FIXME: Do we want to preserve constants? It seems pointless.
7916 if (isa<Constant>(V))
7917 return getValue(V);
7918 return SDValue();
7919 }();
7920 if (!FakeUseValue || FakeUseValue.isUndef())
7921 return;
7922 Ops[0] = getRoot();
7923 Ops[1] = FakeUseValue;
7924 // Also, do not translate a fake use with an undef operand, or any other
7925 // empty SDValues.
7926 if (!Ops[1] || Ops[1].isUndef())
7927 return;
7928 DAG.setRoot(DAG.getNode(ISD::FAKE_USE, sdl, MVT::Other, Ops));
7929 return;
7930 }
7931
7932 case Intrinsic::reloc_none: {
7933 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(0))->getMetadata();
7934 StringRef SymbolName = cast<MDString>(MD)->getString();
7935 SDValue Ops[2] = {
7936 getRoot(),
7937 DAG.getTargetExternalSymbol(
7938 SymbolName.data(), TLI.getProgramPointerTy(DAG.getDataLayout()))};
7939 DAG.setRoot(DAG.getNode(ISD::RELOC_NONE, sdl, MVT::Other, Ops));
7940 return;
7941 }
7942
7943 case Intrinsic::cond_loop: {
7944 SDValue InputChain = DAG.getRoot();
7945 SDValue P = getValue(I.getArgOperand(0));
7946 Res = DAG.getNode(ISD::COND_LOOP, sdl, DAG.getVTList(MVT::Other),
7947 {InputChain, P});
7948 setValue(&I, Res);
7949 DAG.setRoot(Res);
7950 return;
7951 }
7952
7953 case Intrinsic::eh_exceptionpointer:
7954 case Intrinsic::eh_exceptioncode: {
7955 // Get the exception pointer vreg, copy from it, and resize it to fit.
7956 const auto *CPI = cast<CatchPadInst>(I.getArgOperand(0));
7957 MVT PtrVT = TLI.getPointerTy(DAG.getDataLayout());
7958 const TargetRegisterClass *PtrRC = TLI.getRegClassFor(PtrVT);
7959 Register VReg = FuncInfo.getCatchPadExceptionPointerVReg(CPI, PtrRC);
7960 SDValue N = DAG.getCopyFromReg(DAG.getEntryNode(), sdl, VReg, PtrVT);
7961 if (Intrinsic == Intrinsic::eh_exceptioncode)
7962 N = DAG.getZExtOrTrunc(N, sdl, MVT::i32);
7963 setValue(&I, N);
7964 return;
7965 }
7966 case Intrinsic::xray_customevent: {
7967 // Here we want to make sure that the intrinsic behaves as if it has a
7968 // specific calling convention.
7969 const auto &Triple = DAG.getTarget().getTargetTriple();
7970 if (!Triple.isAArch64(64) && Triple.getArch() != Triple::x86_64)
7971 return;
7972
7974
7975 // We want to say that we always want the arguments in registers.
7976 SDValue LogEntryVal = getValue(I.getArgOperand(0));
7977 SDValue StrSizeVal = getValue(I.getArgOperand(1));
7978 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
7979 SDValue Chain = getRoot();
7980 Ops.push_back(LogEntryVal);
7981 Ops.push_back(StrSizeVal);
7982 Ops.push_back(Chain);
7983
7984 // We need to enforce the calling convention for the callsite, so that
7985 // argument ordering is enforced correctly, and that register allocation can
7986 // see that some registers may be assumed clobbered and have to preserve
7987 // them across calls to the intrinsic.
7988 MachineSDNode *MN = DAG.getMachineNode(TargetOpcode::PATCHABLE_EVENT_CALL,
7989 sdl, NodeTys, Ops);
7990 SDValue patchableNode = SDValue(MN, 0);
7991 DAG.setRoot(patchableNode);
7992 setValue(&I, patchableNode);
7993 return;
7994 }
7995 case Intrinsic::xray_typedevent: {
7996 // Here we want to make sure that the intrinsic behaves as if it has a
7997 // specific calling convention.
7998 const auto &Triple = DAG.getTarget().getTargetTriple();
7999 if (!Triple.isAArch64(64) && Triple.getArch() != Triple::x86_64)
8000 return;
8001
8003
8004 // We want to say that we always want the arguments in registers.
8005 // It's unclear to me how manipulating the selection DAG here forces callers
8006 // to provide arguments in registers instead of on the stack.
8007 SDValue LogTypeId = getValue(I.getArgOperand(0));
8008 SDValue LogEntryVal = getValue(I.getArgOperand(1));
8009 SDValue StrSizeVal = getValue(I.getArgOperand(2));
8010 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
8011 SDValue Chain = getRoot();
8012 Ops.push_back(LogTypeId);
8013 Ops.push_back(LogEntryVal);
8014 Ops.push_back(StrSizeVal);
8015 Ops.push_back(Chain);
8016
8017 // We need to enforce the calling convention for the callsite, so that
8018 // argument ordering is enforced correctly, and that register allocation can
8019 // see that some registers may be assumed clobbered and have to preserve
8020 // them across calls to the intrinsic.
8021 MachineSDNode *MN = DAG.getMachineNode(
8022 TargetOpcode::PATCHABLE_TYPED_EVENT_CALL, sdl, NodeTys, Ops);
8023 SDValue patchableNode = SDValue(MN, 0);
8024 DAG.setRoot(patchableNode);
8025 setValue(&I, patchableNode);
8026 return;
8027 }
8028 case Intrinsic::experimental_deoptimize:
8030 return;
8031 case Intrinsic::stepvector:
8032 visitStepVector(I);
8033 return;
8034 case Intrinsic::vector_reduce_fadd:
8035 case Intrinsic::vector_reduce_fmul:
8036 case Intrinsic::vector_reduce_add:
8037 case Intrinsic::vector_reduce_mul:
8038 case Intrinsic::vector_reduce_and:
8039 case Intrinsic::vector_reduce_or:
8040 case Intrinsic::vector_reduce_xor:
8041 case Intrinsic::vector_reduce_smax:
8042 case Intrinsic::vector_reduce_smin:
8043 case Intrinsic::vector_reduce_umax:
8044 case Intrinsic::vector_reduce_umin:
8045 case Intrinsic::vector_reduce_fmax:
8046 case Intrinsic::vector_reduce_fmin:
8047 case Intrinsic::vector_reduce_fmaximum:
8048 case Intrinsic::vector_reduce_fminimum:
8049 visitVectorReduce(I, Intrinsic);
8050 return;
8051
8052 case Intrinsic::icall_branch_funnel: {
8054 Ops.push_back(getValue(I.getArgOperand(0)));
8055
8056 int64_t Offset;
8058 I.getArgOperand(1), Offset, DAG.getDataLayout()));
8059 if (!Base)
8061 "llvm.icall.branch.funnel operand must be a GlobalValue");
8062 Ops.push_back(DAG.getTargetGlobalAddress(Base, sdl, MVT::i64, 0));
8063
8064 struct BranchFunnelTarget {
8065 int64_t Offset;
8067 };
8069
8070 for (unsigned Op = 1, N = I.arg_size(); Op != N; Op += 2) {
8072 I.getArgOperand(Op), Offset, DAG.getDataLayout()));
8073 if (ElemBase != Base)
8074 report_fatal_error("all llvm.icall.branch.funnel operands must refer "
8075 "to the same GlobalValue");
8076
8077 SDValue Val = getValue(I.getArgOperand(Op + 1));
8078 auto *GA = dyn_cast<GlobalAddressSDNode>(Val);
8079 if (!GA)
8081 "llvm.icall.branch.funnel operand must be a GlobalValue");
8082 Targets.push_back({Offset, DAG.getTargetGlobalAddress(
8083 GA->getGlobal(), sdl, Val.getValueType(),
8084 GA->getOffset())});
8085 }
8086 llvm::sort(Targets,
8087 [](const BranchFunnelTarget &T1, const BranchFunnelTarget &T2) {
8088 return T1.Offset < T2.Offset;
8089 });
8090
8091 for (auto &T : Targets) {
8092 Ops.push_back(DAG.getTargetConstant(T.Offset, sdl, MVT::i32));
8093 Ops.push_back(T.Target);
8094 }
8095
8096 Ops.push_back(DAG.getRoot()); // Chain
8097 SDValue N(DAG.getMachineNode(TargetOpcode::ICALL_BRANCH_FUNNEL, sdl,
8098 MVT::Other, Ops),
8099 0);
8100 DAG.setRoot(N);
8101 setValue(&I, N);
8102 HasTailCall = true;
8103 return;
8104 }
8105
8106 case Intrinsic::wasm_landingpad_index:
8107 // Information this intrinsic contained has been transferred to
8108 // MachineFunction in SelectionDAGISel::PrepareEHLandingPad. We can safely
8109 // delete it now.
8110 return;
8111
8112 case Intrinsic::aarch64_settag:
8113 case Intrinsic::aarch64_settag_zero: {
8114 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
8115 bool ZeroMemory = Intrinsic == Intrinsic::aarch64_settag_zero;
8117 DAG, sdl, getRoot(), getValue(I.getArgOperand(0)),
8118 getValue(I.getArgOperand(1)), MachinePointerInfo(I.getArgOperand(0)),
8119 ZeroMemory);
8120 DAG.setRoot(Val);
8121 setValue(&I, Val);
8122 return;
8123 }
8124 case Intrinsic::amdgcn_cs_chain: {
8125 // At this point we don't care if it's amdgpu_cs_chain or
8126 // amdgpu_cs_chain_preserve.
8128
8129 Type *RetTy = I.getType();
8130 assert(RetTy->isVoidTy() && "Should not return");
8131
8132 SDValue Callee = getValue(I.getOperand(0));
8133
8134 // We only have 2 actual args: one for the SGPRs and one for the VGPRs.
8135 // We'll also tack the value of the EXEC mask at the end.
8137 Args.reserve(3);
8138
8139 for (unsigned Idx : {2, 3, 1}) {
8140 TargetLowering::ArgListEntry Arg(getValue(I.getOperand(Idx)),
8141 I.getOperand(Idx)->getType());
8142 Arg.setAttributes(&I, Idx);
8143 Args.push_back(Arg);
8144 }
8145
8146 assert(Args[0].IsInReg && "SGPR args should be marked inreg");
8147 assert(!Args[1].IsInReg && "VGPR args should not be marked inreg");
8148 Args[2].IsInReg = true; // EXEC should be inreg
8149
8150 // Forward the flags and any additional arguments.
8151 for (unsigned Idx = 4; Idx < I.arg_size(); ++Idx) {
8152 TargetLowering::ArgListEntry Arg(getValue(I.getOperand(Idx)),
8153 I.getOperand(Idx)->getType());
8154 Arg.setAttributes(&I, Idx);
8155 Args.push_back(Arg);
8156 }
8157
8158 TargetLowering::CallLoweringInfo CLI(DAG);
8159 CLI.setDebugLoc(getCurSDLoc())
8160 .setChain(getRoot())
8161 .setCallee(CC, RetTy, Callee, std::move(Args))
8162 .setNoReturn(true)
8163 .setTailCall(true)
8164 .setConvergent(I.isConvergent());
8165 CLI.CB = &I;
8166 std::pair<SDValue, SDValue> Result =
8167 lowerInvokable(CLI, /*EHPadBB*/ nullptr);
8168 (void)Result;
8169 assert(!Result.first.getNode() && !Result.second.getNode() &&
8170 "Should've lowered as tail call");
8171
8172 HasTailCall = true;
8173 return;
8174 }
8175 case Intrinsic::amdgcn_call_whole_wave: {
8177 bool isTailCall = I.isTailCall();
8178
8179 // The first argument is the callee. Skip it when assembling the call args.
8180 for (unsigned Idx = 1; Idx < I.arg_size(); ++Idx) {
8181 TargetLowering::ArgListEntry Arg(getValue(I.getArgOperand(Idx)),
8182 I.getArgOperand(Idx)->getType());
8183 Arg.setAttributes(&I, Idx);
8184
8185 // If we have an explicit sret argument that is an Instruction, (i.e., it
8186 // might point to function-local memory), we can't meaningfully tail-call.
8187 if (Arg.IsSRet && isa<Instruction>(I.getArgOperand(Idx)))
8188 isTailCall = false;
8189
8190 Args.push_back(Arg);
8191 }
8192
8193 SDValue ConvControlToken;
8194 if (auto Bundle = I.getOperandBundle(LLVMContext::OB_convergencectrl)) {
8195 auto *Token = Bundle->Inputs[0].get();
8196 ConvControlToken = getValue(Token);
8197 }
8198
8199 TargetLowering::CallLoweringInfo CLI(DAG);
8200 CLI.setDebugLoc(getCurSDLoc())
8201 .setChain(getRoot())
8202 .setCallee(CallingConv::AMDGPU_Gfx_WholeWave, I.getType(),
8203 getValue(I.getArgOperand(0)), std::move(Args))
8204 .setTailCall(isTailCall && canTailCall(I))
8205 .setIsPreallocated(
8206 I.countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0)
8207 .setConvergent(I.isConvergent())
8208 .setConvergenceControlToken(ConvControlToken);
8209 CLI.CB = &I;
8210
8211 std::pair<SDValue, SDValue> Result =
8212 lowerInvokable(CLI, /*EHPadBB=*/nullptr);
8213
8214 if (Result.first.getNode())
8215 setValue(&I, Result.first);
8216 return;
8217 }
8218 case Intrinsic::ptrmask: {
8219 SDValue Ptr = getValue(I.getOperand(0));
8220 SDValue Mask = getValue(I.getOperand(1));
8221
8222 // On arm64_32, pointers are 32 bits when stored in memory, but
8223 // zero-extended to 64 bits when in registers. Thus the mask is 32 bits to
8224 // match the index type, but the pointer is 64 bits, so the mask must be
8225 // zero-extended up to 64 bits to match the pointer.
8226 EVT PtrVT =
8227 TLI.getValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
8228 EVT MemVT =
8229 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
8230 assert(PtrVT == Ptr.getValueType());
8231 if (Mask.getValueType().getFixedSizeInBits() < MemVT.getFixedSizeInBits()) {
8232 // For AMDGPU buffer descriptors the mask is 48 bits, but the pointer is
8233 // 128-bit, so we have to pad the mask with ones for unused bits.
8234 auto HighOnes = DAG.getNode(
8235 ISD::SHL, sdl, PtrVT, DAG.getAllOnesConstant(sdl, PtrVT),
8236 DAG.getShiftAmountConstant(Mask.getValueType().getFixedSizeInBits(),
8237 PtrVT, sdl));
8238 Mask = DAG.getNode(ISD::OR, sdl, PtrVT,
8239 DAG.getZExtOrTrunc(Mask, sdl, PtrVT), HighOnes);
8240 } else if (Mask.getValueType() != PtrVT)
8241 Mask = DAG.getPtrExtOrTrunc(Mask, sdl, PtrVT);
8242
8243 assert(Mask.getValueType() == PtrVT);
8244 setValue(&I, DAG.getNode(ISD::AND, sdl, PtrVT, Ptr, Mask));
8245 return;
8246 }
8247 case Intrinsic::threadlocal_address: {
8248 setValue(&I, getValue(I.getOperand(0)));
8249 return;
8250 }
8251 case Intrinsic::get_active_lane_mask: {
8252 EVT CCVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8253 SDValue Index = getValue(I.getOperand(0));
8254 SDValue TripCount = getValue(I.getOperand(1));
8255 EVT ElementVT = Index.getValueType();
8256
8257 if (!TLI.shouldExpandGetActiveLaneMask(CCVT, ElementVT)) {
8258 setValue(&I, DAG.getNode(ISD::GET_ACTIVE_LANE_MASK, sdl, CCVT, Index,
8259 TripCount));
8260 return;
8261 }
8262
8263 EVT VecTy = EVT::getVectorVT(*DAG.getContext(), ElementVT,
8264 CCVT.getVectorElementCount());
8265
8266 SDValue VectorIndex = DAG.getSplat(VecTy, sdl, Index);
8267 SDValue VectorTripCount = DAG.getSplat(VecTy, sdl, TripCount);
8268 SDValue VectorStep = DAG.getStepVector(sdl, VecTy);
8269 SDValue VectorInduction = DAG.getNode(
8270 ISD::UADDSAT, sdl, VecTy, VectorIndex, VectorStep);
8271 SDValue SetCC = DAG.getSetCC(sdl, CCVT, VectorInduction,
8272 VectorTripCount, ISD::CondCode::SETULT);
8273 setValue(&I, SetCC);
8274 return;
8275 }
8276 case Intrinsic::experimental_get_vector_length: {
8277 assert(cast<ConstantInt>(I.getOperand(1))->getSExtValue() > 0 &&
8278 "Expected positive VF");
8279 unsigned VF = cast<ConstantInt>(I.getOperand(1))->getZExtValue();
8280 bool IsScalable = cast<ConstantInt>(I.getOperand(2))->isOne();
8281
8282 SDValue Count = getValue(I.getOperand(0));
8283 EVT CountVT = Count.getValueType();
8284
8285 if (!TLI.shouldExpandGetVectorLength(CountVT, VF, IsScalable)) {
8286 visitTargetIntrinsic(I, Intrinsic);
8287 return;
8288 }
8289
8290 // Expand to a umin between the trip count and the maximum elements the type
8291 // can hold.
8292 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8293
8294 // Extend the trip count to at least the result VT.
8295 if (CountVT.bitsLT(VT)) {
8296 Count = DAG.getNode(ISD::ZERO_EXTEND, sdl, VT, Count);
8297 CountVT = VT;
8298 }
8299
8300 SDValue MaxEVL = DAG.getElementCount(sdl, CountVT,
8301 ElementCount::get(VF, IsScalable));
8302
8303 SDValue UMin = DAG.getNode(ISD::UMIN, sdl, CountVT, Count, MaxEVL);
8304 // Clip to the result type if needed.
8305 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, sdl, VT, UMin);
8306
8307 setValue(&I, Trunc);
8308 return;
8309 }
8310 case Intrinsic::vector_partial_reduce_add: {
8311 SDValue Acc = getValue(I.getOperand(0));
8312 SDValue Input = getValue(I.getOperand(1));
8313 setValue(&I,
8314 DAG.getNode(ISD::PARTIAL_REDUCE_UMLA, sdl, Acc.getValueType(), Acc,
8315 Input, DAG.getConstant(1, sdl, Input.getValueType())));
8316 return;
8317 }
8318 case Intrinsic::vector_partial_reduce_fadd: {
8319 SDValue Acc = getValue(I.getOperand(0));
8320 SDValue Input = getValue(I.getOperand(1));
8321 setValue(&I, DAG.getNode(
8322 ISD::PARTIAL_REDUCE_FMLA, sdl, Acc.getValueType(), Acc,
8323 Input, DAG.getConstantFP(1.0, sdl, Input.getValueType())));
8324 return;
8325 }
8326 case Intrinsic::experimental_cttz_elts: {
8327 auto DL = getCurSDLoc();
8328 SDValue Op = getValue(I.getOperand(0));
8329 EVT OpVT = Op.getValueType();
8330 EVT RetTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
8331 bool ZeroIsPoison =
8332 !cast<ConstantSDNode>(getValue(I.getOperand(1)))->isZero();
8333
8334 if (!TLI.shouldExpandCttzElements(OpVT)) {
8335 SDValue Ret = DAG.getNode(ZeroIsPoison ? ISD::CTTZ_ELTS_ZERO_POISON
8337 sdl, RetTy, Op);
8338 setValue(&I, Ret);
8339 return;
8340 }
8341
8342 if (OpVT.getScalarType() != MVT::i1) {
8343 // Compare the input vector elements to zero & use to count trailing zeros
8344 SDValue AllZero = DAG.getConstant(0, DL, OpVT);
8345 OpVT = EVT::getVectorVT(*DAG.getContext(), MVT::i1,
8346 OpVT.getVectorElementCount());
8347 Op = DAG.getSetCC(DL, OpVT, Op, AllZero, ISD::SETNE);
8348 }
8349
8350 // If the zero-is-poison flag is set, we can assume the upper limit
8351 // of the result is VF-1.
8352 ConstantRange VScaleRange(1, true); // Dummy value.
8353 if (isa<ScalableVectorType>(I.getOperand(0)->getType()))
8354 VScaleRange = getVScaleRange(I.getCaller(), 64);
8355 unsigned EltWidth = TLI.getBitWidthForCttzElements(
8356 I.getType(), OpVT.getVectorElementCount(), ZeroIsPoison, &VScaleRange);
8357
8358 MVT NewEltTy = MVT::getIntegerVT(EltWidth);
8359
8360 // Create the new vector type & get the vector length
8361 EVT NewVT = EVT::getVectorVT(*DAG.getContext(), NewEltTy,
8362 OpVT.getVectorElementCount());
8363
8364 SDValue VL =
8365 DAG.getElementCount(DL, NewEltTy, OpVT.getVectorElementCount());
8366
8367 SDValue StepVec = DAG.getStepVector(DL, NewVT);
8368 SDValue SplatVL = DAG.getSplat(NewVT, DL, VL);
8369 SDValue StepVL = DAG.getNode(ISD::SUB, DL, NewVT, SplatVL, StepVec);
8370 SDValue Ext = DAG.getNode(ISD::SIGN_EXTEND, DL, NewVT, Op);
8371 SDValue And = DAG.getNode(ISD::AND, DL, NewVT, StepVL, Ext);
8372 SDValue Max = DAG.getNode(ISD::VECREDUCE_UMAX, DL, NewEltTy, And);
8373 SDValue Sub = DAG.getNode(ISD::SUB, DL, NewEltTy, VL, Max);
8374
8375 SDValue Ret = DAG.getZExtOrTrunc(Sub, DL, RetTy);
8376
8377 setValue(&I, Ret);
8378 return;
8379 }
8380 case Intrinsic::vector_insert: {
8381 SDValue Vec = getValue(I.getOperand(0));
8382 SDValue SubVec = getValue(I.getOperand(1));
8383 SDValue Index = getValue(I.getOperand(2));
8384
8385 // The intrinsic's index type is i64, but the SDNode requires an index type
8386 // suitable for the target. Convert the index as required.
8387 MVT VectorIdxTy = TLI.getVectorIdxTy(DAG.getDataLayout());
8388 if (Index.getValueType() != VectorIdxTy)
8389 Index = DAG.getVectorIdxConstant(Index->getAsZExtVal(), sdl);
8390
8391 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8392 setValue(&I, DAG.getNode(ISD::INSERT_SUBVECTOR, sdl, ResultVT, Vec, SubVec,
8393 Index));
8394 return;
8395 }
8396 case Intrinsic::vector_extract: {
8397 SDValue Vec = getValue(I.getOperand(0));
8398 SDValue Index = getValue(I.getOperand(1));
8399 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8400
8401 // The intrinsic's index type is i64, but the SDNode requires an index type
8402 // suitable for the target. Convert the index as required.
8403 MVT VectorIdxTy = TLI.getVectorIdxTy(DAG.getDataLayout());
8404 if (Index.getValueType() != VectorIdxTy)
8405 Index = DAG.getVectorIdxConstant(Index->getAsZExtVal(), sdl);
8406
8407 setValue(&I,
8408 DAG.getNode(ISD::EXTRACT_SUBVECTOR, sdl, ResultVT, Vec, Index));
8409 return;
8410 }
8411 case Intrinsic::experimental_vector_match: {
8412 SDValue Op1 = getValue(I.getOperand(0));
8413 SDValue Op2 = getValue(I.getOperand(1));
8414 SDValue Mask = getValue(I.getOperand(2));
8415 EVT Op1VT = Op1.getValueType();
8416 EVT Op2VT = Op2.getValueType();
8417 EVT ResVT = Mask.getValueType();
8418 unsigned SearchSize = Op2VT.getVectorNumElements();
8419
8420 // If the target has native support for this vector match operation, lower
8421 // the intrinsic untouched; otherwise, expand it below.
8422 if (!TLI.shouldExpandVectorMatch(Op1VT, SearchSize)) {
8423 visitTargetIntrinsic(I, Intrinsic);
8424 return;
8425 }
8426
8427 SDValue Ret = DAG.getConstant(0, sdl, ResVT);
8428
8429 for (unsigned i = 0; i < SearchSize; ++i) {
8430 SDValue Op2Elem = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, sdl,
8431 Op2VT.getVectorElementType(), Op2,
8432 DAG.getVectorIdxConstant(i, sdl));
8433 SDValue Splat = DAG.getNode(ISD::SPLAT_VECTOR, sdl, Op1VT, Op2Elem);
8434 SDValue Cmp = DAG.getSetCC(sdl, ResVT, Op1, Splat, ISD::SETEQ);
8435 Ret = DAG.getNode(ISD::OR, sdl, ResVT, Ret, Cmp);
8436 }
8437
8438 setValue(&I, DAG.getNode(ISD::AND, sdl, ResVT, Ret, Mask));
8439 return;
8440 }
8441 case Intrinsic::vector_reverse:
8442 visitVectorReverse(I);
8443 return;
8444 case Intrinsic::vector_splice_left:
8445 case Intrinsic::vector_splice_right:
8446 visitVectorSplice(I);
8447 return;
8448 case Intrinsic::callbr_landingpad:
8449 visitCallBrLandingPad(I);
8450 return;
8451 case Intrinsic::vector_interleave2:
8452 visitVectorInterleave(I, 2);
8453 return;
8454 case Intrinsic::vector_interleave3:
8455 visitVectorInterleave(I, 3);
8456 return;
8457 case Intrinsic::vector_interleave4:
8458 visitVectorInterleave(I, 4);
8459 return;
8460 case Intrinsic::vector_interleave5:
8461 visitVectorInterleave(I, 5);
8462 return;
8463 case Intrinsic::vector_interleave6:
8464 visitVectorInterleave(I, 6);
8465 return;
8466 case Intrinsic::vector_interleave7:
8467 visitVectorInterleave(I, 7);
8468 return;
8469 case Intrinsic::vector_interleave8:
8470 visitVectorInterleave(I, 8);
8471 return;
8472 case Intrinsic::vector_deinterleave2:
8473 visitVectorDeinterleave(I, 2);
8474 return;
8475 case Intrinsic::vector_deinterleave3:
8476 visitVectorDeinterleave(I, 3);
8477 return;
8478 case Intrinsic::vector_deinterleave4:
8479 visitVectorDeinterleave(I, 4);
8480 return;
8481 case Intrinsic::vector_deinterleave5:
8482 visitVectorDeinterleave(I, 5);
8483 return;
8484 case Intrinsic::vector_deinterleave6:
8485 visitVectorDeinterleave(I, 6);
8486 return;
8487 case Intrinsic::vector_deinterleave7:
8488 visitVectorDeinterleave(I, 7);
8489 return;
8490 case Intrinsic::vector_deinterleave8:
8491 visitVectorDeinterleave(I, 8);
8492 return;
8493 case Intrinsic::experimental_vector_compress:
8494 setValue(&I, DAG.getNode(ISD::VECTOR_COMPRESS, sdl,
8495 getValue(I.getArgOperand(0)).getValueType(),
8496 getValue(I.getArgOperand(0)),
8497 getValue(I.getArgOperand(1)),
8498 getValue(I.getArgOperand(2)), Flags));
8499 return;
8500 case Intrinsic::experimental_convergence_anchor:
8501 case Intrinsic::experimental_convergence_entry:
8502 case Intrinsic::experimental_convergence_loop:
8503 visitConvergenceControl(I, Intrinsic);
8504 return;
8505 case Intrinsic::experimental_vector_histogram_add: {
8506 visitVectorHistogram(I, Intrinsic);
8507 return;
8508 }
8509 case Intrinsic::experimental_vector_extract_last_active: {
8510 visitVectorExtractLastActive(I, Intrinsic);
8511 return;
8512 }
8513 case Intrinsic::loop_dependence_war_mask:
8514 setValue(&I,
8516 EVT::getEVT(I.getType()), getValue(I.getOperand(0)),
8517 getValue(I.getOperand(1)), getValue(I.getOperand(2)),
8518 DAG.getConstant(0, sdl, MVT::i64)));
8519 return;
8520 case Intrinsic::loop_dependence_raw_mask:
8521 setValue(&I,
8523 EVT::getEVT(I.getType()), getValue(I.getOperand(0)),
8524 getValue(I.getOperand(1)), getValue(I.getOperand(2)),
8525 DAG.getConstant(0, sdl, MVT::i64)));
8526 return;
8527 }
8528}
8529
8530void SelectionDAGBuilder::pushFPOpOutChain(SDValue Result,
8532 assert(Result.getNode()->getNumValues() == 2);
8533 SDValue OutChain = Result.getValue(1);
8534 assert(OutChain.getValueType() == MVT::Other);
8535
8536 // Instead of updating the root immediately, push the produced chain to the
8537 // appropriate list, deferring the update until the root is requested. In this
8538 // case, the nodes from the lists are chained using TokenFactor, indicating
8539 // that the operations are independent.
8540 //
8541 // In particular, the root is updated before any call that might access the
8542 // floating-point environment, except for constrained intrinsics.
8543 switch (EB) {
8546 PendingConstrainedFP.push_back(OutChain);
8547 break;
8549 PendingConstrainedFPStrict.push_back(OutChain);
8550 break;
8551 }
8552}
8553
8554void SelectionDAGBuilder::visitConstrainedFPIntrinsic(
8555 const ConstrainedFPIntrinsic &FPI) {
8556 SDLoc sdl = getCurSDLoc();
8557
8558 // We do not need to serialize constrained FP intrinsics against
8559 // each other or against (nonvolatile) loads, so they can be
8560 // chained like loads.
8562 SDValue Chain = getFPOperationRoot(EB);
8564 Opers.push_back(Chain);
8565 for (unsigned I = 0, E = FPI.getNonMetadataArgCount(); I != E; ++I)
8566 Opers.push_back(getValue(FPI.getArgOperand(I)));
8567
8568 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8569 EVT VT = TLI.getValueType(DAG.getDataLayout(), FPI.getType());
8570 SDVTList VTs = DAG.getVTList(VT, MVT::Other);
8571
8572 SDNodeFlags Flags;
8574 Flags.setNoFPExcept(true);
8575
8576 if (auto *FPOp = dyn_cast<FPMathOperator>(&FPI))
8577 Flags.copyFMF(*FPOp);
8578
8579 unsigned Opcode;
8580 switch (FPI.getIntrinsicID()) {
8581 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
8582#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
8583 case Intrinsic::INTRINSIC: \
8584 Opcode = ISD::STRICT_##DAGN; \
8585 break;
8586#include "llvm/IR/ConstrainedOps.def"
8587 case Intrinsic::experimental_constrained_fmuladd: {
8588 Opcode = ISD::STRICT_FMA;
8589 // Break fmuladd into fmul and fadd.
8590 if (TM.Options.AllowFPOpFusion == FPOpFusion::Strict ||
8591 !TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), VT)) {
8592 Opers.pop_back();
8593 SDValue Mul = DAG.getNode(ISD::STRICT_FMUL, sdl, VTs, Opers, Flags);
8594 pushFPOpOutChain(Mul, EB);
8595 Opcode = ISD::STRICT_FADD;
8596 Opers.clear();
8597 Opers.push_back(Mul.getValue(1));
8598 Opers.push_back(Mul.getValue(0));
8599 Opers.push_back(getValue(FPI.getArgOperand(2)));
8600 }
8601 break;
8602 }
8603 }
8604
8605 // A few strict DAG nodes carry additional operands that are not
8606 // set up by the default code above.
8607 switch (Opcode) {
8608 default: break;
8610 Opers.push_back(
8611 DAG.getTargetConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout())));
8612 break;
8613 case ISD::STRICT_FSETCC:
8614 case ISD::STRICT_FSETCCS: {
8615 auto *FPCmp = dyn_cast<ConstrainedFPCmpIntrinsic>(&FPI);
8616 ISD::CondCode Condition = getFCmpCondCode(FPCmp->getPredicate());
8617 if (DAG.isKnownNeverNaN(Opers[1]) && DAG.isKnownNeverNaN(Opers[2]))
8618 Condition = getFCmpCodeWithoutNaN(Condition);
8619 Opers.push_back(DAG.getCondCode(Condition));
8620 break;
8621 }
8622 }
8623
8624 SDValue Result = DAG.getNode(Opcode, sdl, VTs, Opers, Flags);
8625 pushFPOpOutChain(Result, EB);
8626
8627 SDValue FPResult = Result.getValue(0);
8628 setValue(&FPI, FPResult);
8629}
8630
8631static unsigned getISDForVPIntrinsic(const VPIntrinsic &VPIntrin) {
8632 std::optional<unsigned> ResOPC;
8633 switch (VPIntrin.getIntrinsicID()) {
8634 case Intrinsic::vp_ctlz: {
8635 bool IsZeroUndef = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8636 ResOPC = IsZeroUndef ? ISD::VP_CTLZ_ZERO_UNDEF : ISD::VP_CTLZ;
8637 break;
8638 }
8639 case Intrinsic::vp_cttz: {
8640 bool IsZeroUndef = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8641 ResOPC = IsZeroUndef ? ISD::VP_CTTZ_ZERO_UNDEF : ISD::VP_CTTZ;
8642 break;
8643 }
8644 case Intrinsic::vp_cttz_elts: {
8645 bool IsZeroPoison = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8646 ResOPC = IsZeroPoison ? ISD::VP_CTTZ_ELTS_ZERO_UNDEF : ISD::VP_CTTZ_ELTS;
8647 break;
8648 }
8649#define HELPER_MAP_VPID_TO_VPSD(VPID, VPSD) \
8650 case Intrinsic::VPID: \
8651 ResOPC = ISD::VPSD; \
8652 break;
8653#include "llvm/IR/VPIntrinsics.def"
8654 }
8655
8656 if (!ResOPC)
8658 "Inconsistency: no SDNode available for this VPIntrinsic!");
8659
8660 if (*ResOPC == ISD::VP_REDUCE_SEQ_FADD ||
8661 *ResOPC == ISD::VP_REDUCE_SEQ_FMUL) {
8662 if (VPIntrin.getFastMathFlags().allowReassoc())
8663 return *ResOPC == ISD::VP_REDUCE_SEQ_FADD ? ISD::VP_REDUCE_FADD
8664 : ISD::VP_REDUCE_FMUL;
8665 }
8666
8667 return *ResOPC;
8668}
8669
8670void SelectionDAGBuilder::visitVPLoad(
8671 const VPIntrinsic &VPIntrin, EVT VT,
8672 const SmallVectorImpl<SDValue> &OpValues) {
8673 SDLoc DL = getCurSDLoc();
8674 Value *PtrOperand = VPIntrin.getArgOperand(0);
8675 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8676 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8677 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8678 SDValue LD;
8679 // Do not serialize variable-length loads of constant memory with
8680 // anything.
8681 if (!Alignment)
8682 Alignment = DAG.getEVTAlign(VT);
8683 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8684 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8685 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8686 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8687 MachineMemOperand::Flags MMOFlags =
8688 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8689 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8690 MachinePointerInfo(PtrOperand), MMOFlags,
8691 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo, Ranges);
8692 LD = DAG.getLoadVP(VT, DL, InChain, OpValues[0], OpValues[1], OpValues[2],
8693 MMO, false /*IsExpanding */);
8694 if (AddToChain)
8695 PendingLoads.push_back(LD.getValue(1));
8696 setValue(&VPIntrin, LD);
8697}
8698
8699void SelectionDAGBuilder::visitVPLoadFF(
8700 const VPIntrinsic &VPIntrin, EVT VT, EVT EVLVT,
8701 const SmallVectorImpl<SDValue> &OpValues) {
8702 assert(OpValues.size() == 3 && "Unexpected number of operands");
8703 SDLoc DL = getCurSDLoc();
8704 Value *PtrOperand = VPIntrin.getArgOperand(0);
8705 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8706 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8707 const MDNode *Ranges = VPIntrin.getMetadata(LLVMContext::MD_range);
8708 SDValue LD;
8709 // Do not serialize variable-length loads of constant memory with
8710 // anything.
8711 if (!Alignment)
8712 Alignment = DAG.getEVTAlign(VT);
8713 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8714 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8715 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8716 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8717 MachinePointerInfo(PtrOperand), MachineMemOperand::MOLoad,
8718 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo, Ranges);
8719 LD = DAG.getLoadFFVP(VT, DL, InChain, OpValues[0], OpValues[1], OpValues[2],
8720 MMO);
8721 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, EVLVT, LD.getValue(1));
8722 if (AddToChain)
8723 PendingLoads.push_back(LD.getValue(2));
8724 setValue(&VPIntrin, DAG.getMergeValues({LD.getValue(0), Trunc}, DL));
8725}
8726
8727void SelectionDAGBuilder::visitVPGather(
8728 const VPIntrinsic &VPIntrin, EVT VT,
8729 const SmallVectorImpl<SDValue> &OpValues) {
8730 SDLoc DL = getCurSDLoc();
8731 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8732 Value *PtrOperand = VPIntrin.getArgOperand(0);
8733 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8734 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8735 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8736 SDValue LD;
8737 if (!Alignment)
8738 Alignment = DAG.getEVTAlign(VT.getScalarType());
8739 unsigned AS =
8740 PtrOperand->getType()->getScalarType()->getPointerAddressSpace();
8741 MachineMemOperand::Flags MMOFlags =
8742 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8743 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8744 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8745 *Alignment, AAInfo, Ranges);
8746 SDValue Base, Index, Scale;
8747 bool UniformBase =
8748 getUniformBase(PtrOperand, Base, Index, Scale, this, VPIntrin.getParent(),
8749 VT.getScalarStoreSize());
8750 if (!UniformBase) {
8751 Base = DAG.getConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout()));
8752 Index = getValue(PtrOperand);
8753 Scale = DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout()));
8754 }
8755 EVT IdxVT = Index.getValueType();
8756 EVT EltTy = IdxVT.getVectorElementType();
8757 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
8758 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
8759 Index = DAG.getNode(ISD::SIGN_EXTEND, DL, NewIdxVT, Index);
8760 }
8761 LD = DAG.getGatherVP(
8762 DAG.getVTList(VT, MVT::Other), VT, DL,
8763 {DAG.getRoot(), Base, Index, Scale, OpValues[1], OpValues[2]}, MMO,
8765 PendingLoads.push_back(LD.getValue(1));
8766 setValue(&VPIntrin, LD);
8767}
8768
8769void SelectionDAGBuilder::visitVPStore(
8770 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8771 SDLoc DL = getCurSDLoc();
8772 Value *PtrOperand = VPIntrin.getArgOperand(1);
8773 EVT VT = OpValues[0].getValueType();
8774 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8775 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8776 SDValue ST;
8777 if (!Alignment)
8778 Alignment = DAG.getEVTAlign(VT);
8779 SDValue Ptr = OpValues[1];
8780 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
8781 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8782 MachineMemOperand::Flags MMOFlags =
8783 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8784 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8785 MachinePointerInfo(PtrOperand), MMOFlags,
8786 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo);
8787 ST = DAG.getStoreVP(getMemoryRoot(), DL, OpValues[0], Ptr, Offset,
8788 OpValues[2], OpValues[3], VT, MMO, ISD::UNINDEXED,
8789 /* IsTruncating */ false, /*IsCompressing*/ false);
8790 DAG.setRoot(ST);
8791 setValue(&VPIntrin, ST);
8792}
8793
8794void SelectionDAGBuilder::visitVPScatter(
8795 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8796 SDLoc DL = getCurSDLoc();
8797 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8798 Value *PtrOperand = VPIntrin.getArgOperand(1);
8799 EVT VT = OpValues[0].getValueType();
8800 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8801 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8802 SDValue ST;
8803 if (!Alignment)
8804 Alignment = DAG.getEVTAlign(VT.getScalarType());
8805 unsigned AS =
8806 PtrOperand->getType()->getScalarType()->getPointerAddressSpace();
8807 MachineMemOperand::Flags MMOFlags =
8808 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8809 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8810 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8811 *Alignment, AAInfo);
8812 SDValue Base, Index, Scale;
8813 bool UniformBase =
8814 getUniformBase(PtrOperand, Base, Index, Scale, this, VPIntrin.getParent(),
8815 VT.getScalarStoreSize());
8816 if (!UniformBase) {
8817 Base = DAG.getConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout()));
8818 Index = getValue(PtrOperand);
8819 Scale = DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout()));
8820 }
8821 EVT IdxVT = Index.getValueType();
8822 EVT EltTy = IdxVT.getVectorElementType();
8823 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
8824 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
8825 Index = DAG.getNode(ISD::SIGN_EXTEND, DL, NewIdxVT, Index);
8826 }
8827 ST = DAG.getScatterVP(DAG.getVTList(MVT::Other), VT, DL,
8828 {getMemoryRoot(), OpValues[0], Base, Index, Scale,
8829 OpValues[2], OpValues[3]},
8830 MMO, ISD::SIGNED_SCALED);
8831 DAG.setRoot(ST);
8832 setValue(&VPIntrin, ST);
8833}
8834
8835void SelectionDAGBuilder::visitVPStridedLoad(
8836 const VPIntrinsic &VPIntrin, EVT VT,
8837 const SmallVectorImpl<SDValue> &OpValues) {
8838 SDLoc DL = getCurSDLoc();
8839 Value *PtrOperand = VPIntrin.getArgOperand(0);
8840 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8841 if (!Alignment)
8842 Alignment = DAG.getEVTAlign(VT.getScalarType());
8843 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8844 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8845 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8846 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8847 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8848 unsigned AS = PtrOperand->getType()->getPointerAddressSpace();
8849 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8850 MachineMemOperand::Flags MMOFlags =
8851 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8852 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8853 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8854 *Alignment, AAInfo, Ranges);
8855
8856 SDValue LD = DAG.getStridedLoadVP(VT, DL, InChain, OpValues[0], OpValues[1],
8857 OpValues[2], OpValues[3], MMO,
8858 false /*IsExpanding*/);
8859
8860 if (AddToChain)
8861 PendingLoads.push_back(LD.getValue(1));
8862 setValue(&VPIntrin, LD);
8863}
8864
8865void SelectionDAGBuilder::visitVPStridedStore(
8866 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8867 SDLoc DL = getCurSDLoc();
8868 Value *PtrOperand = VPIntrin.getArgOperand(1);
8869 EVT VT = OpValues[0].getValueType();
8870 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8871 if (!Alignment)
8872 Alignment = DAG.getEVTAlign(VT.getScalarType());
8873 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8874 unsigned AS = PtrOperand->getType()->getPointerAddressSpace();
8875 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8876 MachineMemOperand::Flags MMOFlags =
8877 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8878 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8879 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8880 *Alignment, AAInfo);
8881
8882 SDValue ST = DAG.getStridedStoreVP(
8883 getMemoryRoot(), DL, OpValues[0], OpValues[1],
8884 DAG.getUNDEF(OpValues[1].getValueType()), OpValues[2], OpValues[3],
8885 OpValues[4], VT, MMO, ISD::UNINDEXED, /*IsTruncating*/ false,
8886 /*IsCompressing*/ false);
8887
8888 DAG.setRoot(ST);
8889 setValue(&VPIntrin, ST);
8890}
8891
8892void SelectionDAGBuilder::visitVPCmp(const VPCmpIntrinsic &VPIntrin) {
8893 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8894 SDLoc DL = getCurSDLoc();
8895
8896 ISD::CondCode Condition;
8898 bool IsFP = VPIntrin.getOperand(0)->getType()->isFPOrFPVectorTy();
8899 Condition = IsFP ? getFCmpCondCode(CondCode) : getICmpCondCode(CondCode);
8900
8901 SDValue Op1 = getValue(VPIntrin.getOperand(0));
8902 SDValue Op2 = getValue(VPIntrin.getOperand(1));
8903 // #2 is the condition code
8904 SDValue MaskOp = getValue(VPIntrin.getOperand(3));
8905 SDValue EVL = getValue(VPIntrin.getOperand(4));
8906 MVT EVLParamVT = TLI.getVPExplicitVectorLengthTy();
8907 assert(EVLParamVT.isScalarInteger() && EVLParamVT.bitsGE(MVT::i32) &&
8908 "Unexpected target EVL type");
8909 EVL = DAG.getNode(ISD::ZERO_EXTEND, DL, EVLParamVT, EVL);
8910
8911 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
8912 VPIntrin.getType());
8913 if (DAG.isKnownNeverNaN(Op1) && DAG.isKnownNeverNaN(Op2))
8914 Condition = getFCmpCodeWithoutNaN(Condition);
8915 setValue(&VPIntrin,
8916 DAG.getSetCCVP(DL, DestVT, Op1, Op2, Condition, MaskOp, EVL));
8917}
8918
8919void SelectionDAGBuilder::visitVectorPredicationIntrinsic(
8920 const VPIntrinsic &VPIntrin) {
8921 SDLoc DL = getCurSDLoc();
8922 unsigned Opcode = getISDForVPIntrinsic(VPIntrin);
8923
8924 auto IID = VPIntrin.getIntrinsicID();
8925
8926 if (const auto *CmpI = dyn_cast<VPCmpIntrinsic>(&VPIntrin))
8927 return visitVPCmp(*CmpI);
8928
8929 SmallVector<EVT, 4> ValueVTs;
8930 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8931 ComputeValueVTs(TLI, DAG.getDataLayout(), VPIntrin.getType(), ValueVTs);
8932 SDVTList VTs = DAG.getVTList(ValueVTs);
8933
8934 auto EVLParamPos = VPIntrinsic::getVectorLengthParamPos(IID);
8935
8936 MVT EVLParamVT = TLI.getVPExplicitVectorLengthTy();
8937 assert(EVLParamVT.isScalarInteger() && EVLParamVT.bitsGE(MVT::i32) &&
8938 "Unexpected target EVL type");
8939
8940 // Request operands.
8941 SmallVector<SDValue, 7> OpValues;
8942 for (unsigned I = 0; I < VPIntrin.arg_size(); ++I) {
8943 auto Op = getValue(VPIntrin.getArgOperand(I));
8944 if (I == EVLParamPos)
8945 Op = DAG.getNode(ISD::ZERO_EXTEND, DL, EVLParamVT, Op);
8946 OpValues.push_back(Op);
8947 }
8948
8949 switch (Opcode) {
8950 default: {
8951 SDNodeFlags SDFlags;
8952 if (auto *FPMO = dyn_cast<FPMathOperator>(&VPIntrin))
8953 SDFlags.copyFMF(*FPMO);
8954 SDValue Result = DAG.getNode(Opcode, DL, VTs, OpValues, SDFlags);
8955 setValue(&VPIntrin, Result);
8956 break;
8957 }
8958 case ISD::VP_LOAD:
8959 visitVPLoad(VPIntrin, ValueVTs[0], OpValues);
8960 break;
8961 case ISD::VP_LOAD_FF:
8962 visitVPLoadFF(VPIntrin, ValueVTs[0], ValueVTs[1], OpValues);
8963 break;
8964 case ISD::VP_GATHER:
8965 visitVPGather(VPIntrin, ValueVTs[0], OpValues);
8966 break;
8967 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
8968 visitVPStridedLoad(VPIntrin, ValueVTs[0], OpValues);
8969 break;
8970 case ISD::VP_STORE:
8971 visitVPStore(VPIntrin, OpValues);
8972 break;
8973 case ISD::VP_SCATTER:
8974 visitVPScatter(VPIntrin, OpValues);
8975 break;
8976 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
8977 visitVPStridedStore(VPIntrin, OpValues);
8978 break;
8979 case ISD::VP_FMULADD: {
8980 assert(OpValues.size() == 5 && "Unexpected number of operands");
8981 SDNodeFlags SDFlags;
8982 if (auto *FPMO = dyn_cast<FPMathOperator>(&VPIntrin))
8983 SDFlags.copyFMF(*FPMO);
8984 if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
8985 TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), ValueVTs[0])) {
8986 setValue(&VPIntrin, DAG.getNode(ISD::VP_FMA, DL, VTs, OpValues, SDFlags));
8987 } else {
8988 SDValue Mul = DAG.getNode(
8989 ISD::VP_FMUL, DL, VTs,
8990 {OpValues[0], OpValues[1], OpValues[3], OpValues[4]}, SDFlags);
8991 SDValue Add =
8992 DAG.getNode(ISD::VP_FADD, DL, VTs,
8993 {Mul, OpValues[2], OpValues[3], OpValues[4]}, SDFlags);
8994 setValue(&VPIntrin, Add);
8995 }
8996 break;
8997 }
8998 case ISD::VP_IS_FPCLASS: {
8999 const DataLayout DLayout = DAG.getDataLayout();
9000 EVT DestVT = TLI.getValueType(DLayout, VPIntrin.getType());
9001 auto Constant = OpValues[1]->getAsZExtVal();
9002 SDValue Check = DAG.getTargetConstant(Constant, DL, MVT::i32);
9003 SDValue V = DAG.getNode(ISD::VP_IS_FPCLASS, DL, DestVT,
9004 {OpValues[0], Check, OpValues[2], OpValues[3]});
9005 setValue(&VPIntrin, V);
9006 return;
9007 }
9008 case ISD::VP_INTTOPTR: {
9009 SDValue N = OpValues[0];
9010 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), VPIntrin.getType());
9011 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(), VPIntrin.getType());
9012 N = DAG.getVPPtrExtOrTrunc(getCurSDLoc(), DestVT, N, OpValues[1],
9013 OpValues[2]);
9014 N = DAG.getVPZExtOrTrunc(getCurSDLoc(), PtrMemVT, N, OpValues[1],
9015 OpValues[2]);
9016 setValue(&VPIntrin, N);
9017 break;
9018 }
9019 case ISD::VP_PTRTOINT: {
9020 SDValue N = OpValues[0];
9021 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9022 VPIntrin.getType());
9023 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(),
9024 VPIntrin.getOperand(0)->getType());
9025 N = DAG.getVPPtrExtOrTrunc(getCurSDLoc(), PtrMemVT, N, OpValues[1],
9026 OpValues[2]);
9027 N = DAG.getVPZExtOrTrunc(getCurSDLoc(), DestVT, N, OpValues[1],
9028 OpValues[2]);
9029 setValue(&VPIntrin, N);
9030 break;
9031 }
9032 case ISD::VP_ABS:
9033 case ISD::VP_CTLZ:
9034 case ISD::VP_CTLZ_ZERO_UNDEF:
9035 case ISD::VP_CTTZ:
9036 case ISD::VP_CTTZ_ZERO_UNDEF:
9037 case ISD::VP_CTTZ_ELTS_ZERO_UNDEF:
9038 case ISD::VP_CTTZ_ELTS: {
9039 SDValue Result =
9040 DAG.getNode(Opcode, DL, VTs, {OpValues[0], OpValues[2], OpValues[3]});
9041 setValue(&VPIntrin, Result);
9042 break;
9043 }
9044 }
9045}
9046
9047SDValue SelectionDAGBuilder::lowerStartEH(SDValue Chain,
9048 const BasicBlock *EHPadBB,
9049 MCSymbol *&BeginLabel) {
9050 MachineFunction &MF = DAG.getMachineFunction();
9051
9052 // Insert a label before the invoke call to mark the try range. This can be
9053 // used to detect deletion of the invoke via the MachineModuleInfo.
9054 BeginLabel = MF.getContext().createTempSymbol();
9055
9056 // For SjLj, keep track of which landing pads go with which invokes
9057 // so as to maintain the ordering of pads in the LSDA.
9058 unsigned CallSiteIndex = FuncInfo.getCurrentCallSite();
9059 if (CallSiteIndex) {
9060 MF.setCallSiteBeginLabel(BeginLabel, CallSiteIndex);
9061 LPadToCallSiteMap[FuncInfo.getMBB(EHPadBB)].push_back(CallSiteIndex);
9062
9063 // Now that the call site is handled, stop tracking it.
9064 FuncInfo.setCurrentCallSite(0);
9065 }
9066
9067 return DAG.getEHLabel(getCurSDLoc(), Chain, BeginLabel);
9068}
9069
9070SDValue SelectionDAGBuilder::lowerEndEH(SDValue Chain, const InvokeInst *II,
9071 const BasicBlock *EHPadBB,
9072 MCSymbol *BeginLabel) {
9073 assert(BeginLabel && "BeginLabel should've been set");
9074
9075 MachineFunction &MF = DAG.getMachineFunction();
9076
9077 // Insert a label at the end of the invoke call to mark the try range. This
9078 // can be used to detect deletion of the invoke via the MachineModuleInfo.
9079 MCSymbol *EndLabel = MF.getContext().createTempSymbol();
9080 Chain = DAG.getEHLabel(getCurSDLoc(), Chain, EndLabel);
9081
9082 // Inform MachineModuleInfo of range.
9083 auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn());
9084 // There is a platform (e.g. wasm) that uses funclet style IR but does not
9085 // actually use outlined funclets and their LSDA info style.
9086 if (MF.hasEHFunclets() && isFuncletEHPersonality(Pers)) {
9087 assert(II && "II should've been set");
9088 WinEHFuncInfo *EHInfo = MF.getWinEHFuncInfo();
9089 EHInfo->addIPToStateRange(II, BeginLabel, EndLabel);
9090 } else if (!isScopedEHPersonality(Pers)) {
9091 assert(EHPadBB);
9092 MF.addInvoke(FuncInfo.getMBB(EHPadBB), BeginLabel, EndLabel);
9093 }
9094
9095 return Chain;
9096}
9097
9098std::pair<SDValue, SDValue>
9100 const BasicBlock *EHPadBB) {
9101 MCSymbol *BeginLabel = nullptr;
9102
9103 if (EHPadBB) {
9104 // Both PendingLoads and PendingExports must be flushed here;
9105 // this call might not return.
9106 (void)getRoot();
9107 DAG.setRoot(lowerStartEH(getControlRoot(), EHPadBB, BeginLabel));
9108 CLI.setChain(getRoot());
9109 }
9110
9111 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9112 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
9113
9114 assert((CLI.IsTailCall || Result.second.getNode()) &&
9115 "Non-null chain expected with non-tail call!");
9116 assert((Result.second.getNode() || !Result.first.getNode()) &&
9117 "Null value expected with tail call!");
9118
9119 if (!Result.second.getNode()) {
9120 // As a special case, a null chain means that a tail call has been emitted
9121 // and the DAG root is already updated.
9122 HasTailCall = true;
9123
9124 // Since there's no actual continuation from this block, nothing can be
9125 // relying on us setting vregs for them.
9126 PendingExports.clear();
9127 } else {
9128 DAG.setRoot(Result.second);
9129 }
9130
9131 if (EHPadBB) {
9132 DAG.setRoot(lowerEndEH(getRoot(), cast_or_null<InvokeInst>(CLI.CB), EHPadBB,
9133 BeginLabel));
9134 Result.second = getRoot();
9135 }
9136
9137 return Result;
9138}
9139
9141 bool isMustTailCall = CB.isMustTailCall();
9142
9143 // Avoid emitting tail calls in functions with the disable-tail-calls
9144 // attribute.
9145 const Function *Caller = CB.getParent()->getParent();
9146 if (!isMustTailCall &&
9147 Caller->getFnAttribute("disable-tail-calls").getValueAsBool())
9148 return false;
9149
9150 // We can't tail call inside a function with a swifterror argument. Lowering
9151 // does not support this yet. It would have to move into the swifterror
9152 // register before the call.
9153 if (DAG.getTargetLoweringInfo().supportSwiftError() &&
9154 Caller->getAttributes().hasAttrSomewhere(Attribute::SwiftError))
9155 return false;
9156
9157 // Check if target-independent constraints permit a tail call here.
9158 // Target-dependent constraints are checked within TLI->LowerCallTo.
9159 return isInTailCallPosition(CB, DAG.getTarget());
9160}
9161
9163 bool isTailCall, bool isMustTailCall,
9164 const BasicBlock *EHPadBB,
9165 const TargetLowering::PtrAuthInfo *PAI) {
9166 auto &DL = DAG.getDataLayout();
9167 FunctionType *FTy = CB.getFunctionType();
9168 Type *RetTy = CB.getType();
9169
9171 Args.reserve(CB.arg_size());
9172
9173 const Value *SwiftErrorVal = nullptr;
9174 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9175
9176 if (isTailCall)
9177 isTailCall = canTailCall(CB);
9178
9179 for (auto I = CB.arg_begin(), E = CB.arg_end(); I != E; ++I) {
9180 const Value *V = *I;
9181
9182 // Skip empty types
9183 if (V->getType()->isEmptyTy())
9184 continue;
9185
9186 SDValue ArgNode = getValue(V);
9187 TargetLowering::ArgListEntry Entry(ArgNode, V->getType());
9188 Entry.setAttributes(&CB, I - CB.arg_begin());
9189
9190 // Use swifterror virtual register as input to the call.
9191 if (Entry.IsSwiftError && TLI.supportSwiftError()) {
9192 SwiftErrorVal = V;
9193 // We find the virtual register for the actual swifterror argument.
9194 // Instead of using the Value, we use the virtual register instead.
9195 Entry.Node =
9196 DAG.getRegister(SwiftError.getOrCreateVRegUseAt(&CB, FuncInfo.MBB, V),
9197 EVT(TLI.getPointerTy(DL)));
9198 }
9199
9200 Args.push_back(Entry);
9201
9202 // If we have an explicit sret argument that is an Instruction, (i.e., it
9203 // might point to function-local memory), we can't meaningfully tail-call.
9204 if (Entry.IsSRet && isa<Instruction>(V))
9205 isTailCall = false;
9206 }
9207
9208 // If call site has a cfguardtarget operand bundle, create and add an
9209 // additional ArgListEntry.
9210 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_cfguardtarget)) {
9211 Value *V = Bundle->Inputs[0];
9213 Entry.IsCFGuardTarget = true;
9214 Args.push_back(Entry);
9215 }
9216
9217 // Disable tail calls if there is an swifterror argument. Targets have not
9218 // been updated to support tail calls.
9219 if (TLI.supportSwiftError() && SwiftErrorVal)
9220 isTailCall = false;
9221
9222 ConstantInt *CFIType = nullptr;
9223 if (CB.isIndirectCall()) {
9224 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_kcfi)) {
9225 if (!TLI.supportKCFIBundles())
9227 "Target doesn't support calls with kcfi operand bundles.");
9228 CFIType = cast<ConstantInt>(Bundle->Inputs[0]);
9229 assert(CFIType->getType()->isIntegerTy(32) && "Invalid CFI type");
9230 }
9231 }
9232
9233 SDValue ConvControlToken;
9234 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_convergencectrl)) {
9235 auto *Token = Bundle->Inputs[0].get();
9236 ConvControlToken = getValue(Token);
9237 }
9238
9239 GlobalValue *DeactivationSymbol = nullptr;
9241 DeactivationSymbol = cast<GlobalValue>(Bundle->Inputs[0].get());
9242 }
9243
9246 .setChain(getRoot())
9247 .setCallee(RetTy, FTy, Callee, std::move(Args), CB)
9248 .setTailCall(isTailCall)
9252 .setCFIType(CFIType)
9253 .setConvergenceControlToken(ConvControlToken)
9254 .setDeactivationSymbol(DeactivationSymbol);
9255
9256 // Set the pointer authentication info if we have it.
9257 if (PAI) {
9258 if (!TLI.supportPtrAuthBundles())
9260 "This target doesn't support calls with ptrauth operand bundles.");
9261 CLI.setPtrAuth(*PAI);
9262 }
9263
9264 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
9265
9266 if (Result.first.getNode()) {
9267 Result.first = lowerRangeToAssertZExt(DAG, CB, Result.first);
9268 Result.first = lowerNoFPClassToAssertNoFPClass(DAG, CB, Result.first);
9269 setValue(&CB, Result.first);
9270 }
9271
9272 // The last element of CLI.InVals has the SDValue for swifterror return.
9273 // Here we copy it to a virtual register and update SwiftErrorMap for
9274 // book-keeping.
9275 if (SwiftErrorVal && TLI.supportSwiftError()) {
9276 // Get the last element of InVals.
9277 SDValue Src = CLI.InVals.back();
9278 Register VReg =
9279 SwiftError.getOrCreateVRegDefAt(&CB, FuncInfo.MBB, SwiftErrorVal);
9280 SDValue CopyNode = CLI.DAG.getCopyToReg(Result.second, CLI.DL, VReg, Src);
9281 DAG.setRoot(CopyNode);
9282 }
9283}
9284
9285static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT,
9286 SelectionDAGBuilder &Builder) {
9287 // Check to see if this load can be trivially constant folded, e.g. if the
9288 // input is from a string literal.
9289 if (const Constant *LoadInput = dyn_cast<Constant>(PtrVal)) {
9290 // Cast pointer to the type we really want to load.
9291 Type *LoadTy =
9292 Type::getIntNTy(PtrVal->getContext(), LoadVT.getScalarSizeInBits());
9293 if (LoadVT.isVector())
9294 LoadTy = FixedVectorType::get(LoadTy, LoadVT.getVectorNumElements());
9295 if (const Constant *LoadCst =
9296 ConstantFoldLoadFromConstPtr(const_cast<Constant *>(LoadInput),
9297 LoadTy, Builder.DAG.getDataLayout()))
9298 return Builder.getValue(LoadCst);
9299 }
9300
9301 // Otherwise, we have to emit the load. If the pointer is to unfoldable but
9302 // still constant memory, the input chain can be the entry node.
9303 SDValue Root;
9304 bool ConstantMemory = false;
9305
9306 // Do not serialize (non-volatile) loads of constant memory with anything.
9307 if (Builder.BatchAA && Builder.BatchAA->pointsToConstantMemory(PtrVal)) {
9308 Root = Builder.DAG.getEntryNode();
9309 ConstantMemory = true;
9310 } else {
9311 // Do not serialize non-volatile loads against each other.
9312 Root = Builder.DAG.getRoot();
9313 }
9314
9315 SDValue Ptr = Builder.getValue(PtrVal);
9316 SDValue LoadVal =
9317 Builder.DAG.getLoad(LoadVT, Builder.getCurSDLoc(), Root, Ptr,
9318 MachinePointerInfo(PtrVal), Align(1));
9319
9320 if (!ConstantMemory)
9321 Builder.PendingLoads.push_back(LoadVal.getValue(1));
9322 return LoadVal;
9323}
9324
9325/// Record the value for an instruction that produces an integer result,
9326/// converting the type where necessary.
9327void SelectionDAGBuilder::processIntegerCallValue(const Instruction &I,
9328 SDValue Value,
9329 bool IsSigned) {
9330 EVT VT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9331 I.getType(), true);
9332 Value = DAG.getExtOrTrunc(IsSigned, Value, getCurSDLoc(), VT);
9333 setValue(&I, Value);
9334}
9335
9336/// See if we can lower a memcmp/bcmp call into an optimized form. If so, return
9337/// true and lower it. Otherwise return false, and it will be lowered like a
9338/// normal call.
9339/// The caller already checked that \p I calls the appropriate LibFunc with a
9340/// correct prototype.
9341bool SelectionDAGBuilder::visitMemCmpBCmpCall(const CallInst &I) {
9342 const Value *LHS = I.getArgOperand(0), *RHS = I.getArgOperand(1);
9343 const Value *Size = I.getArgOperand(2);
9344 const ConstantSDNode *CSize = dyn_cast<ConstantSDNode>(getValue(Size));
9345 if (CSize && CSize->getZExtValue() == 0) {
9346 EVT CallVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9347 I.getType(), true);
9348 setValue(&I, DAG.getConstant(0, getCurSDLoc(), CallVT));
9349 return true;
9350 }
9351
9352 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9353 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForMemcmp(
9354 DAG, getCurSDLoc(), DAG.getRoot(), getValue(LHS), getValue(RHS),
9355 getValue(Size), &I);
9356 if (Res.first.getNode()) {
9357 processIntegerCallValue(I, Res.first, true);
9358 PendingLoads.push_back(Res.second);
9359 return true;
9360 }
9361
9362 // memcmp(S1,S2,2) != 0 -> (*(short*)LHS != *(short*)RHS) != 0
9363 // memcmp(S1,S2,4) != 0 -> (*(int*)LHS != *(int*)RHS) != 0
9364 if (!CSize || !isOnlyUsedInZeroEqualityComparison(&I))
9365 return false;
9366
9367 // If the target has a fast compare for the given size, it will return a
9368 // preferred load type for that size. Require that the load VT is legal and
9369 // that the target supports unaligned loads of that type. Otherwise, return
9370 // INVALID.
9371 auto hasFastLoadsAndCompare = [&](unsigned NumBits) {
9372 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9373 MVT LVT = TLI.hasFastEqualityCompare(NumBits);
9374 if (LVT != MVT::INVALID_SIMPLE_VALUE_TYPE) {
9375 // TODO: Handle 5 byte compare as 4-byte + 1 byte.
9376 // TODO: Handle 8 byte compare on x86-32 as two 32-bit loads.
9377 // TODO: Check alignment of src and dest ptrs.
9378 unsigned DstAS = LHS->getType()->getPointerAddressSpace();
9379 unsigned SrcAS = RHS->getType()->getPointerAddressSpace();
9380 if (!TLI.isTypeLegal(LVT) ||
9381 !TLI.allowsMisalignedMemoryAccesses(LVT, SrcAS) ||
9382 !TLI.allowsMisalignedMemoryAccesses(LVT, DstAS))
9384 }
9385
9386 return LVT;
9387 };
9388
9389 // This turns into unaligned loads. We only do this if the target natively
9390 // supports the MVT we'll be loading or if it is small enough (<= 4) that
9391 // we'll only produce a small number of byte loads.
9392 MVT LoadVT;
9393 unsigned NumBitsToCompare = CSize->getZExtValue() * 8;
9394 switch (NumBitsToCompare) {
9395 default:
9396 return false;
9397 case 16:
9398 LoadVT = MVT::i16;
9399 break;
9400 case 32:
9401 LoadVT = MVT::i32;
9402 break;
9403 case 64:
9404 case 128:
9405 case 256:
9406 LoadVT = hasFastLoadsAndCompare(NumBitsToCompare);
9407 break;
9408 }
9409
9410 if (LoadVT == MVT::INVALID_SIMPLE_VALUE_TYPE)
9411 return false;
9412
9413 SDValue LoadL = getMemCmpLoad(LHS, LoadVT, *this);
9414 SDValue LoadR = getMemCmpLoad(RHS, LoadVT, *this);
9415
9416 // Bitcast to a wide integer type if the loads are vectors.
9417 if (LoadVT.isVector()) {
9418 EVT CmpVT = EVT::getIntegerVT(LHS->getContext(), LoadVT.getSizeInBits());
9419 LoadL = DAG.getBitcast(CmpVT, LoadL);
9420 LoadR = DAG.getBitcast(CmpVT, LoadR);
9421 }
9422
9423 SDValue Cmp = DAG.getSetCC(getCurSDLoc(), MVT::i1, LoadL, LoadR, ISD::SETNE);
9424 processIntegerCallValue(I, Cmp, false);
9425 return true;
9426}
9427
9428/// See if we can lower a memchr call into an optimized form. If so, return
9429/// true and lower it. Otherwise return false, and it will be lowered like a
9430/// normal call.
9431/// The caller already checked that \p I calls the appropriate LibFunc with a
9432/// correct prototype.
9433bool SelectionDAGBuilder::visitMemChrCall(const CallInst &I) {
9434 const Value *Src = I.getArgOperand(0);
9435 const Value *Char = I.getArgOperand(1);
9436 const Value *Length = I.getArgOperand(2);
9437
9438 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9439 std::pair<SDValue, SDValue> Res =
9440 TSI.EmitTargetCodeForMemchr(DAG, getCurSDLoc(), DAG.getRoot(),
9441 getValue(Src), getValue(Char), getValue(Length),
9442 MachinePointerInfo(Src));
9443 if (Res.first.getNode()) {
9444 setValue(&I, Res.first);
9445 PendingLoads.push_back(Res.second);
9446 return true;
9447 }
9448
9449 return false;
9450}
9451
9452/// See if we can lower a memccpy call into an optimized form. If so, return
9453/// true and lower it, otherwise return false and it will be lowered like a
9454/// normal call.
9455/// The caller already checked that \p I calls the appropriate LibFunc with a
9456/// correct prototype.
9457bool SelectionDAGBuilder::visitMemCCpyCall(const CallInst &I) {
9458 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9459 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForMemccpy(
9460 DAG, getCurSDLoc(), DAG.getRoot(), getValue(I.getArgOperand(0)),
9461 getValue(I.getArgOperand(1)), getValue(I.getArgOperand(2)),
9462 getValue(I.getArgOperand(3)), &I);
9463
9464 if (Res.first) {
9465 processIntegerCallValue(I, Res.first, true);
9466 PendingLoads.push_back(Res.second);
9467 return true;
9468 }
9469 return false;
9470}
9471
9472/// See if we can lower a mempcpy call into an optimized form. If so, return
9473/// true and lower it. Otherwise return false, and it will be lowered like a
9474/// normal call.
9475/// The caller already checked that \p I calls the appropriate LibFunc with a
9476/// correct prototype.
9477bool SelectionDAGBuilder::visitMemPCpyCall(const CallInst &I) {
9478 SDValue Dst = getValue(I.getArgOperand(0));
9479 SDValue Src = getValue(I.getArgOperand(1));
9480 SDValue Size = getValue(I.getArgOperand(2));
9481
9482 Align DstAlign = DAG.InferPtrAlign(Dst).valueOrOne();
9483 Align SrcAlign = DAG.InferPtrAlign(Src).valueOrOne();
9484 // DAG::getMemcpy needs Alignment to be defined.
9485 Align Alignment = std::min(DstAlign, SrcAlign);
9486
9487 SDLoc sdl = getCurSDLoc();
9488
9489 // In the mempcpy context we need to pass in a false value for isTailCall
9490 // because the return pointer needs to be adjusted by the size of
9491 // the copied memory.
9492 SDValue Root = getMemoryRoot();
9493 SDValue MC = DAG.getMemcpy(
9494 Root, sdl, Dst, Src, Size, Alignment, false, false, /*CI=*/nullptr,
9495 std::nullopt, MachinePointerInfo(I.getArgOperand(0)),
9496 MachinePointerInfo(I.getArgOperand(1)), I.getAAMetadata());
9497 assert(MC.getNode() != nullptr &&
9498 "** memcpy should not be lowered as TailCall in mempcpy context **");
9499 DAG.setRoot(MC);
9500
9501 // Check if Size needs to be truncated or extended.
9502 Size = DAG.getSExtOrTrunc(Size, sdl, Dst.getValueType());
9503
9504 // Adjust return pointer to point just past the last dst byte.
9505 SDValue DstPlusSize = DAG.getMemBasePlusOffset(Dst, Size, sdl);
9506 setValue(&I, DstPlusSize);
9507 return true;
9508}
9509
9510/// See if we can lower a strcpy call into an optimized form. If so, return
9511/// true and lower it, otherwise return false and it will be lowered like a
9512/// normal call.
9513/// The caller already checked that \p I calls the appropriate LibFunc with a
9514/// correct prototype.
9515bool SelectionDAGBuilder::visitStrCpyCall(const CallInst &I, bool isStpcpy) {
9516 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9517
9518 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9519 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrcpy(
9520 DAG, getCurSDLoc(), getRoot(), getValue(Arg0), getValue(Arg1),
9521 MachinePointerInfo(Arg0), MachinePointerInfo(Arg1), isStpcpy, &I);
9522 if (Res.first.getNode()) {
9523 setValue(&I, Res.first);
9524 DAG.setRoot(Res.second);
9525 return true;
9526 }
9527
9528 return false;
9529}
9530
9531/// See if we can lower a strcmp call into an optimized form. If so, return
9532/// true and lower it, otherwise return false and it will be lowered like a
9533/// normal call.
9534/// The caller already checked that \p I calls the appropriate LibFunc with a
9535/// correct prototype.
9536bool SelectionDAGBuilder::visitStrCmpCall(const CallInst &I) {
9537 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9538
9539 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9540 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrcmp(
9541 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), getValue(Arg1),
9542 MachinePointerInfo(Arg0), MachinePointerInfo(Arg1), &I);
9543 if (Res.first.getNode()) {
9544 processIntegerCallValue(I, Res.first, true);
9545 PendingLoads.push_back(Res.second);
9546 return true;
9547 }
9548
9549 return false;
9550}
9551
9552/// See if we can lower a strlen call into an optimized form. If so, return
9553/// true and lower it, otherwise return false and it will be lowered like a
9554/// normal call.
9555/// The caller already checked that \p I calls the appropriate LibFunc with a
9556/// correct prototype.
9557bool SelectionDAGBuilder::visitStrLenCall(const CallInst &I) {
9558 const Value *Arg0 = I.getArgOperand(0);
9559
9560 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9561 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrlen(
9562 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), &I);
9563 if (Res.first.getNode()) {
9564 processIntegerCallValue(I, Res.first, false);
9565 PendingLoads.push_back(Res.second);
9566 return true;
9567 }
9568
9569 return false;
9570}
9571
9572/// See if we can lower a strnlen call into an optimized form. If so, return
9573/// true and lower it, otherwise return false and it will be lowered like a
9574/// normal call.
9575/// The caller already checked that \p I calls the appropriate LibFunc with a
9576/// correct prototype.
9577bool SelectionDAGBuilder::visitStrNLenCall(const CallInst &I) {
9578 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9579
9580 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9581 std::pair<SDValue, SDValue> Res =
9582 TSI.EmitTargetCodeForStrnlen(DAG, getCurSDLoc(), DAG.getRoot(),
9583 getValue(Arg0), getValue(Arg1),
9584 MachinePointerInfo(Arg0));
9585 if (Res.first.getNode()) {
9586 processIntegerCallValue(I, Res.first, false);
9587 PendingLoads.push_back(Res.second);
9588 return true;
9589 }
9590
9591 return false;
9592}
9593
9594/// See if we can lower a Strstr call into an optimized form. If so, return
9595/// true and lower it, otherwise return false and it will be lowered like a
9596/// normal call.
9597/// The caller already checked that \p I calls the appropriate LibFunc with a
9598/// correct prototype.
9599bool SelectionDAGBuilder::visitStrstrCall(const CallInst &I) {
9600 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9601 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9602 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrstr(
9603 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), getValue(Arg1), &I);
9604 if (Res.first) {
9605 processIntegerCallValue(I, Res.first, false);
9606 PendingLoads.push_back(Res.second);
9607 return true;
9608 }
9609 return false;
9610}
9611
9612/// See if we can lower a unary floating-point operation into an SDNode with
9613/// the specified Opcode. If so, return true and lower it, otherwise return
9614/// false and it will be lowered like a normal call.
9615/// The caller already checked that \p I calls the appropriate LibFunc with a
9616/// correct prototype.
9617bool SelectionDAGBuilder::visitUnaryFloatCall(const CallInst &I,
9618 unsigned Opcode) {
9619 // We already checked this call's prototype; verify it doesn't modify errno.
9620 // Do not perform optimizations for call sites that require strict
9621 // floating-point semantics.
9622 if (!I.onlyReadsMemory() || I.isStrictFP())
9623 return false;
9624
9625 SDNodeFlags Flags;
9626 Flags.copyFMF(cast<FPMathOperator>(I));
9627
9628 SDValue Tmp = getValue(I.getArgOperand(0));
9629 setValue(&I,
9630 DAG.getNode(Opcode, getCurSDLoc(), Tmp.getValueType(), Tmp, Flags));
9631 return true;
9632}
9633
9634/// See if we can lower a binary floating-point operation into an SDNode with
9635/// the specified Opcode. If so, return true and lower it. Otherwise return
9636/// false, and it will be lowered like a normal call.
9637/// The caller already checked that \p I calls the appropriate LibFunc with a
9638/// correct prototype.
9639bool SelectionDAGBuilder::visitBinaryFloatCall(const CallInst &I,
9640 unsigned Opcode) {
9641 // We already checked this call's prototype; verify it doesn't modify errno.
9642 // Do not perform optimizations for call sites that require strict
9643 // floating-point semantics.
9644 if (!I.onlyReadsMemory() || I.isStrictFP())
9645 return false;
9646
9647 SDNodeFlags Flags;
9648 Flags.copyFMF(cast<FPMathOperator>(I));
9649
9650 SDValue Tmp0 = getValue(I.getArgOperand(0));
9651 SDValue Tmp1 = getValue(I.getArgOperand(1));
9652 EVT VT = Tmp0.getValueType();
9653 setValue(&I, DAG.getNode(Opcode, getCurSDLoc(), VT, Tmp0, Tmp1, Flags));
9654 return true;
9655}
9656
9657void SelectionDAGBuilder::visitCall(const CallInst &I) {
9658 // Handle inline assembly differently.
9659 if (I.isInlineAsm()) {
9660 visitInlineAsm(I);
9661 return;
9662 }
9663
9665
9666 if (Function *F = I.getCalledFunction()) {
9667 if (F->isDeclaration()) {
9668 // Is this an LLVM intrinsic?
9669 if (unsigned IID = F->getIntrinsicID()) {
9670 visitIntrinsicCall(I, IID);
9671 return;
9672 }
9673 }
9674
9675 // Check for well-known libc/libm calls. If the function is internal, it
9676 // can't be a library call. Don't do the check if marked as nobuiltin for
9677 // some reason.
9678 // This code should not handle libcalls that are already canonicalized to
9679 // intrinsics by the middle-end.
9680 LibFunc Func;
9681 if (!I.isNoBuiltin() && !F->hasLocalLinkage() && F->hasName() &&
9682 LibInfo->getLibFunc(*F, Func) && LibInfo->hasOptimizedCodeGen(Func)) {
9683 switch (Func) {
9684 default: break;
9685 case LibFunc_bcmp:
9686 if (visitMemCmpBCmpCall(I))
9687 return;
9688 break;
9689 case LibFunc_copysign:
9690 case LibFunc_copysignf:
9691 case LibFunc_copysignl:
9692 // We already checked this call's prototype; verify it doesn't modify
9693 // errno.
9694 if (I.onlyReadsMemory()) {
9695 SDValue LHS = getValue(I.getArgOperand(0));
9696 SDValue RHS = getValue(I.getArgOperand(1));
9698 LHS.getValueType(), LHS, RHS));
9699 return;
9700 }
9701 break;
9702 case LibFunc_sin:
9703 case LibFunc_sinf:
9704 case LibFunc_sinl:
9705 if (visitUnaryFloatCall(I, ISD::FSIN))
9706 return;
9707 break;
9708 case LibFunc_cos:
9709 case LibFunc_cosf:
9710 case LibFunc_cosl:
9711 if (visitUnaryFloatCall(I, ISD::FCOS))
9712 return;
9713 break;
9714 case LibFunc_tan:
9715 case LibFunc_tanf:
9716 case LibFunc_tanl:
9717 if (visitUnaryFloatCall(I, ISD::FTAN))
9718 return;
9719 break;
9720 case LibFunc_asin:
9721 case LibFunc_asinf:
9722 case LibFunc_asinl:
9723 if (visitUnaryFloatCall(I, ISD::FASIN))
9724 return;
9725 break;
9726 case LibFunc_acos:
9727 case LibFunc_acosf:
9728 case LibFunc_acosl:
9729 if (visitUnaryFloatCall(I, ISD::FACOS))
9730 return;
9731 break;
9732 case LibFunc_atan:
9733 case LibFunc_atanf:
9734 case LibFunc_atanl:
9735 if (visitUnaryFloatCall(I, ISD::FATAN))
9736 return;
9737 break;
9738 case LibFunc_atan2:
9739 case LibFunc_atan2f:
9740 case LibFunc_atan2l:
9741 if (visitBinaryFloatCall(I, ISD::FATAN2))
9742 return;
9743 break;
9744 case LibFunc_sinh:
9745 case LibFunc_sinhf:
9746 case LibFunc_sinhl:
9747 if (visitUnaryFloatCall(I, ISD::FSINH))
9748 return;
9749 break;
9750 case LibFunc_cosh:
9751 case LibFunc_coshf:
9752 case LibFunc_coshl:
9753 if (visitUnaryFloatCall(I, ISD::FCOSH))
9754 return;
9755 break;
9756 case LibFunc_tanh:
9757 case LibFunc_tanhf:
9758 case LibFunc_tanhl:
9759 if (visitUnaryFloatCall(I, ISD::FTANH))
9760 return;
9761 break;
9762 case LibFunc_sqrt:
9763 case LibFunc_sqrtf:
9764 case LibFunc_sqrtl:
9765 case LibFunc_sqrt_finite:
9766 case LibFunc_sqrtf_finite:
9767 case LibFunc_sqrtl_finite:
9768 if (visitUnaryFloatCall(I, ISD::FSQRT))
9769 return;
9770 break;
9771 case LibFunc_log2:
9772 case LibFunc_log2f:
9773 case LibFunc_log2l:
9774 if (visitUnaryFloatCall(I, ISD::FLOG2))
9775 return;
9776 break;
9777 case LibFunc_exp2:
9778 case LibFunc_exp2f:
9779 case LibFunc_exp2l:
9780 if (visitUnaryFloatCall(I, ISD::FEXP2))
9781 return;
9782 break;
9783 case LibFunc_exp10:
9784 case LibFunc_exp10f:
9785 case LibFunc_exp10l:
9786 if (visitUnaryFloatCall(I, ISD::FEXP10))
9787 return;
9788 break;
9789 case LibFunc_ldexp:
9790 case LibFunc_ldexpf:
9791 case LibFunc_ldexpl:
9792 if (visitBinaryFloatCall(I, ISD::FLDEXP))
9793 return;
9794 break;
9795 case LibFunc_strstr:
9796 if (visitStrstrCall(I))
9797 return;
9798 break;
9799 case LibFunc_memcmp:
9800 if (visitMemCmpBCmpCall(I))
9801 return;
9802 break;
9803 case LibFunc_memccpy:
9804 if (visitMemCCpyCall(I))
9805 return;
9806 break;
9807 case LibFunc_mempcpy:
9808 if (visitMemPCpyCall(I))
9809 return;
9810 break;
9811 case LibFunc_memchr:
9812 if (visitMemChrCall(I))
9813 return;
9814 break;
9815 case LibFunc_strcpy:
9816 if (visitStrCpyCall(I, false))
9817 return;
9818 break;
9819 case LibFunc_stpcpy:
9820 if (visitStrCpyCall(I, true))
9821 return;
9822 break;
9823 case LibFunc_strcmp:
9824 if (visitStrCmpCall(I))
9825 return;
9826 break;
9827 case LibFunc_strlen:
9828 if (visitStrLenCall(I))
9829 return;
9830 break;
9831 case LibFunc_strnlen:
9832 if (visitStrNLenCall(I))
9833 return;
9834 break;
9835 }
9836 }
9837 }
9838
9839 if (I.countOperandBundlesOfType(LLVMContext::OB_ptrauth)) {
9840 LowerCallSiteWithPtrAuthBundle(cast<CallBase>(I), /*EHPadBB=*/nullptr);
9841 return;
9842 }
9843
9844 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
9845 // have to do anything here to lower funclet bundles.
9846 // CFGuardTarget bundles are lowered in LowerCallTo.
9848 I, "calls",
9853
9854 SDValue Callee = getValue(I.getCalledOperand());
9855
9856 if (I.hasDeoptState())
9857 LowerCallSiteWithDeoptBundle(&I, Callee, nullptr);
9858 else
9859 // Check if we can potentially perform a tail call. More detailed checking
9860 // is be done within LowerCallTo, after more information about the call is
9861 // known.
9862 LowerCallTo(I, Callee, I.isTailCall(), I.isMustTailCall());
9863}
9864
9866 const CallBase &CB, const BasicBlock *EHPadBB) {
9867 auto PAB = CB.getOperandBundle("ptrauth");
9868 const Value *CalleeV = CB.getCalledOperand();
9869
9870 // Gather the call ptrauth data from the operand bundle:
9871 // [ i32 <key>, i64 <discriminator> ]
9872 const auto *Key = cast<ConstantInt>(PAB->Inputs[0]);
9873 const Value *Discriminator = PAB->Inputs[1];
9874
9875 assert(Key->getType()->isIntegerTy(32) && "Invalid ptrauth key");
9876 assert(Discriminator->getType()->isIntegerTy(64) &&
9877 "Invalid ptrauth discriminator");
9878
9879 // Look through ptrauth constants to find the raw callee.
9880 // Do a direct unauthenticated call if we found it and everything matches.
9881 if (const auto *CalleeCPA = dyn_cast<ConstantPtrAuth>(CalleeV))
9882 if (CalleeCPA->isKnownCompatibleWith(Key, Discriminator,
9883 DAG.getDataLayout()))
9884 return LowerCallTo(CB, getValue(CalleeCPA->getPointer()), CB.isTailCall(),
9885 CB.isMustTailCall(), EHPadBB);
9886
9887 // Functions should never be ptrauth-called directly.
9888 assert(!isa<Function>(CalleeV) && "invalid direct ptrauth call");
9889
9890 // Otherwise, do an authenticated indirect call.
9891 TargetLowering::PtrAuthInfo PAI = {Key->getZExtValue(),
9892 getValue(Discriminator)};
9893
9894 LowerCallTo(CB, getValue(CalleeV), CB.isTailCall(), CB.isMustTailCall(),
9895 EHPadBB, &PAI);
9896}
9897
9898namespace {
9899
9900/// AsmOperandInfo - This contains information for each constraint that we are
9901/// lowering.
9902class SDISelAsmOperandInfo : public TargetLowering::AsmOperandInfo {
9903public:
9904 /// CallOperand - If this is the result output operand or a clobber
9905 /// this is null, otherwise it is the incoming operand to the CallInst.
9906 /// This gets modified as the asm is processed.
9907 SDValue CallOperand;
9908
9909 /// AssignedRegs - If this is a register or register class operand, this
9910 /// contains the set of register corresponding to the operand.
9911 RegsForValue AssignedRegs;
9912
9913 explicit SDISelAsmOperandInfo(const TargetLowering::AsmOperandInfo &info)
9914 : TargetLowering::AsmOperandInfo(info), CallOperand(nullptr, 0) {
9915 }
9916
9917 /// Whether or not this operand accesses memory
9918 bool hasMemory(const TargetLowering &TLI) const {
9919 // Indirect operand accesses access memory.
9920 if (isIndirect)
9921 return true;
9922
9923 for (const auto &Code : Codes)
9925 return true;
9926
9927 return false;
9928 }
9929};
9930
9931
9932} // end anonymous namespace
9933
9934/// Make sure that the output operand \p OpInfo and its corresponding input
9935/// operand \p MatchingOpInfo have compatible constraint types (otherwise error
9936/// out).
9937static void patchMatchingInput(const SDISelAsmOperandInfo &OpInfo,
9938 SDISelAsmOperandInfo &MatchingOpInfo,
9939 SelectionDAG &DAG) {
9940 if (OpInfo.ConstraintVT == MatchingOpInfo.ConstraintVT)
9941 return;
9942
9944 const auto &TLI = DAG.getTargetLoweringInfo();
9945
9946 std::pair<unsigned, const TargetRegisterClass *> MatchRC =
9947 TLI.getRegForInlineAsmConstraint(TRI, OpInfo.ConstraintCode,
9948 OpInfo.ConstraintVT);
9949 std::pair<unsigned, const TargetRegisterClass *> InputRC =
9950 TLI.getRegForInlineAsmConstraint(TRI, MatchingOpInfo.ConstraintCode,
9951 MatchingOpInfo.ConstraintVT);
9952 const bool OutOpIsIntOrFP =
9953 OpInfo.ConstraintVT.isInteger() || OpInfo.ConstraintVT.isFloatingPoint();
9954 const bool InOpIsIntOrFP = MatchingOpInfo.ConstraintVT.isInteger() ||
9955 MatchingOpInfo.ConstraintVT.isFloatingPoint();
9956 if ((OutOpIsIntOrFP != InOpIsIntOrFP) || (MatchRC.second != InputRC.second)) {
9957 // FIXME: error out in a more elegant fashion
9958 report_fatal_error("Unsupported asm: input constraint"
9959 " with a matching output constraint of"
9960 " incompatible type!");
9961 }
9962 MatchingOpInfo.ConstraintVT = OpInfo.ConstraintVT;
9963}
9964
9965/// Get a direct memory input to behave well as an indirect operand.
9966/// This may introduce stores, hence the need for a \p Chain.
9967/// \return The (possibly updated) chain.
9968static SDValue getAddressForMemoryInput(SDValue Chain, const SDLoc &Location,
9969 SDISelAsmOperandInfo &OpInfo,
9970 SelectionDAG &DAG) {
9971 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9972
9973 // If we don't have an indirect input, put it in the constpool if we can,
9974 // otherwise spill it to a stack slot.
9975 // TODO: This isn't quite right. We need to handle these according to
9976 // the addressing mode that the constraint wants. Also, this may take
9977 // an additional register for the computation and we don't want that
9978 // either.
9979
9980 // If the operand is a float, integer, or vector constant, spill to a
9981 // constant pool entry to get its address.
9982 const Value *OpVal = OpInfo.CallOperandVal;
9983 if (isa<ConstantFP>(OpVal) || isa<ConstantInt>(OpVal) ||
9985 OpInfo.CallOperand = DAG.getConstantPool(
9986 cast<Constant>(OpVal), TLI.getPointerTy(DAG.getDataLayout()));
9987 return Chain;
9988 }
9989
9990 // Otherwise, create a stack slot and emit a store to it before the asm.
9991 Type *Ty = OpVal->getType();
9992 auto &DL = DAG.getDataLayout();
9993 TypeSize TySize = DL.getTypeAllocSize(Ty);
9996 int StackID = 0;
9997 if (TySize.isScalable())
9998 StackID = TFI->getStackIDForScalableVectors();
9999 int SSFI = MF.getFrameInfo().CreateStackObject(TySize.getKnownMinValue(),
10000 DL.getPrefTypeAlign(Ty), false,
10001 nullptr, StackID);
10002 SDValue StackSlot = DAG.getFrameIndex(SSFI, TLI.getFrameIndexTy(DL));
10003 Chain = DAG.getTruncStore(Chain, Location, OpInfo.CallOperand, StackSlot,
10005 TLI.getMemValueType(DL, Ty));
10006 OpInfo.CallOperand = StackSlot;
10007
10008 return Chain;
10009}
10010
10011/// GetRegistersForValue - Assign registers (virtual or physical) for the
10012/// specified operand. We prefer to assign virtual registers, to allow the
10013/// register allocator to handle the assignment process. However, if the asm
10014/// uses features that we can't model on machineinstrs, we have SDISel do the
10015/// allocation. This produces generally horrible, but correct, code.
10016///
10017/// OpInfo describes the operand
10018/// RefOpInfo describes the matching operand if any, the operand otherwise
10019static std::optional<unsigned>
10021 SDISelAsmOperandInfo &OpInfo,
10022 SDISelAsmOperandInfo &RefOpInfo) {
10023 LLVMContext &Context = *DAG.getContext();
10024 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10025
10029
10030 // No work to do for memory/address operands.
10031 if (OpInfo.ConstraintType == TargetLowering::C_Memory ||
10032 OpInfo.ConstraintType == TargetLowering::C_Address)
10033 return std::nullopt;
10034
10035 // If this is a constraint for a single physreg, or a constraint for a
10036 // register class, find it.
10037 unsigned AssignedReg;
10038 const TargetRegisterClass *RC;
10039 std::tie(AssignedReg, RC) = TLI.getRegForInlineAsmConstraint(
10040 &TRI, RefOpInfo.ConstraintCode, RefOpInfo.ConstraintVT);
10041 // RC is unset only on failure. Return immediately.
10042 if (!RC)
10043 return std::nullopt;
10044
10045 // Get the actual register value type. This is important, because the user
10046 // may have asked for (e.g.) the AX register in i32 type. We need to
10047 // remember that AX is actually i16 to get the right extension.
10048 const MVT RegVT = *TRI.legalclasstypes_begin(*RC);
10049
10050 if (OpInfo.ConstraintVT != MVT::Other && RegVT != MVT::Untyped) {
10051 // If this is an FP operand in an integer register (or visa versa), or more
10052 // generally if the operand value disagrees with the register class we plan
10053 // to stick it in, fix the operand type.
10054 //
10055 // If this is an input value, the bitcast to the new type is done now.
10056 // Bitcast for output value is done at the end of visitInlineAsm().
10057 if ((OpInfo.Type == InlineAsm::isOutput ||
10058 OpInfo.Type == InlineAsm::isInput) &&
10059 !TRI.isTypeLegalForClass(*RC, OpInfo.ConstraintVT)) {
10060 // Try to convert to the first EVT that the reg class contains. If the
10061 // types are identical size, use a bitcast to convert (e.g. two differing
10062 // vector types). Note: output bitcast is done at the end of
10063 // visitInlineAsm().
10064 if (RegVT.getSizeInBits() == OpInfo.ConstraintVT.getSizeInBits()) {
10065 // Exclude indirect inputs while they are unsupported because the code
10066 // to perform the load is missing and thus OpInfo.CallOperand still
10067 // refers to the input address rather than the pointed-to value.
10068 if (OpInfo.Type == InlineAsm::isInput && !OpInfo.isIndirect)
10069 OpInfo.CallOperand =
10070 DAG.getNode(ISD::BITCAST, DL, RegVT, OpInfo.CallOperand);
10071 OpInfo.ConstraintVT = RegVT;
10072 // If the operand is an FP value and we want it in integer registers,
10073 // use the corresponding integer type. This turns an f64 value into
10074 // i64, which can be passed with two i32 values on a 32-bit machine.
10075 } else if (RegVT.isInteger() && OpInfo.ConstraintVT.isFloatingPoint()) {
10076 MVT VT = MVT::getIntegerVT(OpInfo.ConstraintVT.getSizeInBits());
10077 if (OpInfo.Type == InlineAsm::isInput)
10078 OpInfo.CallOperand =
10079 DAG.getNode(ISD::BITCAST, DL, VT, OpInfo.CallOperand);
10080 OpInfo.ConstraintVT = VT;
10081 }
10082 }
10083 }
10084
10085 // No need to allocate a matching input constraint since the constraint it's
10086 // matching to has already been allocated.
10087 if (OpInfo.isMatchingInputConstraint())
10088 return std::nullopt;
10089
10090 EVT ValueVT = OpInfo.ConstraintVT;
10091 if (OpInfo.ConstraintVT == MVT::Other)
10092 ValueVT = RegVT;
10093
10094 // Initialize NumRegs.
10095 unsigned NumRegs = 1;
10096 if (OpInfo.ConstraintVT != MVT::Other)
10097 NumRegs = TLI.getNumRegisters(Context, OpInfo.ConstraintVT, RegVT);
10098
10099 // If this is a constraint for a specific physical register, like {r17},
10100 // assign it now.
10101
10102 // If this associated to a specific register, initialize iterator to correct
10103 // place. If virtual, make sure we have enough registers
10104
10105 // Initialize iterator if necessary
10108
10109 // Do not check for single registers.
10110 if (AssignedReg) {
10111 I = std::find(I, RC->end(), AssignedReg);
10112 if (I == RC->end()) {
10113 // RC does not contain the selected register, which indicates a
10114 // mismatch between the register and the required type/bitwidth.
10115 return {AssignedReg};
10116 }
10117 }
10118
10119 for (; NumRegs; --NumRegs, ++I) {
10120 assert(I != RC->end() && "Ran out of registers to allocate!");
10121 Register R = AssignedReg ? Register(*I) : RegInfo.createVirtualRegister(RC);
10122 Regs.push_back(R);
10123 }
10124
10125 OpInfo.AssignedRegs = RegsForValue(Regs, RegVT, ValueVT);
10126 return std::nullopt;
10127}
10128
10129static unsigned
10131 const std::vector<SDValue> &AsmNodeOperands) {
10132 // Scan until we find the definition we already emitted of this operand.
10133 unsigned CurOp = InlineAsm::Op_FirstOperand;
10134 for (; OperandNo; --OperandNo) {
10135 // Advance to the next operand.
10136 unsigned OpFlag = AsmNodeOperands[CurOp]->getAsZExtVal();
10137 const InlineAsm::Flag F(OpFlag);
10138 assert(
10139 (F.isRegDefKind() || F.isRegDefEarlyClobberKind() || F.isMemKind()) &&
10140 "Skipped past definitions?");
10141 CurOp += F.getNumOperandRegisters() + 1;
10142 }
10143 return CurOp;
10144}
10145
10146namespace {
10147
10148class ExtraFlags {
10149 unsigned Flags = 0;
10150
10151public:
10152 explicit ExtraFlags(const CallBase &Call) {
10153 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
10154 if (IA->hasSideEffects())
10156 if (IA->isAlignStack())
10158 if (IA->canThrow())
10160 if (Call.isConvergent())
10162 Flags |= IA->getDialect() * InlineAsm::Extra_AsmDialect;
10163 }
10164
10165 void update(const TargetLowering::AsmOperandInfo &OpInfo) {
10166 // Ideally, we would only check against memory constraints. However, the
10167 // meaning of an Other constraint can be target-specific and we can't easily
10168 // reason about it. Therefore, be conservative and set MayLoad/MayStore
10169 // for Other constraints as well.
10172 if (OpInfo.Type == InlineAsm::isInput)
10174 else if (OpInfo.Type == InlineAsm::isOutput)
10176 else if (OpInfo.Type == InlineAsm::isClobber)
10178 }
10179 }
10180
10181 unsigned get() const { return Flags; }
10182};
10183
10184} // end anonymous namespace
10185
10186static bool isFunction(SDValue Op) {
10187 if (Op && Op.getOpcode() == ISD::GlobalAddress) {
10188 if (auto *GA = dyn_cast<GlobalAddressSDNode>(Op)) {
10189 auto Fn = dyn_cast_or_null<Function>(GA->getGlobal());
10190
10191 // In normal "call dllimport func" instruction (non-inlineasm) it force
10192 // indirect access by specifing call opcode. And usually specially print
10193 // asm with indirect symbol (i.g: "*") according to opcode. Inline asm can
10194 // not do in this way now. (In fact, this is similar with "Data Access"
10195 // action). So here we ignore dllimport function.
10196 if (Fn && !Fn->hasDLLImportStorageClass())
10197 return true;
10198 }
10199 }
10200 return false;
10201}
10202
10203/// visitInlineAsm - Handle a call to an InlineAsm object.
10204void SelectionDAGBuilder::visitInlineAsm(const CallBase &Call,
10205 const BasicBlock *EHPadBB) {
10206 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
10207
10208 /// ConstraintOperands - Information about all of the constraints.
10209 SmallVector<SDISelAsmOperandInfo, 16> ConstraintOperands;
10210
10211 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10213 DAG.getDataLayout(), DAG.getSubtarget().getRegisterInfo(), Call);
10214
10215 // First Pass: Calculate HasSideEffects and ExtraFlags (AlignStack,
10216 // AsmDialect, MayLoad, MayStore).
10217 bool HasSideEffect = IA->hasSideEffects();
10218 ExtraFlags ExtraInfo(Call);
10219
10220 for (auto &T : TargetConstraints) {
10221 ConstraintOperands.push_back(SDISelAsmOperandInfo(T));
10222 SDISelAsmOperandInfo &OpInfo = ConstraintOperands.back();
10223
10224 if (OpInfo.CallOperandVal)
10225 OpInfo.CallOperand = getValue(OpInfo.CallOperandVal);
10226
10227 if (!HasSideEffect)
10228 HasSideEffect = OpInfo.hasMemory(TLI);
10229
10230 // Determine if this InlineAsm MayLoad or MayStore based on the constraints.
10231 // FIXME: Could we compute this on OpInfo rather than T?
10232
10233 // Compute the constraint code and ConstraintType to use.
10235
10236 if (T.ConstraintType == TargetLowering::C_Immediate &&
10237 OpInfo.CallOperand && !isa<ConstantSDNode>(OpInfo.CallOperand))
10238 // We've delayed emitting a diagnostic like the "n" constraint because
10239 // inlining could cause an integer showing up.
10240 return emitInlineAsmError(Call, "constraint '" + Twine(T.ConstraintCode) +
10241 "' expects an integer constant "
10242 "expression");
10243
10244 ExtraInfo.update(T);
10245 }
10246
10247 // We won't need to flush pending loads if this asm doesn't touch
10248 // memory and is nonvolatile.
10249 SDValue Glue, Chain = (HasSideEffect) ? getRoot() : DAG.getRoot();
10250
10251 bool EmitEHLabels = isa<InvokeInst>(Call);
10252 if (EmitEHLabels) {
10253 assert(EHPadBB && "InvokeInst must have an EHPadBB");
10254 }
10255 bool IsCallBr = isa<CallBrInst>(Call);
10256
10257 if (IsCallBr || EmitEHLabels) {
10258 // If this is a callbr or invoke we need to flush pending exports since
10259 // inlineasm_br and invoke are terminators.
10260 // We need to do this before nodes are glued to the inlineasm_br node.
10261 Chain = getControlRoot();
10262 }
10263
10264 MCSymbol *BeginLabel = nullptr;
10265 if (EmitEHLabels) {
10266 Chain = lowerStartEH(Chain, EHPadBB, BeginLabel);
10267 }
10268
10269 int OpNo = -1;
10270 SmallVector<StringRef> AsmStrs;
10271 IA->collectAsmStrs(AsmStrs);
10272
10273 // Second pass over the constraints: compute which constraint option to use.
10274 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
10275 if (OpInfo.hasArg() || OpInfo.Type == InlineAsm::isOutput)
10276 OpNo++;
10277
10278 // If this is an output operand with a matching input operand, look up the
10279 // matching input. If their types mismatch, e.g. one is an integer, the
10280 // other is floating point, or their sizes are different, flag it as an
10281 // error.
10282 if (OpInfo.hasMatchingInput()) {
10283 SDISelAsmOperandInfo &Input = ConstraintOperands[OpInfo.MatchingInput];
10284 patchMatchingInput(OpInfo, Input, DAG);
10285 }
10286
10287 // Compute the constraint code and ConstraintType to use.
10288 TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
10289
10290 if ((OpInfo.ConstraintType == TargetLowering::C_Memory &&
10291 OpInfo.Type == InlineAsm::isClobber) ||
10292 OpInfo.ConstraintType == TargetLowering::C_Address)
10293 continue;
10294
10295 // In Linux PIC model, there are 4 cases about value/label addressing:
10296 //
10297 // 1: Function call or Label jmp inside the module.
10298 // 2: Data access (such as global variable, static variable) inside module.
10299 // 3: Function call or Label jmp outside the module.
10300 // 4: Data access (such as global variable) outside the module.
10301 //
10302 // Due to current llvm inline asm architecture designed to not "recognize"
10303 // the asm code, there are quite troubles for us to treat mem addressing
10304 // differently for same value/adress used in different instuctions.
10305 // For example, in pic model, call a func may in plt way or direclty
10306 // pc-related, but lea/mov a function adress may use got.
10307 //
10308 // Here we try to "recognize" function call for the case 1 and case 3 in
10309 // inline asm. And try to adjust the constraint for them.
10310 //
10311 // TODO: Due to current inline asm didn't encourage to jmp to the outsider
10312 // label, so here we don't handle jmp function label now, but we need to
10313 // enhance it (especilly in PIC model) if we meet meaningful requirements.
10314 if (OpInfo.isIndirect && isFunction(OpInfo.CallOperand) &&
10315 TLI.isInlineAsmTargetBranch(AsmStrs, OpNo) &&
10316 TM.getCodeModel() != CodeModel::Large) {
10317 OpInfo.isIndirect = false;
10318 OpInfo.ConstraintType = TargetLowering::C_Address;
10319 }
10320
10321 // If this is a memory input, and if the operand is not indirect, do what we
10322 // need to provide an address for the memory input.
10323 if (OpInfo.ConstraintType == TargetLowering::C_Memory &&
10324 !OpInfo.isIndirect) {
10325 assert((OpInfo.isMultipleAlternative ||
10326 (OpInfo.Type == InlineAsm::isInput)) &&
10327 "Can only indirectify direct input operands!");
10328
10329 // Memory operands really want the address of the value.
10330 Chain = getAddressForMemoryInput(Chain, getCurSDLoc(), OpInfo, DAG);
10331
10332 // There is no longer a Value* corresponding to this operand.
10333 OpInfo.CallOperandVal = nullptr;
10334
10335 // It is now an indirect operand.
10336 OpInfo.isIndirect = true;
10337 }
10338
10339 }
10340
10341 // AsmNodeOperands - The operands for the ISD::INLINEASM node.
10342 std::vector<SDValue> AsmNodeOperands;
10343 AsmNodeOperands.push_back(SDValue()); // reserve space for input chain
10344 AsmNodeOperands.push_back(DAG.getTargetExternalSymbol(
10345 IA->getAsmString().data(), TLI.getProgramPointerTy(DAG.getDataLayout())));
10346
10347 // If we have a !srcloc metadata node associated with it, we want to attach
10348 // this to the ultimately generated inline asm machineinstr. To do this, we
10349 // pass in the third operand as this (potentially null) inline asm MDNode.
10350 const MDNode *SrcLoc = Call.getMetadata("srcloc");
10351 AsmNodeOperands.push_back(DAG.getMDNode(SrcLoc));
10352
10353 // Remember the HasSideEffect, AlignStack, AsmDialect, MayLoad and MayStore
10354 // bits as operand 3.
10355 AsmNodeOperands.push_back(DAG.getTargetConstant(
10356 ExtraInfo.get(), getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10357
10358 // Third pass: Loop over operands to prepare DAG-level operands.. As part of
10359 // this, assign virtual and physical registers for inputs and otput.
10360 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
10361 // Assign Registers.
10362 SDISelAsmOperandInfo &RefOpInfo =
10363 OpInfo.isMatchingInputConstraint()
10364 ? ConstraintOperands[OpInfo.getMatchedOperand()]
10365 : OpInfo;
10366 const auto RegError =
10367 getRegistersForValue(DAG, getCurSDLoc(), OpInfo, RefOpInfo);
10368 if (RegError) {
10369 const MachineFunction &MF = DAG.getMachineFunction();
10370 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
10371 const char *RegName = TRI.getName(*RegError);
10372 emitInlineAsmError(Call, "register '" + Twine(RegName) +
10373 "' allocated for constraint '" +
10374 Twine(OpInfo.ConstraintCode) +
10375 "' does not match required type");
10376 return;
10377 }
10378
10379 auto DetectWriteToReservedRegister = [&]() {
10380 const MachineFunction &MF = DAG.getMachineFunction();
10381 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
10382 for (Register Reg : OpInfo.AssignedRegs.Regs) {
10383 if (Reg.isPhysical() && TRI.isInlineAsmReadOnlyReg(MF, Reg)) {
10384 const char *RegName = TRI.getName(Reg);
10385 emitInlineAsmError(Call, "write to reserved register '" +
10386 Twine(RegName) + "'");
10387 return true;
10388 }
10389 }
10390 return false;
10391 };
10392 assert((OpInfo.ConstraintType != TargetLowering::C_Address ||
10393 (OpInfo.Type == InlineAsm::isInput &&
10394 !OpInfo.isMatchingInputConstraint())) &&
10395 "Only address as input operand is allowed.");
10396
10397 switch (OpInfo.Type) {
10399 if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
10400 const InlineAsm::ConstraintCode ConstraintID =
10401 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10403 "Failed to convert memory constraint code to constraint id.");
10404
10405 // Add information to the INLINEASM node to know about this output.
10406 InlineAsm::Flag OpFlags(InlineAsm::Kind::Mem, 1);
10407 OpFlags.setMemConstraint(ConstraintID);
10408 AsmNodeOperands.push_back(DAG.getTargetConstant(OpFlags, getCurSDLoc(),
10409 MVT::i32));
10410 AsmNodeOperands.push_back(OpInfo.CallOperand);
10411 } else {
10412 // Otherwise, this outputs to a register (directly for C_Register /
10413 // C_RegisterClass, and a target-defined fashion for
10414 // C_Immediate/C_Other). Find a register that we can use.
10415 if (OpInfo.AssignedRegs.Regs.empty()) {
10416 emitInlineAsmError(
10417 Call, "couldn't allocate output register for constraint '" +
10418 Twine(OpInfo.ConstraintCode) + "'");
10419 return;
10420 }
10421
10422 if (DetectWriteToReservedRegister())
10423 return;
10424
10425 // Add information to the INLINEASM node to know that this register is
10426 // set.
10427 OpInfo.AssignedRegs.AddInlineAsmOperands(
10428 OpInfo.isEarlyClobber ? InlineAsm::Kind::RegDefEarlyClobber
10430 false, 0, getCurSDLoc(), DAG, AsmNodeOperands);
10431 }
10432 break;
10433
10434 case InlineAsm::isInput:
10435 case InlineAsm::isLabel: {
10436 SDValue InOperandVal = OpInfo.CallOperand;
10437
10438 if (OpInfo.isMatchingInputConstraint()) {
10439 // If this is required to match an output register we have already set,
10440 // just use its register.
10441 auto CurOp = findMatchingInlineAsmOperand(OpInfo.getMatchedOperand(),
10442 AsmNodeOperands);
10443 InlineAsm::Flag Flag(AsmNodeOperands[CurOp]->getAsZExtVal());
10444 if (Flag.isRegDefKind() || Flag.isRegDefEarlyClobberKind()) {
10445 if (OpInfo.isIndirect) {
10446 // This happens on gcc/testsuite/gcc.dg/pr8788-1.c
10447 emitInlineAsmError(Call, "inline asm not supported yet: "
10448 "don't know how to handle tied "
10449 "indirect register inputs");
10450 return;
10451 }
10452
10454 MachineFunction &MF = DAG.getMachineFunction();
10455 MachineRegisterInfo &MRI = MF.getRegInfo();
10456 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
10457 auto *R = cast<RegisterSDNode>(AsmNodeOperands[CurOp+1]);
10458 Register TiedReg = R->getReg();
10459 MVT RegVT = R->getSimpleValueType(0);
10460 const TargetRegisterClass *RC =
10461 TiedReg.isVirtual() ? MRI.getRegClass(TiedReg)
10462 : RegVT != MVT::Untyped ? TLI.getRegClassFor(RegVT)
10463 : TRI.getMinimalPhysRegClass(TiedReg);
10464 for (unsigned i = 0, e = Flag.getNumOperandRegisters(); i != e; ++i)
10465 Regs.push_back(MRI.createVirtualRegister(RC));
10466
10467 RegsForValue MatchedRegs(Regs, RegVT, InOperandVal.getValueType());
10468
10469 SDLoc dl = getCurSDLoc();
10470 // Use the produced MatchedRegs object to
10471 MatchedRegs.getCopyToRegs(InOperandVal, DAG, dl, Chain, &Glue, &Call);
10472 MatchedRegs.AddInlineAsmOperands(InlineAsm::Kind::RegUse, true,
10473 OpInfo.getMatchedOperand(), dl, DAG,
10474 AsmNodeOperands);
10475 break;
10476 }
10477
10478 assert(Flag.isMemKind() && "Unknown matching constraint!");
10479 assert(Flag.getNumOperandRegisters() == 1 &&
10480 "Unexpected number of operands");
10481 // Add information to the INLINEASM node to know about this input.
10482 // See InlineAsm.h isUseOperandTiedToDef.
10483 Flag.clearMemConstraint();
10484 Flag.setMatchingOp(OpInfo.getMatchedOperand());
10485 AsmNodeOperands.push_back(DAG.getTargetConstant(
10486 Flag, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10487 AsmNodeOperands.push_back(AsmNodeOperands[CurOp+1]);
10488 break;
10489 }
10490
10491 // Treat indirect 'X' constraint as memory.
10492 if (OpInfo.ConstraintType == TargetLowering::C_Other &&
10493 OpInfo.isIndirect)
10494 OpInfo.ConstraintType = TargetLowering::C_Memory;
10495
10496 if (OpInfo.ConstraintType == TargetLowering::C_Immediate ||
10497 OpInfo.ConstraintType == TargetLowering::C_Other) {
10498 std::vector<SDValue> Ops;
10499 TLI.LowerAsmOperandForConstraint(InOperandVal, OpInfo.ConstraintCode,
10500 Ops, DAG);
10501 if (Ops.empty()) {
10502 if (OpInfo.ConstraintType == TargetLowering::C_Immediate)
10503 if (isa<ConstantSDNode>(InOperandVal)) {
10504 emitInlineAsmError(Call, "value out of range for constraint '" +
10505 Twine(OpInfo.ConstraintCode) + "'");
10506 return;
10507 }
10508
10509 emitInlineAsmError(Call,
10510 "invalid operand for inline asm constraint '" +
10511 Twine(OpInfo.ConstraintCode) + "'");
10512 return;
10513 }
10514
10515 // Add information to the INLINEASM node to know about this input.
10516 InlineAsm::Flag ResOpType(InlineAsm::Kind::Imm, Ops.size());
10517 AsmNodeOperands.push_back(DAG.getTargetConstant(
10518 ResOpType, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10519 llvm::append_range(AsmNodeOperands, Ops);
10520 break;
10521 }
10522
10523 if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
10524 assert((OpInfo.isIndirect ||
10525 OpInfo.ConstraintType != TargetLowering::C_Memory) &&
10526 "Operand must be indirect to be a mem!");
10527 assert(InOperandVal.getValueType() ==
10528 TLI.getPointerTy(DAG.getDataLayout()) &&
10529 "Memory operands expect pointer values");
10530
10531 const InlineAsm::ConstraintCode ConstraintID =
10532 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10534 "Failed to convert memory constraint code to constraint id.");
10535
10536 // Add information to the INLINEASM node to know about this input.
10537 InlineAsm::Flag ResOpType(InlineAsm::Kind::Mem, 1);
10538 ResOpType.setMemConstraint(ConstraintID);
10539 AsmNodeOperands.push_back(DAG.getTargetConstant(ResOpType,
10540 getCurSDLoc(),
10541 MVT::i32));
10542 AsmNodeOperands.push_back(InOperandVal);
10543 break;
10544 }
10545
10546 if (OpInfo.ConstraintType == TargetLowering::C_Address) {
10547 const InlineAsm::ConstraintCode ConstraintID =
10548 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10550 "Failed to convert memory constraint code to constraint id.");
10551
10552 InlineAsm::Flag ResOpType(InlineAsm::Kind::Mem, 1);
10553
10554 SDValue AsmOp = InOperandVal;
10555 if (isFunction(InOperandVal)) {
10556 auto *GA = cast<GlobalAddressSDNode>(InOperandVal);
10557 ResOpType = InlineAsm::Flag(InlineAsm::Kind::Func, 1);
10558 AsmOp = DAG.getTargetGlobalAddress(GA->getGlobal(), getCurSDLoc(),
10559 InOperandVal.getValueType(),
10560 GA->getOffset());
10561 }
10562
10563 // Add information to the INLINEASM node to know about this input.
10564 ResOpType.setMemConstraint(ConstraintID);
10565
10566 AsmNodeOperands.push_back(
10567 DAG.getTargetConstant(ResOpType, getCurSDLoc(), MVT::i32));
10568
10569 AsmNodeOperands.push_back(AsmOp);
10570 break;
10571 }
10572
10573 if (OpInfo.ConstraintType != TargetLowering::C_RegisterClass &&
10574 OpInfo.ConstraintType != TargetLowering::C_Register) {
10575 emitInlineAsmError(Call, "unknown asm constraint '" +
10576 Twine(OpInfo.ConstraintCode) + "'");
10577 return;
10578 }
10579
10580 // TODO: Support this.
10581 if (OpInfo.isIndirect) {
10582 emitInlineAsmError(
10583 Call, "Don't know how to handle indirect register inputs yet "
10584 "for constraint '" +
10585 Twine(OpInfo.ConstraintCode) + "'");
10586 return;
10587 }
10588
10589 // Copy the input into the appropriate registers.
10590 if (OpInfo.AssignedRegs.Regs.empty()) {
10591 emitInlineAsmError(Call,
10592 "couldn't allocate input reg for constraint '" +
10593 Twine(OpInfo.ConstraintCode) + "'");
10594 return;
10595 }
10596
10597 if (DetectWriteToReservedRegister())
10598 return;
10599
10600 SDLoc dl = getCurSDLoc();
10601
10602 OpInfo.AssignedRegs.getCopyToRegs(InOperandVal, DAG, dl, Chain, &Glue,
10603 &Call);
10604
10605 OpInfo.AssignedRegs.AddInlineAsmOperands(InlineAsm::Kind::RegUse, false,
10606 0, dl, DAG, AsmNodeOperands);
10607 break;
10608 }
10610 // Add the clobbered value to the operand list, so that the register
10611 // allocator is aware that the physreg got clobbered.
10612 if (!OpInfo.AssignedRegs.Regs.empty())
10614 false, 0, getCurSDLoc(), DAG,
10615 AsmNodeOperands);
10616 break;
10617 }
10618 }
10619
10620 // Finish up input operands. Set the input chain and add the flag last.
10621 AsmNodeOperands[InlineAsm::Op_InputChain] = Chain;
10622 if (Glue.getNode()) AsmNodeOperands.push_back(Glue);
10623
10624 unsigned ISDOpc = IsCallBr ? ISD::INLINEASM_BR : ISD::INLINEASM;
10625 Chain = DAG.getNode(ISDOpc, getCurSDLoc(),
10626 DAG.getVTList(MVT::Other, MVT::Glue), AsmNodeOperands);
10627 Glue = Chain.getValue(1);
10628
10629 // Do additional work to generate outputs.
10630
10631 SmallVector<EVT, 1> ResultVTs;
10632 SmallVector<SDValue, 1> ResultValues;
10633 SmallVector<SDValue, 8> OutChains;
10634
10635 llvm::Type *CallResultType = Call.getType();
10636 ArrayRef<Type *> ResultTypes;
10637 if (StructType *StructResult = dyn_cast<StructType>(CallResultType))
10638 ResultTypes = StructResult->elements();
10639 else if (!CallResultType->isVoidTy())
10640 ResultTypes = ArrayRef(CallResultType);
10641
10642 auto CurResultType = ResultTypes.begin();
10643 auto handleRegAssign = [&](SDValue V) {
10644 assert(CurResultType != ResultTypes.end() && "Unexpected value");
10645 assert((*CurResultType)->isSized() && "Unexpected unsized type");
10646 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), *CurResultType);
10647 ++CurResultType;
10648 // If the type of the inline asm call site return value is different but has
10649 // same size as the type of the asm output bitcast it. One example of this
10650 // is for vectors with different width / number of elements. This can
10651 // happen for register classes that can contain multiple different value
10652 // types. The preg or vreg allocated may not have the same VT as was
10653 // expected.
10654 //
10655 // This can also happen for a return value that disagrees with the register
10656 // class it is put in, eg. a double in a general-purpose register on a
10657 // 32-bit machine.
10658 if (ResultVT != V.getValueType() &&
10659 ResultVT.getSizeInBits() == V.getValueSizeInBits())
10660 V = DAG.getNode(ISD::BITCAST, getCurSDLoc(), ResultVT, V);
10661 else if (ResultVT != V.getValueType() && ResultVT.isInteger() &&
10662 V.getValueType().isInteger()) {
10663 // If a result value was tied to an input value, the computed result
10664 // may have a wider width than the expected result. Extract the
10665 // relevant portion.
10666 V = DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), ResultVT, V);
10667 }
10668 assert(ResultVT == V.getValueType() && "Asm result value mismatch!");
10669 ResultVTs.push_back(ResultVT);
10670 ResultValues.push_back(V);
10671 };
10672
10673 // Deal with output operands.
10674 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
10675 if (OpInfo.Type == InlineAsm::isOutput) {
10676 SDValue Val;
10677 // Skip trivial output operands.
10678 if (OpInfo.AssignedRegs.Regs.empty())
10679 continue;
10680
10681 switch (OpInfo.ConstraintType) {
10684 Val = OpInfo.AssignedRegs.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(),
10685 Chain, &Glue, &Call);
10686 break;
10689 Val = TLI.LowerAsmOutputForConstraint(Chain, Glue, getCurSDLoc(),
10690 OpInfo, DAG);
10691 break;
10693 break; // Already handled.
10695 break; // Silence warning.
10697 assert(false && "Unexpected unknown constraint");
10698 }
10699
10700 // Indirect output manifest as stores. Record output chains.
10701 if (OpInfo.isIndirect) {
10702 const Value *Ptr = OpInfo.CallOperandVal;
10703 assert(Ptr && "Expected value CallOperandVal for indirect asm operand");
10704 SDValue Store = DAG.getStore(Chain, getCurSDLoc(), Val, getValue(Ptr),
10705 MachinePointerInfo(Ptr));
10706 OutChains.push_back(Store);
10707 } else {
10708 // generate CopyFromRegs to associated registers.
10709 assert(!Call.getType()->isVoidTy() && "Bad inline asm!");
10710 if (Val.getOpcode() == ISD::MERGE_VALUES) {
10711 for (const SDValue &V : Val->op_values())
10712 handleRegAssign(V);
10713 } else
10714 handleRegAssign(Val);
10715 }
10716 }
10717 }
10718
10719 // Set results.
10720 if (!ResultValues.empty()) {
10721 assert(CurResultType == ResultTypes.end() &&
10722 "Mismatch in number of ResultTypes");
10723 assert(ResultValues.size() == ResultTypes.size() &&
10724 "Mismatch in number of output operands in asm result");
10725
10727 DAG.getVTList(ResultVTs), ResultValues);
10728 setValue(&Call, V);
10729 }
10730
10731 // Collect store chains.
10732 if (!OutChains.empty())
10733 Chain = DAG.getNode(ISD::TokenFactor, getCurSDLoc(), MVT::Other, OutChains);
10734
10735 if (EmitEHLabels) {
10736 Chain = lowerEndEH(Chain, cast<InvokeInst>(&Call), EHPadBB, BeginLabel);
10737 }
10738
10739 // Only Update Root if inline assembly has a memory effect.
10740 if (ResultValues.empty() || HasSideEffect || !OutChains.empty() || IsCallBr ||
10741 EmitEHLabels)
10742 DAG.setRoot(Chain);
10743}
10744
10745void SelectionDAGBuilder::emitInlineAsmError(const CallBase &Call,
10746 const Twine &Message) {
10747 LLVMContext &Ctx = *DAG.getContext();
10748 Ctx.diagnose(DiagnosticInfoInlineAsm(Call, Message));
10749
10750 // Make sure we leave the DAG in a valid state
10751 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10752 SmallVector<EVT, 1> ValueVTs;
10753 ComputeValueVTs(TLI, DAG.getDataLayout(), Call.getType(), ValueVTs);
10754
10755 if (ValueVTs.empty())
10756 return;
10757
10759 for (const EVT &VT : ValueVTs)
10760 Ops.push_back(DAG.getUNDEF(VT));
10761
10762 setValue(&Call, DAG.getMergeValues(Ops, getCurSDLoc()));
10763}
10764
10765void SelectionDAGBuilder::visitVAStart(const CallInst &I) {
10766 DAG.setRoot(DAG.getNode(ISD::VASTART, getCurSDLoc(),
10767 MVT::Other, getRoot(),
10768 getValue(I.getArgOperand(0)),
10769 DAG.getSrcValue(I.getArgOperand(0))));
10770}
10771
10772void SelectionDAGBuilder::visitVAArg(const VAArgInst &I) {
10773 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10774 const DataLayout &DL = DAG.getDataLayout();
10775 SDValue V = DAG.getVAArg(
10776 TLI.getMemValueType(DAG.getDataLayout(), I.getType()), getCurSDLoc(),
10777 getRoot(), getValue(I.getOperand(0)), DAG.getSrcValue(I.getOperand(0)),
10778 DL.getABITypeAlign(I.getType()).value());
10779 DAG.setRoot(V.getValue(1));
10780
10781 if (I.getType()->isPointerTy())
10782 V = DAG.getPtrExtOrTrunc(
10783 V, getCurSDLoc(), TLI.getValueType(DAG.getDataLayout(), I.getType()));
10784 setValue(&I, V);
10785}
10786
10787void SelectionDAGBuilder::visitVAEnd(const CallInst &I) {
10788 DAG.setRoot(DAG.getNode(ISD::VAEND, getCurSDLoc(),
10789 MVT::Other, getRoot(),
10790 getValue(I.getArgOperand(0)),
10791 DAG.getSrcValue(I.getArgOperand(0))));
10792}
10793
10794void SelectionDAGBuilder::visitVACopy(const CallInst &I) {
10795 DAG.setRoot(DAG.getNode(ISD::VACOPY, getCurSDLoc(),
10796 MVT::Other, getRoot(),
10797 getValue(I.getArgOperand(0)),
10798 getValue(I.getArgOperand(1)),
10799 DAG.getSrcValue(I.getArgOperand(0)),
10800 DAG.getSrcValue(I.getArgOperand(1))));
10801}
10802
10804 const Instruction &I,
10805 SDValue Op) {
10806 std::optional<ConstantRange> CR = getRange(I);
10807
10808 if (!CR || CR->isFullSet() || CR->isEmptySet() || CR->isUpperWrapped())
10809 return Op;
10810
10811 APInt Lo = CR->getUnsignedMin();
10812 if (!Lo.isMinValue())
10813 return Op;
10814
10815 APInt Hi = CR->getUnsignedMax();
10816 unsigned Bits = std::max(Hi.getActiveBits(),
10817 static_cast<unsigned>(IntegerType::MIN_INT_BITS));
10818
10819 EVT SmallVT = EVT::getIntegerVT(*DAG.getContext(), Bits);
10820
10821 SDLoc SL = getCurSDLoc();
10822
10823 SDValue ZExt = DAG.getNode(ISD::AssertZext, SL, Op.getValueType(), Op,
10824 DAG.getValueType(SmallVT));
10825 unsigned NumVals = Op.getNode()->getNumValues();
10826 if (NumVals == 1)
10827 return ZExt;
10828
10830
10831 Ops.push_back(ZExt);
10832 for (unsigned I = 1; I != NumVals; ++I)
10833 Ops.push_back(Op.getValue(I));
10834
10835 return DAG.getMergeValues(Ops, SL);
10836}
10837
10839 SelectionDAG &DAG, const Instruction &I, SDValue Op) {
10840 FPClassTest Classes = getNoFPClass(I);
10841 if (Classes == fcNone)
10842 return Op;
10843
10844 SDLoc SL = getCurSDLoc();
10845 SDValue TestConst = DAG.getTargetConstant(Classes, SDLoc(), MVT::i32);
10846
10847 if (Op.getOpcode() != ISD::MERGE_VALUES) {
10848 return DAG.getNode(ISD::AssertNoFPClass, SL, Op.getValueType(), Op,
10849 TestConst);
10850 }
10851
10852 SmallVector<SDValue, 8> Ops(Op.getNumOperands());
10853 for (unsigned I = 0, E = Ops.size(); I != E; ++I) {
10854 SDValue MergeOp = Op.getOperand(I);
10855 Ops[I] = DAG.getNode(ISD::AssertNoFPClass, SL, MergeOp.getValueType(),
10856 MergeOp, TestConst);
10857 }
10858
10859 return DAG.getMergeValues(Ops, SL);
10860}
10861
10862/// Populate a CallLowerinInfo (into \p CLI) based on the properties of
10863/// the call being lowered.
10864///
10865/// This is a helper for lowering intrinsics that follow a target calling
10866/// convention or require stack pointer adjustment. Only a subset of the
10867/// intrinsic's operands need to participate in the calling convention.
10870 unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy,
10871 AttributeSet RetAttrs, bool IsPatchPoint) {
10873 Args.reserve(NumArgs);
10874
10875 // Populate the argument list.
10876 // Attributes for args start at offset 1, after the return attribute.
10877 for (unsigned ArgI = ArgIdx, ArgE = ArgIdx + NumArgs;
10878 ArgI != ArgE; ++ArgI) {
10879 const Value *V = Call->getOperand(ArgI);
10880
10881 assert(!V->getType()->isEmptyTy() && "Empty type passed to intrinsic.");
10882
10883 TargetLowering::ArgListEntry Entry(getValue(V), V->getType());
10884 Entry.setAttributes(Call, ArgI);
10885 Args.push_back(Entry);
10886 }
10887
10889 .setChain(getRoot())
10890 .setCallee(Call->getCallingConv(), ReturnTy, Callee, std::move(Args),
10891 RetAttrs)
10892 .setDiscardResult(Call->use_empty())
10893 .setIsPatchPoint(IsPatchPoint)
10895 Call->countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0);
10896}
10897
10898/// Add a stack map intrinsic call's live variable operands to a stackmap
10899/// or patchpoint target node's operand list.
10900///
10901/// Constants are converted to TargetConstants purely as an optimization to
10902/// avoid constant materialization and register allocation.
10903///
10904/// FrameIndex operands are converted to TargetFrameIndex so that ISEL does not
10905/// generate addess computation nodes, and so FinalizeISel can convert the
10906/// TargetFrameIndex into a DirectMemRefOp StackMap location. This avoids
10907/// address materialization and register allocation, but may also be required
10908/// for correctness. If a StackMap (or PatchPoint) intrinsic directly uses an
10909/// alloca in the entry block, then the runtime may assume that the alloca's
10910/// StackMap location can be read immediately after compilation and that the
10911/// location is valid at any point during execution (this is similar to the
10912/// assumption made by the llvm.gcroot intrinsic). If the alloca's location were
10913/// only available in a register, then the runtime would need to trap when
10914/// execution reaches the StackMap in order to read the alloca's location.
10915static void addStackMapLiveVars(const CallBase &Call, unsigned StartIdx,
10917 SelectionDAGBuilder &Builder) {
10918 SelectionDAG &DAG = Builder.DAG;
10919 for (unsigned I = StartIdx; I < Call.arg_size(); I++) {
10920 SDValue Op = Builder.getValue(Call.getArgOperand(I));
10921
10922 // Things on the stack are pointer-typed, meaning that they are already
10923 // legal and can be emitted directly to target nodes.
10925 Ops.push_back(DAG.getTargetFrameIndex(FI->getIndex(), Op.getValueType()));
10926 } else {
10927 // Otherwise emit a target independent node to be legalised.
10928 Ops.push_back(Builder.getValue(Call.getArgOperand(I)));
10929 }
10930 }
10931}
10932
10933/// Lower llvm.experimental.stackmap.
10934void SelectionDAGBuilder::visitStackmap(const CallInst &CI) {
10935 // void @llvm.experimental.stackmap(i64 <id>, i32 <numShadowBytes>,
10936 // [live variables...])
10937
10938 assert(CI.getType()->isVoidTy() && "Stackmap cannot return a value.");
10939
10940 SDValue Chain, InGlue, Callee;
10942
10943 SDLoc DL = getCurSDLoc();
10945
10946 // The stackmap intrinsic only records the live variables (the arguments
10947 // passed to it) and emits NOPS (if requested). Unlike the patchpoint
10948 // intrinsic, this won't be lowered to a function call. This means we don't
10949 // have to worry about calling conventions and target specific lowering code.
10950 // Instead we perform the call lowering right here.
10951 //
10952 // chain, flag = CALLSEQ_START(chain, 0, 0)
10953 // chain, flag = STACKMAP(id, nbytes, ..., chain, flag)
10954 // chain, flag = CALLSEQ_END(chain, 0, 0, flag)
10955 //
10956 Chain = DAG.getCALLSEQ_START(getRoot(), 0, 0, DL);
10957 InGlue = Chain.getValue(1);
10958
10959 // Add the STACKMAP operands, starting with DAG house-keeping.
10960 Ops.push_back(Chain);
10961 Ops.push_back(InGlue);
10962
10963 // Add the <id>, <numShadowBytes> operands.
10964 //
10965 // These do not require legalisation, and can be emitted directly to target
10966 // constant nodes.
10968 assert(ID.getValueType() == MVT::i64);
10969 SDValue IDConst =
10970 DAG.getTargetConstant(ID->getAsZExtVal(), DL, ID.getValueType());
10971 Ops.push_back(IDConst);
10972
10973 SDValue Shad = getValue(CI.getArgOperand(1));
10974 assert(Shad.getValueType() == MVT::i32);
10975 SDValue ShadConst =
10976 DAG.getTargetConstant(Shad->getAsZExtVal(), DL, Shad.getValueType());
10977 Ops.push_back(ShadConst);
10978
10979 // Add the live variables.
10980 addStackMapLiveVars(CI, 2, DL, Ops, *this);
10981
10982 // Create the STACKMAP node.
10983 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
10984 Chain = DAG.getNode(ISD::STACKMAP, DL, NodeTys, Ops);
10985 InGlue = Chain.getValue(1);
10986
10987 Chain = DAG.getCALLSEQ_END(Chain, 0, 0, InGlue, DL);
10988
10989 // Stackmaps don't generate values, so nothing goes into the NodeMap.
10990
10991 // Set the root to the target-lowered call chain.
10992 DAG.setRoot(Chain);
10993
10994 // Inform the Frame Information that we have a stackmap in this function.
10995 FuncInfo.MF->getFrameInfo().setHasStackMap();
10996}
10997
10998/// Lower llvm.experimental.patchpoint directly to its target opcode.
10999void SelectionDAGBuilder::visitPatchpoint(const CallBase &CB,
11000 const BasicBlock *EHPadBB) {
11001 // <ty> @llvm.experimental.patchpoint.<ty>(i64 <id>,
11002 // i32 <numBytes>,
11003 // i8* <target>,
11004 // i32 <numArgs>,
11005 // [Args...],
11006 // [live variables...])
11007
11009 bool IsAnyRegCC = CC == CallingConv::AnyReg;
11010 bool HasDef = !CB.getType()->isVoidTy();
11011 SDLoc dl = getCurSDLoc();
11013
11014 // Handle immediate and symbolic callees.
11015 if (auto* ConstCallee = dyn_cast<ConstantSDNode>(Callee))
11016 Callee = DAG.getIntPtrConstant(ConstCallee->getZExtValue(), dl,
11017 /*isTarget=*/true);
11018 else if (auto* SymbolicCallee = dyn_cast<GlobalAddressSDNode>(Callee))
11019 Callee = DAG.getTargetGlobalAddress(SymbolicCallee->getGlobal(),
11020 SDLoc(SymbolicCallee),
11021 SymbolicCallee->getValueType(0));
11022
11023 // Get the real number of arguments participating in the call <numArgs>
11025 unsigned NumArgs = NArgVal->getAsZExtVal();
11026
11027 // Skip the four meta args: <id>, <numNopBytes>, <target>, <numArgs>
11028 // Intrinsics include all meta-operands up to but not including CC.
11029 unsigned NumMetaOpers = PatchPointOpers::CCPos;
11030 assert(CB.arg_size() >= NumMetaOpers + NumArgs &&
11031 "Not enough arguments provided to the patchpoint intrinsic");
11032
11033 // For AnyRegCC the arguments are lowered later on manually.
11034 unsigned NumCallArgs = IsAnyRegCC ? 0 : NumArgs;
11035 Type *ReturnTy =
11036 IsAnyRegCC ? Type::getVoidTy(*DAG.getContext()) : CB.getType();
11037
11038 TargetLowering::CallLoweringInfo CLI(DAG);
11039 populateCallLoweringInfo(CLI, &CB, NumMetaOpers, NumCallArgs, Callee,
11040 ReturnTy, CB.getAttributes().getRetAttrs(), true);
11041 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
11042
11043 SDNode *CallEnd = Result.second.getNode();
11044 if (CallEnd->getOpcode() == ISD::EH_LABEL)
11045 CallEnd = CallEnd->getOperand(0).getNode();
11046 if (HasDef && (CallEnd->getOpcode() == ISD::CopyFromReg))
11047 CallEnd = CallEnd->getOperand(0).getNode();
11048
11049 /// Get a call instruction from the call sequence chain.
11050 /// Tail calls are not allowed.
11051 assert(CallEnd->getOpcode() == ISD::CALLSEQ_END &&
11052 "Expected a callseq node.");
11053 SDNode *Call = CallEnd->getOperand(0).getNode();
11054 bool HasGlue = Call->getGluedNode();
11055
11056 // Replace the target specific call node with the patchable intrinsic.
11058
11059 // Push the chain.
11060 Ops.push_back(*(Call->op_begin()));
11061
11062 // Optionally, push the glue (if any).
11063 if (HasGlue)
11064 Ops.push_back(*(Call->op_end() - 1));
11065
11066 // Push the register mask info.
11067 if (HasGlue)
11068 Ops.push_back(*(Call->op_end() - 2));
11069 else
11070 Ops.push_back(*(Call->op_end() - 1));
11071
11072 // Add the <id> and <numBytes> constants.
11074 Ops.push_back(DAG.getTargetConstant(IDVal->getAsZExtVal(), dl, MVT::i64));
11076 Ops.push_back(DAG.getTargetConstant(NBytesVal->getAsZExtVal(), dl, MVT::i32));
11077
11078 // Add the callee.
11079 Ops.push_back(Callee);
11080
11081 // Adjust <numArgs> to account for any arguments that have been passed on the
11082 // stack instead.
11083 // Call Node: Chain, Target, {Args}, RegMask, [Glue]
11084 unsigned NumCallRegArgs = Call->getNumOperands() - (HasGlue ? 4 : 3);
11085 NumCallRegArgs = IsAnyRegCC ? NumArgs : NumCallRegArgs;
11086 Ops.push_back(DAG.getTargetConstant(NumCallRegArgs, dl, MVT::i32));
11087
11088 // Add the calling convention
11089 Ops.push_back(DAG.getTargetConstant((unsigned)CC, dl, MVT::i32));
11090
11091 // Add the arguments we omitted previously. The register allocator should
11092 // place these in any free register.
11093 if (IsAnyRegCC)
11094 for (unsigned i = NumMetaOpers, e = NumMetaOpers + NumArgs; i != e; ++i)
11095 Ops.push_back(getValue(CB.getArgOperand(i)));
11096
11097 // Push the arguments from the call instruction.
11098 SDNode::op_iterator e = HasGlue ? Call->op_end()-2 : Call->op_end()-1;
11099 Ops.append(Call->op_begin() + 2, e);
11100
11101 // Push live variables for the stack map.
11102 addStackMapLiveVars(CB, NumMetaOpers + NumArgs, dl, Ops, *this);
11103
11104 SDVTList NodeTys;
11105 if (IsAnyRegCC && HasDef) {
11106 // Create the return types based on the intrinsic definition
11107 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11108 SmallVector<EVT, 3> ValueVTs;
11109 ComputeValueVTs(TLI, DAG.getDataLayout(), CB.getType(), ValueVTs);
11110 assert(ValueVTs.size() == 1 && "Expected only one return value type.");
11111
11112 // There is always a chain and a glue type at the end
11113 ValueVTs.push_back(MVT::Other);
11114 ValueVTs.push_back(MVT::Glue);
11115 NodeTys = DAG.getVTList(ValueVTs);
11116 } else
11117 NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
11118
11119 // Replace the target specific call node with a PATCHPOINT node.
11120 SDValue PPV = DAG.getNode(ISD::PATCHPOINT, dl, NodeTys, Ops);
11121
11122 // Update the NodeMap.
11123 if (HasDef) {
11124 if (IsAnyRegCC)
11125 setValue(&CB, SDValue(PPV.getNode(), 0));
11126 else
11127 setValue(&CB, Result.first);
11128 }
11129
11130 // Fixup the consumers of the intrinsic. The chain and glue may be used in the
11131 // call sequence. Furthermore the location of the chain and glue can change
11132 // when the AnyReg calling convention is used and the intrinsic returns a
11133 // value.
11134 if (IsAnyRegCC && HasDef) {
11135 SDValue From[] = {SDValue(Call, 0), SDValue(Call, 1)};
11136 SDValue To[] = {PPV.getValue(1), PPV.getValue(2)};
11137 DAG.ReplaceAllUsesOfValuesWith(From, To, 2);
11138 } else
11139 DAG.ReplaceAllUsesWith(Call, PPV.getNode());
11140 DAG.DeleteNode(Call);
11141
11142 // Inform the Frame Information that we have a patchpoint in this function.
11143 FuncInfo.MF->getFrameInfo().setHasPatchPoint();
11144}
11145
11146void SelectionDAGBuilder::visitVectorReduce(const CallInst &I,
11147 unsigned Intrinsic) {
11148 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11149 SDValue Op1 = getValue(I.getArgOperand(0));
11150 SDValue Op2;
11151 if (I.arg_size() > 1)
11152 Op2 = getValue(I.getArgOperand(1));
11153 SDLoc dl = getCurSDLoc();
11154 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
11155 SDValue Res;
11156 SDNodeFlags SDFlags;
11157 if (auto *FPMO = dyn_cast<FPMathOperator>(&I))
11158 SDFlags.copyFMF(*FPMO);
11159
11160 switch (Intrinsic) {
11161 case Intrinsic::vector_reduce_fadd:
11162 if (SDFlags.hasAllowReassociation())
11163 Res = DAG.getNode(ISD::FADD, dl, VT, Op1,
11164 DAG.getNode(ISD::VECREDUCE_FADD, dl, VT, Op2, SDFlags),
11165 SDFlags);
11166 else
11167 Res = DAG.getNode(ISD::VECREDUCE_SEQ_FADD, dl, VT, Op1, Op2, SDFlags);
11168 break;
11169 case Intrinsic::vector_reduce_fmul:
11170 if (SDFlags.hasAllowReassociation())
11171 Res = DAG.getNode(ISD::FMUL, dl, VT, Op1,
11172 DAG.getNode(ISD::VECREDUCE_FMUL, dl, VT, Op2, SDFlags),
11173 SDFlags);
11174 else
11175 Res = DAG.getNode(ISD::VECREDUCE_SEQ_FMUL, dl, VT, Op1, Op2, SDFlags);
11176 break;
11177 case Intrinsic::vector_reduce_add:
11178 Res = DAG.getNode(ISD::VECREDUCE_ADD, dl, VT, Op1);
11179 break;
11180 case Intrinsic::vector_reduce_mul:
11181 Res = DAG.getNode(ISD::VECREDUCE_MUL, dl, VT, Op1);
11182 break;
11183 case Intrinsic::vector_reduce_and:
11184 Res = DAG.getNode(ISD::VECREDUCE_AND, dl, VT, Op1);
11185 break;
11186 case Intrinsic::vector_reduce_or:
11187 Res = DAG.getNode(ISD::VECREDUCE_OR, dl, VT, Op1);
11188 break;
11189 case Intrinsic::vector_reduce_xor:
11190 Res = DAG.getNode(ISD::VECREDUCE_XOR, dl, VT, Op1);
11191 break;
11192 case Intrinsic::vector_reduce_smax:
11193 Res = DAG.getNode(ISD::VECREDUCE_SMAX, dl, VT, Op1);
11194 break;
11195 case Intrinsic::vector_reduce_smin:
11196 Res = DAG.getNode(ISD::VECREDUCE_SMIN, dl, VT, Op1);
11197 break;
11198 case Intrinsic::vector_reduce_umax:
11199 Res = DAG.getNode(ISD::VECREDUCE_UMAX, dl, VT, Op1);
11200 break;
11201 case Intrinsic::vector_reduce_umin:
11202 Res = DAG.getNode(ISD::VECREDUCE_UMIN, dl, VT, Op1);
11203 break;
11204 case Intrinsic::vector_reduce_fmax:
11205 Res = DAG.getNode(ISD::VECREDUCE_FMAX, dl, VT, Op1, SDFlags);
11206 break;
11207 case Intrinsic::vector_reduce_fmin:
11208 Res = DAG.getNode(ISD::VECREDUCE_FMIN, dl, VT, Op1, SDFlags);
11209 break;
11210 case Intrinsic::vector_reduce_fmaximum:
11211 Res = DAG.getNode(ISD::VECREDUCE_FMAXIMUM, dl, VT, Op1, SDFlags);
11212 break;
11213 case Intrinsic::vector_reduce_fminimum:
11214 Res = DAG.getNode(ISD::VECREDUCE_FMINIMUM, dl, VT, Op1, SDFlags);
11215 break;
11216 default:
11217 llvm_unreachable("Unhandled vector reduce intrinsic");
11218 }
11219 setValue(&I, Res);
11220}
11221
11222/// Returns an AttributeList representing the attributes applied to the return
11223/// value of the given call.
11226 if (CLI.RetSExt)
11227 Attrs.push_back(Attribute::SExt);
11228 if (CLI.RetZExt)
11229 Attrs.push_back(Attribute::ZExt);
11230 if (CLI.IsInReg)
11231 Attrs.push_back(Attribute::InReg);
11232
11233 return AttributeList::get(CLI.RetTy->getContext(), AttributeList::ReturnIndex,
11234 Attrs);
11235}
11236
11237/// TargetLowering::LowerCallTo - This is the default LowerCallTo
11238/// implementation, which just calls LowerCall.
11239/// FIXME: When all targets are
11240/// migrated to using LowerCall, this hook should be integrated into SDISel.
11241std::pair<SDValue, SDValue>
11243 LLVMContext &Context = CLI.RetTy->getContext();
11244
11245 // Handle the incoming return values from the call.
11246 CLI.Ins.clear();
11247 SmallVector<Type *, 4> RetOrigTys;
11249 auto &DL = CLI.DAG.getDataLayout();
11250 ComputeValueTypes(DL, CLI.OrigRetTy, RetOrigTys, &Offsets);
11251
11252 SmallVector<EVT, 4> RetVTs;
11253 if (CLI.RetTy != CLI.OrigRetTy) {
11254 assert(RetOrigTys.size() == 1 &&
11255 "Only supported for non-aggregate returns");
11256 RetVTs.push_back(getValueType(DL, CLI.RetTy));
11257 } else {
11258 for (Type *Ty : RetOrigTys)
11259 RetVTs.push_back(getValueType(DL, Ty));
11260 }
11261
11262 if (CLI.IsPostTypeLegalization) {
11263 // If we are lowering a libcall after legalization, split the return type.
11264 SmallVector<Type *, 4> OldRetOrigTys;
11265 SmallVector<EVT, 4> OldRetVTs;
11266 SmallVector<TypeSize, 4> OldOffsets;
11267 RetOrigTys.swap(OldRetOrigTys);
11268 RetVTs.swap(OldRetVTs);
11269 Offsets.swap(OldOffsets);
11270
11271 for (size_t i = 0, e = OldRetVTs.size(); i != e; ++i) {
11272 EVT RetVT = OldRetVTs[i];
11273 uint64_t Offset = OldOffsets[i];
11274 MVT RegisterVT = getRegisterType(Context, RetVT);
11275 unsigned NumRegs = getNumRegisters(Context, RetVT);
11276 unsigned RegisterVTByteSZ = RegisterVT.getSizeInBits() / 8;
11277 RetOrigTys.append(NumRegs, OldRetOrigTys[i]);
11278 RetVTs.append(NumRegs, RegisterVT);
11279 for (unsigned j = 0; j != NumRegs; ++j)
11280 Offsets.push_back(TypeSize::getFixed(Offset + j * RegisterVTByteSZ));
11281 }
11282 }
11283
11285 GetReturnInfo(CLI.CallConv, CLI.RetTy, getReturnAttrs(CLI), Outs, *this, DL);
11286
11287 bool CanLowerReturn =
11289 CLI.IsVarArg, Outs, Context, CLI.RetTy);
11290
11291 SDValue DemoteStackSlot;
11292 int DemoteStackIdx = -100;
11293 if (!CanLowerReturn) {
11294 // FIXME: equivalent assert?
11295 // assert(!CS.hasInAllocaArgument() &&
11296 // "sret demotion is incompatible with inalloca");
11297 uint64_t TySize = DL.getTypeAllocSize(CLI.RetTy);
11298 Align Alignment = DL.getPrefTypeAlign(CLI.RetTy);
11300 DemoteStackIdx =
11301 MF.getFrameInfo().CreateStackObject(TySize, Alignment, false);
11302 Type *StackSlotPtrType = PointerType::get(Context, DL.getAllocaAddrSpace());
11303
11304 DemoteStackSlot = CLI.DAG.getFrameIndex(DemoteStackIdx, getFrameIndexTy(DL));
11305 ArgListEntry Entry(DemoteStackSlot, StackSlotPtrType);
11306 Entry.IsSRet = true;
11307 Entry.Alignment = Alignment;
11308 CLI.getArgs().insert(CLI.getArgs().begin(), Entry);
11309 CLI.NumFixedArgs += 1;
11310 CLI.getArgs()[0].IndirectType = CLI.RetTy;
11311 CLI.RetTy = CLI.OrigRetTy = Type::getVoidTy(Context);
11312
11313 // sret demotion isn't compatible with tail-calls, since the sret argument
11314 // points into the callers stack frame.
11315 CLI.IsTailCall = false;
11316 } else {
11317 bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
11318 CLI.RetTy, CLI.CallConv, CLI.IsVarArg, DL);
11319 for (unsigned I = 0, E = RetVTs.size(); I != E; ++I) {
11320 ISD::ArgFlagsTy Flags;
11321 if (NeedsRegBlock) {
11322 Flags.setInConsecutiveRegs();
11323 if (I == RetVTs.size() - 1)
11324 Flags.setInConsecutiveRegsLast();
11325 }
11326 EVT VT = RetVTs[I];
11327 MVT RegisterVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11328 unsigned NumRegs =
11329 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11330 for (unsigned i = 0; i != NumRegs; ++i) {
11331 ISD::InputArg Ret(Flags, RegisterVT, VT, RetOrigTys[I],
11333 if (CLI.RetTy->isPointerTy()) {
11334 Ret.Flags.setPointer();
11336 cast<PointerType>(CLI.RetTy)->getAddressSpace());
11337 }
11338 if (CLI.RetSExt)
11339 Ret.Flags.setSExt();
11340 if (CLI.RetZExt)
11341 Ret.Flags.setZExt();
11342 if (CLI.IsInReg)
11343 Ret.Flags.setInReg();
11344 CLI.Ins.push_back(Ret);
11345 }
11346 }
11347 }
11348
11349 // We push in swifterror return as the last element of CLI.Ins.
11350 ArgListTy &Args = CLI.getArgs();
11351 if (supportSwiftError()) {
11352 for (const ArgListEntry &Arg : Args) {
11353 if (Arg.IsSwiftError) {
11354 ISD::ArgFlagsTy Flags;
11355 Flags.setSwiftError();
11357 PointerType::getUnqual(Context),
11358 /*Used=*/true, ISD::InputArg::NoArgIndex, 0);
11359 CLI.Ins.push_back(Ret);
11360 }
11361 }
11362 }
11363
11364 // Handle all of the outgoing arguments.
11365 CLI.Outs.clear();
11366 CLI.OutVals.clear();
11367 for (unsigned i = 0, e = Args.size(); i != e; ++i) {
11368 SmallVector<Type *, 4> OrigArgTys;
11369 ComputeValueTypes(DL, Args[i].OrigTy, OrigArgTys);
11370 // FIXME: Split arguments if CLI.IsPostTypeLegalization
11371 Type *FinalType = Args[i].Ty;
11372 if (Args[i].IsByVal)
11373 FinalType = Args[i].IndirectType;
11374 bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
11375 FinalType, CLI.CallConv, CLI.IsVarArg, DL);
11376 for (unsigned Value = 0, NumValues = OrigArgTys.size(); Value != NumValues;
11377 ++Value) {
11378 Type *OrigArgTy = OrigArgTys[Value];
11379 Type *ArgTy = OrigArgTy;
11380 if (Args[i].Ty != Args[i].OrigTy) {
11381 assert(Value == 0 && "Only supported for non-aggregate arguments");
11382 ArgTy = Args[i].Ty;
11383 }
11384
11385 EVT VT = getValueType(DL, ArgTy);
11386 SDValue Op = SDValue(Args[i].Node.getNode(),
11387 Args[i].Node.getResNo() + Value);
11388 ISD::ArgFlagsTy Flags;
11389
11390 // Certain targets (such as MIPS), may have a different ABI alignment
11391 // for a type depending on the context. Give the target a chance to
11392 // specify the alignment it wants.
11393 const Align OriginalAlignment(getABIAlignmentForCallingConv(ArgTy, DL));
11394 Flags.setOrigAlign(OriginalAlignment);
11395
11396 if (i >= CLI.NumFixedArgs)
11397 Flags.setVarArg();
11398 if (ArgTy->isPointerTy()) {
11399 Flags.setPointer();
11400 Flags.setPointerAddrSpace(cast<PointerType>(ArgTy)->getAddressSpace());
11401 }
11402 if (Args[i].IsZExt)
11403 Flags.setZExt();
11404 if (Args[i].IsSExt)
11405 Flags.setSExt();
11406 if (Args[i].IsNoExt)
11407 Flags.setNoExt();
11408 if (Args[i].IsInReg) {
11409 // If we are using vectorcall calling convention, a structure that is
11410 // passed InReg - is surely an HVA
11412 isa<StructType>(FinalType)) {
11413 // The first value of a structure is marked
11414 if (0 == Value)
11415 Flags.setHvaStart();
11416 Flags.setHva();
11417 }
11418 // Set InReg Flag
11419 Flags.setInReg();
11420 }
11421 if (Args[i].IsSRet)
11422 Flags.setSRet();
11423 if (Args[i].IsSwiftSelf)
11424 Flags.setSwiftSelf();
11425 if (Args[i].IsSwiftAsync)
11426 Flags.setSwiftAsync();
11427 if (Args[i].IsSwiftError)
11428 Flags.setSwiftError();
11429 if (Args[i].IsCFGuardTarget)
11430 Flags.setCFGuardTarget();
11431 if (Args[i].IsByVal)
11432 Flags.setByVal();
11433 if (Args[i].IsByRef)
11434 Flags.setByRef();
11435 if (Args[i].IsPreallocated) {
11436 Flags.setPreallocated();
11437 // Set the byval flag for CCAssignFn callbacks that don't know about
11438 // preallocated. This way we can know how many bytes we should've
11439 // allocated and how many bytes a callee cleanup function will pop. If
11440 // we port preallocated to more targets, we'll have to add custom
11441 // preallocated handling in the various CC lowering callbacks.
11442 Flags.setByVal();
11443 }
11444 if (Args[i].IsInAlloca) {
11445 Flags.setInAlloca();
11446 // Set the byval flag for CCAssignFn callbacks that don't know about
11447 // inalloca. This way we can know how many bytes we should've allocated
11448 // and how many bytes a callee cleanup function will pop. If we port
11449 // inalloca to more targets, we'll have to add custom inalloca handling
11450 // in the various CC lowering callbacks.
11451 Flags.setByVal();
11452 }
11453 Align MemAlign;
11454 if (Args[i].IsByVal || Args[i].IsInAlloca || Args[i].IsPreallocated) {
11455 unsigned FrameSize = DL.getTypeAllocSize(Args[i].IndirectType);
11456 Flags.setByValSize(FrameSize);
11457
11458 // info is not there but there are cases it cannot get right.
11459 if (auto MA = Args[i].Alignment)
11460 MemAlign = *MA;
11461 else
11462 MemAlign = getByValTypeAlignment(Args[i].IndirectType, DL);
11463 } else if (auto MA = Args[i].Alignment) {
11464 MemAlign = *MA;
11465 } else {
11466 MemAlign = OriginalAlignment;
11467 }
11468 Flags.setMemAlign(MemAlign);
11469 if (Args[i].IsNest)
11470 Flags.setNest();
11471 if (NeedsRegBlock)
11472 Flags.setInConsecutiveRegs();
11473
11474 MVT PartVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11475 unsigned NumParts =
11476 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11477 SmallVector<SDValue, 4> Parts(NumParts);
11478 ISD::NodeType ExtendKind = ISD::ANY_EXTEND;
11479
11480 if (Args[i].IsSExt)
11481 ExtendKind = ISD::SIGN_EXTEND;
11482 else if (Args[i].IsZExt)
11483 ExtendKind = ISD::ZERO_EXTEND;
11484
11485 // Conservatively only handle 'returned' on non-vectors that can be lowered,
11486 // for now.
11487 if (Args[i].IsReturned && !Op.getValueType().isVector() &&
11489 assert((CLI.RetTy == Args[i].Ty ||
11490 (CLI.RetTy->isPointerTy() && Args[i].Ty->isPointerTy() &&
11492 Args[i].Ty->getPointerAddressSpace())) &&
11493 RetVTs.size() == NumValues && "unexpected use of 'returned'");
11494 // Before passing 'returned' to the target lowering code, ensure that
11495 // either the register MVT and the actual EVT are the same size or that
11496 // the return value and argument are extended in the same way; in these
11497 // cases it's safe to pass the argument register value unchanged as the
11498 // return register value (although it's at the target's option whether
11499 // to do so)
11500 // TODO: allow code generation to take advantage of partially preserved
11501 // registers rather than clobbering the entire register when the
11502 // parameter extension method is not compatible with the return
11503 // extension method
11504 if ((NumParts * PartVT.getSizeInBits() == VT.getSizeInBits()) ||
11505 (ExtendKind != ISD::ANY_EXTEND && CLI.RetSExt == Args[i].IsSExt &&
11506 CLI.RetZExt == Args[i].IsZExt))
11507 Flags.setReturned();
11508 }
11509
11510 getCopyToParts(CLI.DAG, CLI.DL, Op, &Parts[0], NumParts, PartVT, CLI.CB,
11511 CLI.CallConv, ExtendKind);
11512
11513 for (unsigned j = 0; j != NumParts; ++j) {
11514 // if it isn't first piece, alignment must be 1
11515 // For scalable vectors the scalable part is currently handled
11516 // by individual targets, so we just use the known minimum size here.
11517 ISD::OutputArg MyFlags(
11518 Flags, Parts[j].getValueType().getSimpleVT(), VT, OrigArgTy, i,
11519 j * Parts[j].getValueType().getStoreSize().getKnownMinValue());
11520 if (NumParts > 1 && j == 0)
11521 MyFlags.Flags.setSplit();
11522 else if (j != 0) {
11523 MyFlags.Flags.setOrigAlign(Align(1));
11524 if (j == NumParts - 1)
11525 MyFlags.Flags.setSplitEnd();
11526 }
11527
11528 CLI.Outs.push_back(MyFlags);
11529 CLI.OutVals.push_back(Parts[j]);
11530 }
11531
11532 if (NeedsRegBlock && Value == NumValues - 1)
11533 CLI.Outs[CLI.Outs.size() - 1].Flags.setInConsecutiveRegsLast();
11534 }
11535 }
11536
11538 CLI.Chain = LowerCall(CLI, InVals);
11539
11540 // Update CLI.InVals to use outside of this function.
11541 CLI.InVals = InVals;
11542
11543 // Verify that the target's LowerCall behaved as expected.
11544 assert(CLI.Chain.getNode() && CLI.Chain.getValueType() == MVT::Other &&
11545 "LowerCall didn't return a valid chain!");
11546 assert((!CLI.IsTailCall || InVals.empty()) &&
11547 "LowerCall emitted a return value for a tail call!");
11548 assert((CLI.IsTailCall || InVals.size() == CLI.Ins.size()) &&
11549 "LowerCall didn't emit the correct number of values!");
11550
11551 // For a tail call, the return value is merely live-out and there aren't
11552 // any nodes in the DAG representing it. Return a special value to
11553 // indicate that a tail call has been emitted and no more Instructions
11554 // should be processed in the current block.
11555 if (CLI.IsTailCall) {
11556 CLI.DAG.setRoot(CLI.Chain);
11557 return std::make_pair(SDValue(), SDValue());
11558 }
11559
11560#ifndef NDEBUG
11561 for (unsigned i = 0, e = CLI.Ins.size(); i != e; ++i) {
11562 assert(InVals[i].getNode() && "LowerCall emitted a null value!");
11563 assert(EVT(CLI.Ins[i].VT) == InVals[i].getValueType() &&
11564 "LowerCall emitted a value with the wrong type!");
11565 }
11566#endif
11567
11568 SmallVector<SDValue, 4> ReturnValues;
11569 if (!CanLowerReturn) {
11570 // The instruction result is the result of loading from the
11571 // hidden sret parameter.
11572 MVT PtrVT = getPointerTy(DL, DL.getAllocaAddrSpace());
11573
11574 unsigned NumValues = RetVTs.size();
11575 ReturnValues.resize(NumValues);
11576 SmallVector<SDValue, 4> Chains(NumValues);
11577
11578 // An aggregate return value cannot wrap around the address space, so
11579 // offsets to its parts don't wrap either.
11581 Align HiddenSRetAlign = MF.getFrameInfo().getObjectAlign(DemoteStackIdx);
11582 for (unsigned i = 0; i < NumValues; ++i) {
11584 DemoteStackSlot, CLI.DAG.getConstant(Offsets[i], CLI.DL, PtrVT),
11586 SDValue L = CLI.DAG.getLoad(
11587 RetVTs[i], CLI.DL, CLI.Chain, Add,
11589 DemoteStackIdx, Offsets[i]),
11590 HiddenSRetAlign);
11591 ReturnValues[i] = L;
11592 Chains[i] = L.getValue(1);
11593 }
11594
11595 CLI.Chain = CLI.DAG.getNode(ISD::TokenFactor, CLI.DL, MVT::Other, Chains);
11596 } else {
11597 // Collect the legal value parts into potentially illegal values
11598 // that correspond to the original function's return values.
11599 std::optional<ISD::NodeType> AssertOp;
11600 if (CLI.RetSExt)
11601 AssertOp = ISD::AssertSext;
11602 else if (CLI.RetZExt)
11603 AssertOp = ISD::AssertZext;
11604 unsigned CurReg = 0;
11605 for (EVT VT : RetVTs) {
11606 MVT RegisterVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11607 unsigned NumRegs =
11608 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11609
11610 ReturnValues.push_back(getCopyFromParts(
11611 CLI.DAG, CLI.DL, &InVals[CurReg], NumRegs, RegisterVT, VT, nullptr,
11612 CLI.Chain, CLI.CallConv, AssertOp));
11613 CurReg += NumRegs;
11614 }
11615
11616 // For a function returning void, there is no return value. We can't create
11617 // such a node, so we just return a null return value in that case. In
11618 // that case, nothing will actually look at the value.
11619 if (ReturnValues.empty())
11620 return std::make_pair(SDValue(), CLI.Chain);
11621 }
11622
11623 SDValue Res = CLI.DAG.getNode(ISD::MERGE_VALUES, CLI.DL,
11624 CLI.DAG.getVTList(RetVTs), ReturnValues);
11625 return std::make_pair(Res, CLI.Chain);
11626}
11627
11628/// Places new result values for the node in Results (their number
11629/// and types must exactly match those of the original return values of
11630/// the node), or leaves Results empty, which indicates that the node is not
11631/// to be custom lowered after all.
11634 SelectionDAG &DAG) const {
11635 SDValue Res = LowerOperation(SDValue(N, 0), DAG);
11636
11637 if (!Res.getNode())
11638 return;
11639
11640 // If the original node has one result, take the return value from
11641 // LowerOperation as is. It might not be result number 0.
11642 if (N->getNumValues() == 1) {
11643 Results.push_back(Res);
11644 return;
11645 }
11646
11647 // If the original node has multiple results, then the return node should
11648 // have the same number of results.
11649 assert((N->getNumValues() == Res->getNumValues()) &&
11650 "Lowering returned the wrong number of results!");
11651
11652 // Places new result values base on N result number.
11653 for (unsigned I = 0, E = N->getNumValues(); I != E; ++I)
11654 Results.push_back(Res.getValue(I));
11655}
11656
11658 llvm_unreachable("LowerOperation not implemented for this target!");
11659}
11660
11662 Register Reg,
11663 ISD::NodeType ExtendType) {
11665 assert((Op.getOpcode() != ISD::CopyFromReg ||
11666 cast<RegisterSDNode>(Op.getOperand(1))->getReg() != Reg) &&
11667 "Copy from a reg to the same reg!");
11668 assert(!Reg.isPhysical() && "Is a physreg");
11669
11670 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11671 // If this is an InlineAsm we have to match the registers required, not the
11672 // notional registers required by the type.
11673
11674 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), Reg, V->getType(),
11675 std::nullopt); // This is not an ABI copy.
11676 SDValue Chain = DAG.getEntryNode();
11677
11678 if (ExtendType == ISD::ANY_EXTEND) {
11679 auto PreferredExtendIt = FuncInfo.PreferredExtendType.find(V);
11680 if (PreferredExtendIt != FuncInfo.PreferredExtendType.end())
11681 ExtendType = PreferredExtendIt->second;
11682 }
11683 RFV.getCopyToRegs(Op, DAG, getCurSDLoc(), Chain, nullptr, V, ExtendType);
11684 PendingExports.push_back(Chain);
11685}
11686
11688
11689/// isOnlyUsedInEntryBlock - If the specified argument is only used in the
11690/// entry block, return true. This includes arguments used by switches, since
11691/// the switch may expand into multiple basic blocks.
11692static bool isOnlyUsedInEntryBlock(const Argument *A, bool FastISel) {
11693 // With FastISel active, we may be splitting blocks, so force creation
11694 // of virtual registers for all non-dead arguments.
11695 if (FastISel)
11696 return A->use_empty();
11697
11698 const BasicBlock &Entry = A->getParent()->front();
11699 for (const User *U : A->users())
11700 if (cast<Instruction>(U)->getParent() != &Entry || isa<SwitchInst>(U))
11701 return false; // Use not in entry block.
11702
11703 return true;
11704}
11705
11707 DenseMap<const Argument *,
11708 std::pair<const AllocaInst *, const StoreInst *>>;
11709
11710/// Scan the entry block of the function in FuncInfo for arguments that look
11711/// like copies into a local alloca. Record any copied arguments in
11712/// ArgCopyElisionCandidates.
11713static void
11715 FunctionLoweringInfo *FuncInfo,
11716 ArgCopyElisionMapTy &ArgCopyElisionCandidates) {
11717 // Record the state of every static alloca used in the entry block. Argument
11718 // allocas are all used in the entry block, so we need approximately as many
11719 // entries as we have arguments.
11720 enum StaticAllocaInfo { Unknown, Clobbered, Elidable };
11722 unsigned NumArgs = FuncInfo->Fn->arg_size();
11723 StaticAllocas.reserve(NumArgs * 2);
11724
11725 auto GetInfoIfStaticAlloca = [&](const Value *V) -> StaticAllocaInfo * {
11726 if (!V)
11727 return nullptr;
11728 V = V->stripPointerCasts();
11729 const auto *AI = dyn_cast<AllocaInst>(V);
11730 if (!AI || !AI->isStaticAlloca() || !FuncInfo->StaticAllocaMap.count(AI))
11731 return nullptr;
11732 auto Iter = StaticAllocas.insert({AI, Unknown});
11733 return &Iter.first->second;
11734 };
11735
11736 // Look for stores of arguments to static allocas. Look through bitcasts and
11737 // GEPs to handle type coercions, as long as the alloca is fully initialized
11738 // by the store. Any non-store use of an alloca escapes it and any subsequent
11739 // unanalyzed store might write it.
11740 // FIXME: Handle structs initialized with multiple stores.
11741 for (const Instruction &I : FuncInfo->Fn->getEntryBlock()) {
11742 // Look for stores, and handle non-store uses conservatively.
11743 const auto *SI = dyn_cast<StoreInst>(&I);
11744 if (!SI) {
11745 // We will look through cast uses, so ignore them completely.
11746 if (I.isCast())
11747 continue;
11748 // Ignore debug info and pseudo op intrinsics, they don't escape or store
11749 // to allocas.
11750 if (I.isDebugOrPseudoInst())
11751 continue;
11752 // This is an unknown instruction. Assume it escapes or writes to all
11753 // static alloca operands.
11754 for (const Use &U : I.operands()) {
11755 if (StaticAllocaInfo *Info = GetInfoIfStaticAlloca(U))
11756 *Info = StaticAllocaInfo::Clobbered;
11757 }
11758 continue;
11759 }
11760
11761 // If the stored value is a static alloca, mark it as escaped.
11762 if (StaticAllocaInfo *Info = GetInfoIfStaticAlloca(SI->getValueOperand()))
11763 *Info = StaticAllocaInfo::Clobbered;
11764
11765 // Check if the destination is a static alloca.
11766 const Value *Dst = SI->getPointerOperand()->stripPointerCasts();
11767 StaticAllocaInfo *Info = GetInfoIfStaticAlloca(Dst);
11768 if (!Info)
11769 continue;
11770 const AllocaInst *AI = cast<AllocaInst>(Dst);
11771
11772 // Skip allocas that have been initialized or clobbered.
11773 if (*Info != StaticAllocaInfo::Unknown)
11774 continue;
11775
11776 // Check if the stored value is an argument, and that this store fully
11777 // initializes the alloca.
11778 // If the argument type has padding bits we can't directly forward a pointer
11779 // as the upper bits may contain garbage.
11780 // Don't elide copies from the same argument twice.
11781 const Value *Val = SI->getValueOperand()->stripPointerCasts();
11782 const auto *Arg = dyn_cast<Argument>(Val);
11783 std::optional<TypeSize> AllocaSize = AI->getAllocationSize(DL);
11784 if (!Arg || Arg->hasPassPointeeByValueCopyAttr() ||
11785 Arg->getType()->isEmptyTy() || !AllocaSize ||
11786 DL.getTypeStoreSize(Arg->getType()) != *AllocaSize ||
11787 !DL.typeSizeEqualsStoreSize(Arg->getType()) ||
11788 ArgCopyElisionCandidates.count(Arg)) {
11789 *Info = StaticAllocaInfo::Clobbered;
11790 continue;
11791 }
11792
11793 LLVM_DEBUG(dbgs() << "Found argument copy elision candidate: " << *AI
11794 << '\n');
11795
11796 // Mark this alloca and store for argument copy elision.
11797 *Info = StaticAllocaInfo::Elidable;
11798 ArgCopyElisionCandidates.insert({Arg, {AI, SI}});
11799
11800 // Stop scanning if we've seen all arguments. This will happen early in -O0
11801 // builds, which is useful, because -O0 builds have large entry blocks and
11802 // many allocas.
11803 if (ArgCopyElisionCandidates.size() == NumArgs)
11804 break;
11805 }
11806}
11807
11808/// Try to elide argument copies from memory into a local alloca. Succeeds if
11809/// ArgVal is a load from a suitable fixed stack object.
11812 DenseMap<int, int> &ArgCopyElisionFrameIndexMap,
11813 SmallPtrSetImpl<const Instruction *> &ElidedArgCopyInstrs,
11814 ArgCopyElisionMapTy &ArgCopyElisionCandidates, const Argument &Arg,
11815 ArrayRef<SDValue> ArgVals, bool &ArgHasUses) {
11816 // Check if this is a load from a fixed stack object.
11817 auto *LNode = dyn_cast<LoadSDNode>(ArgVals[0]);
11818 if (!LNode)
11819 return;
11820 auto *FINode = dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode());
11821 if (!FINode)
11822 return;
11823
11824 // Check that the fixed stack object is the right size and alignment.
11825 // Look at the alignment that the user wrote on the alloca instead of looking
11826 // at the stack object.
11827 auto ArgCopyIter = ArgCopyElisionCandidates.find(&Arg);
11828 assert(ArgCopyIter != ArgCopyElisionCandidates.end());
11829 const AllocaInst *AI = ArgCopyIter->second.first;
11830 int FixedIndex = FINode->getIndex();
11831 int &AllocaIndex = FuncInfo.StaticAllocaMap[AI];
11832 int OldIndex = AllocaIndex;
11833 MachineFrameInfo &MFI = FuncInfo.MF->getFrameInfo();
11834 if (MFI.getObjectSize(FixedIndex) != MFI.getObjectSize(OldIndex)) {
11835 LLVM_DEBUG(
11836 dbgs() << " argument copy elision failed due to bad fixed stack "
11837 "object size\n");
11838 return;
11839 }
11840 Align RequiredAlignment = AI->getAlign();
11841 if (MFI.getObjectAlign(FixedIndex) < RequiredAlignment) {
11842 LLVM_DEBUG(dbgs() << " argument copy elision failed: alignment of alloca "
11843 "greater than stack argument alignment ("
11844 << DebugStr(RequiredAlignment) << " vs "
11845 << DebugStr(MFI.getObjectAlign(FixedIndex)) << ")\n");
11846 return;
11847 }
11848
11849 // Perform the elision. Delete the old stack object and replace its only use
11850 // in the variable info map. Mark the stack object as mutable and aliased.
11851 LLVM_DEBUG({
11852 dbgs() << "Eliding argument copy from " << Arg << " to " << *AI << '\n'
11853 << " Replacing frame index " << OldIndex << " with " << FixedIndex
11854 << '\n';
11855 });
11856 MFI.RemoveStackObject(OldIndex);
11857 MFI.setIsImmutableObjectIndex(FixedIndex, false);
11858 MFI.setIsAliasedObjectIndex(FixedIndex, true);
11859 AllocaIndex = FixedIndex;
11860 ArgCopyElisionFrameIndexMap.insert({OldIndex, FixedIndex});
11861 for (SDValue ArgVal : ArgVals)
11862 Chains.push_back(ArgVal.getValue(1));
11863
11864 // Avoid emitting code for the store implementing the copy.
11865 const StoreInst *SI = ArgCopyIter->second.second;
11866 ElidedArgCopyInstrs.insert(SI);
11867
11868 // Check for uses of the argument again so that we can avoid exporting ArgVal
11869 // if it is't used by anything other than the store.
11870 for (const Value *U : Arg.users()) {
11871 if (U != SI) {
11872 ArgHasUses = true;
11873 break;
11874 }
11875 }
11876}
11877
11878void SelectionDAGISel::LowerArguments(const Function &F) {
11879 SelectionDAG &DAG = SDB->DAG;
11880 SDLoc dl = SDB->getCurSDLoc();
11881 const DataLayout &DL = DAG.getDataLayout();
11883
11884 // In Naked functions we aren't going to save any registers.
11885 if (F.hasFnAttribute(Attribute::Naked))
11886 return;
11887
11888 if (!FuncInfo->CanLowerReturn) {
11889 // Put in an sret pointer parameter before all the other parameters.
11890 MVT ValueVT = TLI->getPointerTy(DL, DL.getAllocaAddrSpace());
11891
11892 ISD::ArgFlagsTy Flags;
11893 Flags.setSRet();
11894 MVT RegisterVT = TLI->getRegisterType(*DAG.getContext(), ValueVT);
11895 ISD::InputArg RetArg(Flags, RegisterVT, ValueVT, F.getReturnType(), true,
11897 Ins.push_back(RetArg);
11898 }
11899
11900 // Look for stores of arguments to static allocas. Mark such arguments with a
11901 // flag to ask the target to give us the memory location of that argument if
11902 // available.
11903 ArgCopyElisionMapTy ArgCopyElisionCandidates;
11905 ArgCopyElisionCandidates);
11906
11907 // Set up the incoming argument description vector.
11908 for (const Argument &Arg : F.args()) {
11909 unsigned ArgNo = Arg.getArgNo();
11911 ComputeValueTypes(DAG.getDataLayout(), Arg.getType(), Types);
11912 bool isArgValueUsed = !Arg.use_empty();
11913 Type *FinalType = Arg.getType();
11914 if (Arg.hasAttribute(Attribute::ByVal))
11915 FinalType = Arg.getParamByValType();
11916 bool NeedsRegBlock = TLI->functionArgumentNeedsConsecutiveRegisters(
11917 FinalType, F.getCallingConv(), F.isVarArg(), DL);
11918 for (unsigned Value = 0, NumValues = Types.size(); Value != NumValues;
11919 ++Value) {
11920 Type *ArgTy = Types[Value];
11921 EVT VT = TLI->getValueType(DL, ArgTy);
11922 ISD::ArgFlagsTy Flags;
11923
11924 if (ArgTy->isPointerTy()) {
11925 Flags.setPointer();
11926 Flags.setPointerAddrSpace(cast<PointerType>(ArgTy)->getAddressSpace());
11927 }
11928 if (Arg.hasAttribute(Attribute::ZExt))
11929 Flags.setZExt();
11930 if (Arg.hasAttribute(Attribute::SExt))
11931 Flags.setSExt();
11932 if (Arg.hasAttribute(Attribute::InReg)) {
11933 // If we are using vectorcall calling convention, a structure that is
11934 // passed InReg - is surely an HVA
11935 if (F.getCallingConv() == CallingConv::X86_VectorCall &&
11936 isa<StructType>(Arg.getType())) {
11937 // The first value of a structure is marked
11938 if (0 == Value)
11939 Flags.setHvaStart();
11940 Flags.setHva();
11941 }
11942 // Set InReg Flag
11943 Flags.setInReg();
11944 }
11945 if (Arg.hasAttribute(Attribute::StructRet))
11946 Flags.setSRet();
11947 if (Arg.hasAttribute(Attribute::SwiftSelf))
11948 Flags.setSwiftSelf();
11949 if (Arg.hasAttribute(Attribute::SwiftAsync))
11950 Flags.setSwiftAsync();
11951 if (Arg.hasAttribute(Attribute::SwiftError))
11952 Flags.setSwiftError();
11953 if (Arg.hasAttribute(Attribute::ByVal))
11954 Flags.setByVal();
11955 if (Arg.hasAttribute(Attribute::ByRef))
11956 Flags.setByRef();
11957 if (Arg.hasAttribute(Attribute::InAlloca)) {
11958 Flags.setInAlloca();
11959 // Set the byval flag for CCAssignFn callbacks that don't know about
11960 // inalloca. This way we can know how many bytes we should've allocated
11961 // and how many bytes a callee cleanup function will pop. If we port
11962 // inalloca to more targets, we'll have to add custom inalloca handling
11963 // in the various CC lowering callbacks.
11964 Flags.setByVal();
11965 }
11966 if (Arg.hasAttribute(Attribute::Preallocated)) {
11967 Flags.setPreallocated();
11968 // Set the byval flag for CCAssignFn callbacks that don't know about
11969 // preallocated. This way we can know how many bytes we should've
11970 // allocated and how many bytes a callee cleanup function will pop. If
11971 // we port preallocated to more targets, we'll have to add custom
11972 // preallocated handling in the various CC lowering callbacks.
11973 Flags.setByVal();
11974 }
11975
11976 // Certain targets (such as MIPS), may have a different ABI alignment
11977 // for a type depending on the context. Give the target a chance to
11978 // specify the alignment it wants.
11979 const Align OriginalAlignment(
11980 TLI->getABIAlignmentForCallingConv(ArgTy, DL));
11981 Flags.setOrigAlign(OriginalAlignment);
11982
11983 Align MemAlign;
11984 Type *ArgMemTy = nullptr;
11985 if (Flags.isByVal() || Flags.isInAlloca() || Flags.isPreallocated() ||
11986 Flags.isByRef()) {
11987 if (!ArgMemTy)
11988 ArgMemTy = Arg.getPointeeInMemoryValueType();
11989
11990 uint64_t MemSize = DL.getTypeAllocSize(ArgMemTy);
11991
11992 // For in-memory arguments, size and alignment should be passed from FE.
11993 // BE will guess if this info is not there but there are cases it cannot
11994 // get right.
11995 if (auto ParamAlign = Arg.getParamStackAlign())
11996 MemAlign = *ParamAlign;
11997 else if ((ParamAlign = Arg.getParamAlign()))
11998 MemAlign = *ParamAlign;
11999 else
12000 MemAlign = TLI->getByValTypeAlignment(ArgMemTy, DL);
12001 if (Flags.isByRef())
12002 Flags.setByRefSize(MemSize);
12003 else
12004 Flags.setByValSize(MemSize);
12005 } else if (auto ParamAlign = Arg.getParamStackAlign()) {
12006 MemAlign = *ParamAlign;
12007 } else {
12008 MemAlign = OriginalAlignment;
12009 }
12010 Flags.setMemAlign(MemAlign);
12011
12012 if (Arg.hasAttribute(Attribute::Nest))
12013 Flags.setNest();
12014 if (NeedsRegBlock)
12015 Flags.setInConsecutiveRegs();
12016 if (ArgCopyElisionCandidates.count(&Arg))
12017 Flags.setCopyElisionCandidate();
12018 if (Arg.hasAttribute(Attribute::Returned))
12019 Flags.setReturned();
12020
12021 MVT RegisterVT = TLI->getRegisterTypeForCallingConv(
12022 *CurDAG->getContext(), F.getCallingConv(), VT);
12023 unsigned NumRegs = TLI->getNumRegistersForCallingConv(
12024 *CurDAG->getContext(), F.getCallingConv(), VT);
12025 for (unsigned i = 0; i != NumRegs; ++i) {
12026 // For scalable vectors, use the minimum size; individual targets
12027 // are responsible for handling scalable vector arguments and
12028 // return values.
12029 ISD::InputArg MyFlags(
12030 Flags, RegisterVT, VT, ArgTy, isArgValueUsed, ArgNo,
12031 i * RegisterVT.getStoreSize().getKnownMinValue());
12032 if (NumRegs > 1 && i == 0)
12033 MyFlags.Flags.setSplit();
12034 // if it isn't first piece, alignment must be 1
12035 else if (i > 0) {
12036 MyFlags.Flags.setOrigAlign(Align(1));
12037 if (i == NumRegs - 1)
12038 MyFlags.Flags.setSplitEnd();
12039 }
12040 Ins.push_back(MyFlags);
12041 }
12042 if (NeedsRegBlock && Value == NumValues - 1)
12043 Ins[Ins.size() - 1].Flags.setInConsecutiveRegsLast();
12044 }
12045 }
12046
12047 // Call the target to set up the argument values.
12049 SDValue NewRoot = TLI->LowerFormalArguments(
12050 DAG.getRoot(), F.getCallingConv(), F.isVarArg(), Ins, dl, DAG, InVals);
12051
12052 // Verify that the target's LowerFormalArguments behaved as expected.
12053 assert(NewRoot.getNode() && NewRoot.getValueType() == MVT::Other &&
12054 "LowerFormalArguments didn't return a valid chain!");
12055 assert(InVals.size() == Ins.size() &&
12056 "LowerFormalArguments didn't emit the correct number of values!");
12057 LLVM_DEBUG({
12058 for (unsigned i = 0, e = Ins.size(); i != e; ++i) {
12059 assert(InVals[i].getNode() &&
12060 "LowerFormalArguments emitted a null value!");
12061 assert(EVT(Ins[i].VT) == InVals[i].getValueType() &&
12062 "LowerFormalArguments emitted a value with the wrong type!");
12063 }
12064 });
12065
12066 // Update the DAG with the new chain value resulting from argument lowering.
12067 DAG.setRoot(NewRoot);
12068
12069 // Set up the argument values.
12070 unsigned i = 0;
12071 if (!FuncInfo->CanLowerReturn) {
12072 // Create a virtual register for the sret pointer, and put in a copy
12073 // from the sret argument into it.
12074 MVT VT = TLI->getPointerTy(DL, DL.getAllocaAddrSpace());
12075 MVT RegVT = TLI->getRegisterType(*CurDAG->getContext(), VT);
12076 std::optional<ISD::NodeType> AssertOp;
12077 SDValue ArgValue =
12078 getCopyFromParts(DAG, dl, &InVals[0], 1, RegVT, VT, nullptr, NewRoot,
12079 F.getCallingConv(), AssertOp);
12080
12081 MachineFunction& MF = SDB->DAG.getMachineFunction();
12082 MachineRegisterInfo& RegInfo = MF.getRegInfo();
12083 Register SRetReg =
12084 RegInfo.createVirtualRegister(TLI->getRegClassFor(RegVT));
12085 FuncInfo->DemoteRegister = SRetReg;
12086 NewRoot =
12087 SDB->DAG.getCopyToReg(NewRoot, SDB->getCurSDLoc(), SRetReg, ArgValue);
12088 DAG.setRoot(NewRoot);
12089
12090 // i indexes lowered arguments. Bump it past the hidden sret argument.
12091 ++i;
12092 }
12093
12095 DenseMap<int, int> ArgCopyElisionFrameIndexMap;
12096 for (const Argument &Arg : F.args()) {
12097 SmallVector<SDValue, 4> ArgValues;
12098 SmallVector<EVT, 4> ValueVTs;
12099 ComputeValueVTs(*TLI, DAG.getDataLayout(), Arg.getType(), ValueVTs);
12100 unsigned NumValues = ValueVTs.size();
12101 if (NumValues == 0)
12102 continue;
12103
12104 bool ArgHasUses = !Arg.use_empty();
12105
12106 // Elide the copying store if the target loaded this argument from a
12107 // suitable fixed stack object.
12108 if (Ins[i].Flags.isCopyElisionCandidate()) {
12109 unsigned NumParts = 0;
12110 for (EVT VT : ValueVTs)
12111 NumParts += TLI->getNumRegistersForCallingConv(*CurDAG->getContext(),
12112 F.getCallingConv(), VT);
12113
12114 tryToElideArgumentCopy(*FuncInfo, Chains, ArgCopyElisionFrameIndexMap,
12115 ElidedArgCopyInstrs, ArgCopyElisionCandidates, Arg,
12116 ArrayRef(&InVals[i], NumParts), ArgHasUses);
12117 }
12118
12119 // If this argument is unused then remember its value. It is used to generate
12120 // debugging information.
12121 bool isSwiftErrorArg =
12122 TLI->supportSwiftError() &&
12123 Arg.hasAttribute(Attribute::SwiftError);
12124 if (!ArgHasUses && !isSwiftErrorArg) {
12125 SDB->setUnusedArgValue(&Arg, InVals[i]);
12126
12127 // Also remember any frame index for use in FastISel.
12128 if (FrameIndexSDNode *FI =
12130 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12131 }
12132
12133 for (unsigned Val = 0; Val != NumValues; ++Val) {
12134 EVT VT = ValueVTs[Val];
12135 MVT PartVT = TLI->getRegisterTypeForCallingConv(*CurDAG->getContext(),
12136 F.getCallingConv(), VT);
12137 unsigned NumParts = TLI->getNumRegistersForCallingConv(
12138 *CurDAG->getContext(), F.getCallingConv(), VT);
12139
12140 // Even an apparent 'unused' swifterror argument needs to be returned. So
12141 // we do generate a copy for it that can be used on return from the
12142 // function.
12143 if (ArgHasUses || isSwiftErrorArg) {
12144 std::optional<ISD::NodeType> AssertOp;
12145 if (Arg.hasAttribute(Attribute::SExt))
12146 AssertOp = ISD::AssertSext;
12147 else if (Arg.hasAttribute(Attribute::ZExt))
12148 AssertOp = ISD::AssertZext;
12149
12150 SDValue OutVal =
12151 getCopyFromParts(DAG, dl, &InVals[i], NumParts, PartVT, VT, nullptr,
12152 NewRoot, F.getCallingConv(), AssertOp);
12153
12154 FPClassTest NoFPClass = Arg.getNoFPClass();
12155 if (NoFPClass != fcNone) {
12156 SDValue SDNoFPClass = DAG.getTargetConstant(
12157 static_cast<uint64_t>(NoFPClass), dl, MVT::i32);
12158 OutVal = DAG.getNode(ISD::AssertNoFPClass, dl, OutVal.getValueType(),
12159 OutVal, SDNoFPClass);
12160 }
12161 ArgValues.push_back(OutVal);
12162 }
12163
12164 i += NumParts;
12165 }
12166
12167 // We don't need to do anything else for unused arguments.
12168 if (ArgValues.empty())
12169 continue;
12170
12171 // Note down frame index.
12172 if (FrameIndexSDNode *FI =
12173 dyn_cast<FrameIndexSDNode>(ArgValues[0].getNode()))
12174 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12175
12176 SDValue Res = DAG.getMergeValues(ArrayRef(ArgValues.data(), NumValues),
12177 SDB->getCurSDLoc());
12178
12179 SDB->setValue(&Arg, Res);
12180 if (!TM.Options.EnableFastISel && Res.getOpcode() == ISD::BUILD_PAIR) {
12181 // We want to associate the argument with the frame index, among
12182 // involved operands, that correspond to the lowest address. The
12183 // getCopyFromParts function, called earlier, is swapping the order of
12184 // the operands to BUILD_PAIR depending on endianness. The result of
12185 // that swapping is that the least significant bits of the argument will
12186 // be in the first operand of the BUILD_PAIR node, and the most
12187 // significant bits will be in the second operand.
12188 unsigned LowAddressOp = DAG.getDataLayout().isBigEndian() ? 1 : 0;
12189 if (LoadSDNode *LNode =
12190 dyn_cast<LoadSDNode>(Res.getOperand(LowAddressOp).getNode()))
12191 if (FrameIndexSDNode *FI =
12192 dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
12193 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12194 }
12195
12196 // Analyses past this point are naive and don't expect an assertion.
12197 if (Res.getOpcode() == ISD::AssertZext)
12198 Res = Res.getOperand(0);
12199
12200 // Update the SwiftErrorVRegDefMap.
12201 if (Res.getOpcode() == ISD::CopyFromReg && isSwiftErrorArg) {
12202 Register Reg = cast<RegisterSDNode>(Res.getOperand(1))->getReg();
12203 if (Reg.isVirtual())
12204 SwiftError->setCurrentVReg(FuncInfo->MBB, SwiftError->getFunctionArg(),
12205 Reg);
12206 }
12207
12208 // If this argument is live outside of the entry block, insert a copy from
12209 // wherever we got it to the vreg that other BB's will reference it as.
12210 if (Res.getOpcode() == ISD::CopyFromReg) {
12211 // If we can, though, try to skip creating an unnecessary vreg.
12212 // FIXME: This isn't very clean... it would be nice to make this more
12213 // general.
12214 Register Reg = cast<RegisterSDNode>(Res.getOperand(1))->getReg();
12215 if (Reg.isVirtual()) {
12216 FuncInfo->ValueMap[&Arg] = Reg;
12217 continue;
12218 }
12219 }
12220 if (!isOnlyUsedInEntryBlock(&Arg, TM.Options.EnableFastISel)) {
12221 FuncInfo->InitializeRegForValue(&Arg);
12222 SDB->CopyToExportRegsIfNeeded(&Arg);
12223 }
12224 }
12225
12226 if (!Chains.empty()) {
12227 Chains.push_back(NewRoot);
12228 NewRoot = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chains);
12229 }
12230
12231 DAG.setRoot(NewRoot);
12232
12233 assert(i == InVals.size() && "Argument register count mismatch!");
12234
12235 // If any argument copy elisions occurred and we have debug info, update the
12236 // stale frame indices used in the dbg.declare variable info table.
12237 if (!ArgCopyElisionFrameIndexMap.empty()) {
12238 for (MachineFunction::VariableDbgInfo &VI :
12239 MF->getInStackSlotVariableDbgInfo()) {
12240 auto I = ArgCopyElisionFrameIndexMap.find(VI.getStackSlot());
12241 if (I != ArgCopyElisionFrameIndexMap.end())
12242 VI.updateStackSlot(I->second);
12243 }
12244 }
12245
12246 // Finally, if the target has anything special to do, allow it to do so.
12248}
12249
12250/// Handle PHI nodes in successor blocks. Emit code into the SelectionDAG to
12251/// ensure constants are generated when needed. Remember the virtual registers
12252/// that need to be added to the Machine PHI nodes as input. We cannot just
12253/// directly add them, because expansion might result in multiple MBB's for one
12254/// BB. As such, the start of the BB might correspond to a different MBB than
12255/// the end.
12256void
12257SelectionDAGBuilder::HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) {
12258 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12259
12260 SmallPtrSet<MachineBasicBlock *, 4> SuccsHandled;
12261
12262 // Check PHI nodes in successors that expect a value to be available from this
12263 // block.
12264 for (const BasicBlock *SuccBB : successors(LLVMBB->getTerminator())) {
12265 if (!isa<PHINode>(SuccBB->begin())) continue;
12266 MachineBasicBlock *SuccMBB = FuncInfo.getMBB(SuccBB);
12267
12268 // If this terminator has multiple identical successors (common for
12269 // switches), only handle each succ once.
12270 if (!SuccsHandled.insert(SuccMBB).second)
12271 continue;
12272
12274
12275 // At this point we know that there is a 1-1 correspondence between LLVM PHI
12276 // nodes and Machine PHI nodes, but the incoming operands have not been
12277 // emitted yet.
12278 for (const PHINode &PN : SuccBB->phis()) {
12279 // Ignore dead phi's.
12280 if (PN.use_empty())
12281 continue;
12282
12283 // Skip empty types
12284 if (PN.getType()->isEmptyTy())
12285 continue;
12286
12287 Register Reg;
12288 const Value *PHIOp = PN.getIncomingValueForBlock(LLVMBB);
12289
12290 if (const auto *C = dyn_cast<Constant>(PHIOp)) {
12291 Register &RegOut = ConstantsOut[C];
12292 if (!RegOut) {
12293 RegOut = FuncInfo.CreateRegs(&PN);
12294 // We need to zero/sign extend ConstantInt phi operands to match
12295 // assumptions in FunctionLoweringInfo::ComputePHILiveOutRegInfo.
12296 ISD::NodeType ExtendType = ISD::ANY_EXTEND;
12297 if (auto *CI = dyn_cast<ConstantInt>(C))
12298 ExtendType = TLI.signExtendConstant(CI) ? ISD::SIGN_EXTEND
12300 CopyValueToVirtualRegister(C, RegOut, ExtendType);
12301 }
12302 Reg = RegOut;
12303 } else {
12305 FuncInfo.ValueMap.find(PHIOp);
12306 if (I != FuncInfo.ValueMap.end())
12307 Reg = I->second;
12308 else {
12309 assert(isa<AllocaInst>(PHIOp) &&
12310 FuncInfo.StaticAllocaMap.count(cast<AllocaInst>(PHIOp)) &&
12311 "Didn't codegen value into a register!??");
12312 Reg = FuncInfo.CreateRegs(&PN);
12314 }
12315 }
12316
12317 // Remember that this register needs to added to the machine PHI node as
12318 // the input for this MBB.
12319 SmallVector<EVT, 4> ValueVTs;
12320 ComputeValueVTs(TLI, DAG.getDataLayout(), PN.getType(), ValueVTs);
12321 for (EVT VT : ValueVTs) {
12322 const unsigned NumRegisters = TLI.getNumRegisters(*DAG.getContext(), VT);
12323 for (unsigned i = 0; i != NumRegisters; ++i)
12324 FuncInfo.PHINodesToUpdate.emplace_back(&*MBBI++, Reg + i);
12325 Reg += NumRegisters;
12326 }
12327 }
12328 }
12329
12330 ConstantsOut.clear();
12331}
12332
12333MachineBasicBlock *SelectionDAGBuilder::NextBlock(MachineBasicBlock *MBB) {
12335 if (++I == FuncInfo.MF->end())
12336 return nullptr;
12337 return &*I;
12338}
12339
12340/// During lowering new call nodes can be created (such as memset, etc.).
12341/// Those will become new roots of the current DAG, but complications arise
12342/// when they are tail calls. In such cases, the call lowering will update
12343/// the root, but the builder still needs to know that a tail call has been
12344/// lowered in order to avoid generating an additional return.
12345void SelectionDAGBuilder::updateDAGForMaybeTailCall(SDValue MaybeTC) {
12346 // If the node is null, we do have a tail call.
12347 if (MaybeTC.getNode() != nullptr)
12348 DAG.setRoot(MaybeTC);
12349 else
12350 HasTailCall = true;
12351}
12352
12353void SelectionDAGBuilder::lowerWorkItem(SwitchWorkListItem W, Value *Cond,
12354 MachineBasicBlock *SwitchMBB,
12355 MachineBasicBlock *DefaultMBB) {
12356 MachineFunction *CurMF = FuncInfo.MF;
12357 MachineBasicBlock *NextMBB = nullptr;
12359 if (++BBI != FuncInfo.MF->end())
12360 NextMBB = &*BBI;
12361
12362 unsigned Size = W.LastCluster - W.FirstCluster + 1;
12363
12364 BranchProbabilityInfo *BPI = FuncInfo.BPI;
12365
12366 if (Size == 2 && W.MBB == SwitchMBB) {
12367 // If any two of the cases has the same destination, and if one value
12368 // is the same as the other, but has one bit unset that the other has set,
12369 // use bit manipulation to do two compares at once. For example:
12370 // "if (X == 6 || X == 4)" -> "if ((X|2) == 6)"
12371 // TODO: This could be extended to merge any 2 cases in switches with 3
12372 // cases.
12373 // TODO: Handle cases where W.CaseBB != SwitchBB.
12374 CaseCluster &Small = *W.FirstCluster;
12375 CaseCluster &Big = *W.LastCluster;
12376
12377 if (Small.Low == Small.High && Big.Low == Big.High &&
12378 Small.MBB == Big.MBB) {
12379 const APInt &SmallValue = Small.Low->getValue();
12380 const APInt &BigValue = Big.Low->getValue();
12381
12382 // Check that there is only one bit different.
12383 APInt CommonBit = BigValue ^ SmallValue;
12384 if (CommonBit.isPowerOf2()) {
12385 SDValue CondLHS = getValue(Cond);
12386 EVT VT = CondLHS.getValueType();
12387 SDLoc DL = getCurSDLoc();
12388
12389 SDValue Or = DAG.getNode(ISD::OR, DL, VT, CondLHS,
12390 DAG.getConstant(CommonBit, DL, VT));
12391 SDValue Cond = DAG.getSetCC(
12392 DL, MVT::i1, Or, DAG.getConstant(BigValue | SmallValue, DL, VT),
12393 ISD::SETEQ);
12394
12395 // Update successor info.
12396 // Both Small and Big will jump to Small.BB, so we sum up the
12397 // probabilities.
12398 addSuccessorWithProb(SwitchMBB, Small.MBB, Small.Prob + Big.Prob);
12399 if (BPI)
12400 addSuccessorWithProb(
12401 SwitchMBB, DefaultMBB,
12402 // The default destination is the first successor in IR.
12403 BPI->getEdgeProbability(SwitchMBB->getBasicBlock(), (unsigned)0));
12404 else
12405 addSuccessorWithProb(SwitchMBB, DefaultMBB);
12406
12407 // Insert the true branch.
12408 SDValue BrCond =
12409 DAG.getNode(ISD::BRCOND, DL, MVT::Other, getControlRoot(), Cond,
12410 DAG.getBasicBlock(Small.MBB));
12411 // Insert the false branch.
12412 BrCond = DAG.getNode(ISD::BR, DL, MVT::Other, BrCond,
12413 DAG.getBasicBlock(DefaultMBB));
12414
12415 DAG.setRoot(BrCond);
12416 return;
12417 }
12418 }
12419 }
12420
12421 if (TM.getOptLevel() != CodeGenOptLevel::None) {
12422 // Here, we order cases by probability so the most likely case will be
12423 // checked first. However, two clusters can have the same probability in
12424 // which case their relative ordering is non-deterministic. So we use Low
12425 // as a tie-breaker as clusters are guaranteed to never overlap.
12426 llvm::sort(W.FirstCluster, W.LastCluster + 1,
12427 [](const CaseCluster &a, const CaseCluster &b) {
12428 return a.Prob != b.Prob ?
12429 a.Prob > b.Prob :
12430 a.Low->getValue().slt(b.Low->getValue());
12431 });
12432
12433 // Rearrange the case blocks so that the last one falls through if possible
12434 // without changing the order of probabilities.
12435 for (CaseClusterIt I = W.LastCluster; I > W.FirstCluster; ) {
12436 --I;
12437 if (I->Prob > W.LastCluster->Prob)
12438 break;
12439 if (I->Kind == CC_Range && I->MBB == NextMBB) {
12440 std::swap(*I, *W.LastCluster);
12441 break;
12442 }
12443 }
12444 }
12445
12446 // Compute total probability.
12447 BranchProbability DefaultProb = W.DefaultProb;
12448 BranchProbability UnhandledProbs = DefaultProb;
12449 for (CaseClusterIt I = W.FirstCluster; I <= W.LastCluster; ++I)
12450 UnhandledProbs += I->Prob;
12451
12452 MachineBasicBlock *CurMBB = W.MBB;
12453 for (CaseClusterIt I = W.FirstCluster, E = W.LastCluster; I <= E; ++I) {
12454 bool FallthroughUnreachable = false;
12455 MachineBasicBlock *Fallthrough;
12456 if (I == W.LastCluster) {
12457 // For the last cluster, fall through to the default destination.
12458 Fallthrough = DefaultMBB;
12459 FallthroughUnreachable = isa<UnreachableInst>(
12460 DefaultMBB->getBasicBlock()->getFirstNonPHIOrDbg());
12461 } else {
12462 Fallthrough = CurMF->CreateMachineBasicBlock(CurMBB->getBasicBlock());
12463 CurMF->insert(BBI, Fallthrough);
12464 // Put Cond in a virtual register to make it available from the new blocks.
12466 }
12467 UnhandledProbs -= I->Prob;
12468
12469 switch (I->Kind) {
12470 case CC_JumpTable: {
12471 // FIXME: Optimize away range check based on pivot comparisons.
12472 JumpTableHeader *JTH = &SL->JTCases[I->JTCasesIndex].first;
12473 SwitchCG::JumpTable *JT = &SL->JTCases[I->JTCasesIndex].second;
12474
12475 // The jump block hasn't been inserted yet; insert it here.
12476 MachineBasicBlock *JumpMBB = JT->MBB;
12477 CurMF->insert(BBI, JumpMBB);
12478
12479 auto JumpProb = I->Prob;
12480 auto FallthroughProb = UnhandledProbs;
12481
12482 // If the default statement is a target of the jump table, we evenly
12483 // distribute the default probability to successors of CurMBB. Also
12484 // update the probability on the edge from JumpMBB to Fallthrough.
12485 for (MachineBasicBlock::succ_iterator SI = JumpMBB->succ_begin(),
12486 SE = JumpMBB->succ_end();
12487 SI != SE; ++SI) {
12488 if (*SI == DefaultMBB) {
12489 JumpProb += DefaultProb / 2;
12490 FallthroughProb -= DefaultProb / 2;
12491 JumpMBB->setSuccProbability(SI, DefaultProb / 2);
12492 JumpMBB->normalizeSuccProbs();
12493 break;
12494 }
12495 }
12496
12497 // If the default clause is unreachable, propagate that knowledge into
12498 // JTH->FallthroughUnreachable which will use it to suppress the range
12499 // check.
12500 //
12501 // However, don't do this if we're doing branch target enforcement,
12502 // because a table branch _without_ a range check can be a tempting JOP
12503 // gadget - out-of-bounds inputs that are impossible in correct
12504 // execution become possible again if an attacker can influence the
12505 // control flow. So if an attacker doesn't already have a BTI bypass
12506 // available, we don't want them to be able to get one out of this
12507 // table branch.
12508 if (FallthroughUnreachable) {
12509 Function &CurFunc = CurMF->getFunction();
12510 if (!CurFunc.hasFnAttribute("branch-target-enforcement"))
12511 JTH->FallthroughUnreachable = true;
12512 }
12513
12514 if (!JTH->FallthroughUnreachable)
12515 addSuccessorWithProb(CurMBB, Fallthrough, FallthroughProb);
12516 addSuccessorWithProb(CurMBB, JumpMBB, JumpProb);
12517 CurMBB->normalizeSuccProbs();
12518
12519 // The jump table header will be inserted in our current block, do the
12520 // range check, and fall through to our fallthrough block.
12521 JTH->HeaderBB = CurMBB;
12522 JT->Default = Fallthrough; // FIXME: Move Default to JumpTableHeader.
12523
12524 // If we're in the right place, emit the jump table header right now.
12525 if (CurMBB == SwitchMBB) {
12526 visitJumpTableHeader(*JT, *JTH, SwitchMBB);
12527 JTH->Emitted = true;
12528 }
12529 break;
12530 }
12531 case CC_BitTests: {
12532 // FIXME: Optimize away range check based on pivot comparisons.
12533 BitTestBlock *BTB = &SL->BitTestCases[I->BTCasesIndex];
12534
12535 // The bit test blocks haven't been inserted yet; insert them here.
12536 for (BitTestCase &BTC : BTB->Cases)
12537 CurMF->insert(BBI, BTC.ThisBB);
12538
12539 // Fill in fields of the BitTestBlock.
12540 BTB->Parent = CurMBB;
12541 BTB->Default = Fallthrough;
12542
12543 BTB->DefaultProb = UnhandledProbs;
12544 // If the cases in bit test don't form a contiguous range, we evenly
12545 // distribute the probability on the edge to Fallthrough to two
12546 // successors of CurMBB.
12547 if (!BTB->ContiguousRange) {
12548 BTB->Prob += DefaultProb / 2;
12549 BTB->DefaultProb -= DefaultProb / 2;
12550 }
12551
12552 if (FallthroughUnreachable)
12553 BTB->FallthroughUnreachable = true;
12554
12555 // If we're in the right place, emit the bit test header right now.
12556 if (CurMBB == SwitchMBB) {
12557 visitBitTestHeader(*BTB, SwitchMBB);
12558 BTB->Emitted = true;
12559 }
12560 break;
12561 }
12562 case CC_Range: {
12563 const Value *RHS, *LHS, *MHS;
12564 ISD::CondCode CC;
12565 if (I->Low == I->High) {
12566 // Check Cond == I->Low.
12567 CC = ISD::SETEQ;
12568 LHS = Cond;
12569 RHS=I->Low;
12570 MHS = nullptr;
12571 } else {
12572 // Check I->Low <= Cond <= I->High.
12573 CC = ISD::SETLE;
12574 LHS = I->Low;
12575 MHS = Cond;
12576 RHS = I->High;
12577 }
12578
12579 // If Fallthrough is unreachable, fold away the comparison.
12580 if (FallthroughUnreachable)
12581 CC = ISD::SETTRUE;
12582
12583 // The false probability is the sum of all unhandled cases.
12584 CaseBlock CB(CC, LHS, RHS, MHS, I->MBB, Fallthrough, CurMBB,
12585 getCurSDLoc(), I->Prob, UnhandledProbs);
12586
12587 if (CurMBB == SwitchMBB)
12588 visitSwitchCase(CB, SwitchMBB);
12589 else
12590 SL->SwitchCases.push_back(CB);
12591
12592 break;
12593 }
12594 }
12595 CurMBB = Fallthrough;
12596 }
12597}
12598
12599void SelectionDAGBuilder::splitWorkItem(SwitchWorkList &WorkList,
12600 const SwitchWorkListItem &W,
12601 Value *Cond,
12602 MachineBasicBlock *SwitchMBB) {
12603 assert(W.FirstCluster->Low->getValue().slt(W.LastCluster->Low->getValue()) &&
12604 "Clusters not sorted?");
12605 assert(W.LastCluster - W.FirstCluster + 1 >= 2 && "Too small to split!");
12606
12607 auto [LastLeft, FirstRight, LeftProb, RightProb] =
12608 SL->computeSplitWorkItemInfo(W);
12609
12610 // Use the first element on the right as pivot since we will make less-than
12611 // comparisons against it.
12612 CaseClusterIt PivotCluster = FirstRight;
12613 assert(PivotCluster > W.FirstCluster);
12614 assert(PivotCluster <= W.LastCluster);
12615
12616 CaseClusterIt FirstLeft = W.FirstCluster;
12617 CaseClusterIt LastRight = W.LastCluster;
12618
12619 const ConstantInt *Pivot = PivotCluster->Low;
12620
12621 // New blocks will be inserted immediately after the current one.
12623 ++BBI;
12624
12625 // We will branch to the LHS if Value < Pivot. If LHS is a single cluster,
12626 // we can branch to its destination directly if it's squeezed exactly in
12627 // between the known lower bound and Pivot - 1.
12628 MachineBasicBlock *LeftMBB;
12629 if (FirstLeft == LastLeft && FirstLeft->Kind == CC_Range &&
12630 FirstLeft->Low == W.GE &&
12631 (FirstLeft->High->getValue() + 1LL) == Pivot->getValue()) {
12632 LeftMBB = FirstLeft->MBB;
12633 } else {
12634 LeftMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
12635 FuncInfo.MF->insert(BBI, LeftMBB);
12636 WorkList.push_back(
12637 {LeftMBB, FirstLeft, LastLeft, W.GE, Pivot, W.DefaultProb / 2});
12638 // Put Cond in a virtual register to make it available from the new blocks.
12640 }
12641
12642 // Similarly, we will branch to the RHS if Value >= Pivot. If RHS is a
12643 // single cluster, RHS.Low == Pivot, and we can branch to its destination
12644 // directly if RHS.High equals the current upper bound.
12645 MachineBasicBlock *RightMBB;
12646 if (FirstRight == LastRight && FirstRight->Kind == CC_Range &&
12647 W.LT && (FirstRight->High->getValue() + 1ULL) == W.LT->getValue()) {
12648 RightMBB = FirstRight->MBB;
12649 } else {
12650 RightMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
12651 FuncInfo.MF->insert(BBI, RightMBB);
12652 WorkList.push_back(
12653 {RightMBB, FirstRight, LastRight, Pivot, W.LT, W.DefaultProb / 2});
12654 // Put Cond in a virtual register to make it available from the new blocks.
12656 }
12657
12658 // Create the CaseBlock record that will be used to lower the branch.
12659 CaseBlock CB(ISD::SETLT, Cond, Pivot, nullptr, LeftMBB, RightMBB, W.MBB,
12660 getCurSDLoc(), LeftProb, RightProb);
12661
12662 if (W.MBB == SwitchMBB)
12663 visitSwitchCase(CB, SwitchMBB);
12664 else
12665 SL->SwitchCases.push_back(CB);
12666}
12667
12668// Scale CaseProb after peeling a case with the probablity of PeeledCaseProb
12669// from the swith statement.
12671 BranchProbability PeeledCaseProb) {
12672 if (PeeledCaseProb == BranchProbability::getOne())
12674 BranchProbability SwitchProb = PeeledCaseProb.getCompl();
12675
12676 uint32_t Numerator = CaseProb.getNumerator();
12677 uint32_t Denominator = SwitchProb.scale(CaseProb.getDenominator());
12678 return BranchProbability(Numerator, std::max(Numerator, Denominator));
12679}
12680
12681// Try to peel the top probability case if it exceeds the threshold.
12682// Return current MachineBasicBlock for the switch statement if the peeling
12683// does not occur.
12684// If the peeling is performed, return the newly created MachineBasicBlock
12685// for the peeled switch statement. Also update Clusters to remove the peeled
12686// case. PeeledCaseProb is the BranchProbability for the peeled case.
12687MachineBasicBlock *SelectionDAGBuilder::peelDominantCaseCluster(
12688 const SwitchInst &SI, CaseClusterVector &Clusters,
12689 BranchProbability &PeeledCaseProb) {
12690 MachineBasicBlock *SwitchMBB = FuncInfo.MBB;
12691 // Don't perform if there is only one cluster or optimizing for size.
12692 if (SwitchPeelThreshold > 100 || !FuncInfo.BPI || Clusters.size() < 2 ||
12693 TM.getOptLevel() == CodeGenOptLevel::None ||
12694 SwitchMBB->getParent()->getFunction().hasMinSize())
12695 return SwitchMBB;
12696
12697 BranchProbability TopCaseProb = BranchProbability(SwitchPeelThreshold, 100);
12698 unsigned PeeledCaseIndex = 0;
12699 bool SwitchPeeled = false;
12700 for (unsigned Index = 0; Index < Clusters.size(); ++Index) {
12701 CaseCluster &CC = Clusters[Index];
12702 if (CC.Prob < TopCaseProb)
12703 continue;
12704 TopCaseProb = CC.Prob;
12705 PeeledCaseIndex = Index;
12706 SwitchPeeled = true;
12707 }
12708 if (!SwitchPeeled)
12709 return SwitchMBB;
12710
12711 LLVM_DEBUG(dbgs() << "Peeled one top case in switch stmt, prob: "
12712 << TopCaseProb << "\n");
12713
12714 // Record the MBB for the peeled switch statement.
12715 MachineFunction::iterator BBI(SwitchMBB);
12716 ++BBI;
12717 MachineBasicBlock *PeeledSwitchMBB =
12718 FuncInfo.MF->CreateMachineBasicBlock(SwitchMBB->getBasicBlock());
12719 FuncInfo.MF->insert(BBI, PeeledSwitchMBB);
12720
12721 ExportFromCurrentBlock(SI.getCondition());
12722 auto PeeledCaseIt = Clusters.begin() + PeeledCaseIndex;
12723 SwitchWorkListItem W = {SwitchMBB, PeeledCaseIt, PeeledCaseIt,
12724 nullptr, nullptr, TopCaseProb.getCompl()};
12725 lowerWorkItem(W, SI.getCondition(), SwitchMBB, PeeledSwitchMBB);
12726
12727 Clusters.erase(PeeledCaseIt);
12728 for (CaseCluster &CC : Clusters) {
12729 LLVM_DEBUG(
12730 dbgs() << "Scale the probablity for one cluster, before scaling: "
12731 << CC.Prob << "\n");
12732 CC.Prob = scaleCaseProbality(CC.Prob, TopCaseProb);
12733 LLVM_DEBUG(dbgs() << "After scaling: " << CC.Prob << "\n");
12734 }
12735 PeeledCaseProb = TopCaseProb;
12736 return PeeledSwitchMBB;
12737}
12738
12739void SelectionDAGBuilder::visitSwitch(const SwitchInst &SI) {
12740 // Extract cases from the switch.
12741 BranchProbabilityInfo *BPI = FuncInfo.BPI;
12742 CaseClusterVector Clusters;
12743 Clusters.reserve(SI.getNumCases());
12744 for (auto I : SI.cases()) {
12745 MachineBasicBlock *Succ = FuncInfo.getMBB(I.getCaseSuccessor());
12746 const ConstantInt *CaseVal = I.getCaseValue();
12747 BranchProbability Prob =
12748 BPI ? BPI->getEdgeProbability(SI.getParent(), I.getSuccessorIndex())
12749 : BranchProbability(1, SI.getNumCases() + 1);
12750 Clusters.push_back(CaseCluster::range(CaseVal, CaseVal, Succ, Prob));
12751 }
12752
12753 MachineBasicBlock *DefaultMBB = FuncInfo.getMBB(SI.getDefaultDest());
12754
12755 // Cluster adjacent cases with the same destination. We do this at all
12756 // optimization levels because it's cheap to do and will make codegen faster
12757 // if there are many clusters.
12758 sortAndRangeify(Clusters);
12759
12760 // The branch probablity of the peeled case.
12761 BranchProbability PeeledCaseProb = BranchProbability::getZero();
12762 MachineBasicBlock *PeeledSwitchMBB =
12763 peelDominantCaseCluster(SI, Clusters, PeeledCaseProb);
12764
12765 // If there is only the default destination, jump there directly.
12766 MachineBasicBlock *SwitchMBB = FuncInfo.MBB;
12767 if (Clusters.empty()) {
12768 assert(PeeledSwitchMBB == SwitchMBB);
12769 SwitchMBB->addSuccessor(DefaultMBB);
12770 if (DefaultMBB != NextBlock(SwitchMBB)) {
12771 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
12772 getControlRoot(), DAG.getBasicBlock(DefaultMBB)));
12773 }
12774 return;
12775 }
12776
12777 SL->findJumpTables(Clusters, &SI, getCurSDLoc(), DefaultMBB, DAG.getPSI(),
12778 DAG.getBFI());
12779 SL->findBitTestClusters(Clusters, &SI);
12780
12781 LLVM_DEBUG({
12782 dbgs() << "Case clusters: ";
12783 for (const CaseCluster &C : Clusters) {
12784 if (C.Kind == CC_JumpTable)
12785 dbgs() << "JT:";
12786 if (C.Kind == CC_BitTests)
12787 dbgs() << "BT:";
12788
12789 C.Low->getValue().print(dbgs(), true);
12790 if (C.Low != C.High) {
12791 dbgs() << '-';
12792 C.High->getValue().print(dbgs(), true);
12793 }
12794 dbgs() << ' ';
12795 }
12796 dbgs() << '\n';
12797 });
12798
12799 assert(!Clusters.empty());
12800 SwitchWorkList WorkList;
12801 CaseClusterIt First = Clusters.begin();
12802 CaseClusterIt Last = Clusters.end() - 1;
12803 auto DefaultProb = getEdgeProbability(PeeledSwitchMBB, DefaultMBB);
12804 // Scale the branchprobability for DefaultMBB if the peel occurs and
12805 // DefaultMBB is not replaced.
12806 if (PeeledCaseProb != BranchProbability::getZero() &&
12807 DefaultMBB == FuncInfo.getMBB(SI.getDefaultDest()))
12808 DefaultProb = scaleCaseProbality(DefaultProb, PeeledCaseProb);
12809 WorkList.push_back(
12810 {PeeledSwitchMBB, First, Last, nullptr, nullptr, DefaultProb});
12811
12812 while (!WorkList.empty()) {
12813 SwitchWorkListItem W = WorkList.pop_back_val();
12814 unsigned NumClusters = W.LastCluster - W.FirstCluster + 1;
12815
12816 if (NumClusters > 3 && TM.getOptLevel() != CodeGenOptLevel::None &&
12817 !DefaultMBB->getParent()->getFunction().hasMinSize()) {
12818 // For optimized builds, lower large range as a balanced binary tree.
12819 splitWorkItem(WorkList, W, SI.getCondition(), SwitchMBB);
12820 continue;
12821 }
12822
12823 lowerWorkItem(W, SI.getCondition(), SwitchMBB, DefaultMBB);
12824 }
12825}
12826
12827void SelectionDAGBuilder::visitStepVector(const CallInst &I) {
12828 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12829 auto DL = getCurSDLoc();
12830 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12831 setValue(&I, DAG.getStepVector(DL, ResultVT));
12832}
12833
12834void SelectionDAGBuilder::visitVectorReverse(const CallInst &I) {
12835 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12836 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12837
12838 SDLoc DL = getCurSDLoc();
12839 SDValue V = getValue(I.getOperand(0));
12840 assert(VT == V.getValueType() && "Malformed vector.reverse!");
12841
12842 if (VT.isScalableVector()) {
12843 setValue(&I, DAG.getNode(ISD::VECTOR_REVERSE, DL, VT, V));
12844 return;
12845 }
12846
12847 // Use VECTOR_SHUFFLE for the fixed-length vector
12848 // to maintain existing behavior.
12849 SmallVector<int, 8> Mask;
12850 unsigned NumElts = VT.getVectorMinNumElements();
12851 for (unsigned i = 0; i != NumElts; ++i)
12852 Mask.push_back(NumElts - 1 - i);
12853
12854 setValue(&I, DAG.getVectorShuffle(VT, DL, V, DAG.getUNDEF(VT), Mask));
12855}
12856
12857void SelectionDAGBuilder::visitVectorDeinterleave(const CallInst &I,
12858 unsigned Factor) {
12859 auto DL = getCurSDLoc();
12860 SDValue InVec = getValue(I.getOperand(0));
12861
12862 SmallVector<EVT, 4> ValueVTs;
12863 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
12864 ValueVTs);
12865
12866 EVT OutVT = ValueVTs[0];
12867 unsigned OutNumElts = OutVT.getVectorMinNumElements();
12868
12869 SmallVector<SDValue, 4> SubVecs(Factor);
12870 for (unsigned i = 0; i != Factor; ++i) {
12871 assert(ValueVTs[i] == OutVT && "Expected VTs to be the same");
12872 SubVecs[i] = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, OutVT, InVec,
12873 DAG.getVectorIdxConstant(OutNumElts * i, DL));
12874 }
12875
12876 // Use VECTOR_SHUFFLE for fixed-length vectors with factor of 2 to benefit
12877 // from existing legalisation and combines.
12878 if (OutVT.isFixedLengthVector() && Factor == 2) {
12879 SDValue Even = DAG.getVectorShuffle(OutVT, DL, SubVecs[0], SubVecs[1],
12880 createStrideMask(0, 2, OutNumElts));
12881 SDValue Odd = DAG.getVectorShuffle(OutVT, DL, SubVecs[0], SubVecs[1],
12882 createStrideMask(1, 2, OutNumElts));
12883 SDValue Res = DAG.getMergeValues({Even, Odd}, getCurSDLoc());
12884 setValue(&I, Res);
12885 return;
12886 }
12887
12888 SDValue Res = DAG.getNode(ISD::VECTOR_DEINTERLEAVE, DL,
12889 DAG.getVTList(ValueVTs), SubVecs);
12890 setValue(&I, Res);
12891}
12892
12893void SelectionDAGBuilder::visitVectorInterleave(const CallInst &I,
12894 unsigned Factor) {
12895 auto DL = getCurSDLoc();
12896 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12897 EVT InVT = getValue(I.getOperand(0)).getValueType();
12898 EVT OutVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12899
12900 SmallVector<SDValue, 8> InVecs(Factor);
12901 for (unsigned i = 0; i < Factor; ++i) {
12902 InVecs[i] = getValue(I.getOperand(i));
12903 assert(InVecs[i].getValueType() == InVecs[0].getValueType() &&
12904 "Expected VTs to be the same");
12905 }
12906
12907 // Use VECTOR_SHUFFLE for fixed-length vectors with factor of 2 to benefit
12908 // from existing legalisation and combines.
12909 if (OutVT.isFixedLengthVector() && Factor == 2) {
12910 unsigned NumElts = InVT.getVectorMinNumElements();
12911 SDValue V = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, InVecs);
12912 setValue(&I, DAG.getVectorShuffle(OutVT, DL, V, DAG.getUNDEF(OutVT),
12913 createInterleaveMask(NumElts, 2)));
12914 return;
12915 }
12916
12917 SmallVector<EVT, 8> ValueVTs(Factor, InVT);
12918 SDValue Res =
12919 DAG.getNode(ISD::VECTOR_INTERLEAVE, DL, DAG.getVTList(ValueVTs), InVecs);
12920
12922 for (unsigned i = 0; i < Factor; ++i)
12923 Results[i] = Res.getValue(i);
12924
12925 Res = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, Results);
12926 setValue(&I, Res);
12927}
12928
12929void SelectionDAGBuilder::visitFreeze(const FreezeInst &I) {
12930 SmallVector<EVT, 4> ValueVTs;
12931 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
12932 ValueVTs);
12933 unsigned NumValues = ValueVTs.size();
12934 if (NumValues == 0) return;
12935
12936 SmallVector<SDValue, 4> Values(NumValues);
12937 SDValue Op = getValue(I.getOperand(0));
12938
12939 for (unsigned i = 0; i != NumValues; ++i)
12940 Values[i] = DAG.getNode(ISD::FREEZE, getCurSDLoc(), ValueVTs[i],
12941 SDValue(Op.getNode(), Op.getResNo() + i));
12942
12944 DAG.getVTList(ValueVTs), Values));
12945}
12946
12947void SelectionDAGBuilder::visitVectorSplice(const CallInst &I) {
12948 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12949 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12950
12951 SDLoc DL = getCurSDLoc();
12952 SDValue V1 = getValue(I.getOperand(0));
12953 SDValue V2 = getValue(I.getOperand(1));
12954 const bool IsLeft = I.getIntrinsicID() == Intrinsic::vector_splice_left;
12955
12956 // VECTOR_SHUFFLE doesn't support a scalable or non-constant mask.
12957 if (VT.isScalableVector() || !isa<ConstantInt>(I.getOperand(2))) {
12958 SDValue Offset = DAG.getZExtOrTrunc(
12959 getValue(I.getOperand(2)), DL, TLI.getVectorIdxTy(DAG.getDataLayout()));
12960 setValue(&I, DAG.getNode(IsLeft ? ISD::VECTOR_SPLICE_LEFT
12962 DL, VT, V1, V2, Offset));
12963 return;
12964 }
12965 uint64_t Imm = cast<ConstantInt>(I.getOperand(2))->getZExtValue();
12966
12967 unsigned NumElts = VT.getVectorNumElements();
12968
12969 uint64_t Idx = IsLeft ? Imm : NumElts - Imm;
12970
12971 // Use VECTOR_SHUFFLE to maintain original behaviour for fixed-length vectors.
12972 SmallVector<int, 8> Mask;
12973 for (unsigned i = 0; i < NumElts; ++i)
12974 Mask.push_back(Idx + i);
12975 setValue(&I, DAG.getVectorShuffle(VT, DL, V1, V2, Mask));
12976}
12977
12978// Consider the following MIR after SelectionDAG, which produces output in
12979// phyregs in the first case or virtregs in the second case.
12980//
12981// INLINEASM_BR ..., implicit-def $ebx, ..., implicit-def $edx
12982// %5:gr32 = COPY $ebx
12983// %6:gr32 = COPY $edx
12984// %1:gr32 = COPY %6:gr32
12985// %0:gr32 = COPY %5:gr32
12986//
12987// INLINEASM_BR ..., def %5:gr32, ..., def %6:gr32
12988// %1:gr32 = COPY %6:gr32
12989// %0:gr32 = COPY %5:gr32
12990//
12991// Given %0, we'd like to return $ebx in the first case and %5 in the second.
12992// Given %1, we'd like to return $edx in the first case and %6 in the second.
12993//
12994// If a callbr has outputs, it will have a single mapping in FuncInfo.ValueMap
12995// to a single virtreg (such as %0). The remaining outputs monotonically
12996// increase in virtreg number from there. If a callbr has no outputs, then it
12997// should not have a corresponding callbr landingpad; in fact, the callbr
12998// landingpad would not even be able to refer to such a callbr.
13001 // There is definitely at least one copy.
13002 assert(MI->getOpcode() == TargetOpcode::COPY &&
13003 "start of copy chain MUST be COPY");
13004 Reg = MI->getOperand(1).getReg();
13005
13006 // If the copied register in the first copy must be virtual.
13007 assert(Reg.isVirtual() && "expected COPY of virtual register");
13008 MI = MRI.def_begin(Reg)->getParent();
13009
13010 // There may be an optional second copy.
13011 if (MI->getOpcode() == TargetOpcode::COPY) {
13012 assert(Reg.isVirtual() && "expected COPY of virtual register");
13013 Reg = MI->getOperand(1).getReg();
13014 assert(Reg.isPhysical() && "expected COPY of physical register");
13015 } else {
13016 // The start of the chain must be an INLINEASM_BR.
13017 assert(MI->getOpcode() == TargetOpcode::INLINEASM_BR &&
13018 "end of copy chain MUST be INLINEASM_BR");
13019 }
13020
13021 return Reg;
13022}
13023
13024// We must do this walk rather than the simpler
13025// setValue(&I, getCopyFromRegs(CBR, CBR->getType()));
13026// otherwise we will end up with copies of virtregs only valid along direct
13027// edges.
13028void SelectionDAGBuilder::visitCallBrLandingPad(const CallInst &I) {
13029 SmallVector<EVT, 8> ResultVTs;
13030 SmallVector<SDValue, 8> ResultValues;
13031 const auto *CBR =
13032 cast<CallBrInst>(I.getParent()->getUniquePredecessor()->getTerminator());
13033
13034 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
13035 const TargetRegisterInfo *TRI = DAG.getSubtarget().getRegisterInfo();
13036 MachineRegisterInfo &MRI = DAG.getMachineFunction().getRegInfo();
13037
13038 Register InitialDef = FuncInfo.ValueMap[CBR];
13039 SDValue Chain = DAG.getRoot();
13040
13041 // Re-parse the asm constraints string.
13042 TargetLowering::AsmOperandInfoVector TargetConstraints =
13043 TLI.ParseConstraints(DAG.getDataLayout(), TRI, *CBR);
13044 for (auto &T : TargetConstraints) {
13045 SDISelAsmOperandInfo OpInfo(T);
13046 if (OpInfo.Type != InlineAsm::isOutput)
13047 continue;
13048
13049 // Pencil in OpInfo.ConstraintType and OpInfo.ConstraintVT based on the
13050 // individual constraint.
13051 TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
13052
13053 switch (OpInfo.ConstraintType) {
13056 // Fill in OpInfo.AssignedRegs.Regs.
13057 getRegistersForValue(DAG, getCurSDLoc(), OpInfo, OpInfo);
13058
13059 // getRegistersForValue may produce 1 to many registers based on whether
13060 // the OpInfo.ConstraintVT is legal on the target or not.
13061 for (Register &Reg : OpInfo.AssignedRegs.Regs) {
13062 Register OriginalDef = FollowCopyChain(MRI, InitialDef++);
13063 if (OriginalDef.isPhysical())
13064 FuncInfo.MBB->addLiveIn(OriginalDef);
13065 // Update the assigned registers to use the original defs.
13066 Reg = OriginalDef;
13067 }
13068
13069 SDValue V = OpInfo.AssignedRegs.getCopyFromRegs(
13070 DAG, FuncInfo, getCurSDLoc(), Chain, nullptr, CBR);
13071 ResultValues.push_back(V);
13072 ResultVTs.push_back(OpInfo.ConstraintVT);
13073 break;
13074 }
13076 SDValue Flag;
13077 SDValue V = TLI.LowerAsmOutputForConstraint(Chain, Flag, getCurSDLoc(),
13078 OpInfo, DAG);
13079 ++InitialDef;
13080 ResultValues.push_back(V);
13081 ResultVTs.push_back(OpInfo.ConstraintVT);
13082 break;
13083 }
13084 default:
13085 break;
13086 }
13087 }
13089 DAG.getVTList(ResultVTs), ResultValues);
13090 setValue(&I, V);
13091}
return SDValue()
static unsigned getIntrinsicID(const SDNode *N)
unsigned RegSize
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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)
#define X(NUM, ENUM, NAME)
Definition ELF.h:849
This file implements the BitVector class.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
dxil translate DXIL Translate Metadata
static AttributeList getReturnAttrs(FastISel::CallLoweringInfo &CLI)
Returns an AttributeList representing the attributes applied to the return value of the given call.
Definition FastISel.cpp:942
#define Check(C,...)
static Value * getCondition(Instruction *I)
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...
Module.h This file contains the declarations for the Module class.
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,...
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define RegName(no)
lazy value info
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Machine Check Debug Module
static bool isUndef(const MachineInstr &MI)
Register Reg
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
static const Function * getCalledFunction(const Value *V)
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.
Type::TypeID TypeID
#define T
#define T1
static MCRegister getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
static unsigned getAddressSpace(const Value *V, unsigned MaxLookup)
MachineInstr unsigned OpIdx
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t High
uint64_t IntrinsicInst * II
OptimizedStructLayoutField Field
#define P(N)
if(PassOpts->AAPipeline)
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
static Type * getValueType(Value *V)
Returns the type of the given value/instruction V.
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 bool getUniformBase(const Value *Ptr, SDValue &Base, SDValue &Index, SDValue &Scale, SelectionDAGBuilder *SDB, const BasicBlock *CurBB, uint64_t ElemSize)
static void failForInvalidBundles(const CallBase &I, StringRef Name, ArrayRef< uint32_t > AllowedBundles)
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 SDValue expandPow(const SDLoc &dl, SDValue LHS, SDValue RHS, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
visitPow - Lower a pow intrinsic.
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.
DenseMap< const Argument *, std::pair< const AllocaInst *, const StoreInst * > > ArgCopyElisionMapTy
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 getUnderlyingArgRegs(SmallVectorImpl< std::pair< Register, TypeSize > > &Regs, const SDValue &N)
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 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)
static FPClassTest getNoFPClass(const Instruction &I)
static LLVM_ATTRIBUTE_ALWAYS_INLINE MVT::SimpleValueType getSimpleVT(const uint8_t *MatcherTable, size_t &MatcherIndex)
getSimpleVT - Decode a value in MatcherTable, if it's a VBR encoded value, use GetVBR to decode it.
This file defines the SmallPtrSet class.
This file contains some functions that are useful when dealing with strings.
#define LLVM_DEBUG(...)
Definition Debug.h:114
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
This pass exposes codegen information to IR-level passes.
uint16_t RegSizeInBits(const MCRegisterInfo &MRI, MCRegister RegNo)
Value * RHS
Value * LHS
static const fltSemantics & IEEEsingle()
Definition APFloat.h:296
static LLVM_ABI Semantics SemanticsToEnum(const llvm::fltSemantics &Sem)
Definition APFloat.cpp:145
static LLVM_ABI const fltSemantics * getArbitraryFPSemantics(StringRef Format)
Returns the fltSemantics for a given arbitrary FP format string, or nullptr if invalid.
Definition APFloat.cpp:6089
Class for arbitrary precision integers.
Definition APInt.h:78
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:335
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:441
an instruction to allocate memory on the stack
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
LLVM_ABI std::optional< TypeSize > getAllocationSize(const DataLayout &DL) const
Get allocation size in bytes.
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
LLVM_ABI bool hasAttribute(Attribute::AttrKind Kind) const
Check if an argument has a given attribute.
Definition Function.cpp:338
unsigned getArgNo() const
Return the index of this formal argument in its containing function.
Definition Argument.h:50
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator end() const
Definition ArrayRef.h:131
size_t size() const
size - Get the array size.
Definition ArrayRef.h:142
iterator begin() const
Definition ArrayRef.h:130
bool empty() const
empty - Check if the array is empty.
Definition ArrayRef.h:137
A cache of @llvm.assume calls within a function.
An instruction that atomically checks whether a specified value is in a memory location,...
an instruction that atomically reads a memory location, combines it with another value,...
@ Add
*p = old + v
@ FAdd
*p = old + v
@ USubCond
Subtract only if no unsigned overflow.
@ FMinimum
*p = minimum(old, v) minimum matches the behavior of llvm.minimum.
@ Min
*p = old <signed v ? old : v
@ Sub
*p = old - v
@ And
*p = old & v
@ Xor
*p = old ^ v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ FMaximum
*p = maximum(old, v) maximum matches the behavior of llvm.maximum.
@ FSub
*p = old - v
@ UIncWrap
Increment one up to a maximum value.
@ Max
*p = old >signed v ? old : v
@ UMin
*p = old <unsigned v ? old : v
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
@ UMax
*p = old >unsigned v ? old : v
@ FMaximumNum
*p = maximumnum(old, v) maximumnum matches the behavior of llvm.maximumnum.
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
@ FMinimumNum
*p = minimumnum(old, v) minimumnum matches the behavior of llvm.minimumnum.
@ Nand
*p = ~(old & v)
This class holds the attributes for a particular argument, parameter, function, or return value.
Definition Attributes.h:407
LLVM Basic Block Representation.
Definition BasicBlock.h:62
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
InstListType::const_iterator const_iterator
Definition BasicBlock.h:171
LLVM_ABI bool isEntryBlock() const
Return true if this is the entry block of the containing function.
LLVM_ABI InstListType::const_iterator getFirstNonPHIOrDbg(bool SkipPseudoOp=true) const
Returns a pointer to the first instruction in this block that is not a PHINode or a debug intrinsic,...
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:233
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
This class represents a no-op cast from one type to another.
The address of a basic block.
Definition Constants.h:1065
Analysis providing branch probability information.
LLVM_ABI BranchProbability getEdgeProbability(const BasicBlock *Src, unsigned IndexInSuccessors) const
Get an edge's probability, relative to other out-edges of the Src.
LLVM_ABI 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()
static BranchProbability getUnknown()
uint32_t getNumerator() const
LLVM_ABI 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...
std::optional< OperandBundleUse > getOperandBundle(StringRef Name) const
Return an operand bundle by name, if present.
CallingConv::ID getCallingConv() const
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
LLVM_ABI bool isMustTailCall() const
Tests if this call site must be tail call optimized.
LLVM_ABI 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.
Value * getCalledOperand() const
Value * getArgOperand(unsigned i) const
User::op_iterator arg_end()
Return the iterator pointing to the end of the argument list.
bool isConvergent() const
Determine if the invoke is convergent.
FunctionType * getFunctionType() const
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
LLVM_ABI 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:664
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:676
Conditional Branch instruction.
Class for constant bytes.
Definition Constants.h:281
ConstantDataSequential - A vector or array constant whose element type is a simple 1/2/4/8-byte integ...
Definition Constants.h:736
A constant value that is initialized with an expression using other constant values.
Definition Constants.h:1291
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:420
This is the shared class of boolean and integer constants.
Definition Constants.h:87
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition Constants.h:219
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
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:168
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
A signed pointer, in the ptrauth sense.
Definition Constants.h:1198
uint64_t getZExtValue() const
Constant Vector Declarations.
Definition Constants.h:660
This is an important base class in LLVM.
Definition Constant.h:43
This is the common base class for constrained floating point intrinsics.
LLVM_ABI std::optional< fp::ExceptionBehavior > getExceptionBehavior() const
LLVM_ABI unsigned getNonMetadataArgCount() const
DWARF expression.
LLVM_ABI 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 LLVM_ABI 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 LLVM_ABI std::optional< FragmentInfo > getFragmentInfo(expr_op_iterator Start, expr_op_iterator End)
Retrieve the details of this fragment expression.
LLVM_ABI uint64_t getNumLocationOperands() const
Return the number of unique location operands referred to (via DW_OP_LLVM_arg) in this expression; th...
static LLVM_ABI 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 LLVM_ABI 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 LLVM_ABI 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 LLVM_ABI 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.
Base class for variables.
LLVM_ABI std::optional< uint64_t > getSizeInBits() const
Determines the size of the variable's type.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
bool isBigEndian() const
Definition DataLayout.h:216
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
Record of a variable value-assignment, aka a non instruction representation of the dbg....
LLVM_ABI Value * getVariableLocationOp(unsigned OpIdx) const
DIExpression * getExpression() const
DILocalVariable * getVariable() const
LLVM_ABI 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:123
LLVM_ABI DILocation * getInlinedAt() const
Definition DebugLoc.cpp:67
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:178
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
Definition DenseMap.h:74
bool empty() const
Definition DenseMap.h:109
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT, true > const_iterator
Definition DenseMap.h:75
iterator end()
Definition DenseMap.h:81
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:241
void reserve(size_type NumEntries)
Grow the densemap so that it can contain at least NumEntries items before resizing again.
Definition DenseMap.h:114
Diagnostic information for inline asm reporting.
static constexpr ElementCount getFixed(ScalarTy MinVal)
Definition TypeSize.h:309
static constexpr ElementCount get(ScalarTy MinVal, bool Scalable)
Definition TypeSize.h:315
constexpr bool isScalar() const
Exactly one element.
Definition TypeSize.h:320
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
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:67
An instruction for ordering other memory operations.
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
Definition Type.cpp:873
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
MachineBasicBlock * getMBB(const BasicBlock *BB) const
DenseMap< const AllocaInst *, int > StaticAllocaMap
StaticAllocaMap - Keep track of frame indices for fixed sized allocas in the entry block.
const LiveOutInfo * GetLiveOutRegInfo(Register Reg)
GetLiveOutRegInfo - Gets LiveOutInfo for a register, returning NULL if the register is a PHI destinat...
MachineBasicBlock * MBB
MBB - The current block.
Class to represent function types.
unsigned getNumParams() const
Return the number of fixed parameters this function type requires.
Type * getParamType(unsigned i) const
Parameter type accessors.
Type * getReturnType() const
Data structure describing the variable locations in a function.
const BasicBlock & getEntryBlock() const
Definition Function.h:809
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Definition Function.h:211
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
Definition Function.h:246
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition Function.h:711
bool hasParamAttribute(unsigned ArgNo, Attribute::AttrKind Kind) const
check if an attributes is in the list of attributes.
Definition Function.cpp:740
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
Definition Function.h:272
Constant * getPersonalityFn() const
Get the personality function associated with this function.
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:354
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
Definition Function.h:251
size_t arg_size() const
Definition Function.h:901
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:728
Garbage collection metadata for a single function.
Definition GCMetadata.h:80
bool hasNoUnsignedSignedWrap() const
bool hasNoUnsignedWrap() const
bool isInBounds() const
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
bool hasDLLImportStorageClass() const
Module * getParent()
Get the module that this global value is contained inside of...
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.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
LLVM_ABI FastMathFlags getFastMathFlags() const LLVM_READONLY
Convenience function for getting all the fast-math flags, which must be an operator which supports th...
LLVM_ABI AAMDNodes getAAMetadata() const
Returns the AA metadata for this instruction.
@ MIN_INT_BITS
Minimum number of bits that can be specified.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
Invoke instruction.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
LLVM_ABI void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
The landingpad instruction holds all of the information necessary to generate correct exception handl...
A helper class to return the specified delimiter string after the first invocation of operator String...
An instruction for reading from memory.
static LocationSize precise(uint64_t Value)
static constexpr LocationSize beforeOrAfterPointer()
Any location before or after the base pointer (but still within the underlying object).
LLVM_ABI MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
LLVM_ABI 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.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
Metadata node.
Definition Metadata.h:1080
Machine Value Type.
@ INVALID_SIMPLE_VALUE_TYPE
uint64_t getScalarSizeInBits() const
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.
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
LLVM_ABI void setSuccProbability(succ_iterator I, BranchProbability Prob)
Set successor probability of a given iterator.
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
SmallVectorImpl< MachineBasicBlock * >::iterator succ_iterator
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
void setIsEHContTarget(bool V=true)
Indicates if this is a target of Windows EH Continuation Guard.
void setIsEHFuncletEntry(bool V=true)
Indicates if this is the entry block of an EH funclet.
MachineInstrBundleIterator< MachineInstr > iterator
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.
void setIsImmutableObjectIndex(int ObjectIdx, bool IsImmutable)
Marks the immutability of an object.
LLVM_ABI 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.
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 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)
const WinEHFuncInfo * getWinEHFuncInfo() const
getWinEHFuncInfo - Return information about how the current function uses Windows exception handling.
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.
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.
MCContext & getContext() const
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
void addCodeViewAnnotation(MCSymbol *Label, MDNode *MD)
Record annotations associated with a particular label.
Function & getFunction()
Return the LLVM function that this machine code represents.
BasicBlockListType::iterator iterator
void setHasEHContTarget(bool V)
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)
CreateMachineInstr - Allocate a new MachineInstr.
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.
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.
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
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,...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
def_iterator def_begin(Register RegNo) const
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
LLVM_ABI MCRegister getLiveInPhysReg(Register VReg) const
getLiveInPhysReg - If VReg is a live-in virtual register, return the corresponding live-in physical r...
An SDNode that represents everything that will be needed to construct a MachineInstr.
bool contains(const KeyT &Key) const
Definition MapVector.h:146
std::pair< iterator, bool > try_emplace(const KeyT &Key, Ts &&...Args)
Definition MapVector.h:116
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:184
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:79
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Definition Register.h:83
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(Register 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.
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
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.
bool shouldKeepJumpConditionsTogether(const FunctionLoweringInfo &FuncInfo, const CondBrInst &I, Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs, TargetLoweringBase::CondMergingParams Params) const
DenseMap< const Constant *, Register > ConstantsOut
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....
const TargetTransformInfo * TTI
DenseMap< MachineBasicBlock *, SmallVector< unsigned, 4 > > LPadToCallSiteMap
Map a landing pad to the call site indexes.
SDValue lowerNoFPClassToAssertNoFPClass(SelectionDAG &DAG, const Instruction &I, SDValue Op)
void handleDebugDeclare(Value *Address, DILocalVariable *Variable, DIExpression *Expression, DebugLoc DL)
StatepointLoweringState StatepointLowering
State used while lowering a statepoint sequence (gc_statepoint, gc_relocate, and gc_result).
void visitBitTestCase(SwitchCG::BitTestBlock &BB, MachineBasicBlock *NextMBB, BranchProbability BranchProbToNext, Register Reg, SwitchCG::BitTestCase &B, MachineBasicBlock *SwitchBB)
visitBitTestCase - this function produces one "bit test"
bool canTailCall(const CallBase &CB) const
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 CopyValueToVirtualRegister(const Value *V, Register Reg, ISD::NodeType ExtendType=ISD::ANY_EXTEND)
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.
void init(GCFunctionInfo *gfi, BatchAAResults *BatchAA, AssumptionCache *AC, const TargetLibraryInfo *li, const TargetTransformInfo &TTI)
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
SDValue getFPOperationRoot(fp::ExceptionBehavior EB)
Return the current virtual root of the Selection DAG, flushing PendingConstrainedFP or PendingConstra...
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
MachineRegisterInfo * RegInfo
std::unique_ptr< SwiftErrorValueTracking > SwiftError
virtual void emitFunctionEntryCode()
std::unique_ptr< SelectionDAGBuilder > SDB
virtual std::pair< SDValue, SDValue > EmitTargetCodeForMemccpy(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, SDValue C, SDValue Size, const CallInst *CI) const
Emit target-specific code that performs a memccpy, in cases where that is faster than a libcall.
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 > EmitTargetCodeForStrlen(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src, const CallInst *CI) const
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrstr(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, const CallInst *CI) const
Emit target-specific code that performs a strstr, in cases where that is faster than a libcall.
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 CallInst *CI) const
Emit target-specific code that performs a strcmp, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForMemcmp(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, SDValue Op3, const CallInst *CI) const
Emit target-specific code that performs a memcmp/bcmp, in cases where that is faster than a libcall.
virtual SDValue EmitTargetCodeForSetTag(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Addr, SDValue Size, MachinePointerInfo DstPtrInfo, bool ZeroData) const
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrcpy(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dest, SDValue Src, MachinePointerInfo DestPtrInfo, MachinePointerInfo SrcPtrInfo, bool isStpcpy, const CallInst *CI) const
Emit target-specific code that performs a strcpy or stpcpy, in cases where that is faster than a libc...
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
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 ...
const SDValue & getRoot() const
Return the root tag of the SelectionDAG.
const TargetSubtargetInfo & getSubtarget() const
SDValue getCopyToReg(SDValue Chain, const SDLoc &dl, Register Reg, SDValue N)
LLVM_ABI SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
LLVM_ABI SDValue getShiftAmountConstant(uint64_t Val, EVT VT, const SDLoc &DL)
LLVM_ABI 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),...
LLVM_ABI 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.
LLVM_ABI SDValue getConstantPool(const Constant *C, EVT VT, MaybeAlign Align=std::nullopt, int Offs=0, bool isT=false, unsigned TargetFlags=0)
LLVM_ABI SDValue getConstantFP(double Val, const SDLoc &DL, EVT VT, bool isTarget=false)
Create a ConstantFPSDNode wrapping a constant value.
LLVM_ABI SDValue getRegister(Register Reg, EVT VT)
LLVM_ABI 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,...
LLVM_ABI Align getEVTAlign(EVT MemoryVT) const
Compute the default alignment value for the given type.
LLVM_ABI bool shouldOptForSize() const
const TargetLowering & getTargetLoweringInfo() const
static constexpr unsigned MaxRecursionDepth
LLVM_ABI 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 getBuildVector(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Ops)
Return an ISD::BUILD_VECTOR node.
LLVM_ABI SDValue getBitcast(EVT VT, SDValue V)
Return a bitcast using the SDLoc of the value operand, and casting to the provided type.
LLVM_ABI 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 getCopyFromReg(SDValue Chain, const SDLoc &dl, Register Reg, EVT VT)
LLVM_ABI void setNodeMemRefs(MachineSDNode *N, ArrayRef< MachineMemOperand * > NewMemRefs)
Mutate the specified machine node's memory references to the provided list.
const DataLayout & getDataLayout() const
SDValue getTargetFrameIndex(int FI, EVT VT)
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getMemBasePlusOffset(SDValue Base, TypeSize Offset, const SDLoc &DL, const SDNodeFlags Flags=SDNodeFlags())
Returns sum of the base pointer and offset.
LLVM_ABI 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())
LLVM_ABI SDValue getBasicBlock(MachineBasicBlock *MBB)
LLVM_ABI 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...
LLVM_ABI 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...
const LibcallLoweringInfo & getLibcalls() const
LLVM_ABI SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI SDValue getValueType(EVT)
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
LLVM_ABI 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 getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
LLVM_ABI SDValue getVectorIdxConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
MachineFunction & getMachineFunction() const
LLVM_ABI SDValue getFrameIndex(int FI, EVT VT, bool isTarget=false)
LLVM_ABI 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...
LLVMContext * getContext() const
const SDValue & setRoot(SDValue N)
Set the current root tag of the SelectionDAG.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void swap(SmallVectorImpl &RHS)
void resize(size_type N)
void push_back(const T &Elt)
pointer data()
Return a pointer to the vector's buffer, even if empty().
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Encapsulates all of the information needed to generate a stack protector check, and signals to isel w...
MachineBasicBlock * getSuccessMBB()
MachineBasicBlock * getFailureMBB()
MachineBasicBlock * getParentMBB()
bool shouldEmitFunctionBasedCheckStackProtector() const
An instruction for storing to memory.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:140
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:137
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.
Provides information about what library functions are available for the current target.
virtual Align getByValTypeAlignment(Type *Ty, const DataLayout &DL) const
Returns the desired alignment for ByVal or InAlloca aggregate function arguments in the caller parame...
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
Function * getSSPStackGuardCheck(const Module &M, const LibcallLoweringInfo &Libcalls) const
If the target has a standard stack protection check function that performs validation and error handl...
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.
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 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 unsigned getNumRegisters(LLVMContext &Context, EVT VT, std::optional< MVT > RegisterVT=std::nullopt) const
Return the number of registers that this ValueType will eventually require.
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...
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 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 isOperationCustom(unsigned Op, EVT VT) const
Return true if the operation uses custom lowering, regardless of whether the type is legal or not.
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...
MachineMemOperand::Flags getVPIntrinsicMemOperandFlags(const VPIntrinsic &VPIntrin) const
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...
bool isOperationLegal(unsigned Op, EVT VT) const
Return true if the specified operation is legal on this target.
virtual bool shouldExpandVectorMatch(EVT VT, unsigned SearchSize) const
Return true if the @llvm.experimental.vector.match intrinsic should be expanded for vector type ‘VT’ ...
virtual bool isProfitableToCombineMinNumMaxNum(EVT VT) const
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 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 void getTgtMemIntrinsic(SmallVectorImpl< IntrinsicInfo > &Infos, const CallBase &I, MachineFunction &MF, unsigned Intrinsic) const
Given an intrinsic, checks if on the target the intrinsic will need to map to a MemIntrinsicNode (tou...
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.
virtual Value * getSDagStackGuard(const Module &M, const LibcallLoweringInfo &Libcalls) const
Return the variable that's previously inserted by insertSSPDeclarations, if any, otherwise return nul...
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.
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 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.
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 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 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 bool useLoadStackGuardNode(const Module &M) const
If this function returns true, SelectionDAGBuilder emits a LOAD_STACK_GUARD node when it is lowering ...
virtual void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint, std::vector< SDValue > &Ops, SelectionDAG &DAG) const
Lower the specified operand into the Ops vector.
std::pair< SDValue, SDValue > makeLibCall(SelectionDAG &DAG, RTLIB::LibcallImpl LibcallImpl, EVT RetVT, ArrayRef< SDValue > Ops, MakeLibCallOptions CallOptions, const SDLoc &dl, SDValue Chain=SDValue()) const
Returns a pair of (return value, chain).
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 MVT getJumpTableRegTy(const DataLayout &DL) const
virtual bool CanLowerReturn(CallingConv::ID, MachineFunction &, bool, const SmallVectorImpl< ISD::OutputArg > &, LLVMContext &, const Type *RetTy) const
This hook should be implemented to check whether the return values described by the Outs array can fi...
CodeGenOptLevel getOptLevel() const
Returns the optimization level: None, Less, Default, or Aggressive.
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.
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 TargetFrameLowering * getFrameLowering() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
@ TCK_Latency
The latency of instruction.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:343
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
LLVM_ABI bool isEmptyTy() const
Return true if this type is empty, that is, it has no elements or all of its elements are empty.
Definition Type.cpp:184
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:290
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:284
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:286
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:370
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:130
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:310
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:257
bool isTokenTy() const
Return true if this is 'token'.
Definition Type.h:236
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
Definition Type.cpp:317
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Definition Type.h:227
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:141
Unconditional Branch instruction.
This function has undefined behavior.
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
op_iterator op_begin()
Definition User.h:259
Value * getOperand(unsigned i) const
Definition User.h:207
unsigned getNumOperands() const
Definition User.h:229
op_iterator op_end()
Definition User.h:261
This class represents the va_arg llvm instruction, which returns an argument of the specified type gi...
LLVM_ABI CmpInst::Predicate getPredicate() const
This is the common base class for vector predication intrinsics.
static LLVM_ABI std::optional< unsigned > getVectorLengthParamPos(Intrinsic::ID IntrinsicID)
LLVM_ABI MaybeAlign getPointerAlignment() const
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:440
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:259
iterator_range< user_iterator > users()
Definition Value.h:427
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:713
bool use_empty() const
Definition Value.h:347
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
Base class of all SIMD vector types.
Type * getElementType() const
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:230
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
const ParentTy * getParent() const
Definition ilist_node.h:34
A raw_ostream that writes to an std::string.
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char SymbolName[]
Key for Kernel::Metadata::mSymbolName.
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.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ 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.
@ X86_VectorCall
MSVC calling convention that passes vectors and vector aggregates in SSE registers.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:41
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition ISDOpcodes.h:261
@ STACKRESTORE
STACKRESTORE has two operands, an input chain and a pointer to restore to it returns an output chain.
@ STACKSAVE
STACKSAVE - STACKSAVE has one operand, an input chain.
@ CTLZ_ZERO_UNDEF
Definition ISDOpcodes.h:788
@ CONVERGENCECTRL_ANCHOR
The llvm.experimental.convergence.* intrinsics.
@ STRICT_FSETCC
STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used for floating-point operands only.
Definition ISDOpcodes.h:511
@ DELETED_NODE
DELETED_NODE - This is an illegal value that is used to catch errors.
Definition ISDOpcodes.h:45
@ SET_FPENV
Sets the current floating-point environment.
@ ATOMIC_LOAD_FMINIMUMNUM
@ LOOP_DEPENDENCE_RAW_MASK
@ VECREDUCE_SEQ_FADD
Generic reduction nodes.
@ COND_LOOP
COND_LOOP is a conditional branch to self, used for implementing efficient conditional traps.
@ EH_SJLJ_LONGJMP
OUTCHAIN = EH_SJLJ_LONGJMP(INCHAIN, buffer) This corresponds to the eh.sjlj.longjmp intrinsic.
Definition ISDOpcodes.h:168
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition ISDOpcodes.h:600
@ STACKADDRESS
STACKADDRESS - Represents the llvm.stackaddress intrinsic.
Definition ISDOpcodes.h:127
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:779
@ SMULFIX
RESULT = [US]MULFIX(LHS, RHS, SCALE) - Perform fixed point multiplication on 2 integers with the same...
Definition ISDOpcodes.h:394
@ VAEND
VAEND, VASTART - VAEND and VASTART have three operands: an input chain, pointer, and a SRCVALUE.
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, val, ptr) This corresponds to "store atomic" instruction.
@ RESET_FPENV
Set floating-point environment to default state.
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:264
@ SMULFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
Definition ISDOpcodes.h:400
@ SET_FPMODE
Sets the current dynamic floating-point control modes.
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:853
@ CTTZ_ELTS
Returns the number of number of trailing (least significant) zero elements in a vector.
@ ATOMIC_LOAD_USUB_COND
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:518
@ VECTOR_FIND_LAST_ACTIVE
Finds the index of the last active mask element Operands: Mask.
@ FMODF
FMODF - Decomposes the operand into integral and fractional parts, each having the same type and sign...
@ FATAN2
FATAN2 - atan2, inspired by libm.
@ FSINCOSPI
FSINCOSPI - Compute both the sine and cosine times pi more accurately than FSINCOS(pi*x),...
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition ISDOpcodes.h:220
@ EH_SJLJ_SETUP_DISPATCH
OUTCHAIN = EH_SJLJ_SETUP_DISPATCH(INCHAIN) The target initializes the dispatch table here.
Definition ISDOpcodes.h:172
@ GlobalAddress
Definition ISDOpcodes.h:88
@ ATOMIC_CMP_SWAP_WITH_SUCCESS
Val, Success, OUTCHAIN = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) N.b.
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
Definition ISDOpcodes.h:880
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition ISDOpcodes.h:584
@ VECREDUCE_FMAX
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:417
@ VECREDUCE_FMAXIMUM
FMINIMUM/FMAXIMUM nodes propatate NaNs and signed zeroes using the llvm.minimum and llvm....
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
Definition ISDOpcodes.h:747
@ ATOMIC_FENCE
OUTCHAIN = ATOMIC_FENCE(INCHAIN, ordering, scope) This corresponds to the fence instruction.
@ RESET_FPMODE
Sets default dynamic floating-point control modes.
@ FMULADD
FMULADD - Performs a * b + c, with, or without, intermediate rounding.
Definition ISDOpcodes.h:528
@ FPTRUNC_ROUND
FPTRUNC_ROUND - This corresponds to the fptrunc_round intrinsic.
Definition ISDOpcodes.h:515
@ FAKE_USE
FAKE_USE represents a use of the operand but does not do anything.
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
Definition ISDOpcodes.h:993
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
Definition ISDOpcodes.h:254
@ CLMUL
Carry-less multiplication operations.
Definition ISDOpcodes.h:774
@ INIT_TRAMPOLINE
INIT_TRAMPOLINE - This corresponds to the init_trampoline intrinsic.
@ FLDEXP
FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
@ SDIVFIX
RESULT = [US]DIVFIX(LHS, RHS, SCALE) - Perform fixed point division on 2 integers with the same width...
Definition ISDOpcodes.h:407
@ CONVERT_FROM_ARBITRARY_FP
CONVERT_FROM_ARBITRARY_FP - This operator converts from an arbitrary floating-point represented as an...
@ EH_LABEL
EH_LABEL - Represents a label in mid basic block used to track locations needed for debug and excepti...
@ ATOMIC_LOAD_USUB_SAT
@ EH_RETURN
OUTCHAIN = EH_RETURN(INCHAIN, OFFSET, HANDLER) - This node represents 'eh_return' gcc dwarf builtin,...
Definition ISDOpcodes.h:156
@ ANNOTATION_LABEL
ANNOTATION_LABEL - Represents a mid basic block label used by annotations.
@ SET_ROUNDING
Set rounding mode.
Definition ISDOpcodes.h:975
@ CONVERGENCECTRL_GLUE
This does not correspond to any convergence control intrinsic.
@ PARTIAL_REDUCE_UMLA
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:844
@ PREALLOCATED_SETUP
PREALLOCATED_SETUP - This has 2 operands: an input chain and a SRCVALUE with the preallocated call Va...
@ READSTEADYCOUNTER
READSTEADYCOUNTER - This corresponds to the readfixedcounter intrinsic.
@ ADDROFRETURNADDR
ADDROFRETURNADDR - Represents the llvm.addressofreturnaddress intrinsic.
Definition ISDOpcodes.h:117
@ CONVERGENCECTRL_ENTRY
@ BR
Control flow instructions. These all have token chains.
@ VECREDUCE_FADD
These reductions have relaxed evaluation order semantics, and have a single vector operand.
@ CTTZ_ZERO_UNDEF
Bit counting operators with an undefined result for zero inputs.
Definition ISDOpcodes.h:787
@ PARTIAL_REDUCE_FMLA
@ PREFETCH
PREFETCH - This corresponds to a prefetch intrinsic.
@ FSINCOS
FSINCOS - Compute both fsin and fcos as a single operation.
@ SSUBO
Same for subtraction.
Definition ISDOpcodes.h:352
@ PREALLOCATED_ARG
PREALLOCATED_ARG - This has 3 operands: an input chain, a SRCVALUE with the preallocated call Value,...
@ BRIND
BRIND - Indirect branch.
@ BR_JT
BR_JT - Jumptable branch.
@ VECTOR_INTERLEAVE
VECTOR_INTERLEAVE(VEC1, VEC2, ...) - Returns N vectors from N input vectors, where N is the factor to...
Definition ISDOpcodes.h:635
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition ISDOpcodes.h:541
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
Definition ISDOpcodes.h:548
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition ISDOpcodes.h:374
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:796
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
Definition ISDOpcodes.h:247
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition ISDOpcodes.h:672
@ VACOPY
VACOPY - VACOPY has 5 operands: an input chain, a destination pointer, a source pointer,...
@ GET_ACTIVE_LANE_MASK
GET_ACTIVE_LANE_MASK - this corrosponds to the llvm.get.active.lane.mask intrinsic.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition ISDOpcodes.h:230
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition ISDOpcodes.h:348
@ ARITH_FENCE
ARITH_FENCE - This corresponds to a arithmetic fence intrinsic.
@ VECREDUCE_ADD
Integer reductions may have a result type larger than the vector element type.
@ 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:970
@ CLEANUPRET
CLEANUPRET - Represents a return from a cleanup block funclet.
@ ATOMIC_LOAD_FMAXIMUM
@ GET_FPMODE
Reads the current dynamic floating-point control modes.
@ GET_FPENV
Gets the current floating-point environment.
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:765
@ AssertNoFPClass
AssertNoFPClass - These nodes record if a register contains a float value that is known to be not som...
Definition ISDOpcodes.h:78
@ PtrAuthGlobalAddress
A ptrauth constant.
Definition ISDOpcodes.h:100
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition ISDOpcodes.h:614
@ EntryToken
EntryToken - This is the marker used to indicate the start of a region.
Definition ISDOpcodes.h:48
@ READ_REGISTER
READ_REGISTER, WRITE_REGISTER - This node represents llvm.register on the DAG, which implements the n...
Definition ISDOpcodes.h:139
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition ISDOpcodes.h:576
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:850
@ DEBUGTRAP
DEBUGTRAP - Trap intended to get the attention of a debugger.
@ VSCALE
VSCALE(IMM) - Returns the runtime scaling factor used to calculate the number of elements within a sc...
@ LOCAL_RECOVER
LOCAL_RECOVER - Represents the llvm.localrecover intrinsic.
Definition ISDOpcodes.h:135
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum maximum on two values, following IEEE-754 definition...
@ UBSANTRAP
UBSANTRAP - Trap with an immediate describing the kind of sanitizer failure.
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
Definition ISDOpcodes.h:386
@ PATCHPOINT
The llvm.experimental.patchpoint.
@ SMULO
Same for multiplication.
Definition ISDOpcodes.h:356
@ ATOMIC_LOAD_FMINIMUM
@ DYNAMIC_STACKALLOC
DYNAMIC_STACKALLOC - Allocate some number of bytes on the stack aligned to a specified boundary.
@ VECTOR_SPLICE_LEFT
VECTOR_SPLICE_LEFT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1, VEC2) left by OFFSET elements an...
Definition ISDOpcodes.h:653
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:727
@ VECTOR_REVERSE
VECTOR_REVERSE(VECTOR) - Returns a vector, of the same type as VECTOR, whose elements are shuffled us...
Definition ISDOpcodes.h:640
@ SDIVFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
Definition ISDOpcodes.h:413
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:978
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition ISDOpcodes.h:805
@ PCMARKER
PCMARKER - This corresponds to the pcmarker intrinsic.
@ INLINEASM_BR
INLINEASM_BR - Branching version of inline asm. Used by asm-goto.
@ ATOMIC_LOAD_FMAXIMUMNUM
@ EH_DWARF_CFA
EH_DWARF_CFA - This node represents the pointer to the DWARF Canonical Frame Address (CFA),...
Definition ISDOpcodes.h:150
@ FRAMEADDR
FRAMEADDR, RETURNADDR - These nodes represent llvm.frameaddress and llvm.returnaddress on the DAG.
Definition ISDOpcodes.h:110
@ ATOMIC_LOAD_UDEC_WRAP
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition ISDOpcodes.h:500
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:926
@ READCYCLECOUNTER
READCYCLECOUNTER - This corresponds to the readcyclecounter intrinsic.
@ RELOC_NONE
Issue a no-op relocation against a given symbol at the current location.
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:739
@ TRAP
TRAP - Trapping instruction.
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition ISDOpcodes.h:205
@ SCMP
[US]CMP - 3-way comparison of signed or unsigned integers.
Definition ISDOpcodes.h:735
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1,VEC2) right by OFFSET elements a...
Definition ISDOpcodes.h:657
@ STRICT_FADD
Constrained versions of the binary floating point operators.
Definition ISDOpcodes.h:427
@ STACKMAP
The llvm.experimental.stackmap intrinsic.
@ FREEZE
FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or is evaluated to UNDEF),...
Definition ISDOpcodes.h:241
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition ISDOpcodes.h:565
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:53
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition ISDOpcodes.h:959
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
Definition ISDOpcodes.h:699
@ SPONENTRY
SPONENTRY - Represents the llvm.sponentry intrinsic.
Definition ISDOpcodes.h:122
@ CLEAR_CACHE
llvm.clear_cache intrinsic Operands: Input Chain, Start Addres, End Address Outputs: Output Chain
@ CONVERGENCECTRL_LOOP
@ INLINEASM
INLINEASM - Represents an inline asm block.
@ 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:945
@ VECREDUCE_FMINIMUM
@ EH_SJLJ_SETJMP
RESULT, OUTCHAIN = EH_SJLJ_SETJMP(INCHAIN, buffer) This corresponds to the eh.sjlj....
Definition ISDOpcodes.h:162
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:856
@ BRCOND
BRCOND - Conditional branch.
@ VECREDUCE_SEQ_FMUL
@ CATCHRET
CATCHRET - Represents a return from a catch block funclet.
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition ISDOpcodes.h:62
@ ATOMIC_LOAD_UINC_WRAP
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition ISDOpcodes.h:534
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition ISDOpcodes.h:365
@ VECTOR_DEINTERLEAVE
VECTOR_DEINTERLEAVE(VEC1, VEC2, ...) - Returns N vectors from N input vectors, where N is the factor ...
Definition ISDOpcodes.h:624
@ GET_DYNAMIC_AREA_OFFSET
GET_DYNAMIC_AREA_OFFSET - get offset from native SP to the address of the most recent dynamic alloca.
@ CTTZ_ELTS_ZERO_POISON
@ FMINIMUMNUM
FMINIMUMNUM/FMAXIMUMNUM - minimumnum/maximumnum that is same with FMINNUM_IEEE and FMAXNUM_IEEE besid...
@ ADJUST_TRAMPOLINE
ADJUST_TRAMPOLINE - This corresponds to the adjust_trampoline intrinsic.
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition ISDOpcodes.h:213
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:556
@ LOOP_DEPENDENCE_WAR_MASK
The llvm.loop.dependence.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM.
Flag
These should be considered private to the implementation of the MCInstrDesc class.
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
bool match(Val *V, const Pattern &P)
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
TwoOps_match< Val_t, Idx_t, Instruction::ExtractElement > m_ExtractElt(const Val_t &Val, const Idx_t &Idx)
Matches ExtractElementInst.
IntrinsicID_match m_VScale()
Matches a call to llvm.vscale().
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
Offsets
Offsets in bytes from the start of the input buffer.
std::pair< JumpTableHeader, JumpTable > JumpTableBlock
void sortAndRangeify(CaseClusterVector &Clusters)
Sort Clusters and merge adjacent cases.
std::vector< CaseCluster > CaseClusterVector
@ 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.
SmallVector< SwitchWorkListItem, 4 > SwitchWorkList
CaseClusterVector::iterator CaseClusterIt
initializer< Ty > init(const Ty &Val)
LocationClass< Ty > location(Ty &L)
@ DW_OP_LLVM_arg
Only used in LLVM metadata.
Definition Dwarf.h:149
ExceptionBehavior
Exception behavior used for floating point operations.
Definition FPEnv.h:39
@ ebStrict
This corresponds to "fpexcept.strict".
Definition FPEnv.h:42
@ ebMayTrap
This corresponds to "fpexcept.maytrap".
Definition FPEnv.h:41
@ ebIgnore
This corresponds to "fpexcept.ignore".
Definition FPEnv.h:40
constexpr float log2ef
Definition MathExtras.h:51
constexpr double e
constexpr float ln2f
Definition MathExtras.h:49
NodeAddr< FuncNode * > Func
Definition RDFGraph.h:393
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
Definition Threading.h:280
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:344
@ Offset
Definition DWP.cpp:532
@ Length
Definition DWP.cpp:532
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred)
getICmpCondCode - Return the ISD condition code corresponding to the given LLVM IR integer condition ...
Definition Analysis.cpp:237
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:1739
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:1669
LLVM_ABI 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.
LLVM_ABI bool isOnlyUsedInZeroEqualityComparison(const Instruction *CxtI)
void ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, Type *Ty, SmallVectorImpl< EVT > &ValueVTs, SmallVectorImpl< EVT > *MemVTs=nullptr, 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:119
LLVM_ABI SDValue peekThroughBitcasts(SDValue V)
Return the non-bitcasted source operand of V if it exists.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
@ Done
Definition Threading.h:60
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition bit.h:293
LLVM_ABI 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.
static ConstantRange getRange(Value *Op, SCCPSolver &Solver, const SmallPtrSetImpl< Value * > &InsertedValues)
Helper for getting ranges from Solver.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2208
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 bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition MathExtras.h:243
auto cast_or_null(const Y &Val)
Definition Casting.h:714
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:546
gep_type_iterator gep_type_end(const User *GEP)
constexpr auto equal_to(T &&Arg)
Functor variant of std::equal_to that can be used as a UnaryPredicate in functional algorithms like a...
Definition STLExtras.h:2173
constexpr int popcount(T Value) noexcept
Count the number of set bits in a value.
Definition bit.h:154
LLVM_ABI ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
detail::concat_range< ValueT, RangeTs... > concat(RangeTs &&...Ranges)
Returns a concatenated range across two or more ranges.
Definition STLExtras.h:1152
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:202
void ComputeValueTypes(const DataLayout &DL, Type *Ty, SmallVectorImpl< Type * > &Types, SmallVectorImpl< TypeSize > *Offsets=nullptr, TypeSize StartingOffset=TypeSize::getZero())
Given an LLVM IR type, compute non-aggregate subtypes.
Definition Analysis.cpp:72
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
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:1746
LLVM_ABI 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:854
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1636
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI 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...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
generic_gep_type_iterator<> gep_type_iterator
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
auto succ_size(const MachineBasicBlock *BB)
bool hasSingleElement(ContainerTy &&C)
Returns true if the given container only contains a single element.
Definition STLExtras.h:300
LLVM_ABI 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:203
LLVM_ABI EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
LLVM_ABI Value * salvageDebugInfoImpl(Instruction &I, uint64_t CurrentLocOps, SmallVectorImpl< uint64_t > &Ops, SmallVectorImpl< Value * > &AdditionalValues)
Definition Local.cpp:2289
LLVM_ABI 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.
Definition ModRef.h:74
bool isFuncletEHPersonality(EHPersonality Pers)
Returns true if this is a personality function that invokes handler funclets (which must return to it...
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:189
LLVM_ABI bool isAssignmentTrackingEnabled(const Module &M)
Return true if assignment tracking is enabled for module M.
LLVM_ABI 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.
@ Sub
Subtraction 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:144
@ 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:539
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:225
ArrayRef(const T &OneElt) -> ArrayRef< T >
bool isAsynchronousEHPersonality(EHPersonality Pers)
Returns true if this personality function catches asynchronous exceptions.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isKnownNeverNaN(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the floating-point scalar value is not a NaN or if the floating-point vector value has...
LLVM_ABI 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:25
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:2192
GlobalValue * ExtractTypeInfo(Value *V)
ExtractTypeInfo - Returns the type info, possibly bitcast, encoded in V.
Definition Analysis.cpp:181
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:201
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:2166
LLVM_ABI 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 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:330
@ Default
The result values are uniform if and only if all operands are uniform.
Definition Uniformity.h:20
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:872
#define N
#define NC
Definition regutils.h:42
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:77
Extended Value Type.
Definition ValueTypes.h:35
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
Definition ValueTypes.h:403
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:70
uint64_t getScalarStoreSize() const
Definition ValueTypes.h:410
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition ValueTypes.h:292
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:308
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition ValueTypes.h:155
ElementCount getVectorElementCount() const
Definition ValueTypes.h:358
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:381
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition ValueTypes.h:367
uint64_t getScalarSizeInBits() const
Definition ValueTypes.h:393
static LLVM_ABI EVT getEVT(Type *Ty, bool HandleUnknown=false)
Return the value type corresponding to the specified type.
EVT changeVectorElementType(LLVMContext &Context, EVT EltVT) const
Return a VT for a vector type whose attributes match ourselves with the exception of the element type...
Definition ValueTypes.h:98
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:324
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition ValueTypes.h:61
bool isRISCVVectorTuple() const
Return true if this is a vector value type.
Definition ValueTypes.h:187
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
Definition ValueTypes.h:389
bool isFixedLengthVector() const
Definition ValueTypes.h:189
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:176
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition ValueTypes.h:331
bool bitsGE(EVT VT) const
Return true if this has no less bits than VT.
Definition ValueTypes.h:300
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
Definition ValueTypes.h:182
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:336
EVT changeElementType(LLVMContext &Context, EVT EltVT) const
Return a VT for a type whose attributes match ourselves with the exception of the element type that i...
Definition ValueTypes.h:121
bool isScalarInteger() const
Return true if this is an integer, but not a vector.
Definition ValueTypes.h:165
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition ValueTypes.h:344
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition ValueTypes.h:160
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:128
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
Definition KnownBits.h:264
This class contains a discriminated union of information about pointers in memory operands,...
static LLVM_ABI MachinePointerInfo getUnknownStack(MachineFunction &MF)
Stack memory without other information.
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
A lightweight accessor for an operand bundle meant to be passed around by value.
This struct represents the registers (physical or virtual) that a particular set of values is assigne...
SmallVector< std::pair< Register, TypeSize >, 4 > getRegsAndSizes() const
Return a list of registers and their sizes.
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< Register, 4 > Regs
This list holds the registers assigned to the values.
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.
void setUnpredictable(bool b)
bool hasAllowReassociation() const
void setNoUnsignedWrap(bool b)
void setNoSignedWrap(bool b)
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:276
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.
static CaseCluster range(const ConstantInt *Low, const ConstantInt *High, MachineBasicBlock *MBB, BranchProbability Prob)
Register Reg
The virtual register containing the index of the jump table entry to jump to.
MachineBasicBlock * Default
The MBB of the default bb, which is a successor of the range check MBB.
unsigned JTI
The JumpTableIndex for this jump table in the function.
MachineBasicBlock * MBB
The MBB into which to emit the code for the indirect jump.
std::optional< SDLoc > SL
The debug location of the instruction this JumpTable was produced from.
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 & setDeactivationSymbol(GlobalValue *Sym)
CallLoweringInfo & setCFIType(const ConstantInt *Type)
SmallVector< ISD::InputArg, 32 > Ins
Type * OrigRetTy
Original unlegalized return type.
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
Type * RetTy
Same as OrigRetTy, or partially legalized for soft float libcalls.
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)