LLVM 24.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.
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)
997 if (TLI.isZExtFree(peekThroughFreeze(Val), RegisterVT))
998 ExtendKind = ISD::ZERO_EXTEND;
999
1000 getCopyToParts(DAG, dl, Val.getValue(Val.getResNo() + Value), &Parts[Part],
1001 NumParts, RegisterVT, V, CallConv, ExtendKind);
1002 Part += NumParts;
1003 }
1004
1005 // Copy the parts into the registers.
1006 SmallVector<SDValue, 8> Chains(NumRegs);
1007 for (unsigned i = 0; i != NumRegs; ++i) {
1008 SDValue Part;
1009 if (!Glue) {
1010 Part = DAG.getCopyToReg(Chain, dl, Regs[i], Parts[i]);
1011 } else {
1012 Part = DAG.getCopyToReg(Chain, dl, Regs[i], Parts[i], *Glue);
1013 *Glue = Part.getValue(1);
1014 }
1015
1016 Chains[i] = Part.getValue(0);
1017 }
1018
1019 if (NumRegs == 1 || Glue)
1020 // If NumRegs > 1 && Glue is used then the use of the last CopyToReg is
1021 // flagged to it. That is the CopyToReg nodes and the user are considered
1022 // a single scheduling unit. If we create a TokenFactor and return it as
1023 // chain, then the TokenFactor is both a predecessor (operand) of the
1024 // user as well as a successor (the TF operands are flagged to the user).
1025 // c1, f1 = CopyToReg
1026 // c2, f2 = CopyToReg
1027 // c3 = TokenFactor c1, c2
1028 // ...
1029 // = op c3, ..., f2
1030 Chain = Chains[NumRegs-1];
1031 else
1032 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chains);
1033}
1034
1036 unsigned MatchingIdx, const SDLoc &dl,
1037 SelectionDAG &DAG,
1038 std::vector<SDValue> &Ops) const {
1039 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1040
1041 InlineAsm::Flag Flag(Code, Regs.size());
1042 if (HasMatching)
1043 Flag.setMatchingOp(MatchingIdx);
1044 else if (!Regs.empty() && Regs.front().isVirtual()) {
1045 // Put the register class of the virtual registers in the flag word. That
1046 // way, later passes can recompute register class constraints for inline
1047 // assembly as well as normal instructions.
1048 // Don't do this for tied operands that can use the regclass information
1049 // from the def.
1051 const TargetRegisterClass *RC = MRI.getRegClass(Regs.front());
1052 Flag.setRegClass(RC->getID());
1053 }
1054
1055 SDValue Res = DAG.getTargetConstant(Flag, dl, MVT::i32);
1056 Ops.push_back(Res);
1057
1058 if (Code == InlineAsm::Kind::Clobber) {
1059 // Clobbers should always have a 1:1 mapping with registers, and may
1060 // reference registers that have illegal (e.g. vector) types. Hence, we
1061 // shouldn't try to apply any sort of splitting logic to them.
1062 assert(Regs.size() == RegVTs.size() && Regs.size() == ValueVTs.size() &&
1063 "No 1:1 mapping from clobbers to regs?");
1065 (void)SP;
1066 for (unsigned I = 0, E = ValueVTs.size(); I != E; ++I) {
1067 Ops.push_back(DAG.getRegister(Regs[I], RegVTs[I]));
1068 assert(
1069 (Regs[I] != SP ||
1071 "If we clobbered the stack pointer, MFI should know about it.");
1072 }
1073 return;
1074 }
1075
1076 for (unsigned Value = 0, Reg = 0, e = ValueVTs.size(); Value != e; ++Value) {
1077 MVT RegisterVT = RegVTs[Value];
1078 unsigned NumRegs = TLI.getNumRegisters(*DAG.getContext(), ValueVTs[Value],
1079 RegisterVT);
1080 for (unsigned i = 0; i != NumRegs; ++i) {
1081 assert(Reg < Regs.size() && "Mismatch in # registers expected");
1082 Register TheReg = Regs[Reg++];
1083 Ops.push_back(DAG.getRegister(TheReg, RegisterVT));
1084 }
1085 }
1086}
1087
1091 unsigned I = 0;
1092 for (auto CountAndVT : zip_first(RegCount, RegVTs)) {
1093 unsigned RegCount = std::get<0>(CountAndVT);
1094 MVT RegisterVT = std::get<1>(CountAndVT);
1095 TypeSize RegisterSize = RegisterVT.getSizeInBits();
1096 for (unsigned E = I + RegCount; I != E; ++I)
1097 OutVec.push_back(std::make_pair(Regs[I], RegisterSize));
1098 }
1099 return OutVec;
1100}
1101
1103 AssumptionCache *ac, const TargetLibraryInfo *li,
1104 const TargetTransformInfo &TTI) {
1105 BatchAA = aa;
1106 AC = ac;
1107 GFI = gfi;
1108 LibInfo = li;
1109 Context = DAG.getContext();
1110 LPadToCallSiteMap.clear();
1111 this->TTI = &TTI;
1112 SL->init(DAG.getTargetLoweringInfo(), TM, DAG.getDataLayout());
1113 AssignmentTrackingEnabled = isAssignmentTrackingEnabled(
1114 *DAG.getMachineFunction().getFunction().getParent());
1115}
1116
1118 NodeMap.clear();
1119 UnusedArgNodeMap.clear();
1120 PendingLoads.clear();
1121 PendingExports.clear();
1122 PendingConstrainedFP.clear();
1123 PendingConstrainedFPStrict.clear();
1124 CurInst = nullptr;
1125 HasTailCall = false;
1126 SDNodeOrder = LowestSDNodeOrder;
1127 StatepointLowering.clear();
1128}
1129
1131 DanglingDebugInfoMap.clear();
1132}
1133
1134// Update DAG root to include dependencies on Pending chains.
1135SDValue SelectionDAGBuilder::updateRoot(SmallVectorImpl<SDValue> &Pending) {
1136 SDValue Root = DAG.getRoot();
1137
1138 if (Pending.empty())
1139 return Root;
1140
1141 // Add current root to PendingChains, unless we already indirectly
1142 // depend on it.
1143 if (Root.getOpcode() != ISD::EntryToken) {
1144 unsigned i = 0, e = Pending.size();
1145 for (; i != e; ++i) {
1146 assert(Pending[i].getNode()->getNumOperands() > 1);
1147 if (Pending[i].getNode()->getOperand(0) == Root)
1148 break; // Don't add the root if we already indirectly depend on it.
1149 }
1150
1151 if (i == e)
1152 Pending.push_back(Root);
1153 }
1154
1155 if (Pending.size() == 1)
1156 Root = Pending[0];
1157 else
1158 Root = DAG.getTokenFactor(getCurSDLoc(), Pending);
1159
1160 DAG.setRoot(Root);
1161 Pending.clear();
1162 return Root;
1163}
1164
1168
1170 // If the new exception behavior differs from that of the pending
1171 // ones, chain up them and update the root.
1172 switch (EB) {
1175 // Floating-point exceptions produced by such operations are not intended
1176 // to be observed, so the sequence of these operations does not need to be
1177 // preserved.
1178 //
1179 // They however must not be mixed with the instructions that have strict
1180 // exception behavior. Placing an operation with 'ebIgnore' behavior between
1181 // 'ebStrict' operations could distort the observed exception behavior.
1182 if (!PendingConstrainedFPStrict.empty()) {
1183 assert(PendingConstrainedFP.empty());
1184 updateRoot(PendingConstrainedFPStrict);
1185 }
1186 break;
1188 // Floating-point exception produced by these operations may be observed, so
1189 // they must be correctly chained. If trapping on FP exceptions is
1190 // disabled, the exceptions can be observed only by functions that read
1191 // exception flags, like 'llvm.get_fpenv' or 'fetestexcept'. It means that
1192 // the order of operations is not significant between barriers.
1193 //
1194 // If trapping is enabled, each operation becomes an implicit observation
1195 // point, so the operations must be sequenced according their original
1196 // source order.
1197 if (!PendingConstrainedFP.empty()) {
1198 assert(PendingConstrainedFPStrict.empty());
1199 updateRoot(PendingConstrainedFP);
1200 }
1201 // TODO: Add support for trapping-enabled scenarios.
1202 }
1203 return DAG.getRoot();
1204}
1205
1207 // Chain up all pending constrained intrinsics together with all
1208 // pending loads, by simply appending them to PendingLoads and
1209 // then calling getMemoryRoot().
1210 PendingLoads.reserve(PendingLoads.size() +
1211 PendingConstrainedFP.size() +
1212 PendingConstrainedFPStrict.size());
1213 PendingLoads.append(PendingConstrainedFP.begin(),
1214 PendingConstrainedFP.end());
1215 PendingLoads.append(PendingConstrainedFPStrict.begin(),
1216 PendingConstrainedFPStrict.end());
1217 PendingConstrainedFP.clear();
1218 PendingConstrainedFPStrict.clear();
1219 return getMemoryRoot();
1220}
1221
1223 // We need to emit pending fpexcept.strict constrained intrinsics,
1224 // so append them to the PendingExports list.
1225 PendingExports.append(PendingConstrainedFPStrict.begin(),
1226 PendingConstrainedFPStrict.end());
1227 PendingConstrainedFPStrict.clear();
1228 return updateRoot(PendingExports);
1229}
1230
1232 DILocalVariable *Variable,
1234 DebugLoc DL) {
1235 assert(Variable && "Missing variable");
1236
1237 // Check if address has undef value.
1238 if (!Address || isa<UndefValue>(Address) ||
1239 (Address->use_empty() && !isa<Argument>(Address))) {
1240 LLVM_DEBUG(
1241 dbgs()
1242 << "dbg_declare: Dropping debug info (bad/undef/unused-arg address)\n");
1243 return;
1244 }
1245
1246 bool IsParameter = Variable->isParameter() || isa<Argument>(Address);
1247
1248 SDValue &N = NodeMap[Address];
1249 if (!N.getNode() && isa<Argument>(Address))
1250 // Check unused arguments map.
1251 N = UnusedArgNodeMap[Address];
1252 SDDbgValue *SDV;
1253 if (N.getNode()) {
1254 if (const BitCastInst *BCI = dyn_cast<BitCastInst>(Address))
1255 Address = BCI->getOperand(0);
1256 // Parameters are handled specially.
1257 auto *FINode = dyn_cast<FrameIndexSDNode>(N.getNode());
1258 if (IsParameter && FINode) {
1259 // Byval parameter. We have a frame index at this point.
1260 SDV = DAG.getFrameIndexDbgValue(Variable, Expression, FINode->getIndex(),
1261 /*IsIndirect*/ true, DL, SDNodeOrder);
1262 } else if (isa<Argument>(Address)) {
1263 // Address is an argument, so try to emit its dbg value using
1264 // virtual register info from the FuncInfo.ValueMap.
1265 EmitFuncArgumentDbgValue(Address, Variable, Expression, DL,
1266 FuncArgumentDbgValueKind::Declare, N);
1267 return;
1268 } else {
1269 SDV = DAG.getDbgValue(Variable, Expression, N.getNode(), N.getResNo(),
1270 true, DL, SDNodeOrder);
1271 }
1272 DAG.AddDbgValue(SDV, IsParameter);
1273 } else {
1274 // If Address is an argument then try to emit its dbg value using
1275 // virtual register info from the FuncInfo.ValueMap.
1276 if (!EmitFuncArgumentDbgValue(Address, Variable, Expression, DL,
1277 FuncArgumentDbgValueKind::Declare, N)) {
1278 LLVM_DEBUG(dbgs() << "dbg_declare: Dropping debug info"
1279 << " (could not emit func-arg dbg_value)\n");
1280 }
1281 }
1282}
1283
1285 // Add SDDbgValue nodes for any var locs here. Do so before updating
1286 // SDNodeOrder, as this mapping is {Inst -> Locs BEFORE Inst}.
1287 if (FunctionVarLocs const *FnVarLocs = DAG.getFunctionVarLocs()) {
1288 // Add SDDbgValue nodes for any var locs here. Do so before updating
1289 // SDNodeOrder, as this mapping is {Inst -> Locs BEFORE Inst}.
1290 for (auto It = FnVarLocs->locs_begin(&I), End = FnVarLocs->locs_end(&I);
1291 It != End; ++It) {
1292 auto *Var = FnVarLocs->getDILocalVariable(It->VariableID);
1293 dropDanglingDebugInfo(Var, It->Expr);
1294 if (It->Values.isKillLocation(It->Expr)) {
1295 handleKillDebugValue(Var, It->Expr, It->DL, SDNodeOrder);
1296 continue;
1297 }
1298 SmallVector<Value *> Values(It->Values.location_ops());
1299 if (!handleDebugValue(Values, Var, It->Expr, It->DL, SDNodeOrder,
1300 It->Values.hasArgList())) {
1301 SmallVector<Value *, 4> Vals(It->Values.location_ops());
1303 FnVarLocs->getDILocalVariable(It->VariableID),
1304 It->Expr, Vals.size() > 1, It->DL, SDNodeOrder);
1305 }
1306 }
1307 }
1308
1309 // We must skip DbgVariableRecords if they've already been processed above as
1310 // we have just emitted the debug values resulting from assignment tracking
1311 // analysis, making any existing DbgVariableRecords redundant (and probably
1312 // less correct). We still need to process DbgLabelRecords. This does sink
1313 // DbgLabelRecords to the bottom of the group of debug records. That sholdn't
1314 // be important as it does so deterministcally and ordering between
1315 // DbgLabelRecords and DbgVariableRecords is immaterial (other than for MIR/IR
1316 // printing).
1317 bool SkipDbgVariableRecords = DAG.getFunctionVarLocs();
1318 // Is there is any debug-info attached to this instruction, in the form of
1319 // DbgRecord non-instruction debug-info records.
1320 for (DbgRecord &DR : I.getDbgRecordRange()) {
1321 if (DbgLabelRecord *DLR = dyn_cast<DbgLabelRecord>(&DR)) {
1322 assert(DLR->getLabel() && "Missing label");
1323 SDDbgLabel *SDV =
1324 DAG.getDbgLabel(DLR->getLabel(), DLR->getDebugLoc(), SDNodeOrder);
1325 DAG.AddDbgLabel(SDV);
1326 continue;
1327 }
1328
1329 if (SkipDbgVariableRecords)
1330 continue;
1332 DILocalVariable *Variable = DVR.getVariable();
1335
1337 if (FuncInfo.PreprocessedDVRDeclares.contains(&DVR))
1338 continue;
1339 LLVM_DEBUG(dbgs() << "SelectionDAG visiting dbg_declare: " << DVR
1340 << "\n");
1342 DVR.getDebugLoc());
1343 continue;
1344 }
1345
1346 // A DbgVariableRecord with no locations is a kill location.
1348 if (Values.empty()) {
1350 SDNodeOrder);
1351 continue;
1352 }
1353
1354 // A DbgVariableRecord with an undef or absent location is also a kill
1355 // location.
1356 if (llvm::any_of(Values,
1357 [](Value *V) { return !V || isa<UndefValue>(V); })) {
1359 SDNodeOrder);
1360 continue;
1361 }
1362
1363 bool IsVariadic = DVR.hasArgList();
1364 if (!handleDebugValue(Values, Variable, Expression, DVR.getDebugLoc(),
1365 SDNodeOrder, IsVariadic)) {
1366 addDanglingDebugInfo(Values, Variable, Expression, IsVariadic,
1367 DVR.getDebugLoc(), SDNodeOrder);
1368 }
1369 }
1370}
1371
1373 visitDbgInfo(I);
1374
1375 // Set up outgoing PHI node register values before emitting the terminator.
1376 if (I.isTerminator()) {
1377 HandlePHINodesInSuccessorBlocks(I.getParent());
1378 }
1379
1380 ++SDNodeOrder;
1381 CurInst = &I;
1382
1383 // Set inserted listener only if required.
1384 bool NodeInserted = false;
1385 std::unique_ptr<SelectionDAG::DAGNodeInsertedListener> InsertedListener;
1386 MDNode *PCSectionsMD = I.getMetadata(LLVMContext::MD_pcsections);
1387 MDNode *MMRA = I.getMetadata(LLVMContext::MD_mmra);
1388 if (PCSectionsMD || MMRA) {
1389 InsertedListener = std::make_unique<SelectionDAG::DAGNodeInsertedListener>(
1390 DAG, [&](SDNode *) { NodeInserted = true; });
1391 }
1392
1393 visit(I.getOpcode(), I);
1394
1395 if (!I.isTerminator() && !HasTailCall &&
1396 !isa<GCStatepointInst>(I)) // statepoints handle their exports internally
1398
1399 // Handle metadata.
1400 if (PCSectionsMD || MMRA) {
1401 auto It = NodeMap.find(&I);
1402 if (It != NodeMap.end()) {
1403 if (PCSectionsMD)
1404 DAG.addPCSections(It->second.getNode(), PCSectionsMD);
1405 if (MMRA)
1406 DAG.addMMRAMetadata(It->second.getNode(), MMRA);
1407 } else if (NodeInserted) {
1408 // This should not happen; if it does, don't let it go unnoticed so we can
1409 // fix it. Relevant visit*() function is probably missing a setValue().
1410 errs() << "warning: loosing !pcsections and/or !mmra metadata ["
1411 << I.getModule()->getName() << "]\n";
1412 LLVM_DEBUG(I.dump());
1413 assert(false);
1414 }
1415 }
1416
1417 CurInst = nullptr;
1418}
1419
1420void SelectionDAGBuilder::visitPHI(const PHINode &) {
1421 llvm_unreachable("SelectionDAGBuilder shouldn't visit PHI nodes!");
1422}
1423
1424void SelectionDAGBuilder::visit(unsigned Opcode, const User &I) {
1425 // Note: this doesn't use InstVisitor, because it has to work with
1426 // ConstantExpr's in addition to instructions.
1427 switch (Opcode) {
1428 default: llvm_unreachable("Unknown instruction type encountered!");
1429 // Build the switch statement using the Instruction.def file.
1430#define HANDLE_INST(NUM, OPCODE, CLASS) \
1431 case Instruction::OPCODE: visit##OPCODE((const CLASS&)I); break;
1432#include "llvm/IR/Instruction.def"
1433 }
1434}
1435
1437 DILocalVariable *Variable,
1438 DebugLoc DL, unsigned Order,
1441 // For variadic dbg_values we will now insert poison.
1442 // FIXME: We can potentially recover these!
1444 for (const Value *V : Values) {
1445 auto *Poison = PoisonValue::get(V->getType());
1447 }
1448 SDDbgValue *SDV = DAG.getDbgValueList(Variable, Expression, Locs, {},
1449 /*IsIndirect=*/false, DL, Order,
1450 /*IsVariadic=*/true);
1451 DAG.AddDbgValue(SDV, /*isParameter=*/false);
1452 return true;
1453}
1454
1456 DILocalVariable *Var,
1457 DIExpression *Expr,
1458 bool IsVariadic, DebugLoc DL,
1459 unsigned Order) {
1460 if (IsVariadic) {
1461 handleDanglingVariadicDebugInfo(DAG, Var, DL, Order, Values, Expr);
1462 return;
1463 }
1464 // TODO: Dangling debug info will eventually either be resolved or produce
1465 // a poison DBG_VALUE. However in the resolution case, a gap may appear
1466 // between the original dbg.value location and its resolved DBG_VALUE,
1467 // which we should ideally fill with an extra poison DBG_VALUE.
1468 assert(Values.size() == 1);
1469 DanglingDebugInfoMap[Values[0]].emplace_back(Var, Expr, DL, Order);
1470}
1471
1473 const DIExpression *Expr) {
1474 auto isMatchingDbgValue = [&](DanglingDebugInfo &DDI) {
1475 DIVariable *DanglingVariable = DDI.getVariable();
1476 DIExpression *DanglingExpr = DDI.getExpression();
1477 if (DanglingVariable == Variable && Expr->fragmentsOverlap(DanglingExpr)) {
1478 LLVM_DEBUG(dbgs() << "Dropping dangling debug info for "
1479 << printDDI(nullptr, DDI) << "\n");
1480 return true;
1481 }
1482 return false;
1483 };
1484
1485 for (auto &DDIMI : DanglingDebugInfoMap) {
1486 DanglingDebugInfoVector &DDIV = DDIMI.second;
1487
1488 // If debug info is to be dropped, run it through final checks to see
1489 // whether it can be salvaged.
1490 for (auto &DDI : DDIV)
1491 if (isMatchingDbgValue(DDI))
1492 salvageUnresolvedDbgValue(DDIMI.first, DDI);
1493
1494 erase_if(DDIV, isMatchingDbgValue);
1495 }
1496}
1497
1498// resolveDanglingDebugInfo - if we saw an earlier dbg_value referring to V,
1499// generate the debug data structures now that we've seen its definition.
1501 SDValue Val) {
1502 auto DanglingDbgInfoIt = DanglingDebugInfoMap.find(V);
1503 if (DanglingDbgInfoIt == DanglingDebugInfoMap.end())
1504 return;
1505
1506 DanglingDebugInfoVector &DDIV = DanglingDbgInfoIt->second;
1507 for (auto &DDI : DDIV) {
1508 DebugLoc DL = DDI.getDebugLoc();
1509 unsigned DbgSDNodeOrder = DDI.getSDNodeOrder();
1510 DILocalVariable *Variable = DDI.getVariable();
1511 DIExpression *Expr = DDI.getExpression();
1512 assert(Variable->isValidLocationForIntrinsic(DL) &&
1513 "Expected inlined-at fields to agree");
1514 SDDbgValue *SDV;
1515 if (Val.getNode()) {
1516 // FIXME: I doubt that it is correct to resolve a dangling DbgValue as a
1517 // FuncArgumentDbgValue (it would be hoisted to the function entry, and if
1518 // we couldn't resolve it directly when examining the DbgValue intrinsic
1519 // in the first place we should not be more successful here). Unless we
1520 // have some test case that prove this to be correct we should avoid
1521 // calling EmitFuncArgumentDbgValue here.
1522 unsigned ValSDNodeOrder = Val.getNode()->getIROrder();
1523 if (!EmitFuncArgumentDbgValue(V, Variable, Expr, DL,
1524 FuncArgumentDbgValueKind::Value, Val)) {
1525 LLVM_DEBUG(dbgs() << "Resolve dangling debug info for "
1526 << printDDI(V, DDI) << "\n");
1527 LLVM_DEBUG(dbgs() << " By mapping to:\n "; Val.dump());
1528 // Increase the SDNodeOrder for the DbgValue here to make sure it is
1529 // inserted after the definition of Val when emitting the instructions
1530 // after ISel. An alternative could be to teach
1531 // ScheduleDAGSDNodes::EmitSchedule to delay the insertion properly.
1532 LLVM_DEBUG(if (ValSDNodeOrder > DbgSDNodeOrder) dbgs()
1533 << "changing SDNodeOrder from " << DbgSDNodeOrder << " to "
1534 << ValSDNodeOrder << "\n");
1535 SDV = getDbgValue(Val, Variable, Expr, DL,
1536 std::max(DbgSDNodeOrder, ValSDNodeOrder));
1537 DAG.AddDbgValue(SDV, false);
1538 } else
1539 LLVM_DEBUG(dbgs() << "Resolved dangling debug info for "
1540 << printDDI(V, DDI)
1541 << " in EmitFuncArgumentDbgValue\n");
1542 } else {
1543 LLVM_DEBUG(dbgs() << "Dropping debug info for " << printDDI(V, DDI)
1544 << "\n");
1545 auto Poison = PoisonValue::get(V->getType());
1546 auto SDV =
1547 DAG.getConstantDbgValue(Variable, Expr, Poison, DL, DbgSDNodeOrder);
1548 DAG.AddDbgValue(SDV, false);
1549 }
1550 }
1551 DDIV.clear();
1552}
1553
1555 DanglingDebugInfo &DDI) {
1556 // TODO: For the variadic implementation, instead of only checking the fail
1557 // state of `handleDebugValue`, we need know specifically which values were
1558 // invalid, so that we attempt to salvage only those values when processing
1559 // a DIArgList.
1560 const Value *OrigV = V;
1561 DILocalVariable *Var = DDI.getVariable();
1562 DIExpression *Expr = DDI.getExpression();
1563 DebugLoc DL = DDI.getDebugLoc();
1564 unsigned SDOrder = DDI.getSDNodeOrder();
1565
1566 // Currently we consider only dbg.value intrinsics -- we tell the salvager
1567 // that DW_OP_stack_value is desired.
1568 bool StackValue = true;
1569
1570 // Can this Value can be encoded without any further work?
1571 if (handleDebugValue(V, Var, Expr, DL, SDOrder, /*IsVariadic=*/false))
1572 return;
1573
1574 // Attempt to salvage back through as many instructions as possible. Bail if
1575 // a non-instruction is seen, such as a constant expression or global
1576 // variable. FIXME: Further work could recover those too.
1577 while (isa<Instruction>(V)) {
1578 const Instruction &VAsInst = *cast<const Instruction>(V);
1579 // Temporary "0", awaiting real implementation.
1581 SmallVector<Value *, 4> AdditionalValues;
1582 V = salvageDebugInfoImpl(const_cast<Instruction &>(VAsInst),
1583 Expr->getNumLocationOperands(), Ops,
1584 AdditionalValues);
1585 // If we cannot salvage any further, and haven't yet found a suitable debug
1586 // expression, bail out.
1587 if (!V)
1588 break;
1589
1590 // TODO: If AdditionalValues isn't empty, then the salvage can only be
1591 // represented with a DBG_VALUE_LIST, so we give up. When we have support
1592 // here for variadic dbg_values, remove that condition.
1593 if (!AdditionalValues.empty())
1594 break;
1595
1596 // New value and expr now represent this debuginfo.
1597 Expr = DIExpression::appendOpsToArg(Expr, Ops, 0, StackValue);
1598
1599 // Some kind of simplification occurred: check whether the operand of the
1600 // salvaged debug expression can be encoded in this DAG.
1601 if (handleDebugValue(V, Var, Expr, DL, SDOrder, /*IsVariadic=*/false)) {
1602 LLVM_DEBUG(
1603 dbgs() << "Salvaged debug location info for:\n " << *Var << "\n"
1604 << *OrigV << "\nBy stripping back to:\n " << *V << "\n");
1605 return;
1606 }
1607 }
1608
1609 // This was the final opportunity to salvage this debug information, and it
1610 // couldn't be done. Place a poison DBG_VALUE at this location to terminate
1611 // any earlier variable location.
1612 assert(OrigV && "V shouldn't be null");
1613 auto *Poison = PoisonValue::get(OrigV->getType());
1614 auto *SDV = DAG.getConstantDbgValue(Var, Expr, Poison, DL, SDNodeOrder);
1615 DAG.AddDbgValue(SDV, false);
1616 LLVM_DEBUG(dbgs() << "Dropping debug value info for:\n "
1617 << printDDI(OrigV, DDI) << "\n");
1618}
1619
1621 DIExpression *Expr,
1622 DebugLoc DbgLoc,
1623 unsigned Order) {
1627 handleDebugValue(Poison, Var, NewExpr, DbgLoc, Order,
1628 /*IsVariadic*/ false);
1629}
1630
1632 DILocalVariable *Var,
1633 DIExpression *Expr, DebugLoc DbgLoc,
1634 unsigned Order, bool IsVariadic) {
1635 if (Values.empty())
1636 return true;
1637
1638 // Filter EntryValue locations out early.
1639 if (visitEntryValueDbgValue(Values, Var, Expr, DbgLoc))
1640 return true;
1641
1642 SmallVector<SDDbgOperand> LocationOps;
1643 SmallVector<SDNode *> Dependencies;
1644 for (const Value *V : Values) {
1645 // Constant value.
1648 LocationOps.emplace_back(SDDbgOperand::fromConst(V));
1649 continue;
1650 }
1651
1652 // Look through IntToPtr constants.
1653 if (auto *CE = dyn_cast<ConstantExpr>(V))
1654 if (CE->getOpcode() == Instruction::IntToPtr) {
1655 LocationOps.emplace_back(SDDbgOperand::fromConst(CE->getOperand(0)));
1656 continue;
1657 }
1658
1659 // If the Value is a frame index, we can create a FrameIndex debug value
1660 // without relying on the DAG at all.
1661 if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
1662 auto SI = FuncInfo.StaticAllocaMap.find(AI);
1663 if (SI != FuncInfo.StaticAllocaMap.end()) {
1664 LocationOps.emplace_back(SDDbgOperand::fromFrameIdx(SI->second));
1665 continue;
1666 }
1667 }
1668
1669 // Do not use getValue() in here; we don't want to generate code at
1670 // this point if it hasn't been done yet.
1671 SDValue N = NodeMap[V];
1672 if (!N.getNode() && isa<Argument>(V)) // Check unused arguments map.
1673 N = UnusedArgNodeMap[V];
1674
1675 if (N.getNode()) {
1676 // Only emit func arg dbg value for non-variadic dbg.values for now.
1677 if (!IsVariadic &&
1678 EmitFuncArgumentDbgValue(V, Var, Expr, DbgLoc,
1679 FuncArgumentDbgValueKind::Value, N))
1680 return true;
1681 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(N.getNode())) {
1682 // Construct a FrameIndexDbgValue for FrameIndexSDNodes so we can
1683 // describe stack slot locations.
1684 //
1685 // Consider "int x = 0; int *px = &x;". There are two kinds of
1686 // interesting debug values here after optimization:
1687 //
1688 // dbg.value(i32* %px, !"int *px", !DIExpression()), and
1689 // dbg.value(i32* %px, !"int x", !DIExpression(DW_OP_deref))
1690 //
1691 // Both describe the direct values of their associated variables.
1692 Dependencies.push_back(N.getNode());
1693 LocationOps.emplace_back(SDDbgOperand::fromFrameIdx(FISDN->getIndex()));
1694 continue;
1695 }
1696 LocationOps.emplace_back(
1697 SDDbgOperand::fromNode(N.getNode(), N.getResNo()));
1698 continue;
1699 }
1700
1701 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1702 // Special rules apply for the first dbg.values of parameter variables in a
1703 // function. Identify them by the fact they reference Argument Values, that
1704 // they're parameters, and they are parameters of the current function. We
1705 // need to let them dangle until they get an SDNode.
1706 bool IsParamOfFunc =
1707 isa<Argument>(V) && Var->isParameter() && !DbgLoc.getInlinedAt();
1708 if (IsParamOfFunc)
1709 return false;
1710
1711 // The value is not used in this block yet (or it would have an SDNode).
1712 // We still want the value to appear for the user if possible -- if it has
1713 // an associated VReg, we can refer to that instead.
1714 auto VMI = FuncInfo.ValueMap.find(V);
1715 if (VMI != FuncInfo.ValueMap.end()) {
1716 Register Reg = VMI->second;
1717 // If this is a PHI node, it may be split up into several MI PHI nodes
1718 // (in FunctionLoweringInfo::set).
1719 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), Reg,
1720 V->getType(), std::nullopt);
1721 if (RFV.occupiesMultipleRegs()) {
1722 // FIXME: We could potentially support variadic dbg_values here.
1723 if (IsVariadic)
1724 return false;
1725 unsigned Offset = 0;
1726 unsigned BitsToDescribe = 0;
1727 if (auto VarSize = Var->getSizeInBits())
1728 BitsToDescribe = *VarSize;
1729 if (auto Fragment = Expr->getFragmentInfo())
1730 BitsToDescribe = Fragment->SizeInBits;
1731 for (const auto &RegAndSize : RFV.getRegsAndSizes()) {
1732 // Bail out if all bits are described already.
1733 if (Offset >= BitsToDescribe)
1734 break;
1735 // TODO: handle scalable vectors.
1736 unsigned RegisterSize = RegAndSize.second;
1737 unsigned FragmentSize = (Offset + RegisterSize > BitsToDescribe)
1738 ? BitsToDescribe - Offset
1739 : RegisterSize;
1740 auto FragmentExpr = DIExpression::createFragmentExpression(
1741 Expr, Offset, FragmentSize);
1742 if (!FragmentExpr)
1743 continue;
1744 SDDbgValue *SDV = DAG.getVRegDbgValue(
1745 Var, *FragmentExpr, RegAndSize.first, false, DbgLoc, Order);
1746 DAG.AddDbgValue(SDV, false);
1747 Offset += RegisterSize;
1748 }
1749 return true;
1750 }
1751 // We can use simple vreg locations for variadic dbg_values as well.
1752 LocationOps.emplace_back(SDDbgOperand::fromVReg(Reg));
1753 continue;
1754 }
1755 // We failed to create a SDDbgOperand for V.
1756 return false;
1757 }
1758
1759 // We have created a SDDbgOperand for each Value in Values.
1760 assert(!LocationOps.empty());
1761 SDDbgValue *SDV =
1762 DAG.getDbgValueList(Var, Expr, LocationOps, Dependencies,
1763 /*IsIndirect=*/false, DbgLoc, Order, IsVariadic);
1764 DAG.AddDbgValue(SDV, /*isParameter=*/false);
1765 return true;
1766}
1767
1769 // Try to fixup any remaining dangling debug info -- and drop it if we can't.
1770 for (auto &Pair : DanglingDebugInfoMap)
1771 for (auto &DDI : Pair.second)
1772 salvageUnresolvedDbgValue(const_cast<Value *>(Pair.first), DDI);
1774}
1775
1776/// getCopyFromRegs - If there was virtual register allocated for the value V
1777/// emit CopyFromReg of the specified type Ty. Return empty SDValue() otherwise.
1779 auto It = FuncInfo.ValueMap.find(V);
1780 SDValue Result;
1781
1782 if (It != FuncInfo.ValueMap.end()) {
1783 Register InReg = It->second;
1784
1785 RegsForValue RFV(*DAG.getContext(), DAG.getTargetLoweringInfo(),
1786 DAG.getDataLayout(), InReg, Ty,
1787 std::nullopt); // This is not an ABI copy.
1788 SDValue Chain = DAG.getEntryNode();
1789 Result = RFV.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(), Chain, nullptr,
1790 V);
1791 resolveDanglingDebugInfo(V, Result);
1792 }
1793
1794 return Result;
1795}
1796
1797/// getValue - Return an SDValue for the given Value.
1799 // If we already have an SDValue for this value, use it. It's important
1800 // to do this first, so that we don't create a CopyFromReg if we already
1801 // have a regular SDValue.
1802 SDValue &N = NodeMap[V];
1803 if (N.getNode()) return N;
1804
1805 // If there's a virtual register allocated and initialized for this
1806 // value, use it.
1807 if (SDValue copyFromReg = getCopyFromRegs(V, V->getType()))
1808 return copyFromReg;
1809
1810 // Otherwise create a new SDValue and remember it.
1811 SDValue Val = getValueImpl(V);
1812 NodeMap[V] = Val;
1814 return Val;
1815}
1816
1817void SelectionDAGBuilder::setValueToPoison(const Value *V, const SDLoc &dl) {
1818 if (V->getType()->isVoidTy())
1819 return;
1820
1821 SmallVector<EVT, 4> ValueVTs;
1822 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(),
1823 V->getType(), ValueVTs);
1824 setValue(V, DAG.getErrorMergeValues(ValueVTs, SDValue(), dl));
1825}
1826
1827/// getNonRegisterValue - Return an SDValue for the given Value, but
1828/// don't look in FuncInfo.ValueMap for a virtual register.
1830 // If we already have an SDValue for this value, use it.
1831 SDValue &N = NodeMap[V];
1832 if (N.getNode()) {
1833 if (isIntOrFPConstant(N)) {
1834 // Remove the debug location from the node as the node is about to be used
1835 // in a location which may differ from the original debug location. This
1836 // is relevant to Constant and ConstantFP nodes because they can appear
1837 // as constant expressions inside PHI nodes.
1838 N->setDebugLoc(DebugLoc());
1839 }
1840 return N;
1841 }
1842
1843 // Otherwise create a new SDValue and remember it.
1844 SDValue Val = getValueImpl(V);
1845 NodeMap[V] = Val;
1847 return Val;
1848}
1849
1850/// getValueImpl - Helper function for getValue and getNonRegisterValue.
1851/// Create an SDValue for the given value.
1853 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1854
1855 if (const Constant *C = dyn_cast<Constant>(V)) {
1856 EVT VT = TLI.getValueType(DAG.getDataLayout(), V->getType(), true);
1857
1858 if (const ConstantInt *CI = dyn_cast<ConstantInt>(C)) {
1859 SDLoc DL = getCurSDLoc();
1860
1861 // DAG.getConstant() may attempt to legalise the vector constant which can
1862 // significantly change the combines applied to the DAG. To reduce the
1863 // divergence when enabling ConstantInt based vectors we try to construct
1864 // the DAG in the same way as shufflevector based splats. TODO: The
1865 // divergence sometimes leads to better optimisations. Ideally we should
1866 // prevent DAG.getConstant() from legalising too early but there are some
1867 // degradations preventing this.
1868 if (VT.isScalableVector())
1869 return DAG.getNode(
1870 ISD::SPLAT_VECTOR, DL, VT,
1871 DAG.getConstant(CI->getValue(), DL, VT.getVectorElementType()));
1872 if (VT.isFixedLengthVector())
1873 return DAG.getSplatBuildVector(
1874 VT, DL,
1875 DAG.getConstant(CI->getValue(), DL, VT.getVectorElementType()));
1876 return DAG.getConstant(*CI, DL, VT);
1877 }
1878
1879 if (const ConstantByte *CB = dyn_cast<ConstantByte>(C))
1880 return DAG.getConstant(CB->getValue(), getCurSDLoc(), VT);
1881
1882 if (const GlobalValue *GV = dyn_cast<GlobalValue>(C))
1883 return DAG.getGlobalAddress(GV, getCurSDLoc(), VT);
1884
1885 if (const ConstantPtrAuth *CPA = dyn_cast<ConstantPtrAuth>(C)) {
1886 return DAG.getNode(ISD::PtrAuthGlobalAddress, getCurSDLoc(), VT,
1887 getValue(CPA->getPointer()), getValue(CPA->getKey()),
1888 getValue(CPA->getAddrDiscriminator()),
1889 getValue(CPA->getDiscriminator()));
1890 }
1891
1893 return DAG.getConstant(0, getCurSDLoc(), VT);
1894
1895 if (match(C, m_VScale()))
1896 return DAG.getVScale(getCurSDLoc(), VT, APInt(VT.getSizeInBits(), 1));
1897
1898 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C))
1899 return DAG.getConstantFP(*CFP, getCurSDLoc(), VT);
1900
1901 if (isa<UndefValue>(C) && !V->getType()->isAggregateType())
1902 return isa<PoisonValue>(C) ? DAG.getPOISON(VT) : DAG.getUNDEF(VT);
1903
1904 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
1905 visit(CE->getOpcode(), *CE);
1906 SDValue N1 = NodeMap[V];
1907 assert(N1.getNode() && "visit didn't populate the NodeMap!");
1908 return N1;
1909 }
1910
1912 SmallVector<SDValue, 4> Constants;
1913 for (const Use &U : C->operands()) {
1914 SDNode *Val = getValue(U).getNode();
1915 // If the operand is an empty aggregate, there are no values.
1916 if (!Val) continue;
1917 // Add each leaf value from the operand to the Constants list
1918 // to form a flattened list of all the values.
1919 for (unsigned i = 0, e = Val->getNumValues(); i != e; ++i)
1920 Constants.push_back(SDValue(Val, i));
1921 }
1922
1923 return DAG.getMergeValues(Constants, getCurSDLoc());
1924 }
1925
1926 if (const ConstantDataSequential *CDS =
1929 for (uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i) {
1930 SDNode *Val = getValue(CDS->getElementAsConstant(i)).getNode();
1931 // Add each leaf value from the operand to the Constants list
1932 // to form a flattened list of all the values.
1933 for (unsigned i = 0, e = Val->getNumValues(); i != e; ++i)
1934 Ops.push_back(SDValue(Val, i));
1935 }
1936
1937 if (isa<ArrayType>(CDS->getType()))
1938 return DAG.getMergeValues(Ops, getCurSDLoc());
1939 return DAG.getBuildVector(VT, getCurSDLoc(), Ops);
1940 }
1941
1942 if (C->getType()->isStructTy() || C->getType()->isArrayTy()) {
1944 "Unknown struct or array constant!");
1945
1946 SmallVector<EVT, 4> ValueVTs;
1947 ComputeValueVTs(TLI, DAG.getDataLayout(), C->getType(), ValueVTs);
1948 unsigned NumElts = ValueVTs.size();
1949 if (NumElts == 0)
1950 return SDValue(); // empty struct
1951 SmallVector<SDValue, 4> Constants(NumElts);
1952 for (unsigned i = 0; i != NumElts; ++i) {
1953 EVT EltVT = ValueVTs[i];
1954 if (isa<UndefValue>(C))
1955 Constants[i] = DAG.getUNDEF(EltVT);
1956 else if (EltVT.isFloatingPoint())
1957 Constants[i] = DAG.getConstantFP(0, getCurSDLoc(), EltVT);
1958 else
1959 Constants[i] = DAG.getConstant(0, getCurSDLoc(), EltVT);
1960 }
1961
1962 return DAG.getMergeValues(Constants, getCurSDLoc());
1963 }
1964
1965 if (const BlockAddress *BA = dyn_cast<BlockAddress>(C))
1966 return DAG.getBlockAddress(BA, VT);
1967
1968 if (const auto *Equiv = dyn_cast<DSOLocalEquivalent>(C))
1969 return getValue(Equiv->getGlobalValue());
1970
1971 if (const auto *NC = dyn_cast<NoCFIValue>(C))
1972 return getValue(NC->getGlobalValue());
1973
1974 if (VT == MVT::aarch64svcount) {
1975 assert(C->isNullValue() && "Can only zero this target type!");
1976 return DAG.getNode(ISD::BITCAST, getCurSDLoc(), VT,
1977 DAG.getConstant(0, getCurSDLoc(), MVT::nxv16i1));
1978 }
1979
1980 if (VT.isRISCVVectorTuple()) {
1981 assert(C->isNullValue() && "Can only zero this target type!");
1982 return DAG.getNode(
1984 DAG.getNode(
1986 EVT::getVectorVT(*DAG.getContext(), MVT::i8,
1987 VT.getSizeInBits().getKnownMinValue() / 8, true),
1988 DAG.getConstant(0, getCurSDLoc(), MVT::getIntegerVT(8))));
1989 }
1990
1991 if (VT == MVT::externref || VT == MVT::funcref) {
1992 assert(C->isNullValue() && "Can only zero this target type!");
1993 // The zero value of a WebAssembly reference type is the null reference,
1994 // materialized with ref.null.
1995 Intrinsic::ID IID = VT == MVT::externref ? Intrinsic::wasm_ref_null_extern
1996 : Intrinsic::wasm_ref_null_func;
1997 return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, getCurSDLoc(), VT,
1998 DAG.getTargetConstant(IID, getCurSDLoc(), MVT::i32));
1999 }
2000
2001 VectorType *VecTy = cast<VectorType>(V->getType());
2002
2003 // Now that we know the number and type of the elements, get that number of
2004 // elements into the Ops array based on what kind of constant it is.
2005 if (const ConstantVector *CV = dyn_cast<ConstantVector>(C)) {
2007 unsigned NumElements = cast<FixedVectorType>(VecTy)->getNumElements();
2008 for (unsigned i = 0; i != NumElements; ++i)
2009 Ops.push_back(getValue(CV->getOperand(i)));
2010
2011 return DAG.getBuildVector(VT, getCurSDLoc(), Ops);
2012 }
2013
2015 EVT EltVT =
2016 TLI.getValueType(DAG.getDataLayout(), VecTy->getElementType());
2017
2018 SDValue Op;
2019 if (EltVT.isFloatingPoint())
2020 Op = DAG.getConstantFP(0, getCurSDLoc(), EltVT);
2021 else
2022 Op = DAG.getConstant(0, getCurSDLoc(), EltVT);
2023
2024 return DAG.getSplat(VT, getCurSDLoc(), Op);
2025 }
2026
2027 llvm_unreachable("Unknown vector constant");
2028 }
2029
2030 // If this is a static alloca, generate it as the frameindex instead of
2031 // computation.
2032 if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
2033 auto SI = FuncInfo.StaticAllocaMap.find(AI);
2034 if (SI != FuncInfo.StaticAllocaMap.end())
2035 return DAG.getFrameIndex(
2036 SI->second, TLI.getValueType(DAG.getDataLayout(), AI->getType()));
2037 }
2038
2039 // If this is an instruction which fast-isel has deferred, select it now.
2040 if (const Instruction *Inst = dyn_cast<Instruction>(V)) {
2041 Register InReg = FuncInfo.InitializeRegForValue(Inst);
2042 RegsForValue RFV(*DAG.getContext(), TLI, DAG.getDataLayout(), InReg,
2043 Inst->getType(), std::nullopt);
2044 SDValue Chain = DAG.getEntryNode();
2045 return RFV.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(), Chain, nullptr, V);
2046 }
2047
2048 if (const MetadataAsValue *MD = dyn_cast<MetadataAsValue>(V))
2049 return DAG.getMDNode(cast<MDNode>(MD->getMetadata()));
2050
2051 if (const auto *BB = dyn_cast<BasicBlock>(V))
2052 return DAG.getBasicBlock(FuncInfo.getMBB(BB));
2053
2054 llvm_unreachable("Can't get register for value!");
2055}
2056
2057void SelectionDAGBuilder::visitCatchPad(const CatchPadInst &I) {
2059 bool IsMSVCCXX = Pers == EHPersonality::MSVC_CXX;
2060 bool IsCoreCLR = Pers == EHPersonality::CoreCLR;
2061 bool IsSEH = isAsynchronousEHPersonality(Pers);
2062 MachineBasicBlock *CatchPadMBB = FuncInfo.MBB;
2063 if (IsSEH) {
2064 // For SEH, EHCont Guard needs to know that this catchpad is a target.
2065 CatchPadMBB->setIsEHContTarget(true);
2067 } else
2068 CatchPadMBB->setIsEHScopeEntry();
2069 // In MSVC C++ and CoreCLR, catchblocks are funclets and need prologues.
2070 if (IsMSVCCXX || IsCoreCLR)
2071 CatchPadMBB->setIsEHFuncletEntry();
2072}
2073
2074void SelectionDAGBuilder::visitCatchRet(const CatchReturnInst &I) {
2075 // Update machine-CFG edge.
2076 MachineBasicBlock *TargetMBB = FuncInfo.getMBB(I.getSuccessor());
2077 FuncInfo.MBB->addSuccessor(TargetMBB);
2078
2079 auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn());
2080 bool IsSEH = isAsynchronousEHPersonality(Pers);
2081 if (IsSEH) {
2082 // If this is not a fall-through branch or optimizations are switched off,
2083 // emit the branch.
2084 if (TargetMBB != NextBlock(FuncInfo.MBB) ||
2085 TM.getOptLevel() == CodeGenOptLevel::None)
2086 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
2087 getControlRoot(), DAG.getBasicBlock(TargetMBB)));
2088 return;
2089 }
2090
2091 // For non-SEH, EHCont Guard needs to know that this catchret is a target.
2092 TargetMBB->setIsEHContTarget(true);
2093 DAG.getMachineFunction().setHasEHContTarget(true);
2094
2095 // Figure out the funclet membership for the catchret's successor.
2096 // This will be used by the FuncletLayout pass to determine how to order the
2097 // BB's.
2098 // A 'catchret' returns to the outer scope's color.
2099 Value *ParentPad = I.getCatchSwitchParentPad();
2100 const BasicBlock *SuccessorColor;
2101 if (isa<ConstantTokenNone>(ParentPad))
2102 SuccessorColor = &FuncInfo.Fn->getEntryBlock();
2103 else
2104 SuccessorColor = cast<Instruction>(ParentPad)->getParent();
2105 assert(SuccessorColor && "No parent funclet for catchret!");
2106 MachineBasicBlock *SuccessorColorMBB = FuncInfo.getMBB(SuccessorColor);
2107 assert(SuccessorColorMBB && "No MBB for SuccessorColor!");
2108
2109 // Create the terminator node.
2110 SDValue Ret = DAG.getNode(ISD::CATCHRET, getCurSDLoc(), MVT::Other,
2111 getControlRoot(), DAG.getBasicBlock(TargetMBB),
2112 DAG.getBasicBlock(SuccessorColorMBB));
2113 DAG.setRoot(Ret);
2114}
2115
2116void SelectionDAGBuilder::visitCleanupPad(const CleanupPadInst &CPI) {
2117 // Don't emit any special code for the cleanuppad instruction. It just marks
2118 // the start of an EH scope/funclet.
2119 FuncInfo.MBB->setIsEHScopeEntry();
2120 auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn());
2121 if (Pers != EHPersonality::Wasm_CXX) {
2122 FuncInfo.MBB->setIsEHFuncletEntry();
2123 FuncInfo.MBB->setIsCleanupFuncletEntry();
2124 }
2125}
2126
2127/// When an invoke or a cleanupret unwinds to the next EH pad, there are
2128/// many places it could ultimately go. In the IR, we have a single unwind
2129/// destination, but in the machine CFG, we enumerate all the possible blocks.
2130/// This function skips over imaginary basic blocks that hold catchswitch
2131/// instructions, and finds all the "real" machine
2132/// basic block destinations. As those destinations may not be successors of
2133/// EHPadBB, here we also calculate the edge probability to those destinations.
2134/// The passed-in Prob is the edge probability to EHPadBB.
2136 FunctionLoweringInfo &FuncInfo, const BasicBlock *EHPadBB,
2137 BranchProbability Prob,
2138 SmallVectorImpl<std::pair<MachineBasicBlock *, BranchProbability>>
2139 &UnwindDests) {
2140 EHPersonality Personality =
2142 bool IsMSVCCXX = Personality == EHPersonality::MSVC_CXX;
2143 bool IsCoreCLR = Personality == EHPersonality::CoreCLR;
2144 bool IsWasmCXX = Personality == EHPersonality::Wasm_CXX;
2145 bool IsSEH = isAsynchronousEHPersonality(Personality);
2146
2147 while (EHPadBB) {
2149 BasicBlock *NewEHPadBB = nullptr;
2150 if (isa<LandingPadInst>(Pad)) {
2151 // Stop on landingpads. They are not funclets.
2152 UnwindDests.emplace_back(FuncInfo.getMBB(EHPadBB), Prob);
2153 break;
2154 } else if (isa<CleanupPadInst>(Pad)) {
2155 // Stop on cleanup pads. Cleanups are always funclet entries for all known
2156 // personalities except Wasm. And in Wasm this becomes a catch_all(_ref),
2157 // which always catches an exception.
2158 UnwindDests.emplace_back(FuncInfo.getMBB(EHPadBB), Prob);
2159 UnwindDests.back().first->setIsEHScopeEntry();
2160 // In Wasm, EH scopes are not funclets
2161 if (!IsWasmCXX)
2162 UnwindDests.back().first->setIsEHFuncletEntry();
2163 break;
2164 } else if (const auto *CatchSwitch = dyn_cast<CatchSwitchInst>(Pad)) {
2165 // Add the catchpad handlers to the possible destinations.
2166 for (const BasicBlock *CatchPadBB : CatchSwitch->handlers()) {
2167 UnwindDests.emplace_back(FuncInfo.getMBB(CatchPadBB), Prob);
2168 // For MSVC++ and the CLR, catchblocks are funclets and need prologues.
2169 if (IsMSVCCXX || IsCoreCLR)
2170 UnwindDests.back().first->setIsEHFuncletEntry();
2171 if (!IsSEH)
2172 UnwindDests.back().first->setIsEHScopeEntry();
2173 }
2174 NewEHPadBB = CatchSwitch->getUnwindDest();
2175 } else {
2176 continue;
2177 }
2178
2179 BranchProbabilityInfo *BPI = FuncInfo.BPI;
2180 if (BPI && NewEHPadBB)
2181 Prob *= BPI->getEdgeProbability(EHPadBB, NewEHPadBB);
2182 EHPadBB = NewEHPadBB;
2183 }
2184}
2185
2186void SelectionDAGBuilder::visitCleanupRet(const CleanupReturnInst &I) {
2187 // Update successor info.
2189 auto UnwindDest = I.getUnwindDest();
2190 BranchProbabilityInfo *BPI = FuncInfo.BPI;
2191 BranchProbability UnwindDestProb =
2192 (BPI && UnwindDest)
2193 ? BPI->getEdgeProbability(FuncInfo.MBB->getBasicBlock(), UnwindDest)
2195 findUnwindDestinations(FuncInfo, UnwindDest, UnwindDestProb, UnwindDests);
2196 for (auto &UnwindDest : UnwindDests) {
2197 UnwindDest.first->setIsEHPad();
2198 addSuccessorWithProb(FuncInfo.MBB, UnwindDest.first, UnwindDest.second);
2199 }
2200 FuncInfo.MBB->normalizeSuccProbs();
2201
2202 // Create the terminator node.
2203 MachineBasicBlock *CleanupPadMBB =
2204 FuncInfo.getMBB(I.getCleanupPad()->getParent());
2205 SDValue Ret = DAG.getNode(ISD::CLEANUPRET, getCurSDLoc(), MVT::Other,
2206 getControlRoot(), DAG.getBasicBlock(CleanupPadMBB));
2207 DAG.setRoot(Ret);
2208}
2209
2210void SelectionDAGBuilder::visitCatchSwitch(const CatchSwitchInst &CSI) {
2211 report_fatal_error("visitCatchSwitch not yet implemented!");
2212}
2213
2214void SelectionDAGBuilder::visitRet(const ReturnInst &I) {
2215 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
2216 auto &DL = DAG.getDataLayout();
2217 SDValue Chain = getControlRoot();
2220
2221 // Calls to @llvm.experimental.deoptimize don't generate a return value, so
2222 // lower
2223 //
2224 // %val = call <ty> @llvm.experimental.deoptimize()
2225 // ret <ty> %val
2226 //
2227 // differently.
2228 if (I.getParent()->getTerminatingDeoptimizeCall()) {
2230 return;
2231 }
2232
2233 if (!FuncInfo.CanLowerReturn) {
2234 Register DemoteReg = FuncInfo.DemoteRegister;
2235
2236 // Emit a store of the return value through the virtual register.
2237 // Leave Outs empty so that LowerReturn won't try to load return
2238 // registers the usual way.
2239 MVT PtrValueVT = TLI.getPointerTy(DL, DL.getAllocaAddrSpace());
2240 SDValue RetPtr =
2241 DAG.getCopyFromReg(Chain, getCurSDLoc(), DemoteReg, PtrValueVT);
2242 Type *RetTy = I.getOperand(0)->getType();
2243 Align BaseAlign = DL.getPrefTypeAlign(RetTy);
2244 RetPtr =
2245 TLI.annotateStackObjectPointer(RetPtr, DAG, getCurSDLoc(), BaseAlign);
2246 SDValue RetOp = getValue(I.getOperand(0));
2247
2248 SmallVector<EVT, 4> ValueVTs, MemVTs;
2249 SmallVector<uint64_t, 4> Offsets;
2250 ComputeValueVTs(TLI, DL, RetTy, ValueVTs, &MemVTs, &Offsets, 0);
2251 unsigned NumValues = ValueVTs.size();
2252
2253 SmallVector<SDValue, 4> Chains(NumValues);
2254 for (unsigned i = 0; i != NumValues; ++i) {
2255 // An aggregate return value cannot wrap around the address space, so
2256 // offsets to its parts don't wrap either.
2257 SDValue Ptr = DAG.getObjectPtrOffset(getCurSDLoc(), RetPtr,
2258 TypeSize::getFixed(Offsets[i]));
2259
2260 SDValue Val = RetOp.getValue(RetOp.getResNo() + i);
2261 if (MemVTs[i] != ValueVTs[i])
2262 Val = DAG.getPtrExtOrTrunc(Val, getCurSDLoc(), MemVTs[i]);
2263 Chains[i] = DAG.getStore(
2264 Chain, getCurSDLoc(), Val,
2265 // FIXME: better loc info would be nice.
2266 Ptr, MachinePointerInfo::getUnknownStack(DAG.getMachineFunction()),
2267 commonAlignment(BaseAlign, Offsets[i]));
2268 }
2269
2270 Chain = DAG.getNode(ISD::TokenFactor, getCurSDLoc(),
2271 MVT::Other, Chains);
2272 } else if (I.getNumOperands() != 0) {
2274 ComputeValueTypes(DL, I.getOperand(0)->getType(), Types);
2275 unsigned NumValues = Types.size();
2276 if (NumValues) {
2277 SDValue RetOp = getValue(I.getOperand(0));
2278
2279 const Function *F = I.getParent()->getParent();
2280
2281 bool NeedsRegBlock = TLI.functionArgumentNeedsConsecutiveRegisters(
2282 I.getOperand(0)->getType(), F->getCallingConv(),
2283 /*IsVarArg*/ false, DL);
2284
2285 ISD::NodeType ExtendKind = ISD::ANY_EXTEND;
2286 if (F->getAttributes().hasRetAttr(Attribute::SExt))
2287 ExtendKind = ISD::SIGN_EXTEND;
2288 else if (F->getAttributes().hasRetAttr(Attribute::ZExt))
2289 ExtendKind = ISD::ZERO_EXTEND;
2290
2291 LLVMContext &Context = F->getContext();
2292 bool RetInReg = F->getAttributes().hasRetAttr(Attribute::InReg);
2293
2294 for (unsigned j = 0; j != NumValues; ++j) {
2295 EVT VT = TLI.getValueType(DL, Types[j]);
2296
2297 if (ExtendKind != ISD::ANY_EXTEND && VT.isInteger())
2298 VT = TLI.getTypeForExtReturn(Context, VT, ExtendKind);
2299
2300 CallingConv::ID CC = F->getCallingConv();
2301
2302 unsigned NumParts = TLI.getNumRegistersForCallingConv(Context, CC, VT);
2303 MVT PartVT = TLI.getRegisterTypeForCallingConv(Context, CC, VT);
2304 SmallVector<SDValue, 4> Parts(NumParts);
2306 SDValue(RetOp.getNode(), RetOp.getResNo() + j),
2307 &Parts[0], NumParts, PartVT, &I, CC, ExtendKind);
2308
2309 // 'inreg' on function refers to return value
2310 ISD::ArgFlagsTy Flags = ISD::ArgFlagsTy();
2311 if (RetInReg)
2312 Flags.setInReg();
2313
2314 if (I.getOperand(0)->getType()->isPointerTy()) {
2315 Flags.setPointer();
2316 Flags.setPointerAddrSpace(
2317 cast<PointerType>(I.getOperand(0)->getType())->getAddressSpace());
2318 }
2319
2320 if (NeedsRegBlock) {
2321 Flags.setInConsecutiveRegs();
2322 if (j == NumValues - 1)
2323 Flags.setInConsecutiveRegsLast();
2324 }
2325
2326 // Propagate extension type if any
2327 if (ExtendKind == ISD::SIGN_EXTEND)
2328 Flags.setSExt();
2329 else if (ExtendKind == ISD::ZERO_EXTEND)
2330 Flags.setZExt();
2331 else if (F->getAttributes().hasRetAttr(Attribute::NoExt))
2332 Flags.setNoExt();
2333
2334 for (unsigned i = 0; i < NumParts; ++i) {
2335 Outs.push_back(ISD::OutputArg(Flags,
2336 Parts[i].getValueType().getSimpleVT(),
2337 VT, Types[j], 0, 0));
2338 OutVals.push_back(Parts[i]);
2339 }
2340 }
2341 }
2342 }
2343
2344 // Push in swifterror virtual register as the last element of Outs. This makes
2345 // sure swifterror virtual register will be returned in the swifterror
2346 // physical register.
2347 const Function *F = I.getParent()->getParent();
2348 if (TLI.supportSwiftError() &&
2349 F->getAttributes().hasAttrSomewhere(Attribute::SwiftError)) {
2350 assert(SwiftError.getFunctionArg() && "Need a swift error argument");
2351 ISD::ArgFlagsTy Flags = ISD::ArgFlagsTy();
2352 Flags.setSwiftError();
2353 Outs.push_back(ISD::OutputArg(Flags, /*vt=*/TLI.getPointerTy(DL),
2354 /*argvt=*/EVT(TLI.getPointerTy(DL)),
2355 PointerType::getUnqual(*DAG.getContext()),
2356 /*origidx=*/1, /*partOffs=*/0));
2357 // Create SDNode for the swifterror virtual register.
2358 OutVals.push_back(
2359 DAG.getRegister(SwiftError.getOrCreateVRegUseAt(
2360 &I, FuncInfo.MBB, SwiftError.getFunctionArg()),
2361 EVT(TLI.getPointerTy(DL))));
2362 }
2363
2364 bool isVarArg = DAG.getMachineFunction().getFunction().isVarArg();
2365 CallingConv::ID CallConv =
2366 DAG.getMachineFunction().getFunction().getCallingConv();
2367 Chain = DAG.getTargetLoweringInfo().LowerReturn(
2368 Chain, CallConv, isVarArg, Outs, OutVals, getCurSDLoc(), DAG);
2369
2370 // Verify that the target's LowerReturn behaved as expected.
2371 assert(Chain.getNode() && Chain.getValueType() == MVT::Other &&
2372 "LowerReturn didn't return a valid chain!");
2373
2374 // Update the DAG with the new chain value resulting from return lowering.
2375 DAG.setRoot(Chain);
2376}
2377
2378/// CopyToExportRegsIfNeeded - If the given value has virtual registers
2379/// created for it, emit nodes to copy the value into the virtual
2380/// registers.
2382 // Skip empty types
2383 if (V->getType()->isEmptyTy())
2384 return;
2385
2386 auto VMI = FuncInfo.ValueMap.find(V);
2387 if (VMI != FuncInfo.ValueMap.end()) {
2388 assert((!V->use_empty() || isa<CallBrInst>(V)) &&
2389 "Unused value assigned virtual registers!");
2390 CopyValueToVirtualRegister(V, VMI->second);
2391 }
2392}
2393
2394/// ExportFromCurrentBlock - If this condition isn't known to be exported from
2395/// the current basic block, add it to ValueMap now so that we'll get a
2396/// CopyTo/FromReg.
2398 // No need to export constants.
2399 if (!isa<Instruction>(V) && !isa<Argument>(V)) return;
2400
2401 // Already exported?
2402 if (FuncInfo.isExportedInst(V)) return;
2403
2404 Register Reg = FuncInfo.InitializeRegForValue(V);
2406}
2407
2409 const BasicBlock *FromBB) {
2410 // The operands of the setcc have to be in this block. We don't know
2411 // how to export them from some other block.
2412 if (const Instruction *VI = dyn_cast<Instruction>(V)) {
2413 // Can export from current BB.
2414 if (VI->getParent() == FromBB)
2415 return true;
2416
2417 // Is already exported, noop.
2418 return FuncInfo.isExportedInst(V);
2419 }
2420
2421 // If this is an argument, we can export it if the BB is the entry block or
2422 // if it is already exported.
2423 if (isa<Argument>(V)) {
2424 if (FromBB->isEntryBlock())
2425 return true;
2426
2427 // Otherwise, can only export this if it is already exported.
2428 return FuncInfo.isExportedInst(V);
2429 }
2430
2431 // Otherwise, constants can always be exported.
2432 return true;
2433}
2434
2435/// Return branch probability calculated by BranchProbabilityInfo for IR blocks.
2437SelectionDAGBuilder::getEdgeProbability(const MachineBasicBlock *Src,
2438 const MachineBasicBlock *Dst) const {
2440 const BasicBlock *SrcBB = Src->getBasicBlock();
2441 const BasicBlock *DstBB = Dst->getBasicBlock();
2442 if (!BPI) {
2443 // If BPI is not available, set the default probability as 1 / N, where N is
2444 // the number of successors.
2445 auto SuccSize = std::max<uint32_t>(succ_size(SrcBB), 1);
2446 return BranchProbability(1, SuccSize);
2447 }
2448 return BPI->getEdgeProbability(SrcBB, DstBB);
2449}
2450
2451void SelectionDAGBuilder::addSuccessorWithProb(MachineBasicBlock *Src,
2452 MachineBasicBlock *Dst,
2453 BranchProbability Prob) {
2454 if (!FuncInfo.BPI)
2455 Src->addSuccessorWithoutProb(Dst);
2456 else {
2457 if (Prob.isUnknown())
2458 Prob = getEdgeProbability(Src, Dst);
2459 Src->addSuccessor(Dst, Prob);
2460 }
2461}
2462
2463static bool InBlock(const Value *V, const BasicBlock *BB) {
2464 if (const Instruction *I = dyn_cast<Instruction>(V))
2465 return I->getParent() == BB;
2466 return true;
2467}
2468
2469/// EmitBranchForMergedCondition - Helper method for FindMergedConditions.
2470/// This function emits a branch and is used at the leaves of an OR or an
2471/// AND operator tree.
2472void
2475 MachineBasicBlock *FBB,
2476 MachineBasicBlock *CurBB,
2477 MachineBasicBlock *SwitchBB,
2478 BranchProbability TProb,
2479 BranchProbability FProb,
2480 bool InvertCond) {
2481 const BasicBlock *BB = CurBB->getBasicBlock();
2482
2483 // If the leaf of the tree is a comparison, merge the condition into
2484 // the caseblock.
2485 if (const CmpInst *BOp = dyn_cast<CmpInst>(Cond)) {
2486 // The operands of the cmp have to be in this block. We don't know
2487 // how to export them from some other block. If this is the first block
2488 // of the sequence, no exporting is needed.
2489 if (CurBB == SwitchBB ||
2490 (isExportableFromCurrentBlock(BOp->getOperand(0), BB) &&
2491 isExportableFromCurrentBlock(BOp->getOperand(1), BB))) {
2492 ISD::CondCode Condition;
2493 if (const ICmpInst *IC = dyn_cast<ICmpInst>(Cond)) {
2494 ICmpInst::Predicate Pred =
2495 InvertCond ? IC->getInversePredicate() : IC->getPredicate();
2496 Condition = getICmpCondCode(Pred);
2497 } else {
2498 const FCmpInst *FC = cast<FCmpInst>(Cond);
2499 FCmpInst::Predicate Pred =
2500 InvertCond ? FC->getInversePredicate() : FC->getPredicate();
2501 Condition = getFCmpCondCode(Pred);
2502 if (FC->hasNoNaNs() ||
2503 (isKnownNeverNaN(FC->getOperand(0),
2504 SimplifyQuery(DAG.getDataLayout(), FC)) &&
2505 isKnownNeverNaN(FC->getOperand(1),
2506 SimplifyQuery(DAG.getDataLayout(), FC))))
2507 Condition = getFCmpCodeWithoutNaN(Condition);
2508 }
2509
2510 CaseBlock CB(Condition, BOp->getOperand(0), BOp->getOperand(1), nullptr,
2511 TBB, FBB, CurBB, getCurSDLoc(), TProb, FProb);
2512 SL->SwitchCases.push_back(CB);
2513 return;
2514 }
2515 }
2516
2517 // Create a CaseBlock record representing this branch.
2518 ISD::CondCode Opc = InvertCond ? ISD::SETNE : ISD::SETEQ;
2519 CaseBlock CB(Opc, Cond, ConstantInt::getTrue(*DAG.getContext()),
2520 nullptr, TBB, FBB, CurBB, getCurSDLoc(), TProb, FProb);
2521 SL->SwitchCases.push_back(CB);
2522}
2523
2524// Collect dependencies on V recursively. This is used for the cost analysis in
2525// `shouldKeepJumpConditionsTogether`.
2529 unsigned Depth = 0) {
2530 // Return false if we have an incomplete count.
2532 return false;
2533
2534 auto *I = dyn_cast<Instruction>(V);
2535 if (I == nullptr)
2536 return true;
2537
2538 if (Necessary != nullptr) {
2539 // This instruction is necessary for the other side of the condition so
2540 // don't count it.
2541 if (Necessary->contains(I))
2542 return true;
2543 }
2544
2545 // Already added this dep.
2546 if (!Deps->try_emplace(I, false).second)
2547 return true;
2548
2549 for (unsigned OpIdx = 0, E = I->getNumOperands(); OpIdx < E; ++OpIdx)
2550 if (!collectInstructionDeps(Deps, I->getOperand(OpIdx), Necessary,
2551 Depth + 1))
2552 return false;
2553 return true;
2554}
2555
2558 Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs,
2560 if (Params.BaseCost < 0)
2561 return false;
2562
2563 // Baseline cost.
2564 InstructionCost CostThresh = Params.BaseCost;
2565
2566 BranchProbabilityInfo *BPI = nullptr;
2567 if (Params.LikelyBias || Params.UnlikelyBias)
2568 BPI = FuncInfo.BPI;
2569 if (BPI != nullptr) {
2570 // See if we are either likely to get an early out or compute both lhs/rhs
2571 // of the condition.
2572 BasicBlock *IfFalse = I.getSuccessor(0);
2573 BasicBlock *IfTrue = I.getSuccessor(1);
2574
2575 std::optional<bool> Likely;
2576 if (BPI->isEdgeHot(I.getParent(), IfTrue))
2577 Likely = true;
2578 else if (BPI->isEdgeHot(I.getParent(), IfFalse))
2579 Likely = false;
2580
2581 if (Likely) {
2582 if (Opc == (*Likely ? Instruction::And : Instruction::Or))
2583 // Its likely we will have to compute both lhs and rhs of condition
2584 CostThresh += Params.LikelyBias;
2585 else {
2586 if (Params.UnlikelyBias < 0)
2587 return false;
2588 // Its likely we will get an early out.
2589 CostThresh -= Params.UnlikelyBias;
2590 }
2591 }
2592 }
2593
2594 if (CostThresh <= 0)
2595 return false;
2596
2597 // Collect "all" instructions that lhs condition is dependent on.
2598 // Use map for stable iteration (to avoid non-determanism of iteration of
2599 // SmallPtrSet). The `bool` value is just a dummy.
2601 collectInstructionDeps(&LhsDeps, Lhs);
2602 // Collect "all" instructions that rhs condition is dependent on AND are
2603 // dependencies of lhs. This gives us an estimate on which instructions we
2604 // stand to save by splitting the condition.
2605 if (!collectInstructionDeps(&RhsDeps, Rhs, &LhsDeps))
2606 return false;
2607 // Add the compare instruction itself unless its a dependency on the LHS.
2608 if (const auto *RhsI = dyn_cast<Instruction>(Rhs))
2609 if (!LhsDeps.contains(RhsI))
2610 RhsDeps.try_emplace(RhsI, false);
2611
2612 InstructionCost CostOfIncluding = 0;
2613 // See if this instruction will need to computed independently of whether RHS
2614 // is.
2615 Value *BrCond = I.getCondition();
2616 auto ShouldCountInsn = [&RhsDeps, &BrCond](const Instruction *Ins) {
2617 for (const auto *U : Ins->users()) {
2618 // If user is independent of RHS calculation we don't need to count it.
2619 if (auto *UIns = dyn_cast<Instruction>(U))
2620 if (UIns != BrCond && !RhsDeps.contains(UIns))
2621 return false;
2622 }
2623 return true;
2624 };
2625
2626 // Prune instructions from RHS Deps that are dependencies of unrelated
2627 // instructions. The value (SelectionDAG::MaxRecursionDepth) is fairly
2628 // arbitrary and just meant to cap the how much time we spend in the pruning
2629 // loop. Its highly unlikely to come into affect.
2630 const unsigned MaxPruneIters = SelectionDAG::MaxRecursionDepth;
2631 // Stop after a certain point. No incorrectness from including too many
2632 // instructions.
2633 for (unsigned PruneIters = 0; PruneIters < MaxPruneIters; ++PruneIters) {
2634 const Instruction *ToDrop = nullptr;
2635 for (const auto &InsPair : RhsDeps) {
2636 if (!ShouldCountInsn(InsPair.first)) {
2637 ToDrop = InsPair.first;
2638 break;
2639 }
2640 }
2641 if (ToDrop == nullptr)
2642 break;
2643 RhsDeps.erase(ToDrop);
2644 }
2645
2646 for (const auto &InsPair : RhsDeps) {
2647 // Finally accumulate latency that we can only attribute to computing the
2648 // RHS condition. Use latency because we are essentially trying to calculate
2649 // the cost of the dependency chain.
2650 // Possible TODO: We could try to estimate ILP and make this more precise.
2651 CostOfIncluding += TTI->getInstructionCost(
2652 InsPair.first, TargetTransformInfo::TCK_Latency);
2653
2654 if (CostOfIncluding > CostThresh)
2655 return false;
2656 }
2657 return true;
2658}
2659
2662 MachineBasicBlock *FBB,
2663 MachineBasicBlock *CurBB,
2664 MachineBasicBlock *SwitchBB,
2666 BranchProbability TProb,
2667 BranchProbability FProb,
2668 bool InvertCond) {
2669 // Skip over not part of the tree and remember to invert op and operands at
2670 // next level.
2671 Value *NotCond;
2672 if (match(Cond, m_OneUse(m_Not(m_Value(NotCond)))) &&
2673 InBlock(NotCond, CurBB->getBasicBlock())) {
2674 FindMergedConditions(NotCond, TBB, FBB, CurBB, SwitchBB, Opc, TProb, FProb,
2675 !InvertCond);
2676 return;
2677 }
2678
2680 const Value *BOpOp0, *BOpOp1;
2681 // Compute the effective opcode for Cond, taking into account whether it needs
2682 // to be inverted, e.g.
2683 // and (not (or A, B)), C
2684 // gets lowered as
2685 // and (and (not A, not B), C)
2687 if (BOp) {
2688 BOpc = match(BOp, m_LogicalAnd(m_Value(BOpOp0), m_Value(BOpOp1)))
2689 ? Instruction::And
2690 : (match(BOp, m_LogicalOr(m_Value(BOpOp0), m_Value(BOpOp1)))
2691 ? Instruction::Or
2693 if (InvertCond) {
2694 if (BOpc == Instruction::And)
2695 BOpc = Instruction::Or;
2696 else if (BOpc == Instruction::Or)
2697 BOpc = Instruction::And;
2698 }
2699 }
2700
2701 // If this node is not part of the or/and tree, emit it as a branch.
2702 // Note that all nodes in the tree should have same opcode.
2703 bool BOpIsInOrAndTree = BOpc && BOpc == Opc && BOp->hasOneUse();
2704 if (!BOpIsInOrAndTree || BOp->getParent() != CurBB->getBasicBlock() ||
2705 !InBlock(BOpOp0, CurBB->getBasicBlock()) ||
2706 !InBlock(BOpOp1, CurBB->getBasicBlock())) {
2707 EmitBranchForMergedCondition(Cond, TBB, FBB, CurBB, SwitchBB,
2708 TProb, FProb, InvertCond);
2709 return;
2710 }
2711
2712 // Create TmpBB after CurBB.
2713 MachineFunction::iterator BBI(CurBB);
2714 MachineFunction &MF = DAG.getMachineFunction();
2716 CurBB->getParent()->insert(++BBI, TmpBB);
2717
2718 if (Opc == Instruction::Or) {
2719 // Codegen X | Y as:
2720 // BB1:
2721 // jmp_if_X TBB
2722 // jmp TmpBB
2723 // TmpBB:
2724 // jmp_if_Y TBB
2725 // jmp FBB
2726 //
2727
2728 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
2729 // The requirement is that
2730 // TrueProb for BB1 + (FalseProb for BB1 * TrueProb for TmpBB)
2731 // = TrueProb for original BB.
2732 // Assuming the original probabilities are A and B, one choice is to set
2733 // BB1's probabilities to A/2 and A/2+B, and set TmpBB's probabilities to
2734 // A/(1+B) and 2B/(1+B). This choice assumes that
2735 // TrueProb for BB1 == FalseProb for BB1 * TrueProb for TmpBB.
2736 // Another choice is to assume TrueProb for BB1 equals to TrueProb for
2737 // TmpBB, but the math is more complicated.
2738
2739 auto NewTrueProb = TProb / 2;
2740 auto NewFalseProb = TProb / 2 + FProb;
2741 // Emit the LHS condition.
2742 FindMergedConditions(BOpOp0, TBB, TmpBB, CurBB, SwitchBB, Opc, NewTrueProb,
2743 NewFalseProb, InvertCond);
2744
2745 // Normalize A/2 and B to get A/(1+B) and 2B/(1+B).
2746 SmallVector<BranchProbability, 2> Probs{TProb / 2, FProb};
2748 // Emit the RHS condition into TmpBB.
2749 FindMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
2750 Probs[1], InvertCond);
2751 } else {
2752 assert(Opc == Instruction::And && "Unknown merge op!");
2753 // Codegen X & Y as:
2754 // BB1:
2755 // jmp_if_X TmpBB
2756 // jmp FBB
2757 // TmpBB:
2758 // jmp_if_Y TBB
2759 // jmp FBB
2760 //
2761 // This requires creation of TmpBB after CurBB.
2762
2763 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
2764 // The requirement is that
2765 // FalseProb for BB1 + (TrueProb for BB1 * FalseProb for TmpBB)
2766 // = FalseProb for original BB.
2767 // Assuming the original probabilities are A and B, one choice is to set
2768 // BB1's probabilities to A+B/2 and B/2, and set TmpBB's probabilities to
2769 // 2A/(1+A) and B/(1+A). This choice assumes that FalseProb for BB1 ==
2770 // TrueProb for BB1 * FalseProb for TmpBB.
2771
2772 auto NewTrueProb = TProb + FProb / 2;
2773 auto NewFalseProb = FProb / 2;
2774 // Emit the LHS condition.
2775 FindMergedConditions(BOpOp0, TmpBB, FBB, CurBB, SwitchBB, Opc, NewTrueProb,
2776 NewFalseProb, InvertCond);
2777
2778 // Normalize A and B/2 to get 2A/(1+A) and B/(1+A).
2779 SmallVector<BranchProbability, 2> Probs{TProb, FProb / 2};
2781 // Emit the RHS condition into TmpBB.
2782 FindMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
2783 Probs[1], InvertCond);
2784 }
2785}
2786
2787/// If the set of cases should be emitted as a series of branches, return true.
2788/// If we should emit this as a bunch of and/or'd together conditions, return
2789/// false.
2790bool
2791SelectionDAGBuilder::ShouldEmitAsBranches(const std::vector<CaseBlock> &Cases) {
2792 if (Cases.size() != 2) return true;
2793
2794 // If this is two comparisons of the same values or'd or and'd together, they
2795 // will get folded into a single comparison, so don't emit two blocks.
2796 if ((Cases[0].CmpLHS == Cases[1].CmpLHS &&
2797 Cases[0].CmpRHS == Cases[1].CmpRHS) ||
2798 (Cases[0].CmpRHS == Cases[1].CmpLHS &&
2799 Cases[0].CmpLHS == Cases[1].CmpRHS)) {
2800 return false;
2801 }
2802
2803 // Handle: (X != null) | (Y != null) --> (X|Y) != 0
2804 // Handle: (X == null) & (Y == null) --> (X|Y) == 0
2805 if (Cases[0].CmpRHS == Cases[1].CmpRHS &&
2806 Cases[0].CC == Cases[1].CC &&
2807 isa<Constant>(Cases[0].CmpRHS) &&
2808 cast<Constant>(Cases[0].CmpRHS)->isNullValue()) {
2809 if (Cases[0].CC == ISD::SETEQ && Cases[0].TrueBB == Cases[1].ThisBB)
2810 return false;
2811 if (Cases[0].CC == ISD::SETNE && Cases[0].FalseBB == Cases[1].ThisBB)
2812 return false;
2813 }
2814
2815 return true;
2816}
2817
2818void SelectionDAGBuilder::visitUncondBr(const UncondBrInst &I) {
2820
2821 MachineBasicBlock *Succ0MBB = FuncInfo.getMBB(I.getSuccessor(0));
2822
2823 // Update machine-CFG edges.
2824 BrMBB->addSuccessor(Succ0MBB);
2825
2826 // If this is not a fall-through branch or optimizations are switched off,
2827 // emit the branch.
2828 if (Succ0MBB != NextBlock(BrMBB) ||
2830 auto Br = DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other, getControlRoot(),
2831 DAG.getBasicBlock(Succ0MBB));
2832 setValue(&I, Br);
2833 DAG.setRoot(Br);
2834 }
2835}
2836
2837void SelectionDAGBuilder::visitCondBr(const CondBrInst &I) {
2838 MachineBasicBlock *BrMBB = FuncInfo.MBB;
2839
2840 MachineBasicBlock *Succ0MBB = FuncInfo.getMBB(I.getSuccessor(0));
2841
2842 // If this condition is one of the special cases we handle, do special stuff
2843 // now.
2844 const Value *CondVal = I.getCondition();
2845 MachineBasicBlock *Succ1MBB = FuncInfo.getMBB(I.getSuccessor(1));
2846
2847 // If this is a series of conditions that are or'd or and'd together, emit
2848 // this as a sequence of branches instead of setcc's with and/or operations.
2849 // As long as jumps are not expensive (exceptions for multi-use logic ops,
2850 // unpredictable branches, and vector extracts because those jumps are likely
2851 // expensive for any target), this should improve performance.
2852 // For example, instead of something like:
2853 // cmp A, B
2854 // C = seteq
2855 // cmp D, E
2856 // F = setle
2857 // or C, F
2858 // jnz foo
2859 // Emit:
2860 // cmp A, B
2861 // je foo
2862 // cmp D, E
2863 // jle foo
2864 bool IsUnpredictable = I.hasMetadata(LLVMContext::MD_unpredictable);
2865 const Instruction *BOp = dyn_cast<Instruction>(CondVal);
2866 if (!DAG.getTargetLoweringInfo().isJumpExpensive() && BOp &&
2867 BOp->hasOneUse() && !IsUnpredictable) {
2868 Value *Vec;
2869 const Value *BOp0, *BOp1;
2871 if (match(BOp, m_LogicalAnd(m_Value(BOp0), m_Value(BOp1))))
2872 Opcode = Instruction::And;
2873 else if (match(BOp, m_LogicalOr(m_Value(BOp0), m_Value(BOp1))))
2874 Opcode = Instruction::Or;
2875
2876 if (Opcode &&
2877 !(match(BOp0, m_ExtractElt(m_Value(Vec), m_Value())) &&
2878 match(BOp1, m_ExtractElt(m_Specific(Vec), m_Value()))) &&
2880 FuncInfo, I, Opcode, BOp0, BOp1,
2881 DAG.getTargetLoweringInfo().getJumpConditionMergingParams(
2882 Opcode, BOp0, BOp1, FuncInfo.Fn))) {
2883 FindMergedConditions(BOp, Succ0MBB, Succ1MBB, BrMBB, BrMBB, Opcode,
2884 getEdgeProbability(BrMBB, Succ0MBB),
2885 getEdgeProbability(BrMBB, Succ1MBB),
2886 /*InvertCond=*/false);
2887 // If the compares in later blocks need to use values not currently
2888 // exported from this block, export them now. This block should always
2889 // be the first entry.
2890 assert(SL->SwitchCases[0].ThisBB == BrMBB && "Unexpected lowering!");
2891
2892 // Allow some cases to be rejected.
2893 if (ShouldEmitAsBranches(SL->SwitchCases)) {
2894 for (unsigned i = 1, e = SL->SwitchCases.size(); i != e; ++i) {
2895 ExportFromCurrentBlock(SL->SwitchCases[i].CmpLHS);
2896 ExportFromCurrentBlock(SL->SwitchCases[i].CmpRHS);
2897 }
2898
2899 // Emit the branch for this block.
2900 visitSwitchCase(SL->SwitchCases[0], BrMBB);
2901 SL->SwitchCases.erase(SL->SwitchCases.begin());
2902 return;
2903 }
2904
2905 // Okay, we decided not to do this, remove any inserted MBB's and clear
2906 // SwitchCases.
2907 for (unsigned i = 1, e = SL->SwitchCases.size(); i != e; ++i)
2908 FuncInfo.MF->erase(SL->SwitchCases[i].ThisBB);
2909
2910 SL->SwitchCases.clear();
2911 }
2912 }
2913
2914 // Create a CaseBlock record representing this branch.
2915 CaseBlock CB(ISD::SETEQ, CondVal, ConstantInt::getTrue(*DAG.getContext()),
2916 nullptr, Succ0MBB, Succ1MBB, BrMBB, getCurSDLoc(),
2918 IsUnpredictable);
2919
2920 // Use visitSwitchCase to actually insert the fast branch sequence for this
2921 // cond branch.
2922 visitSwitchCase(CB, BrMBB);
2923}
2924
2925/// visitSwitchCase - Emits the necessary code to represent a single node in
2926/// the binary search tree resulting from lowering a switch instruction.
2928 MachineBasicBlock *SwitchBB) {
2929 SDValue Cond;
2930 SDValue CondLHS = getValue(CB.CmpLHS);
2931 SDLoc dl = CB.DL;
2932
2933 if (CB.CC == ISD::SETTRUE) {
2934 // Branch or fall through to TrueBB.
2935 addSuccessorWithProb(SwitchBB, CB.TrueBB, CB.TrueProb);
2936 SwitchBB->normalizeSuccProbs();
2937 if (CB.TrueBB != NextBlock(SwitchBB)) {
2938 DAG.setRoot(DAG.getNode(ISD::BR, dl, MVT::Other, getControlRoot(),
2939 DAG.getBasicBlock(CB.TrueBB)));
2940 }
2941 return;
2942 }
2943
2944 auto &TLI = DAG.getTargetLoweringInfo();
2945 EVT MemVT = TLI.getMemValueType(DAG.getDataLayout(), CB.CmpLHS->getType());
2946
2947 // Build the setcc now.
2948 if (!CB.CmpMHS) {
2949 // Fold "(X == true)" to X and "(X == false)" to !X to
2950 // handle common cases produced by branch lowering.
2951 if (CB.CmpRHS == ConstantInt::getTrue(*DAG.getContext()) &&
2952 CB.CC == ISD::SETEQ)
2953 Cond = CondLHS;
2954 else if (CB.CmpRHS == ConstantInt::getFalse(*DAG.getContext()) &&
2955 CB.CC == ISD::SETEQ) {
2956 SDValue True = DAG.getConstant(1, dl, CondLHS.getValueType());
2957 Cond = DAG.getNode(ISD::XOR, dl, CondLHS.getValueType(), CondLHS, True);
2958 } else {
2959 SDValue CondRHS = getValue(CB.CmpRHS);
2960
2961 // If a pointer's DAG type is larger than its memory type then the DAG
2962 // values are zero-extended. This breaks signed comparisons so truncate
2963 // back to the underlying type before doing the compare.
2964 if (CondLHS.getValueType() != MemVT) {
2965 CondLHS = DAG.getPtrExtOrTrunc(CondLHS, getCurSDLoc(), MemVT);
2966 CondRHS = DAG.getPtrExtOrTrunc(CondRHS, getCurSDLoc(), MemVT);
2967 }
2968 Cond = DAG.getSetCC(dl, MVT::i1, CondLHS, CondRHS, CB.CC);
2969 }
2970 } else {
2971 assert(CB.CC == ISD::SETLE && "Can handle only LE ranges now");
2972
2973 const APInt& Low = cast<ConstantInt>(CB.CmpLHS)->getValue();
2974 const APInt& High = cast<ConstantInt>(CB.CmpRHS)->getValue();
2975
2976 SDValue CmpOp = getValue(CB.CmpMHS);
2977 EVT VT = CmpOp.getValueType();
2978
2979 if (cast<ConstantInt>(CB.CmpLHS)->isMinValue(true)) {
2980 Cond = DAG.getSetCC(dl, MVT::i1, CmpOp, DAG.getConstant(High, dl, VT),
2981 ISD::SETLE);
2982 } else {
2983 SDValue SUB = DAG.getNode(ISD::SUB, dl,
2984 VT, CmpOp, DAG.getConstant(Low, dl, VT));
2985 Cond = DAG.getSetCC(dl, MVT::i1, SUB,
2986 DAG.getConstant(High-Low, dl, VT), ISD::SETULE);
2987 }
2988 }
2989
2990 // Update successor info
2991 addSuccessorWithProb(SwitchBB, CB.TrueBB, CB.TrueProb);
2992 // TrueBB and FalseBB are always different unless the incoming IR is
2993 // degenerate. This only happens when running llc on weird IR.
2994 if (CB.TrueBB != CB.FalseBB)
2995 addSuccessorWithProb(SwitchBB, CB.FalseBB, CB.FalseProb);
2996 SwitchBB->normalizeSuccProbs();
2997
2998 // If the lhs block is the next block, invert the condition so that we can
2999 // fall through to the lhs instead of the rhs block.
3000 if (CB.TrueBB == NextBlock(SwitchBB)) {
3001 std::swap(CB.TrueBB, CB.FalseBB);
3002 SDValue True = DAG.getConstant(1, dl, Cond.getValueType());
3003 Cond = DAG.getNode(ISD::XOR, dl, Cond.getValueType(), Cond, True);
3004 }
3005
3006 SDNodeFlags Flags;
3008 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl, MVT::Other, getControlRoot(),
3009 Cond, DAG.getBasicBlock(CB.TrueBB), Flags);
3010
3011 setValue(CurInst, BrCond);
3012
3013 // Insert the false branch. Do this even if it's a fall through branch,
3014 // this makes it easier to do DAG optimizations which require inverting
3015 // the branch condition.
3016 BrCond = DAG.getNode(ISD::BR, dl, MVT::Other, BrCond,
3017 DAG.getBasicBlock(CB.FalseBB));
3018
3019 DAG.setRoot(BrCond);
3020}
3021
3022/// visitJumpTable - Emit JumpTable node in the current MBB
3024 // Emit the code for the jump table
3025 assert(JT.SL && "Should set SDLoc for SelectionDAG!");
3026 assert(JT.Reg && "Should lower JT Header first!");
3027 EVT PTy = DAG.getTargetLoweringInfo().getJumpTableRegTy(DAG.getDataLayout());
3028 SDValue Index = DAG.getCopyFromReg(getControlRoot(), *JT.SL, JT.Reg, PTy);
3029 SDValue Table = DAG.getJumpTable(JT.JTI, PTy);
3030 SDValue BrJumpTable = DAG.getNode(ISD::BR_JT, *JT.SL, MVT::Other,
3031 Index.getValue(1), Table, Index);
3032 DAG.setRoot(BrJumpTable);
3033}
3034
3035/// visitJumpTableHeader - This function emits necessary code to produce index
3036/// in the JumpTable from switch case.
3038 JumpTableHeader &JTH,
3039 MachineBasicBlock *SwitchBB) {
3040 assert(JT.SL && "Should set SDLoc for SelectionDAG!");
3041 const SDLoc &dl = *JT.SL;
3042
3043 // Subtract the lowest switch case value from the value being switched on.
3044 SDValue SwitchOp = getValue(JTH.SValue);
3045 EVT VT = SwitchOp.getValueType();
3046 SDValue Sub = DAG.getNode(ISD::SUB, dl, VT, SwitchOp,
3047 DAG.getConstant(JTH.First, dl, VT));
3048
3049 // The SDNode we just created, which holds the value being switched on minus
3050 // the smallest case value, needs to be copied to a virtual register so it
3051 // can be used as an index into the jump table in a subsequent basic block.
3052 // This value may be smaller or larger than the target's pointer type, and
3053 // therefore require extension or truncating.
3054 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3055 SwitchOp =
3056 DAG.getZExtOrTrunc(Sub, dl, TLI.getJumpTableRegTy(DAG.getDataLayout()));
3057
3058 Register JumpTableReg =
3059 FuncInfo.CreateReg(TLI.getJumpTableRegTy(DAG.getDataLayout()));
3060 SDValue CopyTo =
3061 DAG.getCopyToReg(getControlRoot(), dl, JumpTableReg, SwitchOp);
3062 JT.Reg = JumpTableReg;
3063
3064 if (!JTH.FallthroughUnreachable) {
3065 // Emit the range check for the jump table, and branch to the default block
3066 // for the switch statement if the value being switched on exceeds the
3067 // largest case in the switch.
3068 SDValue CMP = DAG.getSetCC(
3069 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
3070 Sub.getValueType()),
3071 Sub, DAG.getConstant(JTH.Last - JTH.First, dl, VT), ISD::SETUGT);
3072
3073 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl,
3074 MVT::Other, CopyTo, CMP,
3075 DAG.getBasicBlock(JT.Default));
3076
3077 // Avoid emitting unnecessary branches to the next block.
3078 if (JT.MBB != NextBlock(SwitchBB))
3079 BrCond = DAG.getNode(ISD::BR, dl, MVT::Other, BrCond,
3080 DAG.getBasicBlock(JT.MBB));
3081
3082 DAG.setRoot(BrCond);
3083 } else {
3084 // Avoid emitting unnecessary branches to the next block.
3085 if (JT.MBB != NextBlock(SwitchBB))
3086 DAG.setRoot(DAG.getNode(ISD::BR, dl, MVT::Other, CopyTo,
3087 DAG.getBasicBlock(JT.MBB)));
3088 else
3089 DAG.setRoot(CopyTo);
3090 }
3091}
3092
3093/// Create a LOAD_STACK_GUARD node, and let it carry the target specific global
3094/// variable if there exists one.
3096 SDValue &Chain) {
3097 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3098 EVT PtrTy = TLI.getPointerTy(DAG.getDataLayout());
3099 EVT PtrMemTy = TLI.getPointerMemTy(DAG.getDataLayout());
3101 Value *Global =
3104 DAG.getMachineNode(TargetOpcode::LOAD_STACK_GUARD, DL, PtrTy, Chain);
3105 if (Global) {
3106 MachinePointerInfo MPInfo(Global);
3110 MPInfo, Flags, PtrTy.getSizeInBits() / 8, DAG.getEVTAlign(PtrTy));
3111 DAG.setNodeMemRefs(Node, {MemRef});
3112 }
3113 if (PtrTy != PtrMemTy)
3114 return DAG.getPtrExtOrTrunc(SDValue(Node, 0), DL, PtrMemTy);
3115 return SDValue(Node, 0);
3116}
3117
3118/// Codegen a new tail for a stack protector check ParentMBB which has had its
3119/// tail spliced into a stack protector check success bb.
3120///
3121/// For a high level explanation of how this fits into the stack protector
3122/// generation see the comment on the declaration of class
3123/// StackProtectorDescriptor.
3125 MachineBasicBlock *ParentBB) {
3126
3127 // First create the loads to the guard/stack slot for the comparison.
3128 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3129 auto &DL = DAG.getDataLayout();
3130 EVT PtrTy = TLI.getFrameIndexTy(DL);
3131 EVT PtrMemTy = TLI.getPointerMemTy(DL, DL.getAllocaAddrSpace());
3132
3133 MachineFrameInfo &MFI = ParentBB->getParent()->getFrameInfo();
3134 int FI = MFI.getStackProtectorIndex();
3135
3136 SDValue Guard;
3137 SDLoc dl = getCurSDLoc();
3138 SDValue StackSlotPtr = DAG.getFrameIndex(FI, PtrTy);
3139 const Module &M = *ParentBB->getParent()->getFunction().getParent();
3140 Align Align = DL.getPrefTypeAlign(
3141 PointerType::get(M.getContext(), DL.getAllocaAddrSpace()));
3142
3143 // Generate code to load the content of the guard slot.
3144 SDValue GuardVal = DAG.getLoad(
3145 PtrMemTy, dl, DAG.getEntryNode(), StackSlotPtr,
3146 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI), Align,
3148
3149 // If cookie mixing is enabled, unmix the stored GuardVal to get back the
3150 // original cookie for comparison. The prologue stored (FP - Cookie) or
3151 // (FP XOR Cookie), so we apply the same operation again to unmix:
3152 // FP - (FP - Cookie) = Cookie, or (FP XOR Cookie) XOR FP = Cookie.
3153 if (TLI.useStackGuardMixFP())
3154 GuardVal = TLI.emitStackGuardMixFP(DAG, GuardVal, dl);
3155
3156 // If we're using function-based instrumentation, call the guard check
3157 // function
3159 // Get the guard check function from the target and verify it exists since
3160 // we're using function-based instrumentation
3161 const Function *GuardCheckFn =
3162 TLI.getSSPStackGuardCheck(M, DAG.getLibcalls());
3163 assert(GuardCheckFn && "Guard check function is null");
3164
3165 // The target provides a guard check function to validate the guard value.
3166 // Generate a call to that function with the content of the guard slot as
3167 // argument.
3168 FunctionType *FnTy = GuardCheckFn->getFunctionType();
3169 assert(FnTy->getNumParams() == 1 && "Invalid function signature");
3170
3172 TargetLowering::ArgListEntry Entry(GuardVal, FnTy->getParamType(0));
3173 if (GuardCheckFn->hasParamAttribute(0, Attribute::AttrKind::InReg))
3174 Entry.IsInReg = true;
3175 Args.push_back(Entry);
3176
3179 .setChain(DAG.getEntryNode())
3180 .setCallee(GuardCheckFn->getCallingConv(), FnTy->getReturnType(),
3181 getValue(GuardCheckFn), std::move(Args));
3182
3183 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
3184 DAG.setRoot(Result.second);
3185 return;
3186 }
3187
3188 // Load the fresh guard value for comparison.
3189 // For targets that mix the cookie in LOAD_STACK_GUARD expansion, we need to
3190 // load directly without using LOAD_STACK_GUARD to avoid unwanted mixing.
3191 SDValue Chain = DAG.getEntryNode();
3192 if (TLI.useStackGuardMixFP()) {
3193 // Mixing targets: load cookie directly to avoid mixing in LOAD_STACK_GUARD
3194 if (const Value *IRGuard = TLI.getSDagStackGuard(M, DAG.getLibcalls())) {
3195 SDValue GuardPtr = getValue(IRGuard);
3196 Guard = DAG.getLoad(PtrMemTy, dl, Chain, GuardPtr,
3197 MachinePointerInfo(IRGuard, 0), Align,
3199 } else {
3200 LLVMContext &Ctx = *DAG.getContext();
3201 Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
3202 Guard = DAG.getPOISON(PtrMemTy);
3203 }
3204 } else {
3205 // Non-mixing targets: use LOAD_STACK_GUARD or direct load as usual
3206 if (TLI.useLoadStackGuardNode(M)) {
3207 Guard = getLoadStackGuard(DAG, dl, Chain);
3208 } else {
3209 if (const Value *IRGuard = TLI.getSDagStackGuard(M, DAG.getLibcalls())) {
3210 SDValue GuardPtr = getValue(IRGuard);
3211 Guard = DAG.getLoad(PtrMemTy, dl, Chain, GuardPtr,
3212 MachinePointerInfo(IRGuard, 0), Align,
3214 } else {
3215 LLVMContext &Ctx = *DAG.getContext();
3216 Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
3217 Guard = DAG.getPOISON(PtrMemTy);
3218 }
3219 }
3220 }
3221
3222 // Now both Guard (fresh cookie) and GuardVal (unmixed from stored value)
3223 // contain unmixed cookie values that can be compared directly.
3224
3225 // Perform the comparison via a getsetcc.
3226 SDValue Cmp = DAG.getSetCC(
3227 dl, TLI.getSetCCResultType(DL, *DAG.getContext(), Guard.getValueType()),
3228 Guard, GuardVal, ISD::SETNE);
3229
3230 // If the guard/stackslot do not equal, branch to failure MBB.
3231 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl, MVT::Other, getControlRoot(),
3232 Cmp, DAG.getBasicBlock(SPD.getFailureMBB()));
3233 // Otherwise branch to success MBB.
3234 SDValue Br = DAG.getNode(ISD::BR, dl,
3235 MVT::Other, BrCond,
3236 DAG.getBasicBlock(SPD.getSuccessMBB()));
3237
3238 DAG.setRoot(Br);
3239}
3240
3241/// Codegen the failure basic block for a stack protector check.
3242///
3243/// A failure stack protector machine basic block consists simply of a call to
3244/// __stack_chk_fail().
3245///
3246/// For a high level explanation of how this fits into the stack protector
3247/// generation see the comment on the declaration of class
3248/// StackProtectorDescriptor.
3251
3252 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3253 MachineBasicBlock *ParentBB = SPD.getParentMBB();
3254 const Module &M = *ParentBB->getParent()->getFunction().getParent();
3255 SDValue Chain;
3256
3257 // For -Oz builds with a guard check function, we use function-based
3258 // instrumentation. Otherwise, if we have a guard check function, we call it
3259 // in the failure block.
3260 auto *GuardCheckFn = TLI.getSSPStackGuardCheck(M, DAG.getLibcalls());
3261 if (GuardCheckFn && !SPD.shouldEmitFunctionBasedCheckStackProtector()) {
3262 // First create the loads to the guard/stack slot for the comparison.
3263 auto &DL = DAG.getDataLayout();
3264 EVT PtrTy = TLI.getFrameIndexTy(DL);
3265 EVT PtrMemTy = TLI.getPointerMemTy(DL, DL.getAllocaAddrSpace());
3266
3267 MachineFrameInfo &MFI = ParentBB->getParent()->getFrameInfo();
3268 int FI = MFI.getStackProtectorIndex();
3269
3270 SDLoc dl = getCurSDLoc();
3271 SDValue StackSlotPtr = DAG.getFrameIndex(FI, PtrTy);
3272 Align Align = DL.getPrefTypeAlign(
3273 PointerType::get(M.getContext(), DL.getAllocaAddrSpace()));
3274
3275 // Generate code to load the content of the guard slot.
3276 SDValue GuardVal = DAG.getLoad(
3277 PtrMemTy, dl, DAG.getEntryNode(), StackSlotPtr,
3278 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI), Align,
3280
3281 if (TLI.useStackGuardMixFP())
3282 GuardVal = TLI.emitStackGuardMixFP(DAG, GuardVal, dl);
3283
3284 // The target provides a guard check function to validate the guard value.
3285 // Generate a call to that function with the content of the guard slot as
3286 // argument.
3287 FunctionType *FnTy = GuardCheckFn->getFunctionType();
3288 assert(FnTy->getNumParams() == 1 && "Invalid function signature");
3289
3291 TargetLowering::ArgListEntry Entry(GuardVal, FnTy->getParamType(0));
3292 if (GuardCheckFn->hasParamAttribute(0, Attribute::AttrKind::InReg))
3293 Entry.IsInReg = true;
3294 Args.push_back(Entry);
3295
3298 .setChain(DAG.getEntryNode())
3299 .setCallee(GuardCheckFn->getCallingConv(), FnTy->getReturnType(),
3300 getValue(GuardCheckFn), std::move(Args));
3301
3302 Chain = TLI.LowerCallTo(CLI).second;
3303 } else {
3305 CallOptions.setDiscardResult(true);
3306 Chain = TLI.makeLibCall(DAG, RTLIB::STACKPROTECTOR_CHECK_FAIL, MVT::isVoid,
3307 {}, CallOptions, getCurSDLoc())
3308 .second;
3309 }
3310
3311 // Emit a trap instruction if we are required to do so.
3312 const TargetOptions &TargetOpts = DAG.getTarget().Options;
3313 if (TargetOpts.TrapUnreachable && !TargetOpts.NoTrapAfterNoreturn)
3314 Chain = DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, Chain);
3315
3316 DAG.setRoot(Chain);
3317}
3318
3319/// visitBitTestHeader - This function emits necessary code to produce value
3320/// suitable for "bit tests"
3322 MachineBasicBlock *SwitchBB) {
3323 SDLoc dl = getCurSDLoc();
3324
3325 // Subtract the minimum value.
3326 SDValue SwitchOp = getValue(B.SValue);
3327 EVT VT = SwitchOp.getValueType();
3328 SDValue RangeSub =
3329 DAG.getNode(ISD::SUB, dl, VT, SwitchOp, DAG.getConstant(B.First, dl, VT));
3330
3331 // Determine the type of the test operands.
3332 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3333 bool UsePtrType = false;
3334 if (!TLI.isTypeLegal(VT)) {
3335 UsePtrType = true;
3336 } else {
3337 for (const BitTestCase &Case : B.Cases)
3338 if (!isUIntN(VT.getSizeInBits(), Case.Mask)) {
3339 // Switch table case range are encoded into series of masks.
3340 // Just use pointer type, it's guaranteed to fit.
3341 UsePtrType = true;
3342 break;
3343 }
3344 }
3345 SDValue Sub = RangeSub;
3346 if (UsePtrType) {
3347 VT = TLI.getPointerTy(DAG.getDataLayout());
3348 Sub = DAG.getZExtOrTrunc(Sub, dl, VT);
3349 }
3350
3351 B.RegVT = VT.getSimpleVT();
3352 B.Reg = FuncInfo.CreateReg(B.RegVT);
3353 SDValue CopyTo = DAG.getCopyToReg(getControlRoot(), dl, B.Reg, Sub);
3354
3355 MachineBasicBlock* MBB = B.Cases[0].ThisBB;
3356
3357 if (!B.FallthroughUnreachable)
3358 addSuccessorWithProb(SwitchBB, B.Default, B.DefaultProb);
3359 addSuccessorWithProb(SwitchBB, MBB, B.Prob);
3360 SwitchBB->normalizeSuccProbs();
3361
3362 SDValue Root = CopyTo;
3363 if (!B.FallthroughUnreachable) {
3364 // Conditional branch to the default block.
3365 SDValue RangeCmp = DAG.getSetCC(dl,
3366 TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
3367 RangeSub.getValueType()),
3368 RangeSub, DAG.getConstant(B.Range, dl, RangeSub.getValueType()),
3369 ISD::SETUGT);
3370
3371 Root = DAG.getNode(ISD::BRCOND, dl, MVT::Other, Root, RangeCmp,
3372 DAG.getBasicBlock(B.Default));
3373 }
3374
3375 // Avoid emitting unnecessary branches to the next block.
3376 if (MBB != NextBlock(SwitchBB))
3377 Root = DAG.getNode(ISD::BR, dl, MVT::Other, Root, DAG.getBasicBlock(MBB));
3378
3379 DAG.setRoot(Root);
3380}
3381
3382/// visitBitTestCase - this function produces one "bit test"
3384 MachineBasicBlock *NextMBB,
3385 BranchProbability BranchProbToNext,
3386 Register Reg, BitTestCase &B,
3387 MachineBasicBlock *SwitchBB) {
3388 SDLoc dl = getCurSDLoc();
3389 MVT VT = BB.RegVT;
3390 SDValue ShiftOp = DAG.getCopyFromReg(getControlRoot(), dl, Reg, VT);
3391 SDValue Cmp;
3392 unsigned PopCount = llvm::popcount(B.Mask);
3393 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3394 if (PopCount == 1) {
3395 // Testing for a single bit; just compare the shift count with what it
3396 // would need to be to shift a 1 bit in that position.
3397 Cmp = DAG.getSetCC(
3398 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3399 ShiftOp, DAG.getConstant(llvm::countr_zero(B.Mask), dl, VT),
3400 ISD::SETEQ);
3401 } else if (PopCount == BB.Range) {
3402 // There is only one zero bit in the range, test for it directly.
3403 Cmp = DAG.getSetCC(
3404 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3405 ShiftOp, DAG.getConstant(llvm::countr_one(B.Mask), dl, VT), ISD::SETNE);
3406 } else {
3407 // Make desired shift
3408 SDValue SwitchVal = DAG.getNode(ISD::SHL, dl, VT,
3409 DAG.getConstant(1, dl, VT), ShiftOp);
3410
3411 // Emit bit tests and jumps
3412 SDValue AndOp = DAG.getNode(ISD::AND, dl,
3413 VT, SwitchVal, DAG.getConstant(B.Mask, dl, VT));
3414 Cmp = DAG.getSetCC(
3415 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3416 AndOp, DAG.getConstant(0, dl, VT), ISD::SETNE);
3417 }
3418
3419 // The branch probability from SwitchBB to B.TargetBB is B.ExtraProb.
3420 addSuccessorWithProb(SwitchBB, B.TargetBB, B.ExtraProb);
3421 // The branch probability from SwitchBB to NextMBB is BranchProbToNext.
3422 addSuccessorWithProb(SwitchBB, NextMBB, BranchProbToNext);
3423 // It is not guaranteed that the sum of B.ExtraProb and BranchProbToNext is
3424 // one as they are relative probabilities (and thus work more like weights),
3425 // and hence we need to normalize them to let the sum of them become one.
3426 SwitchBB->normalizeSuccProbs();
3427
3428 SDValue BrAnd = DAG.getNode(ISD::BRCOND, dl,
3429 MVT::Other, getControlRoot(),
3430 Cmp, DAG.getBasicBlock(B.TargetBB));
3431
3432 // Avoid emitting unnecessary branches to the next block.
3433 if (NextMBB != NextBlock(SwitchBB))
3434 BrAnd = DAG.getNode(ISD::BR, dl, MVT::Other, BrAnd,
3435 DAG.getBasicBlock(NextMBB));
3436
3437 DAG.setRoot(BrAnd);
3438}
3439
3440void SelectionDAGBuilder::visitInvoke(const InvokeInst &I) {
3441 MachineBasicBlock *InvokeMBB = FuncInfo.MBB;
3442
3443 // Retrieve successors. Look through artificial IR level blocks like
3444 // catchswitch for successors.
3445 MachineBasicBlock *Return = FuncInfo.getMBB(I.getSuccessor(0));
3446 const BasicBlock *EHPadBB = I.getSuccessor(1);
3447 MachineBasicBlock *EHPadMBB = FuncInfo.getMBB(EHPadBB);
3448
3449 // Deopt and ptrauth bundles are lowered in helper functions, and we don't
3450 // have to do anything here to lower funclet bundles.
3451 failForInvalidBundles(I, "invokes",
3457
3458 const Value *Callee(I.getCalledOperand());
3459 const Function *Fn = dyn_cast<Function>(Callee);
3460 if (isa<InlineAsm>(Callee))
3461 visitInlineAsm(I, EHPadBB);
3462 else if (Fn && Fn->isIntrinsic()) {
3463 switch (Fn->getIntrinsicID()) {
3464 default:
3465 llvm_unreachable("Cannot invoke this intrinsic");
3466 case Intrinsic::donothing:
3467 // Ignore invokes to @llvm.donothing: jump directly to the next BB.
3468 case Intrinsic::seh_try_begin:
3469 case Intrinsic::seh_scope_begin:
3470 case Intrinsic::seh_try_end:
3471 case Intrinsic::seh_scope_end:
3472 if (EHPadMBB)
3473 // a block referenced by EH table
3474 // so dtor-funclet not removed by opts
3475 EHPadMBB->setMachineBlockAddressTaken();
3476 break;
3477 case Intrinsic::experimental_patchpoint_void:
3478 case Intrinsic::experimental_patchpoint:
3479 visitPatchpoint(I, EHPadBB);
3480 break;
3481 case Intrinsic::experimental_gc_statepoint:
3483 break;
3484 // wasm_throw, wasm_rethrow: This is usually done in visitTargetIntrinsic,
3485 // but these intrinsics are special because they can be invoked, so we
3486 // manually lower it to a DAG node here.
3487 case Intrinsic::wasm_throw: {
3489 std::array<SDValue, 4> Ops = {
3490 getControlRoot(), // inchain for the terminator node
3491 DAG.getTargetConstant(Intrinsic::wasm_throw, getCurSDLoc(),
3493 getValue(I.getArgOperand(0)), // tag
3494 getValue(I.getArgOperand(1)) // thrown value
3495 };
3496 SDVTList VTs = DAG.getVTList(ArrayRef<EVT>({MVT::Other})); // outchain
3497 DAG.setRoot(DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops));
3498 break;
3499 }
3500 case Intrinsic::wasm_rethrow: {
3501 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3502 std::array<SDValue, 2> Ops = {
3503 getControlRoot(), // inchain for the terminator node
3504 DAG.getTargetConstant(Intrinsic::wasm_rethrow, getCurSDLoc(),
3505 TLI.getPointerTy(DAG.getDataLayout()))};
3506 SDVTList VTs = DAG.getVTList(ArrayRef<EVT>({MVT::Other})); // outchain
3507 DAG.setRoot(DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops));
3508 break;
3509 }
3510 }
3511 } else if (I.hasDeoptState()) {
3512 // Currently we do not lower any intrinsic calls with deopt operand bundles.
3513 // Eventually we will support lowering the @llvm.experimental.deoptimize
3514 // intrinsic, and right now there are no plans to support other intrinsics
3515 // with deopt state.
3516 LowerCallSiteWithDeoptBundle(&I, getValue(Callee), EHPadBB);
3517 } else if (I.countOperandBundlesOfType(LLVMContext::OB_ptrauth)) {
3519 } else {
3520 LowerCallTo(I, getValue(Callee), false, false, EHPadBB);
3521 }
3522
3523 // If the value of the invoke is used outside of its defining block, make it
3524 // available as a virtual register.
3525 // We already took care of the exported value for the statepoint instruction
3526 // during call to the LowerStatepoint.
3527 if (!isa<GCStatepointInst>(I)) {
3529 }
3530
3532 BranchProbabilityInfo *BPI = FuncInfo.BPI;
3533 BranchProbability EHPadBBProb =
3534 BPI ? BPI->getEdgeProbability(InvokeMBB->getBasicBlock(), EHPadBB)
3536 findUnwindDestinations(FuncInfo, EHPadBB, EHPadBBProb, UnwindDests);
3537
3538 // Update successor info.
3539 addSuccessorWithProb(InvokeMBB, Return);
3540 for (auto &UnwindDest : UnwindDests) {
3541 UnwindDest.first->setIsEHPad();
3542 addSuccessorWithProb(InvokeMBB, UnwindDest.first, UnwindDest.second);
3543 }
3544 InvokeMBB->normalizeSuccProbs();
3545
3546 // Drop into normal successor.
3547 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other, getControlRoot(),
3548 DAG.getBasicBlock(Return)));
3549}
3550
3551/// The intrinsics currently supported by callbr are implicit control flow
3552/// intrinsics such as amdgcn.kill.
3553/// - they should be called (no "dontcall-" attributes)
3554/// - they do not touch memory on the target (= !TLI.getTgtMemIntrinsic())
3555/// - they do not need custom argument handling (no
3556/// TLI.CollectTargetIntrinsicOperands())
3557void SelectionDAGBuilder::visitCallBrIntrinsic(const CallBrInst &I) {
3558#ifndef NDEBUG
3560 DAG.getTargetLoweringInfo().getTgtMemIntrinsic(
3561 Infos, I, DAG.getMachineFunction(), I.getIntrinsicID());
3562 assert(Infos.empty() && "Intrinsic touches memory");
3563#endif
3564
3565 auto [HasChain, OnlyLoad] = getTargetIntrinsicCallProperties(I);
3566
3568 getTargetIntrinsicOperands(I, HasChain, OnlyLoad);
3569 SDVTList VTs = getTargetIntrinsicVTList(I, HasChain);
3570
3571 // Create the node.
3572 SDValue Result =
3573 getTargetNonMemIntrinsicNode(*I.getType(), HasChain, Ops, VTs);
3574 Result = handleTargetIntrinsicRet(I, HasChain, OnlyLoad, Result);
3575
3576 setValue(&I, Result);
3577}
3578
3579void SelectionDAGBuilder::visitCallBr(const CallBrInst &I) {
3580 MachineBasicBlock *CallBrMBB = FuncInfo.MBB;
3581
3582 if (I.isInlineAsm()) {
3583 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
3584 // have to do anything here to lower funclet bundles.
3585 failForInvalidBundles(I, "callbrs",
3587 visitInlineAsm(I);
3588 } else {
3589 assert(!I.hasOperandBundles() &&
3590 "Can't have operand bundles for intrinsics");
3591 visitCallBrIntrinsic(I);
3592 }
3594
3595 // Retrieve successors.
3596 SmallPtrSet<BasicBlock *, 8> Dests;
3597 Dests.insert(I.getDefaultDest());
3598 MachineBasicBlock *Return = FuncInfo.getMBB(I.getDefaultDest());
3599
3600 // Update successor info.
3601 addSuccessorWithProb(CallBrMBB, Return, BranchProbability::getOne());
3602 // TODO: For most of the cases where there is an intrinsic callbr, we're
3603 // having exactly one indirect target, which will be unreachable. As soon as
3604 // this changes, we might need to enhance
3605 // Target->setIsInlineAsmBrIndirectTarget or add something similar for
3606 // intrinsic indirect branches.
3607 if (I.isInlineAsm()) {
3608 for (BasicBlock *Dest : I.getIndirectDests()) {
3609 MachineBasicBlock *Target = FuncInfo.getMBB(Dest);
3610 Target->setIsInlineAsmBrIndirectTarget();
3611 // If we introduce a type of asm goto statement that is permitted to use
3612 // an indirect call instruction to jump to its labels, then we should add
3613 // a call to Target->setMachineBlockAddressTaken() here, to mark the
3614 // target block as requiring a BTI.
3615
3616 Target->setLabelMustBeEmitted();
3617 // Don't add duplicate machine successors.
3618 if (Dests.insert(Dest).second)
3619 addSuccessorWithProb(CallBrMBB, Target, BranchProbability::getZero());
3620 }
3621 }
3622 CallBrMBB->normalizeSuccProbs();
3623
3624 // Drop into default successor.
3625 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(),
3626 MVT::Other, getControlRoot(),
3627 DAG.getBasicBlock(Return)));
3628}
3629
3630void SelectionDAGBuilder::visitResume(const ResumeInst &RI) {
3631 llvm_unreachable("SelectionDAGBuilder shouldn't visit resume instructions!");
3632}
3633
3634void SelectionDAGBuilder::visitLandingPad(const LandingPadInst &LP) {
3635 assert(FuncInfo.MBB->isEHPad() &&
3636 "Call to landingpad not in landing pad!");
3637
3638 // If there aren't registers to copy the values into (e.g., during SjLj
3639 // exceptions), then don't bother to create these DAG nodes.
3640 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3641 const Constant *PersonalityFn = FuncInfo.Fn->getPersonalityFn();
3643 TLI.getTargetMachine().getExceptionModel(), PersonalityFn) == 0 &&
3645 TLI.getTargetMachine().getExceptionModel(), PersonalityFn) == 0)
3646 return;
3647
3648 // If landingpad's return type is token type, we don't create DAG nodes
3649 // for its exception pointer and selector value. The extraction of exception
3650 // pointer or selector value from token type landingpads is not currently
3651 // supported.
3652 if (LP.getType()->isTokenTy())
3653 return;
3654
3655 SmallVector<EVT, 2> ValueVTs;
3656 SDLoc dl = getCurSDLoc();
3657 ComputeValueVTs(TLI, DAG.getDataLayout(), LP.getType(), ValueVTs);
3658 assert(ValueVTs.size() == 2 && "Only two-valued landingpads are supported");
3659
3660 // Get the two live-in registers as SDValues. The physregs have already been
3661 // copied into virtual registers.
3662 SDValue Ops[2];
3663 if (FuncInfo.ExceptionPointerVirtReg) {
3664 Ops[0] = DAG.getZExtOrTrunc(
3665 DAG.getCopyFromReg(DAG.getEntryNode(), dl,
3666 FuncInfo.ExceptionPointerVirtReg,
3667 TLI.getPointerTy(DAG.getDataLayout())),
3668 dl, ValueVTs[0]);
3669 } else {
3670 Ops[0] = DAG.getConstant(0, dl, TLI.getPointerTy(DAG.getDataLayout()));
3671 }
3672 Ops[1] = DAG.getZExtOrTrunc(
3673 DAG.getCopyFromReg(DAG.getEntryNode(), dl,
3674 FuncInfo.ExceptionSelectorVirtReg,
3675 TLI.getPointerTy(DAG.getDataLayout())),
3676 dl, ValueVTs[1]);
3677
3678 // Merge into one.
3679 SDValue Res = DAG.getNode(ISD::MERGE_VALUES, dl,
3680 DAG.getVTList(ValueVTs), Ops);
3681 setValue(&LP, Res);
3682}
3683
3686 // Update JTCases.
3687 for (JumpTableBlock &JTB : SL->JTCases)
3688 if (JTB.first.HeaderBB == First)
3689 JTB.first.HeaderBB = Last;
3690
3691 // Update BitTestCases.
3692 for (BitTestBlock &BTB : SL->BitTestCases)
3693 if (BTB.Parent == First)
3694 BTB.Parent = Last;
3695}
3696
3697void SelectionDAGBuilder::visitIndirectBr(const IndirectBrInst &I) {
3698 MachineBasicBlock *IndirectBrMBB = FuncInfo.MBB;
3699
3700 // Update machine-CFG edges with unique successors.
3702 for (unsigned i = 0, e = I.getNumSuccessors(); i != e; ++i) {
3703 BasicBlock *BB = I.getSuccessor(i);
3704 bool Inserted = Done.insert(BB).second;
3705 if (!Inserted)
3706 continue;
3707
3708 MachineBasicBlock *Succ = FuncInfo.getMBB(BB);
3709 addSuccessorWithProb(IndirectBrMBB, Succ);
3710 }
3711 IndirectBrMBB->normalizeSuccProbs();
3712
3714 MVT::Other, getControlRoot(),
3715 getValue(I.getAddress())));
3716}
3717
3718void SelectionDAGBuilder::visitUnreachable(const UnreachableInst &I) {
3719 if (!I.shouldLowerToTrap(DAG.getTarget().Options.TrapUnreachable,
3720 DAG.getTarget().Options.NoTrapAfterNoreturn))
3721 return;
3722
3723 DAG.setRoot(DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, DAG.getRoot()));
3724}
3725
3726void SelectionDAGBuilder::visitUnary(const User &I, unsigned Opcode) {
3727 SDNodeFlags Flags;
3728 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3729 Flags.copyFMF(*FPOp);
3730
3731 SDValue Op = getValue(I.getOperand(0));
3732 SDValue UnNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op.getValueType(),
3733 Op, Flags);
3734 setValue(&I, UnNodeValue);
3735}
3736
3737void SelectionDAGBuilder::visitBinary(const User &I, unsigned Opcode) {
3738 SDNodeFlags Flags;
3739 if (auto *OFBinOp = dyn_cast<OverflowingBinaryOperator>(&I)) {
3740 Flags.setNoSignedWrap(OFBinOp->hasNoSignedWrap());
3741 Flags.setNoUnsignedWrap(OFBinOp->hasNoUnsignedWrap());
3742 }
3743 if (auto *ExactOp = dyn_cast<PossiblyExactOperator>(&I))
3744 Flags.setExact(ExactOp->isExact());
3745 if (auto *DisjointOp = dyn_cast<PossiblyDisjointInst>(&I))
3746 Flags.setDisjoint(DisjointOp->isDisjoint());
3747 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3748 Flags.copyFMF(*FPOp);
3749
3750 SDValue Op1 = getValue(I.getOperand(0));
3751 SDValue Op2 = getValue(I.getOperand(1));
3752 SDValue BinNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(),
3753 Op1, Op2, Flags);
3754 setValue(&I, BinNodeValue);
3755}
3756
3757void SelectionDAGBuilder::visitShift(const User &I, unsigned Opcode) {
3758 SDValue Op1 = getValue(I.getOperand(0));
3759 SDValue Op2 = getValue(I.getOperand(1));
3760
3761 EVT ShiftTy = DAG.getTargetLoweringInfo().getShiftAmountTy(
3762 Op1.getValueType(), DAG.getDataLayout());
3763
3764 // Coerce the shift amount to the right type if we can. This exposes the
3765 // truncate or zext to optimization early.
3766 if (!I.getType()->isVectorTy() && Op2.getValueType() != ShiftTy) {
3768 "Unexpected shift type");
3769 Op2 = DAG.getZExtOrTrunc(Op2, getCurSDLoc(), ShiftTy);
3770 }
3771
3772 bool nuw = false;
3773 bool nsw = false;
3774 bool exact = false;
3775
3776 if (Opcode == ISD::SRL || Opcode == ISD::SRA || Opcode == ISD::SHL) {
3777
3778 if (const OverflowingBinaryOperator *OFBinOp =
3780 nuw = OFBinOp->hasNoUnsignedWrap();
3781 nsw = OFBinOp->hasNoSignedWrap();
3782 }
3783 if (const PossiblyExactOperator *ExactOp =
3785 exact = ExactOp->isExact();
3786 }
3787 SDNodeFlags Flags;
3788 Flags.setExact(exact);
3789 Flags.setNoSignedWrap(nsw);
3790 Flags.setNoUnsignedWrap(nuw);
3791 SDValue Res = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(), Op1, Op2,
3792 Flags);
3793 setValue(&I, Res);
3794}
3795
3796void SelectionDAGBuilder::visitSDiv(const User &I) {
3797 SDValue Op1 = getValue(I.getOperand(0));
3798 SDValue Op2 = getValue(I.getOperand(1));
3799
3800 SDNodeFlags Flags;
3801 Flags.setExact(isa<PossiblyExactOperator>(&I) &&
3802 cast<PossiblyExactOperator>(&I)->isExact());
3803 setValue(&I, DAG.getNode(ISD::SDIV, getCurSDLoc(), Op1.getValueType(), Op1,
3804 Op2, Flags));
3805}
3806
3807void SelectionDAGBuilder::visitICmp(const ICmpInst &I) {
3808 ICmpInst::Predicate predicate = I.getPredicate();
3809 SDValue Op1 = getValue(I.getOperand(0));
3810 SDValue Op2 = getValue(I.getOperand(1));
3811 ISD::CondCode Opcode = getICmpCondCode(predicate);
3812
3813 auto &TLI = DAG.getTargetLoweringInfo();
3814 EVT MemVT =
3815 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
3816
3817 // If a pointer's DAG type is larger than its memory type then the DAG values
3818 // are zero-extended. This breaks signed comparisons so truncate back to the
3819 // underlying type before doing the compare.
3820 if (Op1.getValueType() != MemVT) {
3821 Op1 = DAG.getPtrExtOrTrunc(Op1, getCurSDLoc(), MemVT);
3822 Op2 = DAG.getPtrExtOrTrunc(Op2, getCurSDLoc(), MemVT);
3823 }
3824
3825 SDNodeFlags Flags;
3826 Flags.setSameSign(I.hasSameSign());
3827
3828 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3829 I.getType());
3830 setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Opcode,
3831 /*Chain=*/{}, /*IsSignaling=*/false, Flags));
3832}
3833
3834void SelectionDAGBuilder::visitFCmp(const FCmpInst &I) {
3835 FCmpInst::Predicate predicate = I.getPredicate();
3836 SDValue Op1 = getValue(I.getOperand(0));
3837 SDValue Op2 = getValue(I.getOperand(1));
3838
3839 ISD::CondCode Condition = getFCmpCondCode(predicate);
3840 auto *FPMO = cast<FPMathOperator>(&I);
3841 if (FPMO->hasNoNaNs() ||
3842 (DAG.isKnownNeverNaN(Op1) && DAG.isKnownNeverNaN(Op2)))
3843 Condition = getFCmpCodeWithoutNaN(Condition);
3844
3845 SDNodeFlags Flags;
3846 Flags.copyFMF(*FPMO);
3847
3848 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3849 I.getType());
3850 setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Condition,
3851 /*Chain=*/{}, /*IsSignaling=*/false, Flags));
3852}
3853
3854// Check if the condition of the select has one use or two users that are both
3855// selects with the same condition.
3856static bool hasOnlySelectUsers(const Value *Cond) {
3857 return llvm::all_of(Cond->users(), [](const Value *V) {
3858 return isa<SelectInst>(V);
3859 });
3860}
3861
3862void SelectionDAGBuilder::visitSelect(const User &I) {
3863 SmallVector<EVT, 4> ValueVTs;
3864 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
3865 ValueVTs);
3866 unsigned NumValues = ValueVTs.size();
3867 if (NumValues == 0) return;
3868
3870 SDValue Cond = getValue(I.getOperand(0));
3871 SDValue LHSVal = getValue(I.getOperand(1));
3872 SDValue RHSVal = getValue(I.getOperand(2));
3873 SmallVector<SDValue, 1> BaseOps(1, Cond);
3875 Cond.getValueType().isVector() ? ISD::VSELECT : ISD::SELECT;
3876
3877 bool IsUnaryAbs = false;
3878 bool Negate = false;
3879
3880 SDNodeFlags Flags;
3881 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3882 Flags.copyFMF(*FPOp);
3883
3884 Flags.setUnpredictable(
3885 cast<SelectInst>(I).getMetadata(LLVMContext::MD_unpredictable));
3886
3887 // Min/max matching is only viable if all output VTs are the same.
3888 if (all_equal(ValueVTs)) {
3889 EVT VT = ValueVTs[0];
3890 LLVMContext &Ctx = *DAG.getContext();
3891 auto &TLI = DAG.getTargetLoweringInfo();
3892
3893 // We care about the legality of the operation after it has been type
3894 // legalized.
3895 while (TLI.getTypeAction(Ctx, VT) != TargetLoweringBase::TypeLegal)
3896 VT = TLI.getTypeToTransformTo(Ctx, VT);
3897
3898 // If the vselect is legal, assume we want to leave this as a vector setcc +
3899 // vselect. Otherwise, if this is going to be scalarized, we want to see if
3900 // min/max is legal on the scalar type.
3901 bool UseScalarMinMax = VT.isVector() &&
3903
3904 // ValueTracking's select pattern matching does not account for -0.0,
3905 // so we can't lower to FMINIMUM/FMAXIMUM because those nodes specify that
3906 // -0.0 is less than +0.0.
3907 const Value *LHS, *RHS;
3908 auto SPR = matchSelectPattern(&I, LHS, RHS);
3910 switch (SPR.Flavor) {
3911 case SPF_UMAX: Opc = ISD::UMAX; break;
3912 case SPF_UMIN: Opc = ISD::UMIN; break;
3913 case SPF_SMAX: Opc = ISD::SMAX; break;
3914 case SPF_SMIN: Opc = ISD::SMIN; break;
3915 case SPF_FMINNUM:
3917 break;
3918
3919 switch (SPR.NaNBehavior) {
3920 case SPNB_NA: llvm_unreachable("No NaN behavior for FP op?");
3921 case SPNB_RETURNS_ANY:
3922 case SPNB_RETURNS_NAN:
3923 break;
3924 case SPNB_RETURNS_OTHER:
3926 Flags.setNoSignedZeros(true);
3927 break;
3928 }
3929 break;
3930 case SPF_FMAXNUM:
3932 break;
3933
3934 switch (SPR.NaNBehavior) {
3935 case SPNB_NA: llvm_unreachable("No NaN behavior for FP op?");
3936 case SPNB_RETURNS_NAN:
3937 case SPNB_RETURNS_ANY:
3938 break;
3939 case SPNB_RETURNS_OTHER:
3941 Flags.setNoSignedZeros(true);
3942 break;
3943 }
3944 break;
3945 case SPF_NABS:
3946 Negate = true;
3947 [[fallthrough]];
3948 case SPF_ABS:
3949 IsUnaryAbs = true;
3950 Opc = ISD::ABS;
3951 break;
3952 default: break;
3953 }
3954
3955 if (!IsUnaryAbs && Opc != ISD::DELETED_NODE &&
3956 (TLI.isOperationLegalOrCustom(Opc, VT) ||
3957 (UseScalarMinMax &&
3959 // If the underlying comparison instruction is used by any other
3960 // instruction, the consumed instructions won't be destroyed, so it is
3961 // not profitable to convert to a min/max.
3963 OpCode = Opc;
3964 LHSVal = getValue(LHS);
3965 RHSVal = getValue(RHS);
3966 BaseOps.clear();
3967 }
3968
3969 if (IsUnaryAbs) {
3970 OpCode = Opc;
3971 LHSVal = getValue(LHS);
3972 BaseOps.clear();
3973 }
3974 }
3975
3976 if (IsUnaryAbs) {
3977 for (unsigned i = 0; i != NumValues; ++i) {
3978 SDLoc dl = getCurSDLoc();
3979 EVT VT = LHSVal.getNode()->getValueType(LHSVal.getResNo() + i);
3980 Values[i] =
3981 DAG.getNode(OpCode, dl, VT, LHSVal.getValue(LHSVal.getResNo() + i));
3982 if (Negate)
3983 Values[i] = DAG.getNegative(Values[i], dl, VT);
3984 }
3985 } else {
3986 for (unsigned i = 0; i != NumValues; ++i) {
3987 SmallVector<SDValue, 3> Ops(BaseOps.begin(), BaseOps.end());
3988 Ops.push_back(SDValue(LHSVal.getNode(), LHSVal.getResNo() + i));
3989 Ops.push_back(SDValue(RHSVal.getNode(), RHSVal.getResNo() + i));
3990 Values[i] = DAG.getNode(
3991 OpCode, getCurSDLoc(),
3992 LHSVal.getNode()->getValueType(LHSVal.getResNo() + i), Ops, Flags);
3993 }
3994 }
3995
3997 DAG.getVTList(ValueVTs), Values));
3998}
3999
4000void SelectionDAGBuilder::visitTrunc(const User &I) {
4001 // TruncInst cannot be a no-op cast because sizeof(src) > sizeof(dest).
4002 SDValue N = getValue(I.getOperand(0));
4003 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4004 I.getType());
4005 SDNodeFlags Flags;
4006 if (auto *Trunc = dyn_cast<TruncInst>(&I)) {
4007 Flags.setNoSignedWrap(Trunc->hasNoSignedWrap());
4008 Flags.setNoUnsignedWrap(Trunc->hasNoUnsignedWrap());
4009 }
4010
4011 setValue(&I, DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), DestVT, N, Flags));
4012}
4013
4014void SelectionDAGBuilder::visitZExt(const User &I) {
4015 // ZExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
4016 // ZExt also can't be a cast to bool for same reason. So, nothing much to do
4017 SDValue N = getValue(I.getOperand(0));
4018 auto &TLI = DAG.getTargetLoweringInfo();
4019 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4020
4021 SDNodeFlags Flags;
4022 if (auto *PNI = dyn_cast<PossiblyNonNegInst>(&I))
4023 Flags.setNonNeg(PNI->hasNonNeg());
4024
4025 // Eagerly use nonneg information to canonicalize towards sign_extend if
4026 // that is the target's preference.
4027 // TODO: Let the target do this later.
4028 if (Flags.hasNonNeg() &&
4029 TLI.isSExtCheaperThanZExt(N.getValueType(), DestVT)) {
4030 setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));
4031 return;
4032 }
4033
4034 setValue(&I, DAG.getNode(ISD::ZERO_EXTEND, getCurSDLoc(), DestVT, N, Flags));
4035}
4036
4037void SelectionDAGBuilder::visitSExt(const User &I) {
4038 // SExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
4039 // SExt also can't be a cast to bool for same reason. So, nothing much to do
4040 SDValue N = getValue(I.getOperand(0));
4041 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4042 I.getType());
4043 setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));
4044}
4045
4046void SelectionDAGBuilder::visitFPTrunc(const User &I) {
4047 // FPTrunc is never a no-op cast, no need to check
4048 SDValue N = getValue(I.getOperand(0));
4049 SDLoc dl = getCurSDLoc();
4050 SDNodeFlags Flags;
4051 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
4052 Flags.copyFMF(*FPOp);
4053 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4054 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4055 setValue(&I, DAG.getNode(ISD::FP_ROUND, dl, DestVT, N,
4056 DAG.getTargetConstant(
4057 0, dl, TLI.getPointerTy(DAG.getDataLayout())),
4058 Flags));
4059}
4060
4061void SelectionDAGBuilder::visitFPExt(const User &I) {
4062 // FPExt is never a no-op cast, no need to check
4063 SDValue N = getValue(I.getOperand(0));
4064 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4065 I.getType());
4066 SDNodeFlags Flags;
4067 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
4068 Flags.copyFMF(*FPOp);
4069 setValue(&I, DAG.getNode(ISD::FP_EXTEND, getCurSDLoc(), DestVT, N, Flags));
4070}
4071
4072void SelectionDAGBuilder::visitFPToUI(const User &I) {
4073 // FPToUI is never a no-op cast, no need to check
4074 SDValue N = getValue(I.getOperand(0));
4075 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4076 I.getType());
4077 setValue(&I, DAG.getNode(ISD::FP_TO_UINT, getCurSDLoc(), DestVT, N));
4078}
4079
4080void SelectionDAGBuilder::visitFPToSI(const User &I) {
4081 // FPToSI is never a no-op cast, no need to check
4082 SDValue N = getValue(I.getOperand(0));
4083 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4084 I.getType());
4085 setValue(&I, DAG.getNode(ISD::FP_TO_SINT, getCurSDLoc(), DestVT, N));
4086}
4087
4088void SelectionDAGBuilder::visitUIToFP(const User &I) {
4089 // UIToFP is never a no-op cast, no need to check
4090 SDValue N = getValue(I.getOperand(0));
4091 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4092 I.getType());
4093 SDNodeFlags Flags;
4094 Flags.setNonNeg(cast<PossiblyNonNegInst>(&I)->hasNonNeg());
4095 Flags.copyFMF(*cast<FPMathOperator>(&I));
4096
4097 setValue(&I, DAG.getNode(ISD::UINT_TO_FP, getCurSDLoc(), DestVT, N, Flags));
4098}
4099
4100void SelectionDAGBuilder::visitSIToFP(const User &I) {
4101 // SIToFP is never a no-op cast, no need to check
4102 SDValue N = getValue(I.getOperand(0));
4103 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4104 I.getType());
4105 SDNodeFlags Flags;
4106 Flags.copyFMF(*cast<FPMathOperator>(&I));
4107
4108 setValue(&I, DAG.getNode(ISD::SINT_TO_FP, getCurSDLoc(), DestVT, N, Flags));
4109}
4110
4111void SelectionDAGBuilder::visitPtrToAddr(const User &I) {
4112 SDValue N = getValue(I.getOperand(0));
4113 // By definition the type of the ptrtoaddr must be equal to the address type.
4114 const auto &TLI = DAG.getTargetLoweringInfo();
4115 EVT AddrVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4116 // The address width must be smaller or equal to the pointer representation
4117 // width, so we lower ptrtoaddr as a truncate (possibly folded to a no-op).
4118 N = DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), AddrVT, N);
4119 setValue(&I, N);
4120}
4121
4122void SelectionDAGBuilder::visitPtrToInt(const User &I) {
4123 // What to do depends on the size of the integer and the size of the pointer.
4124 // We can either truncate, zero extend, or no-op, accordingly.
4125 SDValue N = getValue(I.getOperand(0));
4126 auto &TLI = DAG.getTargetLoweringInfo();
4127 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4128 I.getType());
4129 EVT PtrMemVT =
4130 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
4131 N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), PtrMemVT);
4132 N = DAG.getZExtOrTrunc(N, getCurSDLoc(), DestVT);
4133 setValue(&I, N);
4134}
4135
4136void SelectionDAGBuilder::visitIntToPtr(const User &I) {
4137 // What to do depends on the size of the integer and the size of the pointer.
4138 // We can either truncate, zero extend, or no-op, accordingly.
4139 SDValue N = getValue(I.getOperand(0));
4140 auto &TLI = DAG.getTargetLoweringInfo();
4141 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4142 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(), I.getType());
4143 N = DAG.getZExtOrTrunc(N, getCurSDLoc(), PtrMemVT);
4144 N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), DestVT);
4145 setValue(&I, N);
4146}
4147
4148void SelectionDAGBuilder::visitBitCast(const User &I) {
4149 SDValue N = getValue(I.getOperand(0));
4150 SDLoc dl = getCurSDLoc();
4151 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4152 I.getType());
4153
4154 // BitCast assures us that source and destination are the same size so this is
4155 // either a BITCAST or a no-op.
4156 if (DestVT != N.getValueType())
4157 setValue(&I, DAG.getNode(ISD::BITCAST, dl,
4158 DestVT, N)); // convert types.
4159 // Check if the original LLVM IR Operand was a ConstantInt, because getValue()
4160 // might fold any kind of constant expression to an integer constant and that
4161 // is not what we are looking for. Only recognize a bitcast of a genuine
4162 // constant integer as an opaque constant.
4163 else if(ConstantInt *C = dyn_cast<ConstantInt>(I.getOperand(0)))
4164 setValue(&I, DAG.getConstant(C->getValue(), dl, DestVT, /*isTarget=*/false,
4165 /*isOpaque*/true));
4166 else
4167 setValue(&I, N); // noop cast.
4168}
4169
4170void SelectionDAGBuilder::visitAddrSpaceCast(const User &I) {
4171 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4172 const Value *SV = I.getOperand(0);
4173 SDValue N = getValue(SV);
4174 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4175
4176 unsigned SrcAS = SV->getType()->getPointerAddressSpace();
4177 unsigned DestAS = I.getType()->getPointerAddressSpace();
4178
4179 if (!TM.isNoopAddrSpaceCast(SrcAS, DestAS))
4180 N = DAG.getAddrSpaceCast(getCurSDLoc(), DestVT, N, SrcAS, DestAS);
4181
4182 setValue(&I, N);
4183}
4184
4185void SelectionDAGBuilder::visitInsertElement(const User &I) {
4186 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4187 SDValue InVec = getValue(I.getOperand(0));
4188 SDValue InVal = getValue(I.getOperand(1));
4189 SDValue InIdx = DAG.getZExtOrTrunc(getValue(I.getOperand(2)), getCurSDLoc(),
4190 TLI.getVectorIdxTy(DAG.getDataLayout()));
4192 TLI.getValueType(DAG.getDataLayout(), I.getType()),
4193 InVec, InVal, InIdx));
4194}
4195
4196void SelectionDAGBuilder::visitExtractElement(const User &I) {
4197 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4198 SDValue InVec = getValue(I.getOperand(0));
4199 SDValue InIdx = DAG.getZExtOrTrunc(getValue(I.getOperand(1)), getCurSDLoc(),
4200 TLI.getVectorIdxTy(DAG.getDataLayout()));
4202 TLI.getValueType(DAG.getDataLayout(), I.getType()),
4203 InVec, InIdx));
4204}
4205
4206void SelectionDAGBuilder::visitShuffleVector(const User &I) {
4207 SDValue Src1 = getValue(I.getOperand(0));
4208 SDValue Src2 = getValue(I.getOperand(1));
4209 ArrayRef<int> Mask;
4210 if (auto *SVI = dyn_cast<ShuffleVectorInst>(&I))
4211 Mask = SVI->getShuffleMask();
4212 else
4213 Mask = cast<ConstantExpr>(I).getShuffleMask();
4214 SDLoc DL = getCurSDLoc();
4215 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4216 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4217 EVT SrcVT = Src1.getValueType();
4218
4219 if (all_of(Mask, equal_to(0)) && VT.isScalableVector()) {
4220 // Canonical splat form of first element of first input vector.
4221 SDValue FirstElt =
4222 DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, SrcVT.getScalarType(), Src1,
4223 DAG.getVectorIdxConstant(0, DL));
4224 setValue(&I, DAG.getNode(ISD::SPLAT_VECTOR, DL, VT, FirstElt));
4225 return;
4226 }
4227
4228 // For now, we only handle splats for scalable vectors.
4229 // The DAGCombiner will perform a BUILD_VECTOR -> SPLAT_VECTOR transformation
4230 // for targets that support a SPLAT_VECTOR for non-scalable vector types.
4231 assert(!VT.isScalableVector() && "Unsupported scalable vector shuffle");
4232
4233 unsigned SrcNumElts = SrcVT.getVectorNumElements();
4234 unsigned MaskNumElts = Mask.size();
4235
4236 if (SrcNumElts == MaskNumElts) {
4237 setValue(&I, DAG.getVectorShuffle(VT, DL, Src1, Src2, Mask));
4238 return;
4239 }
4240
4241 // Normalize the shuffle vector since mask and vector length don't match.
4242 if (SrcNumElts < MaskNumElts) {
4243 // Mask is longer than the source vectors. We can use concatenate vector to
4244 // make the mask and vectors lengths match.
4245
4246 if (MaskNumElts % SrcNumElts == 0) {
4247 // Mask length is a multiple of the source vector length.
4248 // Check if the shuffle is some kind of concatenation of the input
4249 // vectors.
4250 unsigned NumConcat = MaskNumElts / SrcNumElts;
4251 bool IsConcat = true;
4252 SmallVector<int, 8> ConcatSrcs(NumConcat, -1);
4253 for (unsigned i = 0; i != MaskNumElts; ++i) {
4254 int Idx = Mask[i];
4255 if (Idx < 0)
4256 continue;
4257 // Ensure the indices in each SrcVT sized piece are sequential and that
4258 // the same source is used for the whole piece.
4259 if ((Idx % SrcNumElts != (i % SrcNumElts)) ||
4260 (ConcatSrcs[i / SrcNumElts] >= 0 &&
4261 ConcatSrcs[i / SrcNumElts] != (int)(Idx / SrcNumElts))) {
4262 IsConcat = false;
4263 break;
4264 }
4265 // Remember which source this index came from.
4266 ConcatSrcs[i / SrcNumElts] = Idx / SrcNumElts;
4267 }
4268
4269 // The shuffle is concatenating multiple vectors together. Just emit
4270 // a CONCAT_VECTORS operation.
4271 if (IsConcat) {
4272 SmallVector<SDValue, 8> ConcatOps;
4273 for (auto Src : ConcatSrcs) {
4274 if (Src < 0)
4275 ConcatOps.push_back(DAG.getUNDEF(SrcVT));
4276 else if (Src == 0)
4277 ConcatOps.push_back(Src1);
4278 else
4279 ConcatOps.push_back(Src2);
4280 }
4281 setValue(&I, DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, ConcatOps));
4282 return;
4283 }
4284 }
4285
4286 unsigned PaddedMaskNumElts = alignTo(MaskNumElts, SrcNumElts);
4287 unsigned NumConcat = PaddedMaskNumElts / SrcNumElts;
4288 EVT PaddedVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(),
4289 PaddedMaskNumElts);
4290
4291 // Pad both vectors with undefs to make them the same length as the mask.
4292 SDValue UndefVal = DAG.getUNDEF(SrcVT);
4293
4294 SmallVector<SDValue, 8> MOps1(NumConcat, UndefVal);
4295 SmallVector<SDValue, 8> MOps2(NumConcat, UndefVal);
4296 MOps1[0] = Src1;
4297 MOps2[0] = Src2;
4298
4299 Src1 = DAG.getNode(ISD::CONCAT_VECTORS, DL, PaddedVT, MOps1);
4300 Src2 = DAG.getNode(ISD::CONCAT_VECTORS, DL, PaddedVT, MOps2);
4301
4302 // Readjust mask for new input vector length.
4303 SmallVector<int, 8> MappedOps(PaddedMaskNumElts, -1);
4304 for (unsigned i = 0; i != MaskNumElts; ++i) {
4305 int Idx = Mask[i];
4306 if (Idx >= (int)SrcNumElts)
4307 Idx -= SrcNumElts - PaddedMaskNumElts;
4308 MappedOps[i] = Idx;
4309 }
4310
4311 SDValue Result = DAG.getVectorShuffle(PaddedVT, DL, Src1, Src2, MappedOps);
4312
4313 // If the concatenated vector was padded, extract a subvector with the
4314 // correct number of elements.
4315 if (MaskNumElts != PaddedMaskNumElts)
4316 Result = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Result,
4317 DAG.getVectorIdxConstant(0, DL));
4318
4319 setValue(&I, Result);
4320 return;
4321 }
4322
4323 assert(SrcNumElts > MaskNumElts);
4324
4325 // Analyze the access pattern of the vector to see if we can extract
4326 // two subvectors and do the shuffle.
4327 int StartIdx[2] = {-1, -1}; // StartIdx to extract from
4328 bool CanExtract = true;
4329 for (int Idx : Mask) {
4330 unsigned Input = 0;
4331 if (Idx < 0)
4332 continue;
4333
4334 if (Idx >= (int)SrcNumElts) {
4335 Input = 1;
4336 Idx -= SrcNumElts;
4337 }
4338
4339 // If all the indices come from the same MaskNumElts sized portion of
4340 // the sources we can use extract. Also make sure the extract wouldn't
4341 // extract past the end of the source.
4342 int NewStartIdx = alignDown(Idx, MaskNumElts);
4343 if (NewStartIdx + MaskNumElts > SrcNumElts ||
4344 (StartIdx[Input] >= 0 && StartIdx[Input] != NewStartIdx))
4345 CanExtract = false;
4346 // Make sure we always update StartIdx as we use it to track if all
4347 // elements are undef.
4348 StartIdx[Input] = NewStartIdx;
4349 }
4350
4351 if (StartIdx[0] < 0 && StartIdx[1] < 0) {
4352 setValue(&I, DAG.getUNDEF(VT)); // Vectors are not used.
4353 return;
4354 }
4355 if (CanExtract) {
4356 // Extract appropriate subvector and generate a vector shuffle
4357 for (unsigned Input = 0; Input < 2; ++Input) {
4358 SDValue &Src = Input == 0 ? Src1 : Src2;
4359 if (StartIdx[Input] < 0)
4360 Src = DAG.getUNDEF(VT);
4361 else {
4362 Src = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Src,
4363 DAG.getVectorIdxConstant(StartIdx[Input], DL));
4364 }
4365 }
4366
4367 // Calculate new mask.
4368 SmallVector<int, 8> MappedOps(Mask);
4369 for (int &Idx : MappedOps) {
4370 if (Idx >= (int)SrcNumElts)
4371 Idx -= SrcNumElts + StartIdx[1] - MaskNumElts;
4372 else if (Idx >= 0)
4373 Idx -= StartIdx[0];
4374 }
4375
4376 setValue(&I, DAG.getVectorShuffle(VT, DL, Src1, Src2, MappedOps));
4377 return;
4378 }
4379
4380 // We can't use either concat vectors or extract subvectors so fall back to
4381 // replacing the shuffle with extract and build vector.
4382 // to insert and build vector.
4383 EVT EltVT = VT.getVectorElementType();
4385 for (int Idx : Mask) {
4386 SDValue Res;
4387
4388 if (Idx < 0) {
4389 Res = DAG.getUNDEF(EltVT);
4390 } else {
4391 SDValue &Src = Idx < (int)SrcNumElts ? Src1 : Src2;
4392 if (Idx >= (int)SrcNumElts) Idx -= SrcNumElts;
4393
4394 Res = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Src,
4395 DAG.getVectorIdxConstant(Idx, DL));
4396 }
4397
4398 Ops.push_back(Res);
4399 }
4400
4401 setValue(&I, DAG.getBuildVector(VT, DL, Ops));
4402}
4403
4404void SelectionDAGBuilder::visitInsertValue(const InsertValueInst &I) {
4405 ArrayRef<unsigned> Indices = I.getIndices();
4406 const Value *Op0 = I.getOperand(0);
4407 const Value *Op1 = I.getOperand(1);
4408 Type *AggTy = I.getType();
4409 Type *ValTy = Op1->getType();
4410 bool IntoUndef = isa<UndefValue>(Op0);
4411 bool FromUndef = isa<UndefValue>(Op1);
4412
4413 unsigned LinearIndex = ComputeLinearIndex(AggTy, Indices);
4414
4415 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4416 SmallVector<EVT, 4> AggValueVTs;
4417 ComputeValueVTs(TLI, DAG.getDataLayout(), AggTy, AggValueVTs);
4418 SmallVector<EVT, 4> ValValueVTs;
4419 ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);
4420
4421 unsigned NumAggValues = AggValueVTs.size();
4422 unsigned NumValValues = ValValueVTs.size();
4423 SmallVector<SDValue, 4> Values(NumAggValues);
4424
4425 // Ignore an insertvalue that produces an empty object
4426 if (!NumAggValues) {
4427 setValue(&I, DAG.getUNDEF(MVT(MVT::Other)));
4428 return;
4429 }
4430
4431 SDValue Agg = getValue(Op0);
4432 unsigned i = 0;
4433 // Copy the beginning value(s) from the original aggregate.
4434 for (; i != LinearIndex; ++i)
4435 Values[i] = IntoUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4436 SDValue(Agg.getNode(), Agg.getResNo() + i);
4437 // Copy values from the inserted value(s).
4438 if (NumValValues) {
4439 SDValue Val = getValue(Op1);
4440 for (; i != LinearIndex + NumValValues; ++i)
4441 Values[i] = FromUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4442 SDValue(Val.getNode(), Val.getResNo() + i - LinearIndex);
4443 }
4444 // Copy remaining value(s) from the original aggregate.
4445 for (; i != NumAggValues; ++i)
4446 Values[i] = IntoUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4447 SDValue(Agg.getNode(), Agg.getResNo() + i);
4448
4450 DAG.getVTList(AggValueVTs), Values));
4451}
4452
4453void SelectionDAGBuilder::visitExtractValue(const ExtractValueInst &I) {
4454 ArrayRef<unsigned> Indices = I.getIndices();
4455 const Value *Op0 = I.getOperand(0);
4456 Type *AggTy = Op0->getType();
4457 Type *ValTy = I.getType();
4458 bool OutOfUndef = isa<UndefValue>(Op0);
4459
4460 unsigned LinearIndex = ComputeLinearIndex(AggTy, Indices);
4461
4462 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4463 SmallVector<EVT, 4> ValValueVTs;
4464 ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);
4465
4466 unsigned NumValValues = ValValueVTs.size();
4467
4468 // Ignore a extractvalue that produces an empty object
4469 if (!NumValValues) {
4470 setValue(&I, DAG.getUNDEF(MVT(MVT::Other)));
4471 return;
4472 }
4473
4474 SmallVector<SDValue, 4> Values(NumValValues);
4475
4476 SDValue Agg = getValue(Op0);
4477 // Copy out the selected value(s).
4478 for (unsigned i = LinearIndex; i != LinearIndex + NumValValues; ++i)
4479 Values[i - LinearIndex] =
4480 OutOfUndef ?
4481 DAG.getUNDEF(Agg.getNode()->getValueType(Agg.getResNo() + i)) :
4482 SDValue(Agg.getNode(), Agg.getResNo() + i);
4483
4485 DAG.getVTList(ValValueVTs), Values));
4486}
4487
4488void SelectionDAGBuilder::visitGetElementPtr(const User &I) {
4489 Value *Op0 = I.getOperand(0);
4490 // Note that the pointer operand may be a vector of pointers. Take the scalar
4491 // element which holds a pointer.
4492 unsigned AS = Op0->getType()->getScalarType()->getPointerAddressSpace();
4493 SDValue N = getValue(Op0);
4494 SDLoc dl = getCurSDLoc();
4495 auto &TLI = DAG.getTargetLoweringInfo();
4496 GEPNoWrapFlags NW = cast<GEPOperator>(I).getNoWrapFlags();
4497
4498 // For a vector GEP, keep the prefix scalar as long as possible, then
4499 // convert any scalars encountered after the first vector operand to vectors.
4500 bool IsVectorGEP = I.getType()->isVectorTy();
4501 ElementCount VectorElementCount =
4502 IsVectorGEP ? cast<VectorType>(I.getType())->getElementCount()
4504
4506 GTI != E; ++GTI) {
4507 const Value *Idx = GTI.getOperand();
4508 if (StructType *StTy = GTI.getStructTypeOrNull()) {
4509 unsigned Field = cast<Constant>(Idx)->getUniqueInteger().getZExtValue();
4510 if (Field) {
4511 // N = N + Offset
4513 DAG.getDataLayout().getStructLayout(StTy)->getElementOffset(Field);
4514
4515 // In an inbounds GEP with an offset that is nonnegative even when
4516 // interpreted as signed, assume there is no unsigned overflow.
4517 SDNodeFlags Flags;
4518 if (NW.hasNoUnsignedWrap() ||
4519 (int64_t(Offset) >= 0 && NW.hasNoUnsignedSignedWrap()))
4521 Flags.setInBounds(NW.isInBounds());
4522
4523 N = DAG.getMemBasePlusOffset(
4524 N, DAG.getConstant(Offset, dl, N.getValueType()), dl, Flags);
4525 }
4526 } else {
4527 // IdxSize is the width of the arithmetic according to IR semantics.
4528 // In SelectionDAG, we may prefer to do arithmetic in a wider bitwidth
4529 // (and fix up the result later).
4530 unsigned IdxSize = DAG.getDataLayout().getIndexSizeInBits(AS);
4531 MVT IdxTy = MVT::getIntegerVT(IdxSize);
4532 TypeSize ElementSize =
4533 GTI.getSequentialElementStride(DAG.getDataLayout());
4534 // We intentionally mask away the high bits here; ElementSize may not
4535 // fit in IdxTy.
4536 APInt ElementMul(IdxSize, ElementSize.getKnownMinValue(),
4537 /*isSigned=*/false, /*implicitTrunc=*/true);
4538 bool ElementScalable = ElementSize.isScalable();
4539
4540 // If this is a scalar constant or a splat vector of constants,
4541 // handle it quickly.
4542 const auto *C = dyn_cast<Constant>(Idx);
4543 if (C && isa<VectorType>(C->getType()))
4544 C = C->getSplatValue();
4545
4546 const auto *CI = dyn_cast_or_null<ConstantInt>(C);
4547 if (CI && CI->isZero())
4548 continue;
4549 if (CI && !ElementScalable) {
4550 APInt Offs = ElementMul * CI->getValue().sextOrTrunc(IdxSize);
4551 LLVMContext &Context = *DAG.getContext();
4552 SDValue OffsVal;
4553 if (N.getValueType().isVector())
4554 OffsVal = DAG.getConstant(
4555 Offs, dl, EVT::getVectorVT(Context, IdxTy, VectorElementCount));
4556 else
4557 OffsVal = DAG.getConstant(Offs, dl, IdxTy);
4558
4559 // In an inbounds GEP with an offset that is nonnegative even when
4560 // interpreted as signed, assume there is no unsigned overflow.
4561 SDNodeFlags Flags;
4562 if (NW.hasNoUnsignedWrap() ||
4563 (Offs.isNonNegative() && NW.hasNoUnsignedSignedWrap()))
4564 Flags.setNoUnsignedWrap(true);
4565 Flags.setInBounds(NW.isInBounds());
4566
4567 OffsVal = DAG.getSExtOrTrunc(OffsVal, dl, N.getValueType());
4568
4569 N = DAG.getMemBasePlusOffset(N, OffsVal, dl, Flags);
4570 continue;
4571 }
4572
4573 // N = N + Idx * ElementMul;
4574 SDValue IdxN = getValue(Idx);
4575
4576 if (IdxN.getValueType().isVector() != N.getValueType().isVector()) {
4577 if (N.getValueType().isVector()) {
4578 EVT VT = EVT::getVectorVT(*Context, IdxN.getValueType(),
4579 VectorElementCount);
4580 IdxN = DAG.getSplat(VT, dl, IdxN);
4581 } else {
4582 EVT VT =
4583 EVT::getVectorVT(*Context, N.getValueType(), VectorElementCount);
4584 N = DAG.getSplat(VT, dl, N);
4585 }
4586 }
4587
4588 // If the index is smaller or larger than intptr_t, truncate or extend
4589 // it.
4590 IdxN = DAG.getSExtOrTrunc(IdxN, dl, N.getValueType());
4591
4592 SDNodeFlags ScaleFlags;
4593 // The multiplication of an index by the type size does not wrap the
4594 // pointer index type in a signed sense (mul nsw).
4596
4597 // The multiplication of an index by the type size does not wrap the
4598 // pointer index type in an unsigned sense (mul nuw).
4599 ScaleFlags.setNoUnsignedWrap(NW.hasNoUnsignedWrap());
4600
4601 if (ElementScalable) {
4602 EVT VScaleTy = N.getValueType().getScalarType();
4603 SDValue VScale = DAG.getNode(
4604 ISD::VSCALE, dl, VScaleTy,
4605 DAG.getConstant(ElementMul.getZExtValue(), dl, VScaleTy));
4606 if (N.getValueType().isVector())
4607 VScale = DAG.getSplatVector(N.getValueType(), dl, VScale);
4608 IdxN = DAG.getNode(ISD::MUL, dl, N.getValueType(), IdxN, VScale,
4609 ScaleFlags);
4610 } else {
4611 // If this is a multiply by a power of two, turn it into a shl
4612 // immediately. This is a very common case.
4613 if (ElementMul != 1) {
4614 if (ElementMul.isPowerOf2()) {
4615 unsigned Amt = ElementMul.logBase2();
4616 IdxN = DAG.getNode(
4617 ISD::SHL, dl, N.getValueType(), IdxN,
4618 DAG.getShiftAmountConstant(Amt, N.getValueType(), dl),
4619 ScaleFlags);
4620 } else {
4621 SDValue Scale = DAG.getConstant(ElementMul.getZExtValue(), dl,
4622 IdxN.getValueType());
4623 IdxN = DAG.getNode(ISD::MUL, dl, N.getValueType(), IdxN, Scale,
4624 ScaleFlags);
4625 }
4626 }
4627 }
4628
4629 // The successive addition of the current address, truncated to the
4630 // pointer index type and interpreted as an unsigned number, and each
4631 // offset, also interpreted as an unsigned number, does not wrap the
4632 // pointer index type (add nuw).
4633 SDNodeFlags AddFlags;
4634 AddFlags.setNoUnsignedWrap(NW.hasNoUnsignedWrap());
4635 AddFlags.setInBounds(NW.isInBounds());
4636
4637 N = DAG.getMemBasePlusOffset(N, IdxN, dl, AddFlags);
4638 }
4639 }
4640
4641 if (IsVectorGEP && !N.getValueType().isVector()) {
4642 EVT VT = EVT::getVectorVT(*Context, N.getValueType(), VectorElementCount);
4643 N = DAG.getSplat(VT, dl, N);
4644 }
4645
4646 MVT PtrTy = TLI.getPointerTy(DAG.getDataLayout(), AS);
4647 MVT PtrMemTy = TLI.getPointerMemTy(DAG.getDataLayout(), AS);
4648 if (IsVectorGEP) {
4649 PtrTy = MVT::getVectorVT(PtrTy, VectorElementCount);
4650 PtrMemTy = MVT::getVectorVT(PtrMemTy, VectorElementCount);
4651 }
4652
4653 if (PtrMemTy != PtrTy && !cast<GEPOperator>(I).isInBounds())
4654 N = DAG.getPtrExtendInReg(N, dl, PtrMemTy);
4655
4656 setValue(&I, N);
4657}
4658
4659void SelectionDAGBuilder::visitAlloca(const AllocaInst &I) {
4660 // If this is a fixed sized alloca in the entry block of the function,
4661 // allocate it statically on the stack.
4662 if (FuncInfo.StaticAllocaMap.count(&I))
4663 return; // getValue will auto-populate this.
4664
4665 SDLoc dl = getCurSDLoc();
4666 Type *Ty = I.getAllocatedType();
4667 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4668 auto &DL = DAG.getDataLayout();
4669 TypeSize TySize = DL.getTypeAllocSize(Ty);
4670 MaybeAlign Alignment = I.getAlign();
4671
4672 SDValue AllocSize = getValue(I.getArraySize());
4673
4674 EVT IntPtr = TLI.getPointerTy(DL, I.getAddressSpace());
4675 if (AllocSize.getValueType() != IntPtr)
4676 AllocSize = DAG.getZExtOrTrunc(AllocSize, dl, IntPtr);
4677
4678 AllocSize = DAG.getNode(
4679 ISD::MUL, dl, IntPtr, AllocSize,
4680 DAG.getZExtOrTrunc(DAG.getTypeSize(dl, MVT::i64, TySize), dl, IntPtr));
4681
4682 // Handle alignment. If the requested alignment is less than or equal to
4683 // the stack alignment, ignore it. If the size is greater than or equal to
4684 // the stack alignment, we note this in the DYNAMIC_STACKALLOC node.
4685 Align StackAlign = DAG.getSubtarget().getFrameLowering()->getStackAlign();
4686 if (*Alignment <= StackAlign)
4687 Alignment = std::nullopt;
4688
4689 const uint64_t StackAlignMask = StackAlign.value() - 1U;
4690 // Round the size of the allocation up to the stack alignment size
4691 // by add SA-1 to the size. This doesn't overflow because we're computing
4692 // an address inside an alloca.
4693 AllocSize = DAG.getNode(ISD::ADD, dl, AllocSize.getValueType(), AllocSize,
4694 DAG.getConstant(StackAlignMask, dl, IntPtr),
4696
4697 // Mask out the low bits for alignment purposes.
4698 AllocSize = DAG.getNode(ISD::AND, dl, AllocSize.getValueType(), AllocSize,
4699 DAG.getSignedConstant(~StackAlignMask, dl, IntPtr));
4700
4701 SDValue Ops[] = {
4702 getRoot(), AllocSize,
4703 DAG.getConstant(Alignment ? Alignment->value() : 0, dl, IntPtr)};
4704 SDVTList VTs = DAG.getVTList(AllocSize.getValueType(), MVT::Other);
4705 SDValue DSA = DAG.getNode(ISD::DYNAMIC_STACKALLOC, dl, VTs, Ops);
4706 setValue(&I, DSA);
4707 DAG.setRoot(DSA.getValue(1));
4708
4709 assert(FuncInfo.MF->getFrameInfo().hasVarSizedObjects());
4710}
4711
4712static const MDNode *getRangeMetadata(const Instruction &I) {
4713 return I.getMetadata(LLVMContext::MD_range);
4714}
4715
4716static std::optional<ConstantRange> getRange(const Instruction &I) {
4717 if (const auto *CB = dyn_cast<CallBase>(&I))
4718 if (std::optional<ConstantRange> CR = CB->getRange())
4719 return CR;
4720 if (const MDNode *Range = getRangeMetadata(I))
4722 return std::nullopt;
4723}
4724
4726 if (const auto *CB = dyn_cast<CallBase>(&I))
4727 return CB->getRetNoFPClass();
4728 return fcNone;
4729}
4730
4731void SelectionDAGBuilder::visitLoad(const LoadInst &I) {
4732 if (I.isAtomic())
4733 return visitAtomicLoad(I);
4734
4735 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4736 const Value *SV = I.getOperand(0);
4737 if (TLI.supportSwiftError()) {
4738 // Swifterror values can come from either a function parameter with
4739 // swifterror attribute or an alloca with swifterror attribute.
4740 if (const Argument *Arg = dyn_cast<Argument>(SV)) {
4741 if (Arg->hasSwiftErrorAttr())
4742 return visitLoadFromSwiftError(I);
4743 }
4744
4745 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(SV)) {
4746 if (Alloca->isSwiftError())
4747 return visitLoadFromSwiftError(I);
4748 }
4749 }
4750
4751 SDValue Ptr = getValue(SV);
4752
4753 Type *Ty = I.getType();
4754 SmallVector<EVT, 4> ValueVTs, MemVTs;
4756 ComputeValueVTs(TLI, DAG.getDataLayout(), Ty, ValueVTs, &MemVTs, &Offsets);
4757 unsigned NumValues = ValueVTs.size();
4758 if (NumValues == 0)
4759 return;
4760
4761 Align Alignment = I.getAlign();
4762 AAMDNodes AAInfo = I.getAAMetadata();
4763 const MDNode *Ranges = getRangeMetadata(I);
4764 const MDNode *MemCacheHint = getMemCacheHintMetadata(I);
4765 bool isVolatile = I.isVolatile();
4766 MachineMemOperand::Flags MMOFlags =
4767 TLI.getLoadMemOperandFlags(I, DAG.getDataLayout(), AC, LibInfo);
4768
4769 SDValue Root;
4770 bool ConstantMemory = false;
4771 if (isVolatile)
4772 // Serialize volatile loads with other side effects.
4773 Root = getRoot();
4774 else if (NumValues > MaxParallelChains)
4775 Root = getMemoryRoot();
4776 else if (BatchAA &&
4777 BatchAA->pointsToConstantMemory(MemoryLocation(
4778 SV,
4779 LocationSize::precise(DAG.getDataLayout().getTypeStoreSize(Ty)),
4780 AAInfo))) {
4781 // Do not serialize (non-volatile) loads of constant memory with anything.
4782 Root = DAG.getEntryNode();
4783 ConstantMemory = true;
4785 } else {
4786 // Do not serialize non-volatile loads against each other.
4787 Root = DAG.getRoot();
4788 }
4789
4790 SDLoc dl = getCurSDLoc();
4791
4792 if (isVolatile)
4793 Root = TLI.prepareVolatileOrAtomicLoad(Root, dl, DAG);
4794
4796 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4797
4798 unsigned ChainI = 0;
4799 for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
4800 // Serializing loads here may result in excessive register pressure, and
4801 // TokenFactor places arbitrary choke points on the scheduler. SD scheduling
4802 // could recover a bit by hoisting nodes upward in the chain by recognizing
4803 // they are side-effect free or do not alias. The optimizer should really
4804 // avoid this case by converting large object/array copies to llvm.memcpy
4805 // (MaxParallelChains should always remain as failsafe).
4806 if (ChainI == MaxParallelChains) {
4807 assert(PendingLoads.empty() && "PendingLoads must be serialized first");
4808 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4809 ArrayRef(Chains.data(), ChainI));
4810 Root = Chain;
4811 ChainI = 0;
4812 }
4813
4814 // TODO: MachinePointerInfo only supports a fixed length offset.
4815 MachinePointerInfo PtrInfo =
4816 !Offsets[i].isScalable() || Offsets[i].isZero()
4817 ? MachinePointerInfo(SV, Offsets[i].getKnownMinValue())
4818 : MachinePointerInfo();
4819
4820 SDValue A = DAG.getObjectPtrOffset(dl, Ptr, Offsets[i]);
4821 SDValue L =
4822 DAG.getLoad(MemVTs[i], dl, Root, A, PtrInfo, Alignment, MMOFlags,
4823 MMOMetadata(AAInfo, Ranges, MemCacheHint));
4824 Chains[ChainI] = L.getValue(1);
4825
4826 if (MemVTs[i] != ValueVTs[i])
4827 L = DAG.getPtrExtOrTrunc(L, dl, ValueVTs[i]);
4828
4829 if (MDNode *NoFPClassMD = I.getMetadata(LLVMContext::MD_nofpclass)) {
4830 uint64_t FPTestInt =
4831 cast<ConstantInt>(
4832 cast<ConstantAsMetadata>(NoFPClassMD->getOperand(0))->getValue())
4833 ->getZExtValue();
4834 if (FPTestInt != fcNone) {
4835 SDValue FPTestConst =
4836 DAG.getTargetConstant(FPTestInt, SDLoc(), MVT::i32);
4837 L = DAG.getNode(ISD::AssertNoFPClass, dl, L.getValueType(), L,
4838 FPTestConst);
4839 }
4840 }
4841 Values[i] = L;
4842 }
4843
4844 if (!ConstantMemory) {
4845 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4846 ArrayRef(Chains.data(), ChainI));
4847 if (isVolatile)
4848 DAG.setRoot(Chain);
4849 else
4850 PendingLoads.push_back(Chain);
4851 }
4852
4853 setValue(&I, DAG.getNode(ISD::MERGE_VALUES, dl,
4854 DAG.getVTList(ValueVTs), Values));
4855}
4856
4857void SelectionDAGBuilder::visitStoreToSwiftError(const StoreInst &I) {
4858 assert(DAG.getTargetLoweringInfo().supportSwiftError() &&
4859 "call visitStoreToSwiftError when backend supports swifterror");
4860
4861 SmallVector<EVT, 4> ValueVTs;
4862 SmallVector<uint64_t, 4> Offsets;
4863 const Value *SrcV = I.getOperand(0);
4864 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(),
4865 SrcV->getType(), ValueVTs, /*MemVTs=*/nullptr, &Offsets, 0);
4866 assert(ValueVTs.size() == 1 && Offsets[0] == 0 &&
4867 "expect a single EVT for swifterror");
4868
4869 SDValue Src = getValue(SrcV);
4870 // Create a virtual register, then update the virtual register.
4871 Register VReg =
4872 SwiftError.getOrCreateVRegDefAt(&I, FuncInfo.MBB, I.getPointerOperand());
4873 // Chain, DL, Reg, N or Chain, DL, Reg, N, Glue
4874 // Chain can be getRoot or getControlRoot.
4875 SDValue CopyNode = DAG.getCopyToReg(getRoot(), getCurSDLoc(), VReg,
4876 SDValue(Src.getNode(), Src.getResNo()));
4877 DAG.setRoot(CopyNode);
4878}
4879
4880void SelectionDAGBuilder::visitLoadFromSwiftError(const LoadInst &I) {
4881 assert(DAG.getTargetLoweringInfo().supportSwiftError() &&
4882 "call visitLoadFromSwiftError when backend supports swifterror");
4883
4884 assert(!I.isVolatile() &&
4885 !I.hasMetadata(LLVMContext::MD_nontemporal) &&
4886 !I.hasMetadata(LLVMContext::MD_invariant_load) &&
4887 "Support volatile, non temporal, invariant for load_from_swift_error");
4888
4889 const Value *SV = I.getOperand(0);
4890 Type *Ty = I.getType();
4891 assert(
4892 (!BatchAA ||
4893 !BatchAA->pointsToConstantMemory(MemoryLocation(
4894 SV, LocationSize::precise(DAG.getDataLayout().getTypeStoreSize(Ty)),
4895 I.getAAMetadata()))) &&
4896 "load_from_swift_error should not be constant memory");
4897
4898 SmallVector<EVT, 4> ValueVTs;
4899 SmallVector<uint64_t, 4> Offsets;
4900 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), Ty,
4901 ValueVTs, /*MemVTs=*/nullptr, &Offsets, 0);
4902 assert(ValueVTs.size() == 1 && Offsets[0] == 0 &&
4903 "expect a single EVT for swifterror");
4904
4905 // Chain, DL, Reg, VT, Glue or Chain, DL, Reg, VT
4906 SDValue L = DAG.getCopyFromReg(
4907 getRoot(), getCurSDLoc(),
4908 SwiftError.getOrCreateVRegUseAt(&I, FuncInfo.MBB, SV), ValueVTs[0]);
4909
4910 setValue(&I, L);
4911}
4912
4913void SelectionDAGBuilder::visitStore(const StoreInst &I) {
4914 if (I.isAtomic())
4915 return visitAtomicStore(I);
4916
4917 const Value *SrcV = I.getOperand(0);
4918 const Value *PtrV = I.getOperand(1);
4919
4920 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4921 if (TLI.supportSwiftError()) {
4922 // Swifterror values can come from either a function parameter with
4923 // swifterror attribute or an alloca with swifterror attribute.
4924 if (const Argument *Arg = dyn_cast<Argument>(PtrV)) {
4925 if (Arg->hasSwiftErrorAttr())
4926 return visitStoreToSwiftError(I);
4927 }
4928
4929 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(PtrV)) {
4930 if (Alloca->isSwiftError())
4931 return visitStoreToSwiftError(I);
4932 }
4933 }
4934
4935 SmallVector<EVT, 4> ValueVTs, MemVTs;
4937 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(),
4938 SrcV->getType(), ValueVTs, &MemVTs, &Offsets);
4939 unsigned NumValues = ValueVTs.size();
4940 if (NumValues == 0)
4941 return;
4942
4943 // Get the lowered operands. Note that we do this after
4944 // checking if NumResults is zero, because with zero results
4945 // the operands won't have values in the map.
4946 SDValue Src = getValue(SrcV);
4947 SDValue Ptr = getValue(PtrV);
4948
4949 SDValue Root = I.isVolatile() ? getRoot() : getMemoryRoot();
4950 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4951 SDLoc dl = getCurSDLoc();
4952 Align Alignment = I.getAlign();
4953 AAMDNodes AAInfo = I.getAAMetadata();
4954 const MDNode *MemCacheHint =
4955 getMemCacheHintMetadata(I, I.getPointerOperandIndex());
4956
4957 auto MMOFlags = TLI.getStoreMemOperandFlags(I, DAG.getDataLayout());
4958
4959 unsigned ChainI = 0;
4960 for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
4961 // See visitLoad comments.
4962 if (ChainI == MaxParallelChains) {
4963 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4964 ArrayRef(Chains.data(), ChainI));
4965 Root = Chain;
4966 ChainI = 0;
4967 }
4968
4969 // TODO: MachinePointerInfo only supports a fixed length offset.
4970 MachinePointerInfo PtrInfo =
4971 !Offsets[i].isScalable() || Offsets[i].isZero()
4972 ? MachinePointerInfo(PtrV, Offsets[i].getKnownMinValue())
4973 : MachinePointerInfo();
4974
4975 SDValue Add = DAG.getObjectPtrOffset(dl, Ptr, Offsets[i]);
4976 SDValue Val = SDValue(Src.getNode(), Src.getResNo() + i);
4977 if (MemVTs[i] != ValueVTs[i])
4978 Val = DAG.getPtrExtOrTrunc(Val, dl, MemVTs[i]);
4979 SDValue St =
4980 DAG.getStore(Root, dl, Val, Add, PtrInfo, Alignment, MMOFlags,
4981 MMOMetadata(AAInfo, /*Ranges=*/nullptr, MemCacheHint));
4982 Chains[ChainI] = St;
4983 }
4984
4985 SDValue StoreNode = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4986 ArrayRef(Chains.data(), ChainI));
4987 setValue(&I, StoreNode);
4988 DAG.setRoot(StoreNode);
4989}
4990
4991void SelectionDAGBuilder::visitMaskedStore(const CallInst &I,
4992 bool IsCompressing) {
4993 SDLoc sdl = getCurSDLoc();
4994
4995 Value *Src0Operand = I.getArgOperand(0);
4996 Value *PtrOperand = I.getArgOperand(1);
4997 Value *MaskOperand = I.getArgOperand(2);
4998 Align Alignment = I.getParamAlign(1).valueOrOne();
4999
5000 SDValue Ptr = getValue(PtrOperand);
5001 SDValue Src0 = getValue(Src0Operand);
5002 SDValue Mask = getValue(MaskOperand);
5003 SDValue Offset = DAG.getPOISON(Ptr.getValueType());
5004
5005 EVT VT = Src0.getValueType();
5006
5007 const auto &TLI = DAG.getTargetLoweringInfo();
5008
5009 auto MMOFlags = MachineMemOperand::MOStore;
5010 MMOFlags |= TLI.getTargetMMOFlags(I);
5011 if (I.hasMetadata(LLVMContext::MD_nontemporal))
5013
5014 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5015 MachinePointerInfo(PtrOperand), MMOFlags,
5016 LocationSize::upperBound(VT.getStoreSize()), Alignment,
5017 I.getAAMetadata());
5018
5019 SDValue StoreNode =
5020 !IsCompressing && TTI->hasConditionalLoadStoreForType(
5021 I.getArgOperand(0)->getType(), /*IsStore=*/true)
5022 ? TLI.visitMaskedStore(DAG, sdl, getMemoryRoot(), MMO, Ptr, Src0,
5023 Mask)
5024 : DAG.getMaskedStore(getMemoryRoot(), sdl, Src0, Ptr, Offset, Mask,
5025 VT, MMO, ISD::UNINDEXED, /*Truncating=*/false,
5026 IsCompressing);
5027 DAG.setRoot(StoreNode);
5028 setValue(&I, StoreNode);
5029}
5030
5031// Get a uniform base for the Gather/Scatter intrinsic.
5032// The first argument of the Gather/Scatter intrinsic is a vector of pointers.
5033// We try to represent it as a base pointer + vector of indices.
5034// Usually, the vector of pointers comes from a 'getelementptr' instruction.
5035// The first operand of the GEP may be a single pointer or a vector of pointers
5036// Example:
5037// %gep.ptr = getelementptr i32, <8 x i32*> %vptr, <8 x i32> %ind
5038// or
5039// %gep.ptr = getelementptr i32, i32* %ptr, <8 x i32> %ind
5040// %res = call <8 x i32> @llvm.masked.gather.v8i32(<8 x i32*> %gep.ptr, ..
5041//
5042// When the first GEP operand is a single pointer - it is the uniform base we
5043// are looking for. If first operand of the GEP is a splat vector - we
5044// extract the splat value and use it as a uniform base.
5045// In all other cases the function returns 'false'.
5046static bool getUniformBase(const Value *Ptr, SDValue &Base, SDValue &Index,
5047 SDValue &Scale, SelectionDAGBuilder *SDB,
5048 const BasicBlock *CurBB, uint64_t ElemSize) {
5049 SelectionDAG& DAG = SDB->DAG;
5050 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5051 const DataLayout &DL = DAG.getDataLayout();
5052
5053 assert(Ptr->getType()->isVectorTy() && "Unexpected pointer type");
5054
5055 // Handle splat constant pointer.
5056 if (auto *C = dyn_cast<Constant>(Ptr)) {
5057 C = C->getSplatValue();
5058 if (!C)
5059 return false;
5060
5061 Base = SDB->getValue(C);
5062
5063 ElementCount NumElts = cast<VectorType>(Ptr->getType())->getElementCount();
5064 EVT VT = EVT::getVectorVT(*DAG.getContext(), TLI.getPointerTy(DL), NumElts);
5065 Index = DAG.getConstant(0, SDB->getCurSDLoc(), VT);
5066 Scale = DAG.getTargetConstant(1, SDB->getCurSDLoc(), TLI.getPointerTy(DL));
5067 return true;
5068 }
5069
5071 if (!GEP || GEP->getParent() != CurBB)
5072 return false;
5073
5074 if (GEP->getNumOperands() != 2)
5075 return false;
5076
5077 const Value *BasePtr = GEP->getPointerOperand();
5078 const Value *IndexVal = GEP->getOperand(GEP->getNumOperands() - 1);
5079
5080 // Make sure the base is scalar and the index is a vector.
5081 if (BasePtr->getType()->isVectorTy() || !IndexVal->getType()->isVectorTy())
5082 return false;
5083
5084 TypeSize ScaleVal = DL.getTypeAllocSize(GEP->getResultElementType());
5085 if (ScaleVal.isScalable())
5086 return false;
5087
5088 // Target may not support the required addressing mode.
5089 if (ScaleVal != 1 &&
5090 !TLI.isLegalScaleForGatherScatter(ScaleVal.getFixedValue(), ElemSize))
5091 return false;
5092
5093 Base = SDB->getValue(BasePtr);
5094 Index = SDB->getValue(IndexVal);
5095
5096 Scale =
5097 DAG.getTargetConstant(ScaleVal, SDB->getCurSDLoc(), TLI.getPointerTy(DL));
5098 return true;
5099}
5100
5101void SelectionDAGBuilder::visitMaskedScatter(const CallInst &I) {
5102 SDLoc sdl = getCurSDLoc();
5103
5104 // llvm.masked.scatter.*(Src0, Ptrs, Mask)
5105 const Value *Ptr = I.getArgOperand(1);
5106 SDValue Src0 = getValue(I.getArgOperand(0));
5107 SDValue Mask = getValue(I.getArgOperand(2));
5108 EVT VT = Src0.getValueType();
5109 Align Alignment = I.getParamAlign(1).valueOrOne();
5110 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5111
5112 SDValue Base;
5113 SDValue Index;
5114 SDValue Scale;
5115 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
5116 I.getParent(), VT.getScalarStoreSize());
5117
5118 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
5119 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5120 MachinePointerInfo(AS), MachineMemOperand::MOStore,
5121 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata());
5122 if (!UniformBase) {
5123 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5124 Index = getValue(Ptr);
5125 Scale =
5126 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5127 }
5128
5129 EVT IdxVT = Index.getValueType();
5130 EVT EltTy = IdxVT.getVectorElementType();
5131 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
5132 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
5133 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
5134 }
5135
5136 SDValue Ops[] = { getMemoryRoot(), Src0, Mask, Base, Index, Scale };
5137 SDValue Scatter = DAG.getMaskedScatter(DAG.getVTList(MVT::Other), VT, sdl,
5138 Ops, MMO, ISD::SIGNED_SCALED, false);
5139 DAG.setRoot(Scatter);
5140 setValue(&I, Scatter);
5141}
5142
5143void SelectionDAGBuilder::visitMaskedLoad(const CallInst &I, bool IsExpanding) {
5144 SDLoc sdl = getCurSDLoc();
5145
5146 Value *PtrOperand = I.getArgOperand(0);
5147 Value *MaskOperand = I.getArgOperand(1);
5148 Value *Src0Operand = I.getArgOperand(2);
5149 Align Alignment = I.getParamAlign(0).valueOrOne();
5150
5151 SDValue Ptr = getValue(PtrOperand);
5152 SDValue Src0 = getValue(Src0Operand);
5153 SDValue Mask = getValue(MaskOperand);
5154 SDValue Offset = DAG.getPOISON(Ptr.getValueType());
5155
5156 EVT VT = Src0.getValueType();
5157 AAMDNodes AAInfo = I.getAAMetadata();
5158 const MDNode *Ranges = getRangeMetadata(I);
5159
5160 // Do not serialize masked loads of constant memory with anything.
5161 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
5162 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
5163
5164 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
5165
5166 const auto &TLI = DAG.getTargetLoweringInfo();
5167
5168 auto MMOFlags = MachineMemOperand::MOLoad;
5169 MMOFlags |= TLI.getTargetMMOFlags(I);
5170 if (I.hasMetadata(LLVMContext::MD_nontemporal))
5172 if (I.hasMetadata(LLVMContext::MD_invariant_load))
5174
5175 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5176 MachinePointerInfo(PtrOperand), MMOFlags,
5177 LocationSize::upperBound(VT.getStoreSize()), Alignment,
5178 MMOMetadata(AAInfo, Ranges));
5179
5180 // The Load/Res may point to different values and both of them are output
5181 // variables.
5182 SDValue Load;
5183 SDValue Res;
5184 if (!IsExpanding &&
5185 TTI->hasConditionalLoadStoreForType(Src0Operand->getType(),
5186 /*IsStore=*/false))
5187 Res = TLI.visitMaskedLoad(DAG, sdl, InChain, MMO, Load, Ptr, Src0, Mask);
5188 else
5189 Res = Load =
5190 DAG.getMaskedLoad(VT, sdl, InChain, Ptr, Offset, Mask, Src0, VT, MMO,
5191 ISD::UNINDEXED, ISD::NON_EXTLOAD, IsExpanding);
5192 if (AddToChain)
5193 PendingLoads.push_back(Load.getValue(1));
5194 setValue(&I, Res);
5195}
5196
5197void SelectionDAGBuilder::visitMaskedGather(const CallInst &I) {
5198 SDLoc sdl = getCurSDLoc();
5199
5200 // @llvm.masked.gather.*(Ptrs, Mask, Src0)
5201 const Value *Ptr = I.getArgOperand(0);
5202 SDValue Src0 = getValue(I.getArgOperand(2));
5203 SDValue Mask = getValue(I.getArgOperand(1));
5204
5205 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5206 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
5207 Align Alignment = I.getParamAlign(0).valueOrOne();
5208
5209 const MDNode *Ranges = getRangeMetadata(I);
5210
5211 SDValue Root = DAG.getRoot();
5212 SDValue Base;
5213 SDValue Index;
5214 SDValue Scale;
5215 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
5216 I.getParent(), VT.getScalarStoreSize());
5217 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
5218 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5219 MachinePointerInfo(AS), MachineMemOperand::MOLoad,
5221 MMOMetadata(I.getAAMetadata(), Ranges));
5222
5223 if (!UniformBase) {
5224 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5225 Index = getValue(Ptr);
5226 Scale =
5227 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5228 }
5229
5230 EVT IdxVT = Index.getValueType();
5231 EVT EltTy = IdxVT.getVectorElementType();
5232 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
5233 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
5234 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
5235 }
5236
5237 SDValue Ops[] = { Root, Src0, Mask, Base, Index, Scale };
5238 SDValue Gather =
5239 DAG.getMaskedGather(DAG.getVTList(VT, MVT::Other), VT, sdl, Ops, MMO,
5241
5242 PendingLoads.push_back(Gather.getValue(1));
5243 setValue(&I, Gather);
5244}
5245
5246void SelectionDAGBuilder::visitAtomicCmpXchg(const AtomicCmpXchgInst &I) {
5247 SDLoc dl = getCurSDLoc();
5248 AtomicOrdering SuccessOrdering = I.getSuccessOrdering();
5249 AtomicOrdering FailureOrdering = I.getFailureOrdering();
5250 SyncScope::ID SSID = I.getSyncScopeID();
5251
5252 SDValue InChain = getRoot();
5253
5254 MVT MemVT = getValue(I.getCompareOperand()).getSimpleValueType();
5255 SDVTList VTs = DAG.getVTList(MemVT, MVT::i1, MVT::Other);
5256
5257 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5258 auto Flags = TLI.getAtomicMemOperandFlags(I, DAG.getDataLayout());
5259
5260 MachineFunction &MF = DAG.getMachineFunction();
5261 MachineMemOperand *MMO = MF.getMachineMemOperand(
5262 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5263 I.getAlign(), MMOMetadata(), SSID, SuccessOrdering, FailureOrdering);
5264
5266 dl, MemVT, VTs, InChain,
5267 getValue(I.getPointerOperand()),
5268 getValue(I.getCompareOperand()),
5269 getValue(I.getNewValOperand()), MMO);
5270
5271 SDValue OutChain = L.getValue(2);
5272
5273 setValue(&I, L);
5274 DAG.setRoot(OutChain);
5275}
5276
5277void SelectionDAGBuilder::visitAtomicRMW(const AtomicRMWInst &I) {
5278 SDLoc dl = getCurSDLoc();
5280 switch (I.getOperation()) {
5281 default: llvm_unreachable("Unknown atomicrmw operation");
5299 break;
5302 break;
5305 break;
5308 break;
5311 break;
5314 break;
5317 break;
5320 break;
5321 }
5322 AtomicOrdering Ordering = I.getOrdering();
5323 SyncScope::ID SSID = I.getSyncScopeID();
5324
5325 SDValue InChain = getRoot();
5326
5327 auto MemVT = getValue(I.getValOperand()).getSimpleValueType();
5328 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5329 auto Flags = TLI.getAtomicMemOperandFlags(I, DAG.getDataLayout());
5330
5331 MachineFunction &MF = DAG.getMachineFunction();
5332 MachineMemOperand *MMO = MF.getMachineMemOperand(
5333 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5334 I.getAlign(), MMOMetadata(), SSID, Ordering);
5335
5336 SDValue L =
5337 DAG.getAtomic(NT, dl, MemVT, InChain,
5338 getValue(I.getPointerOperand()), getValue(I.getValOperand()),
5339 MMO);
5340
5341 SDValue OutChain = L.getValue(1);
5342
5343 setValue(&I, L);
5344 DAG.setRoot(OutChain);
5345}
5346
5347void SelectionDAGBuilder::visitFence(const FenceInst &I) {
5348 SDLoc dl = getCurSDLoc();
5349 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5350 SDValue Ops[3];
5351 Ops[0] = getRoot();
5352 Ops[1] = DAG.getTargetConstant((unsigned)I.getOrdering(), dl,
5353 TLI.getFenceOperandTy(DAG.getDataLayout()));
5354 Ops[2] = DAG.getTargetConstant(I.getSyncScopeID(), dl,
5355 TLI.getFenceOperandTy(DAG.getDataLayout()));
5356 SDValue N = DAG.getNode(ISD::ATOMIC_FENCE, dl, MVT::Other, Ops);
5357 setValue(&I, N);
5358 DAG.setRoot(N);
5359}
5360
5361void SelectionDAGBuilder::visitAtomicLoad(const LoadInst &I) {
5362 SDLoc dl = getCurSDLoc();
5363 AtomicOrdering Order = I.getOrdering();
5364 SyncScope::ID SSID = I.getSyncScopeID();
5365
5366 SDValue InChain = getRoot();
5367
5368 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5369 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
5370 EVT MemVT = TLI.getMemValueType(DAG.getDataLayout(), I.getType());
5371
5372 if (!TLI.supportsUnalignedAtomics() &&
5373 I.getAlign().value() < MemVT.getSizeInBits() / 8)
5374 report_fatal_error("Cannot generate unaligned atomic load");
5375
5376 auto Flags = TLI.getLoadMemOperandFlags(I, DAG.getDataLayout(), AC, LibInfo);
5377
5378 const MDNode *Ranges = getRangeMetadata(I);
5379 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5380 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5381 I.getAlign(), MMOMetadata(AAMDNodes(), Ranges), SSID, Order);
5382
5383 InChain = TLI.prepareVolatileOrAtomicLoad(InChain, dl, DAG);
5384
5385 SDValue Ptr = getValue(I.getPointerOperand());
5386 SDValue L =
5387 DAG.getAtomicLoad(ISD::NON_EXTLOAD, dl, MemVT, MemVT, InChain, Ptr, MMO);
5388
5389 SDValue OutChain = L.getValue(1);
5390 if (MemVT != VT)
5391 L = DAG.getPtrExtOrTrunc(L, dl, VT);
5392
5393 setValue(&I, L);
5394 DAG.setRoot(OutChain);
5395}
5396
5397void SelectionDAGBuilder::visitAtomicStore(const StoreInst &I) {
5398 SDLoc dl = getCurSDLoc();
5399
5400 AtomicOrdering Ordering = I.getOrdering();
5401 SyncScope::ID SSID = I.getSyncScopeID();
5402
5403 SDValue InChain = getRoot();
5404
5405 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5406 EVT MemVT =
5407 TLI.getMemValueType(DAG.getDataLayout(), I.getValueOperand()->getType());
5408
5409 if (!TLI.supportsUnalignedAtomics() &&
5410 I.getAlign().value() < MemVT.getSizeInBits() / 8)
5411 report_fatal_error("Cannot generate unaligned atomic store");
5412
5413 auto Flags = TLI.getStoreMemOperandFlags(I, DAG.getDataLayout());
5414
5415 MachineFunction &MF = DAG.getMachineFunction();
5416 MachineMemOperand *MMO = MF.getMachineMemOperand(
5417 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5418 I.getAlign(), MMOMetadata(), SSID, Ordering);
5419
5420 SDValue Val = getValue(I.getValueOperand());
5421 if (Val.getValueType() != MemVT)
5422 Val = DAG.getPtrExtOrTrunc(Val, dl, MemVT);
5423 SDValue Ptr = getValue(I.getPointerOperand());
5424
5425 SDValue OutChain =
5426 DAG.getAtomic(ISD::ATOMIC_STORE, dl, MemVT, InChain, Val, Ptr, MMO);
5427
5428 setValue(&I, OutChain);
5429 DAG.setRoot(OutChain);
5430}
5431
5432/// Check if this intrinsic call depends on the chain (1st return value)
5433/// and if it only *loads* memory.
5434/// Ignore the callsite's attributes. A specific call site may be marked with
5435/// readnone, but the lowering code will expect the chain based on the
5436/// definition.
5437std::pair<bool, bool>
5438SelectionDAGBuilder::getTargetIntrinsicCallProperties(const CallBase &I) {
5439 const Function *F = I.getCalledFunction();
5440 bool HasChain = !F->doesNotAccessMemory();
5441 bool OnlyLoad =
5442 HasChain && F->onlyReadsMemory() && F->willReturn() && F->doesNotThrow();
5443
5444 return {HasChain, OnlyLoad};
5445}
5446
5447SmallVector<SDValue, 8> SelectionDAGBuilder::getTargetIntrinsicOperands(
5448 const CallBase &I, bool HasChain, bool OnlyLoad,
5449 TargetLowering::IntrinsicInfo *TgtMemIntrinsicInfo) {
5450 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5451
5452 // Build the operand list.
5454 if (HasChain) { // If this intrinsic has side-effects, chainify it.
5455 if (OnlyLoad) {
5456 // We don't need to serialize loads against other loads.
5457 Ops.push_back(DAG.getRoot());
5458 } else {
5459 Ops.push_back(getRoot());
5460 }
5461 }
5462
5463 // Add the intrinsic ID as an integer operand if it's not a target intrinsic.
5464 if (!TgtMemIntrinsicInfo || TgtMemIntrinsicInfo->opc == ISD::INTRINSIC_VOID ||
5465 TgtMemIntrinsicInfo->opc == ISD::INTRINSIC_W_CHAIN)
5466 Ops.push_back(DAG.getTargetConstant(I.getIntrinsicID(), getCurSDLoc(),
5467 TLI.getPointerTy(DAG.getDataLayout())));
5468
5469 // Add all operands of the call to the operand list.
5470 for (unsigned i = 0, e = I.arg_size(); i != e; ++i) {
5471 const Value *Arg = I.getArgOperand(i);
5472 if (!I.paramHasAttr(i, Attribute::ImmArg)) {
5473 Ops.push_back(getValue(Arg));
5474 continue;
5475 }
5476
5477 // Use TargetConstant instead of a regular constant for immarg.
5478 EVT VT = TLI.getValueType(DAG.getDataLayout(), Arg->getType(), true);
5479 if (const ConstantInt *CI = dyn_cast<ConstantInt>(Arg)) {
5480 assert(CI->getBitWidth() <= 64 &&
5481 "large intrinsic immediates not handled");
5482 Ops.push_back(DAG.getTargetConstant(*CI, SDLoc(), VT));
5483 } else {
5484 Ops.push_back(
5485 DAG.getTargetConstantFP(*cast<ConstantFP>(Arg), SDLoc(), VT));
5486 }
5487 }
5488
5489 if (std::optional<OperandBundleUse> Bundle =
5490 I.getOperandBundle(LLVMContext::OB_deactivation_symbol)) {
5491 auto *Sym = Bundle->Inputs[0].get();
5492 SDValue SDSym = getValue(Sym);
5493 SDSym = DAG.getDeactivationSymbol(cast<GlobalValue>(Sym));
5494 Ops.push_back(SDSym);
5495 }
5496
5497 if (std::optional<OperandBundleUse> Bundle =
5498 I.getOperandBundle(LLVMContext::OB_convergencectrl)) {
5499 Value *Token = Bundle->Inputs[0].get();
5500 SDValue ConvControlToken = getValue(Token);
5501 assert(Ops.back().getValueType() != MVT::Glue &&
5502 "Did not expect another glue node here.");
5503 ConvControlToken =
5504 DAG.getNode(ISD::CONVERGENCECTRL_GLUE, {}, MVT::Glue, ConvControlToken);
5505 Ops.push_back(ConvControlToken);
5506 }
5507
5508 return Ops;
5509}
5510
5511SDVTList SelectionDAGBuilder::getTargetIntrinsicVTList(const CallBase &I,
5512 bool HasChain) {
5513 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5514
5515 SmallVector<EVT, 4> ValueVTs;
5516 ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);
5517
5518 if (HasChain)
5519 ValueVTs.push_back(MVT::Other);
5520
5521 return DAG.getVTList(ValueVTs);
5522}
5523
5524/// Get an INTRINSIC node for a target intrinsic which does not touch memory.
5525SDValue SelectionDAGBuilder::getTargetNonMemIntrinsicNode(
5526 const Type &IntrinsicVT, bool HasChain, ArrayRef<SDValue> Ops,
5527 const SDVTList &VTs) {
5528 if (!HasChain)
5529 return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, getCurSDLoc(), VTs, Ops);
5530 if (!IntrinsicVT.isVoidTy())
5531 return DAG.getNode(ISD::INTRINSIC_W_CHAIN, getCurSDLoc(), VTs, Ops);
5532 return DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops);
5533}
5534
5535/// Set root, convert return type if necessary and check alignment.
5536SDValue SelectionDAGBuilder::handleTargetIntrinsicRet(const CallBase &I,
5537 bool HasChain,
5538 bool OnlyLoad,
5539 SDValue Result) {
5540 if (HasChain) {
5541 SDValue Chain = Result.getValue(Result.getNode()->getNumValues() - 1);
5542 if (OnlyLoad)
5543 PendingLoads.push_back(Chain);
5544 else
5545 DAG.setRoot(Chain);
5546 }
5547
5548 if (I.getType()->isVoidTy())
5549 return Result;
5550
5551 if (MaybeAlign Alignment = I.getRetAlign(); InsertAssertAlign && Alignment) {
5552 // Insert `assertalign` node if there's an alignment.
5553 Result = DAG.getAssertAlign(getCurSDLoc(), Result, Alignment.valueOrOne());
5554 } else if (!isa<VectorType>(I.getType())) {
5555 Result = lowerRangeToAssertZExt(DAG, I, Result);
5556 }
5557
5558 return Result;
5559}
5560
5561/// visitTargetIntrinsic - Lower a call of a target intrinsic to an INTRINSIC
5562/// node.
5563void SelectionDAGBuilder::visitTargetIntrinsic(const CallInst &I,
5564 unsigned Intrinsic) {
5565 auto [HasChain, OnlyLoad] = getTargetIntrinsicCallProperties(I);
5566 Intrinsic::ID IntrinsicID = static_cast<Intrinsic::ID>(Intrinsic);
5567
5568 if (!DAG.getMachineFunction().getSubtarget().isIntrinsicSupported(
5569 Intrinsic)) {
5570 SDLoc DL = getCurSDLoc();
5571 DAG.getContext()->diagnose(DiagnosticInfoUnsupportedTargetIntrinsic(
5572 *I.getFunction(), IntrinsicID, DL.getDebugLoc()));
5573
5574 // The intrinsic is not available on this subtarget. Preserve the chain for
5575 // side-effecting intrinsics and lower any result to poison so that
5576 // compilation can continue and collect further diagnostics.
5577 if (HasChain && !OnlyLoad)
5578 DAG.setRoot(getRoot());
5579
5581 return;
5582 }
5583
5584 // Infos is set by getTgtMemIntrinsic.
5586 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5587 TLI.getTgtMemIntrinsic(Infos, I, DAG.getMachineFunction(), Intrinsic);
5588 // Use the first (primary) info determines the node opcode.
5589 TargetLowering::IntrinsicInfo *Info = !Infos.empty() ? &Infos[0] : nullptr;
5590
5592 getTargetIntrinsicOperands(I, HasChain, OnlyLoad, Info);
5593 SDVTList VTs = getTargetIntrinsicVTList(I, HasChain);
5594
5595 // Propagate fast-math-flags from IR to node(s).
5596 SDNodeFlags Flags;
5597 if (auto *FPMO = dyn_cast<FPMathOperator>(&I))
5598 Flags.copyFMF(*FPMO);
5599 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
5600
5601 // Create the node.
5603
5604 // In some cases, custom collection of operands from CallInst I may be needed.
5606 if (!Infos.empty()) {
5607 // This is target intrinsic that touches memory
5608 // Create MachineMemOperands for each memory access described by the target.
5609 MachineFunction &MF = DAG.getMachineFunction();
5611 for (const auto &Info : Infos) {
5612 // TODO: We currently just fallback to address space 0 if
5613 // getTgtMemIntrinsic didn't yield anything useful.
5614 MachinePointerInfo MPI;
5615 if (Info.ptrVal)
5616 MPI = MachinePointerInfo(Info.ptrVal, Info.offset);
5617 else if (Info.fallbackAddressSpace)
5618 MPI = MachinePointerInfo(*Info.fallbackAddressSpace);
5619 EVT MemVT = Info.memVT;
5620 LocationSize Size = LocationSize::precise(Info.size);
5621 if (Size.hasValue() && !Size.getValue())
5623 Align Alignment = Info.align.value_or(DAG.getEVTAlign(MemVT));
5624 MachineMemOperand *MMO = MF.getMachineMemOperand(
5625 MPI, Info.flags, Size, Alignment, I.getAAMetadata(), Info.ssid,
5626 Info.order, Info.failureOrder);
5627 MMOs.push_back(MMO);
5628 }
5629
5630 Result = DAG.getMemIntrinsicNode(Info->opc, getCurSDLoc(), VTs, Ops,
5631 Info->memVT, MMOs);
5632 } else {
5633 Result = getTargetNonMemIntrinsicNode(*I.getType(), HasChain, Ops, VTs);
5634 }
5635
5636 Result = handleTargetIntrinsicRet(I, HasChain, OnlyLoad, Result);
5637
5638 setValue(&I, Result);
5639}
5640
5641/// GetSignificand - Get the significand and build it into a floating-point
5642/// number with exponent of 1:
5643///
5644/// Op = (Op & 0x007fffff) | 0x3f800000;
5645///
5646/// where Op is the hexadecimal representation of floating point value.
5648 SDValue t1 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
5649 DAG.getConstant(0x007fffff, dl, MVT::i32));
5650 SDValue t2 = DAG.getNode(ISD::OR, dl, MVT::i32, t1,
5651 DAG.getConstant(0x3f800000, dl, MVT::i32));
5652 return DAG.getNode(ISD::BITCAST, dl, MVT::f32, t2);
5653}
5654
5655/// GetExponent - Get the exponent:
5656///
5657/// (float)(int)(((Op & 0x7f800000) >> 23) - 127);
5658///
5659/// where Op is the hexadecimal representation of floating point value.
5661 const TargetLowering &TLI, const SDLoc &dl) {
5662 SDValue t0 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
5663 DAG.getConstant(0x7f800000, dl, MVT::i32));
5664 SDValue t1 = DAG.getNode(ISD::SRL, dl, MVT::i32, t0,
5665 DAG.getShiftAmountConstant(23, MVT::i32, dl));
5666 SDValue t2 = DAG.getNode(ISD::SUB, dl, MVT::i32, t1,
5667 DAG.getConstant(127, dl, MVT::i32));
5668 return DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, t2);
5669}
5670
5671/// getF32Constant - Get 32-bit floating point constant.
5672static SDValue getF32Constant(SelectionDAG &DAG, unsigned Flt,
5673 const SDLoc &dl) {
5674 return DAG.getConstantFP(APFloat(APFloat::IEEEsingle(), APInt(32, Flt)), dl,
5675 MVT::f32);
5676}
5677
5679 SelectionDAG &DAG) {
5680 // TODO: What fast-math-flags should be set on the floating-point nodes?
5681
5682 // IntegerPartOfX = ((int32_t)(t0);
5683 SDValue IntegerPartOfX = DAG.getNode(ISD::FP_TO_SINT, dl, MVT::i32, t0);
5684
5685 // FractionalPartOfX = t0 - (float)IntegerPartOfX;
5686 SDValue t1 = DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, IntegerPartOfX);
5687 SDValue X = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0, t1);
5688
5689 // IntegerPartOfX <<= 23;
5690 IntegerPartOfX = DAG.getNode(ISD::SHL, dl, MVT::i32, IntegerPartOfX,
5691 DAG.getShiftAmountConstant(23, MVT::i32, dl));
5692
5693 SDValue TwoToFractionalPartOfX;
5694 if (LimitFloatPrecision <= 6) {
5695 // For floating-point precision of 6:
5696 //
5697 // TwoToFractionalPartOfX =
5698 // 0.997535578f +
5699 // (0.735607626f + 0.252464424f * x) * x;
5700 //
5701 // error 0.0144103317, which is 6 bits
5702 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5703 getF32Constant(DAG, 0x3e814304, dl));
5704 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5705 getF32Constant(DAG, 0x3f3c50c8, dl));
5706 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5707 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5708 getF32Constant(DAG, 0x3f7f5e7e, dl));
5709 } else if (LimitFloatPrecision <= 12) {
5710 // For floating-point precision of 12:
5711 //
5712 // TwoToFractionalPartOfX =
5713 // 0.999892986f +
5714 // (0.696457318f +
5715 // (0.224338339f + 0.792043434e-1f * x) * x) * x;
5716 //
5717 // error 0.000107046256, which is 13 to 14 bits
5718 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5719 getF32Constant(DAG, 0x3da235e3, dl));
5720 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5721 getF32Constant(DAG, 0x3e65b8f3, dl));
5722 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5723 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5724 getF32Constant(DAG, 0x3f324b07, dl));
5725 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5726 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5727 getF32Constant(DAG, 0x3f7ff8fd, dl));
5728 } else { // LimitFloatPrecision <= 18
5729 // For floating-point precision of 18:
5730 //
5731 // TwoToFractionalPartOfX =
5732 // 0.999999982f +
5733 // (0.693148872f +
5734 // (0.240227044f +
5735 // (0.554906021e-1f +
5736 // (0.961591928e-2f +
5737 // (0.136028312e-2f + 0.157059148e-3f *x)*x)*x)*x)*x)*x;
5738 // error 2.47208000*10^(-7), which is better than 18 bits
5739 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5740 getF32Constant(DAG, 0x3924b03e, dl));
5741 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5742 getF32Constant(DAG, 0x3ab24b87, dl));
5743 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5744 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5745 getF32Constant(DAG, 0x3c1d8c17, dl));
5746 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5747 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5748 getF32Constant(DAG, 0x3d634a1d, dl));
5749 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5750 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5751 getF32Constant(DAG, 0x3e75fe14, dl));
5752 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5753 SDValue t11 = DAG.getNode(ISD::FADD, dl, MVT::f32, t10,
5754 getF32Constant(DAG, 0x3f317234, dl));
5755 SDValue t12 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t11, X);
5756 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t12,
5757 getF32Constant(DAG, 0x3f800000, dl));
5758 }
5759
5760 // Add the exponent into the result in integer domain.
5761 SDValue t13 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, TwoToFractionalPartOfX);
5762 return DAG.getNode(ISD::BITCAST, dl, MVT::f32,
5763 DAG.getNode(ISD::ADD, dl, MVT::i32, t13, IntegerPartOfX));
5764}
5765
5766/// expandExp - Lower an exp intrinsic. Handles the special sequences for
5767/// limited-precision mode.
5769 const TargetLowering &TLI, SDNodeFlags Flags) {
5770 if (Op.getValueType() == MVT::f32 &&
5772
5773 // Put the exponent in the right bit position for later addition to the
5774 // final result:
5775 //
5776 // t0 = Op * log2(e)
5777
5778 // TODO: What fast-math-flags should be set here?
5779 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, Op,
5780 DAG.getConstantFP(numbers::log2ef, dl, MVT::f32));
5781 return getLimitedPrecisionExp2(t0, dl, DAG);
5782 }
5783
5784 // No special expansion.
5785 return DAG.getNode(ISD::FEXP, dl, Op.getValueType(), Op, Flags);
5786}
5787
5788/// expandLog - Lower a log intrinsic. Handles the special sequences for
5789/// limited-precision mode.
5791 const TargetLowering &TLI, SDNodeFlags Flags) {
5792 // TODO: What fast-math-flags should be set on the floating-point nodes?
5793
5794 if (Op.getValueType() == MVT::f32 &&
5796 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5797
5798 // Scale the exponent by log(2).
5799 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5800 SDValue LogOfExponent =
5801 DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5802 DAG.getConstantFP(numbers::ln2f, dl, MVT::f32));
5803
5804 // Get the significand and build it into a floating-point number with
5805 // exponent of 1.
5806 SDValue X = GetSignificand(DAG, Op1, dl);
5807
5808 SDValue LogOfMantissa;
5809 if (LimitFloatPrecision <= 6) {
5810 // For floating-point precision of 6:
5811 //
5812 // LogofMantissa =
5813 // -1.1609546f +
5814 // (1.4034025f - 0.23903021f * x) * x;
5815 //
5816 // error 0.0034276066, which is better than 8 bits
5817 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5818 getF32Constant(DAG, 0xbe74c456, dl));
5819 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5820 getF32Constant(DAG, 0x3fb3a2b1, dl));
5821 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5822 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5823 getF32Constant(DAG, 0x3f949a29, dl));
5824 } else if (LimitFloatPrecision <= 12) {
5825 // For floating-point precision of 12:
5826 //
5827 // LogOfMantissa =
5828 // -1.7417939f +
5829 // (2.8212026f +
5830 // (-1.4699568f +
5831 // (0.44717955f - 0.56570851e-1f * x) * x) * x) * x;
5832 //
5833 // error 0.000061011436, which is 14 bits
5834 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5835 getF32Constant(DAG, 0xbd67b6d6, dl));
5836 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5837 getF32Constant(DAG, 0x3ee4f4b8, dl));
5838 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5839 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5840 getF32Constant(DAG, 0x3fbc278b, dl));
5841 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5842 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5843 getF32Constant(DAG, 0x40348e95, dl));
5844 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5845 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5846 getF32Constant(DAG, 0x3fdef31a, dl));
5847 } else { // LimitFloatPrecision <= 18
5848 // For floating-point precision of 18:
5849 //
5850 // LogOfMantissa =
5851 // -2.1072184f +
5852 // (4.2372794f +
5853 // (-3.7029485f +
5854 // (2.2781945f +
5855 // (-0.87823314f +
5856 // (0.19073739f - 0.17809712e-1f * x) * x) * x) * x) * x)*x;
5857 //
5858 // error 0.0000023660568, which is better than 18 bits
5859 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5860 getF32Constant(DAG, 0xbc91e5ac, dl));
5861 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5862 getF32Constant(DAG, 0x3e4350aa, dl));
5863 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5864 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5865 getF32Constant(DAG, 0x3f60d3e3, dl));
5866 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5867 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5868 getF32Constant(DAG, 0x4011cdf0, dl));
5869 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5870 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5871 getF32Constant(DAG, 0x406cfd1c, dl));
5872 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5873 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5874 getF32Constant(DAG, 0x408797cb, dl));
5875 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5876 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t10,
5877 getF32Constant(DAG, 0x4006dcab, dl));
5878 }
5879
5880 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, LogOfMantissa);
5881 }
5882
5883 // No special expansion.
5884 return DAG.getNode(ISD::FLOG, dl, Op.getValueType(), Op, Flags);
5885}
5886
5887/// expandLog2 - Lower a log2 intrinsic. Handles the special sequences for
5888/// limited-precision mode.
5890 const TargetLowering &TLI, SDNodeFlags Flags) {
5891 // TODO: What fast-math-flags should be set on the floating-point nodes?
5892
5893 if (Op.getValueType() == MVT::f32 &&
5895 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5896
5897 // Get the exponent.
5898 SDValue LogOfExponent = GetExponent(DAG, Op1, TLI, dl);
5899
5900 // Get the significand and build it into a floating-point number with
5901 // exponent of 1.
5902 SDValue X = GetSignificand(DAG, Op1, dl);
5903
5904 // Different possible minimax approximations of significand in
5905 // floating-point for various degrees of accuracy over [1,2].
5906 SDValue Log2ofMantissa;
5907 if (LimitFloatPrecision <= 6) {
5908 // For floating-point precision of 6:
5909 //
5910 // Log2ofMantissa = -1.6749035f + (2.0246817f - .34484768f * x) * x;
5911 //
5912 // error 0.0049451742, which is more than 7 bits
5913 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5914 getF32Constant(DAG, 0xbeb08fe0, dl));
5915 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5916 getF32Constant(DAG, 0x40019463, dl));
5917 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5918 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5919 getF32Constant(DAG, 0x3fd6633d, dl));
5920 } else if (LimitFloatPrecision <= 12) {
5921 // For floating-point precision of 12:
5922 //
5923 // Log2ofMantissa =
5924 // -2.51285454f +
5925 // (4.07009056f +
5926 // (-2.12067489f +
5927 // (.645142248f - 0.816157886e-1f * x) * x) * x) * x;
5928 //
5929 // error 0.0000876136000, which is better than 13 bits
5930 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5931 getF32Constant(DAG, 0xbda7262e, dl));
5932 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5933 getF32Constant(DAG, 0x3f25280b, dl));
5934 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5935 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5936 getF32Constant(DAG, 0x4007b923, dl));
5937 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5938 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5939 getF32Constant(DAG, 0x40823e2f, dl));
5940 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5941 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5942 getF32Constant(DAG, 0x4020d29c, dl));
5943 } else { // LimitFloatPrecision <= 18
5944 // For floating-point precision of 18:
5945 //
5946 // Log2ofMantissa =
5947 // -3.0400495f +
5948 // (6.1129976f +
5949 // (-5.3420409f +
5950 // (3.2865683f +
5951 // (-1.2669343f +
5952 // (0.27515199f -
5953 // 0.25691327e-1f * x) * x) * x) * x) * x) * x;
5954 //
5955 // error 0.0000018516, which is better than 18 bits
5956 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5957 getF32Constant(DAG, 0xbcd2769e, dl));
5958 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5959 getF32Constant(DAG, 0x3e8ce0b9, dl));
5960 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5961 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5962 getF32Constant(DAG, 0x3fa22ae7, dl));
5963 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5964 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5965 getF32Constant(DAG, 0x40525723, dl));
5966 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5967 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5968 getF32Constant(DAG, 0x40aaf200, dl));
5969 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5970 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5971 getF32Constant(DAG, 0x40c39dad, dl));
5972 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5973 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t10,
5974 getF32Constant(DAG, 0x4042902c, dl));
5975 }
5976
5977 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, Log2ofMantissa);
5978 }
5979
5980 // No special expansion.
5981 return DAG.getNode(ISD::FLOG2, dl, Op.getValueType(), Op, Flags);
5982}
5983
5984/// expandLog10 - Lower a log10 intrinsic. Handles the special sequences for
5985/// limited-precision mode.
5987 const TargetLowering &TLI, SDNodeFlags Flags) {
5988 // TODO: What fast-math-flags should be set on the floating-point nodes?
5989
5990 if (Op.getValueType() == MVT::f32 &&
5992 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5993
5994 // Scale the exponent by log10(2) [0.30102999f].
5995 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5996 SDValue LogOfExponent = DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5997 getF32Constant(DAG, 0x3e9a209a, dl));
5998
5999 // Get the significand and build it into a floating-point number with
6000 // exponent of 1.
6001 SDValue X = GetSignificand(DAG, Op1, dl);
6002
6003 SDValue Log10ofMantissa;
6004 if (LimitFloatPrecision <= 6) {
6005 // For floating-point precision of 6:
6006 //
6007 // Log10ofMantissa =
6008 // -0.50419619f +
6009 // (0.60948995f - 0.10380950f * x) * x;
6010 //
6011 // error 0.0014886165, which is 6 bits
6012 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
6013 getF32Constant(DAG, 0xbdd49a13, dl));
6014 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
6015 getF32Constant(DAG, 0x3f1c0789, dl));
6016 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
6017 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
6018 getF32Constant(DAG, 0x3f011300, dl));
6019 } else if (LimitFloatPrecision <= 12) {
6020 // For floating-point precision of 12:
6021 //
6022 // Log10ofMantissa =
6023 // -0.64831180f +
6024 // (0.91751397f +
6025 // (-0.31664806f + 0.47637168e-1f * x) * x) * x;
6026 //
6027 // error 0.00019228036, which is better than 12 bits
6028 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
6029 getF32Constant(DAG, 0x3d431f31, dl));
6030 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
6031 getF32Constant(DAG, 0x3ea21fb2, dl));
6032 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
6033 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
6034 getF32Constant(DAG, 0x3f6ae232, dl));
6035 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
6036 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
6037 getF32Constant(DAG, 0x3f25f7c3, dl));
6038 } else { // LimitFloatPrecision <= 18
6039 // For floating-point precision of 18:
6040 //
6041 // Log10ofMantissa =
6042 // -0.84299375f +
6043 // (1.5327582f +
6044 // (-1.0688956f +
6045 // (0.49102474f +
6046 // (-0.12539807f + 0.13508273e-1f * x) * x) * x) * x) * x;
6047 //
6048 // error 0.0000037995730, which is better than 18 bits
6049 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
6050 getF32Constant(DAG, 0x3c5d51ce, dl));
6051 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
6052 getF32Constant(DAG, 0x3e00685a, dl));
6053 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
6054 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
6055 getF32Constant(DAG, 0x3efb6798, dl));
6056 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
6057 SDValue t5 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
6058 getF32Constant(DAG, 0x3f88d192, dl));
6059 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
6060 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
6061 getF32Constant(DAG, 0x3fc4316c, dl));
6062 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
6063 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t8,
6064 getF32Constant(DAG, 0x3f57ce70, dl));
6065 }
6066
6067 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, Log10ofMantissa);
6068 }
6069
6070 // No special expansion.
6071 return DAG.getNode(ISD::FLOG10, dl, Op.getValueType(), Op, Flags);
6072}
6073
6074/// expandExp2 - Lower an exp2 intrinsic. Handles the special sequences for
6075/// limited-precision mode.
6077 const TargetLowering &TLI, SDNodeFlags Flags) {
6078 if (Op.getValueType() == MVT::f32 &&
6080 return getLimitedPrecisionExp2(Op, dl, DAG);
6081
6082 // No special expansion.
6083 return DAG.getNode(ISD::FEXP2, dl, Op.getValueType(), Op, Flags);
6084}
6085
6086/// visitPow - Lower a pow intrinsic. Handles the special sequences for
6087/// limited-precision mode with x == 10.0f.
6089 SelectionDAG &DAG, const TargetLowering &TLI,
6090 SDNodeFlags Flags) {
6091 bool IsExp10 = false;
6092 if (LHS.getValueType() == MVT::f32 && RHS.getValueType() == MVT::f32 &&
6095 APFloat Ten(10.0f);
6096 IsExp10 = LHSC->isExactlyValue(Ten);
6097 }
6098 }
6099
6100 // TODO: What fast-math-flags should be set on the FMUL node?
6101 if (IsExp10) {
6102 // Put the exponent in the right bit position for later addition to the
6103 // final result:
6104 //
6105 // #define LOG2OF10 3.3219281f
6106 // t0 = Op * LOG2OF10;
6107 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, RHS,
6108 getF32Constant(DAG, 0x40549a78, dl));
6109 return getLimitedPrecisionExp2(t0, dl, DAG);
6110 }
6111
6112 // No special expansion.
6113 return DAG.getNode(ISD::FPOW, dl, LHS.getValueType(), LHS, RHS, Flags);
6114}
6115
6116/// ExpandPowI - Expand a llvm.powi intrinsic.
6118 SelectionDAG &DAG) {
6119 // If RHS is a constant, we can expand this out to a multiplication tree if
6120 // it's beneficial on the target, otherwise we end up lowering to a call to
6121 // __powidf2 (for example).
6123 unsigned Val = RHSC->getSExtValue();
6124
6125 // powi(x, 0) -> 1.0
6126 if (Val == 0)
6127 return DAG.getConstantFP(1.0, DL, LHS.getValueType());
6128
6130 Val, DAG.shouldOptForSize())) {
6131 // Get the exponent as a positive value.
6132 if ((int)Val < 0)
6133 Val = -Val;
6134 // We use the simple binary decomposition method to generate the multiply
6135 // sequence. There are more optimal ways to do this (for example,
6136 // powi(x,15) generates one more multiply than it should), but this has
6137 // the benefit of being both really simple and much better than a libcall.
6138 SDValue Res; // Logically starts equal to 1.0
6139 SDValue CurSquare = LHS;
6140 // TODO: Intrinsics should have fast-math-flags that propagate to these
6141 // nodes.
6142 while (Val) {
6143 if (Val & 1) {
6144 if (Res.getNode())
6145 Res =
6146 DAG.getNode(ISD::FMUL, DL, Res.getValueType(), Res, CurSquare);
6147 else
6148 Res = CurSquare; // 1.0*CurSquare.
6149 }
6150
6151 CurSquare = DAG.getNode(ISD::FMUL, DL, CurSquare.getValueType(),
6152 CurSquare, CurSquare);
6153 Val >>= 1;
6154 }
6155
6156 // If the original was negative, invert the result, producing 1/(x*x*x).
6157 if (RHSC->getSExtValue() < 0)
6158 Res = DAG.getNode(ISD::FDIV, DL, LHS.getValueType(),
6159 DAG.getConstantFP(1.0, DL, LHS.getValueType()), Res);
6160 return Res;
6161 }
6162 }
6163
6164 // Otherwise, expand to a libcall.
6165 return DAG.getNode(ISD::FPOWI, DL, LHS.getValueType(), LHS, RHS);
6166}
6167
6168static SDValue expandDivFix(unsigned Opcode, const SDLoc &DL,
6169 SDValue LHS, SDValue RHS, SDValue Scale,
6170 SelectionDAG &DAG, const TargetLowering &TLI) {
6171 EVT VT = LHS.getValueType();
6172 bool Signed = Opcode == ISD::SDIVFIX || Opcode == ISD::SDIVFIXSAT;
6173 bool Saturating = Opcode == ISD::SDIVFIXSAT || Opcode == ISD::UDIVFIXSAT;
6174 LLVMContext &Ctx = *DAG.getContext();
6175
6176 // If the type is legal but the operation isn't, this node might survive all
6177 // the way to operation legalization. If we end up there and we do not have
6178 // the ability to widen the type (if VT*2 is not legal), we cannot expand the
6179 // node.
6180
6181 // Coax the legalizer into expanding the node during type legalization instead
6182 // by bumping the size by one bit. This will force it to Promote, enabling the
6183 // early expansion and avoiding the need to expand later.
6184
6185 // We don't have to do this if Scale is 0; that can always be expanded, unless
6186 // it's a saturating signed operation. Those can experience true integer
6187 // division overflow, a case which we must avoid.
6188
6189 // FIXME: We wouldn't have to do this (or any of the early
6190 // expansion/promotion) if it was possible to expand a libcall of an
6191 // illegal type during operation legalization. But it's not, so things
6192 // get a bit hacky.
6193 unsigned ScaleInt = Scale->getAsZExtVal();
6194 if ((ScaleInt > 0 || (Saturating && Signed)) &&
6195 (TLI.isTypeLegal(VT) ||
6196 (VT.isVector() && TLI.isTypeLegal(VT.getVectorElementType())))) {
6198 Opcode, VT, ScaleInt);
6199 if (Action != TargetLowering::Legal && Action != TargetLowering::Custom) {
6200 EVT PromVT;
6201 if (VT.isScalarInteger())
6202 PromVT = EVT::getIntegerVT(Ctx, VT.getSizeInBits() + 1);
6203 else if (VT.isVector()) {
6204 PromVT = VT.getVectorElementType();
6205 PromVT = EVT::getIntegerVT(Ctx, PromVT.getSizeInBits() + 1);
6206 PromVT = EVT::getVectorVT(Ctx, PromVT, VT.getVectorElementCount());
6207 } else
6208 llvm_unreachable("Wrong VT for DIVFIX?");
6209 LHS = DAG.getExtOrTrunc(Signed, LHS, DL, PromVT);
6210 RHS = DAG.getExtOrTrunc(Signed, RHS, DL, PromVT);
6211 EVT ShiftTy = TLI.getShiftAmountTy(PromVT, DAG.getDataLayout());
6212 // For saturating operations, we need to shift up the LHS to get the
6213 // proper saturation width, and then shift down again afterwards.
6214 if (Saturating)
6215 LHS = DAG.getNode(ISD::SHL, DL, PromVT, LHS,
6216 DAG.getConstant(1, DL, ShiftTy));
6217 SDValue Res = DAG.getNode(Opcode, DL, PromVT, LHS, RHS, Scale);
6218 if (Saturating)
6219 Res = DAG.getNode(Signed ? ISD::SRA : ISD::SRL, DL, PromVT, Res,
6220 DAG.getConstant(1, DL, ShiftTy));
6221 return DAG.getZExtOrTrunc(Res, DL, VT);
6222 }
6223 }
6224
6225 return DAG.getNode(Opcode, DL, VT, LHS, RHS, Scale);
6226}
6227
6228// getUnderlyingArgRegs - Find underlying registers used for a truncated,
6229// bitcasted, or split argument. Returns a list of <Register, size in bits>
6230static void
6231getUnderlyingArgRegs(SmallVectorImpl<std::pair<Register, TypeSize>> &Regs,
6232 const SDValue &N) {
6233 switch (N.getOpcode()) {
6234 case ISD::CopyFromReg: {
6235 SDValue Op = N.getOperand(1);
6236 Regs.emplace_back(cast<RegisterSDNode>(Op)->getReg(),
6237 Op.getValueType().getSizeInBits());
6238 return;
6239 }
6240 case ISD::BITCAST:
6241 case ISD::AssertZext:
6242 case ISD::AssertSext:
6243 case ISD::TRUNCATE:
6244 getUnderlyingArgRegs(Regs, N.getOperand(0));
6245 return;
6246 case ISD::BUILD_PAIR:
6247 case ISD::BUILD_VECTOR:
6249 for (SDValue Op : N->op_values())
6250 getUnderlyingArgRegs(Regs, Op);
6251 return;
6252 default:
6253 return;
6254 }
6255}
6256
6257/// If the DbgValueInst is a dbg_value of a function argument, create the
6258/// corresponding DBG_VALUE machine instruction for it now. At the end of
6259/// instruction selection, they will be inserted to the entry BB.
6260/// We don't currently support this for variadic dbg_values, as they shouldn't
6261/// appear for function arguments or in the prologue.
6262bool SelectionDAGBuilder::EmitFuncArgumentDbgValue(
6263 const Value *V, DILocalVariable *Variable, DIExpression *Expr,
6264 DILocation *DL, FuncArgumentDbgValueKind Kind, const SDValue &N) {
6265 const Argument *Arg = dyn_cast<Argument>(V);
6266 if (!Arg)
6267 return false;
6268
6269 MachineFunction &MF = DAG.getMachineFunction();
6270 const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo();
6271
6272 // Helper to create DBG_INSTR_REFs or DBG_VALUEs, depending on what kind
6273 // we've been asked to pursue.
6274 auto MakeVRegDbgValue = [&](Register Reg, DIExpression *FragExpr,
6275 bool Indirect) {
6276 if (Reg.isVirtual() && MF.useDebugInstrRef()) {
6277 // For VRegs, in instruction referencing mode, create a DBG_INSTR_REF
6278 // pointing at the VReg, which will be patched up later.
6279 auto &Inst = TII->get(TargetOpcode::DBG_INSTR_REF);
6281 /* Reg */ Reg, /* isDef */ false, /* isImp */ false,
6282 /* isKill */ false, /* isDead */ false,
6283 /* isUndef */ false, /* isEarlyClobber */ false,
6284 /* SubReg */ 0, /* isDebug */ true)});
6285
6286 auto *NewDIExpr = FragExpr;
6287 // We don't have an "Indirect" field in DBG_INSTR_REF, fold that into
6288 // the DIExpression.
6289 if (Indirect)
6290 NewDIExpr = DIExpression::prepend(FragExpr, DIExpression::DerefBefore);
6292 NewDIExpr = DIExpression::prependOpcodes(NewDIExpr, Ops);
6293 return BuildMI(MF, DL, Inst, false, MOs, Variable, NewDIExpr);
6294 } else {
6295 // Create a completely standard DBG_VALUE.
6296 auto &Inst = TII->get(TargetOpcode::DBG_VALUE);
6297 return BuildMI(MF, DL, Inst, Indirect, Reg, Variable, FragExpr);
6298 }
6299 };
6300
6301 if (Kind == FuncArgumentDbgValueKind::Value) {
6302 // ArgDbgValues are hoisted to the beginning of the entry block. So we
6303 // should only emit as ArgDbgValue if the dbg.value intrinsic is found in
6304 // the entry block.
6305 bool IsInEntryBlock = FuncInfo.MBB == &FuncInfo.MF->front();
6306 if (!IsInEntryBlock)
6307 return false;
6308
6309 // ArgDbgValues are hoisted to the beginning of the entry block. So we
6310 // should only emit as ArgDbgValue if the dbg.value intrinsic describes a
6311 // variable that also is a param.
6312 //
6313 // Although, if we are at the top of the entry block already, we can still
6314 // emit using ArgDbgValue. This might catch some situations when the
6315 // dbg.value refers to an argument that isn't used in the entry block, so
6316 // any CopyToReg node would be optimized out and the only way to express
6317 // this DBG_VALUE is by using the physical reg (or FI) as done in this
6318 // method. ArgDbgValues are hoisted to the beginning of the entry block. So
6319 // we should only emit as ArgDbgValue if the Variable is an argument to the
6320 // current function, and the dbg.value intrinsic is found in the entry
6321 // block.
6322 bool VariableIsFunctionInputArg = Variable->isParameter() &&
6323 !DL->getInlinedAt();
6324 bool IsInPrologue = SDNodeOrder == LowestSDNodeOrder;
6325 if (!IsInPrologue && !VariableIsFunctionInputArg)
6326 return false;
6327
6328 // Here we assume that a function argument on IR level only can be used to
6329 // describe one input parameter on source level. If we for example have
6330 // source code like this
6331 //
6332 // struct A { long x, y; };
6333 // void foo(struct A a, long b) {
6334 // ...
6335 // b = a.x;
6336 // ...
6337 // }
6338 //
6339 // and IR like this
6340 //
6341 // define void @foo(i32 %a1, i32 %a2, i32 %b) {
6342 // entry:
6343 // call void @llvm.dbg.value(metadata i32 %a1, "a", DW_OP_LLVM_fragment
6344 // call void @llvm.dbg.value(metadata i32 %a2, "a", DW_OP_LLVM_fragment
6345 // call void @llvm.dbg.value(metadata i32 %b, "b",
6346 // ...
6347 // call void @llvm.dbg.value(metadata i32 %a1, "b"
6348 // ...
6349 //
6350 // then the last dbg.value is describing a parameter "b" using a value that
6351 // is an argument. But since we already has used %a1 to describe a parameter
6352 // we should not handle that last dbg.value here (that would result in an
6353 // incorrect hoisting of the DBG_VALUE to the function entry).
6354 // Notice that we allow one dbg.value per IR level argument, to accommodate
6355 // for the situation with fragments above.
6356 // If there is no node for the value being handled, we return true to skip
6357 // the normal generation of debug info, as it would kill existing debug
6358 // info for the parameter in case of duplicates.
6359 if (VariableIsFunctionInputArg) {
6360 unsigned ArgNo = Arg->getArgNo();
6361 if (ArgNo >= FuncInfo.DescribedArgs.size())
6362 FuncInfo.DescribedArgs.resize(ArgNo + 1, false);
6363 else if (!IsInPrologue && FuncInfo.DescribedArgs.test(ArgNo))
6364 return !NodeMap[V].getNode();
6365 FuncInfo.DescribedArgs.set(ArgNo);
6366 }
6367 }
6368
6369 bool IsIndirect = false;
6370 std::optional<MachineOperand> Op;
6371 // Some arguments' frame index is recorded during argument lowering.
6372 int FI = FuncInfo.getArgumentFrameIndex(Arg);
6373 if (FI != std::numeric_limits<int>::max())
6375
6377 if (!Op && N.getNode()) {
6378 getUnderlyingArgRegs(ArgRegsAndSizes, N);
6379 Register Reg;
6380 if (ArgRegsAndSizes.size() == 1)
6381 Reg = ArgRegsAndSizes.front().first;
6382
6383 if (Reg && Reg.isVirtual()) {
6384 MachineRegisterInfo &RegInfo = MF.getRegInfo();
6385 Register PR = RegInfo.getLiveInPhysReg(Reg);
6386 if (PR)
6387 Reg = PR;
6388 }
6389 if (Reg) {
6391 IsIndirect = Kind != FuncArgumentDbgValueKind::Value;
6392 }
6393 }
6394
6395 if (!Op && N.getNode()) {
6396 // Check if frame index is available.
6397 SDValue LCandidate = peekThroughBitcasts(N);
6398 if (LoadSDNode *LNode = dyn_cast<LoadSDNode>(LCandidate.getNode()))
6399 if (FrameIndexSDNode *FINode =
6400 dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
6401 Op = MachineOperand::CreateFI(FINode->getIndex());
6402 }
6403
6404 if (!Op) {
6405 // Create a DBG_VALUE for each decomposed value in ArgRegs to cover Reg
6406 auto splitMultiRegDbgValue =
6407 [&](ArrayRef<std::pair<Register, TypeSize>> SplitRegs) -> bool {
6408 unsigned Offset = 0;
6409 for (const auto &[Reg, RegSizeInBits] : SplitRegs) {
6410 // FIXME: Scalable sizes are not supported in fragment expressions.
6411 if (RegSizeInBits.isScalable())
6412 return false;
6413
6414 // If the expression is already a fragment, the current register
6415 // offset+size might extend beyond the fragment. In this case, only
6416 // the register bits that are inside the fragment are relevant.
6417 int RegFragmentSizeInBits = RegSizeInBits.getFixedValue();
6418 if (auto ExprFragmentInfo = Expr->getFragmentInfo()) {
6419 uint64_t ExprFragmentSizeInBits = ExprFragmentInfo->SizeInBits;
6420 // The register is entirely outside the expression fragment,
6421 // so is irrelevant for debug info.
6422 if (Offset >= ExprFragmentSizeInBits)
6423 break;
6424 // The register is partially outside the expression fragment, only
6425 // the low bits within the fragment are relevant for debug info.
6426 if (Offset + RegFragmentSizeInBits > ExprFragmentSizeInBits) {
6427 RegFragmentSizeInBits = ExprFragmentSizeInBits - Offset;
6428 }
6429 }
6430
6431 auto FragmentExpr = DIExpression::createFragmentExpression(
6432 Expr, Offset, RegFragmentSizeInBits);
6433 Offset += RegSizeInBits.getFixedValue();
6434 // If a valid fragment expression cannot be created, the variable's
6435 // correct value cannot be determined and so it is set as poison.
6436 if (!FragmentExpr) {
6437 SDDbgValue *SDV = DAG.getConstantDbgValue(
6438 Variable, Expr, PoisonValue::get(V->getType()), DL, SDNodeOrder);
6439 DAG.AddDbgValue(SDV, false);
6440 continue;
6441 }
6442 MachineInstr *NewMI = MakeVRegDbgValue(
6443 Reg, *FragmentExpr, Kind != FuncArgumentDbgValueKind::Value);
6444 FuncInfo.ArgDbgValues.push_back(NewMI);
6445 }
6446
6447 return true;
6448 };
6449
6450 // Check if ValueMap has reg number.
6452 VMI = FuncInfo.ValueMap.find(V);
6453 if (VMI != FuncInfo.ValueMap.end()) {
6454 const auto &TLI = DAG.getTargetLoweringInfo();
6455 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), VMI->second,
6456 V->getType(), std::nullopt);
6457 if (RFV.occupiesMultipleRegs())
6458 return splitMultiRegDbgValue(RFV.getRegsAndSizes());
6459
6460 Op = MachineOperand::CreateReg(VMI->second, false);
6461 IsIndirect = Kind != FuncArgumentDbgValueKind::Value;
6462 } else if (ArgRegsAndSizes.size() > 1) {
6463 // This was split due to the calling convention, and no virtual register
6464 // mapping exists for the value.
6465 return splitMultiRegDbgValue(ArgRegsAndSizes);
6466 }
6467 }
6468
6469 if (!Op)
6470 return false;
6471
6472 assert(Variable->isValidLocationForIntrinsic(DL) &&
6473 "Expected inlined-at fields to agree");
6474 MachineInstr *NewMI = nullptr;
6475
6476 if (Op->isReg())
6477 NewMI = MakeVRegDbgValue(Op->getReg(), Expr, IsIndirect);
6478 else
6479 NewMI = BuildMI(MF, DL, TII->get(TargetOpcode::DBG_VALUE), true, *Op,
6480 Variable, Expr);
6481
6482 // Otherwise, use ArgDbgValues.
6483 FuncInfo.ArgDbgValues.push_back(NewMI);
6484 return true;
6485}
6486
6487/// Return the appropriate SDDbgValue based on N.
6488SDDbgValue *SelectionDAGBuilder::getDbgValue(SDValue N,
6489 DILocalVariable *Variable,
6490 DIExpression *Expr,
6491 const DebugLoc &dl,
6492 unsigned DbgSDNodeOrder) {
6493 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(N.getNode())) {
6494 // Construct a FrameIndexDbgValue for FrameIndexSDNodes so we can describe
6495 // stack slot locations.
6496 //
6497 // Consider "int x = 0; int *px = &x;". There are two kinds of interesting
6498 // debug values here after optimization:
6499 //
6500 // dbg.value(i32* %px, !"int *px", !DIExpression()), and
6501 // dbg.value(i32* %px, !"int x", !DIExpression(DW_OP_deref))
6502 //
6503 // Both describe the direct values of their associated variables.
6504 return DAG.getFrameIndexDbgValue(Variable, Expr, FISDN->getIndex(),
6505 /*IsIndirect*/ false, dl, DbgSDNodeOrder);
6506 }
6507 return DAG.getDbgValue(Variable, Expr, N.getNode(), N.getResNo(),
6508 /*IsIndirect*/ false, dl, DbgSDNodeOrder);
6509}
6510
6511static unsigned FixedPointIntrinsicToOpcode(unsigned Intrinsic) {
6512 switch (Intrinsic) {
6513 case Intrinsic::smul_fix:
6514 return ISD::SMULFIX;
6515 case Intrinsic::umul_fix:
6516 return ISD::UMULFIX;
6517 case Intrinsic::smul_fix_sat:
6518 return ISD::SMULFIXSAT;
6519 case Intrinsic::umul_fix_sat:
6520 return ISD::UMULFIXSAT;
6521 case Intrinsic::sdiv_fix:
6522 return ISD::SDIVFIX;
6523 case Intrinsic::udiv_fix:
6524 return ISD::UDIVFIX;
6525 case Intrinsic::sdiv_fix_sat:
6526 return ISD::SDIVFIXSAT;
6527 case Intrinsic::udiv_fix_sat:
6528 return ISD::UDIVFIXSAT;
6529 default:
6530 llvm_unreachable("Unhandled fixed point intrinsic");
6531 }
6532}
6533
6534/// Given a @llvm.call.preallocated.setup, return the corresponding
6535/// preallocated call.
6536static const CallBase *FindPreallocatedCall(const Value *PreallocatedSetup) {
6537 assert(cast<CallBase>(PreallocatedSetup)
6539 ->getIntrinsicID() == Intrinsic::call_preallocated_setup &&
6540 "expected call_preallocated_setup Value");
6541 for (const auto *U : PreallocatedSetup->users()) {
6542 auto *UseCall = cast<CallBase>(U);
6543 const Function *Fn = UseCall->getCalledFunction();
6544 if (!Fn || Fn->getIntrinsicID() != Intrinsic::call_preallocated_arg) {
6545 return UseCall;
6546 }
6547 }
6548 llvm_unreachable("expected corresponding call to preallocated setup/arg");
6549}
6550
6551/// If DI is a debug value with an EntryValue expression, lower it using the
6552/// corresponding physical register of the associated Argument value
6553/// (guaranteed to exist by the verifier).
6554bool SelectionDAGBuilder::visitEntryValueDbgValue(
6556 DIExpression *Expr, DebugLoc DbgLoc) {
6557 if (!Expr->isEntryValue() || !hasSingleElement(Values))
6558 return false;
6559
6560 // These properties are guaranteed by the verifier.
6561 const Argument *Arg = cast<Argument>(Values[0]);
6562 assert(Arg->hasAttribute(Attribute::AttrKind::SwiftAsync));
6563
6564 auto ArgIt = FuncInfo.ValueMap.find(Arg);
6565 if (ArgIt == FuncInfo.ValueMap.end()) {
6566 LLVM_DEBUG(
6567 dbgs() << "Dropping dbg.value: expression is entry_value but "
6568 "couldn't find an associated register for the Argument\n");
6569 return true;
6570 }
6571 Register ArgVReg = ArgIt->getSecond();
6572
6573 for (auto [PhysReg, VirtReg] : FuncInfo.RegInfo->liveins())
6574 if (ArgVReg == VirtReg || ArgVReg == PhysReg) {
6575 SDDbgValue *SDV = DAG.getVRegDbgValue(
6576 Variable, Expr, PhysReg, false /*IsIndidrect*/, DbgLoc, SDNodeOrder);
6577 DAG.AddDbgValue(SDV, false /*treat as dbg.declare byval parameter*/);
6578 return true;
6579 }
6580 LLVM_DEBUG(dbgs() << "Dropping dbg.value: expression is entry_value but "
6581 "couldn't find a physical register\n");
6582 return true;
6583}
6584
6585/// Lower the call to the specified intrinsic function.
6586void SelectionDAGBuilder::visitConvergenceControl(const CallInst &I,
6587 unsigned Intrinsic) {
6588 SDLoc sdl = getCurSDLoc();
6589 switch (Intrinsic) {
6590 case Intrinsic::experimental_convergence_anchor:
6591 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_ANCHOR, sdl, MVT::Untyped));
6592 break;
6593 case Intrinsic::experimental_convergence_entry:
6594 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_ENTRY, sdl, MVT::Untyped));
6595 break;
6596 case Intrinsic::experimental_convergence_loop: {
6597 auto Bundle = I.getOperandBundle(LLVMContext::OB_convergencectrl);
6598 auto *Token = Bundle->Inputs[0].get();
6599 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_LOOP, sdl, MVT::Untyped,
6600 getValue(Token)));
6601 break;
6602 }
6603 }
6604}
6605
6606void SelectionDAGBuilder::visitVectorHistogram(const CallInst &I,
6607 unsigned IntrinsicID) {
6608 // For now, we're only lowering an 'add' histogram.
6609 // We can add others later, e.g. saturating adds, min/max.
6610 assert(IntrinsicID == Intrinsic::experimental_vector_histogram_add &&
6611 "Tried to lower unsupported histogram type");
6612 SDLoc sdl = getCurSDLoc();
6613 Value *Ptr = I.getOperand(0);
6614 SDValue Inc = getValue(I.getOperand(1));
6615 SDValue Mask = getValue(I.getOperand(2));
6616
6617 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6618 DataLayout TargetDL = DAG.getDataLayout();
6619 EVT VT = Inc.getValueType();
6620 Align Alignment = DAG.getEVTAlign(VT);
6621
6622 const MDNode *Ranges = getRangeMetadata(I);
6623
6624 SDValue Root = DAG.getRoot();
6625 SDValue Base;
6626 SDValue Index;
6627 SDValue Scale;
6628 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
6629 I.getParent(), VT.getScalarStoreSize());
6630
6631 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
6632
6633 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
6634 MachinePointerInfo(AS),
6636 MemoryLocation::UnknownSize, Alignment,
6637 MMOMetadata(I.getAAMetadata(), Ranges));
6638
6639 if (!UniformBase) {
6640 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
6641 Index = getValue(Ptr);
6642 Scale =
6643 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
6644 }
6645
6646 EVT IdxVT = Index.getValueType();
6647
6648 // Avoid using e.g. i32 as index type when the increment must be performed
6649 // on i64's.
6650 bool MustExtendIndex = VT.getScalarSizeInBits() > IdxVT.getScalarSizeInBits();
6651 EVT EltTy = MustExtendIndex ? VT : IdxVT.getVectorElementType();
6652 if (MustExtendIndex || TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
6653 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
6654 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
6655 }
6656
6657 SDValue ID = DAG.getTargetConstant(IntrinsicID, sdl, MVT::i32);
6658
6659 SDValue Ops[] = {Root, Inc, Mask, Base, Index, Scale, ID};
6660 SDValue Histogram = DAG.getMaskedHistogram(DAG.getVTList(MVT::Other), VT, sdl,
6661 Ops, MMO, ISD::SIGNED_SCALED);
6662
6663 setValue(&I, Histogram);
6664 DAG.setRoot(Histogram);
6665}
6666
6667void SelectionDAGBuilder::visitVectorExtractLastActive(const CallInst &I,
6668 unsigned Intrinsic) {
6669 assert(Intrinsic == Intrinsic::experimental_vector_extract_last_active &&
6670 "Tried lowering invalid vector extract last");
6671 SDLoc sdl = getCurSDLoc();
6672 const DataLayout &Layout = DAG.getDataLayout();
6673 SDValue Data = getValue(I.getOperand(0));
6674 SDValue Mask = getValue(I.getOperand(1));
6675
6676 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6677 EVT ResVT = TLI.getValueType(Layout, I.getType());
6678
6679 EVT ExtVT = TLI.getVectorIdxTy(Layout);
6680 SDValue Idx = DAG.getNode(ISD::VECTOR_FIND_LAST_ACTIVE, sdl, ExtVT, Mask);
6681 SDValue Result = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, sdl, ResVT, Data, Idx);
6682
6683 Value *Default = I.getOperand(2);
6685 SDValue PassThru = getValue(Default);
6686 EVT BoolVT = Mask.getValueType().getScalarType();
6687 SDValue AnyActive = DAG.getNode(ISD::VECREDUCE_OR, sdl, BoolVT, Mask);
6688 Result = DAG.getSelect(sdl, ResVT, AnyActive, Result, PassThru);
6689 }
6690
6691 setValue(&I, Result);
6692}
6693
6694/// Lower the call to the specified intrinsic function.
6695void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
6696 unsigned Intrinsic) {
6697 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6698 SDLoc sdl = getCurSDLoc();
6699 DebugLoc dl = getCurDebugLoc();
6700 SDValue Res;
6701
6702 SDNodeFlags Flags;
6703 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
6704 Flags.copyFMF(*FPOp);
6705
6706 switch (Intrinsic) {
6707 default:
6708 // By default, turn this into a target intrinsic node.
6709 visitTargetIntrinsic(I, Intrinsic);
6710 return;
6711 case Intrinsic::vscale: {
6712 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6713 setValue(&I, DAG.getVScale(sdl, VT, APInt(VT.getSizeInBits(), 1)));
6714 return;
6715 }
6716 case Intrinsic::vastart: visitVAStart(I); return;
6717 case Intrinsic::vaend: visitVAEnd(I); return;
6718 case Intrinsic::vacopy: visitVACopy(I); return;
6719 case Intrinsic::returnaddress:
6720 setValue(&I, DAG.getNode(ISD::RETURNADDR, sdl,
6721 TLI.getValueType(DAG.getDataLayout(), I.getType()),
6722 getValue(I.getArgOperand(0))));
6723 return;
6724 case Intrinsic::addressofreturnaddress:
6725 setValue(&I,
6726 DAG.getNode(ISD::ADDROFRETURNADDR, sdl,
6727 TLI.getValueType(DAG.getDataLayout(), I.getType())));
6728 return;
6729 case Intrinsic::sponentry:
6730 setValue(&I,
6731 DAG.getNode(ISD::SPONENTRY, sdl,
6732 TLI.getValueType(DAG.getDataLayout(), I.getType())));
6733 return;
6734 case Intrinsic::frameaddress:
6735 setValue(&I, DAG.getNode(ISD::FRAMEADDR, sdl,
6736 TLI.getFrameIndexTy(DAG.getDataLayout()),
6737 getValue(I.getArgOperand(0))));
6738 return;
6739 case Intrinsic::read_volatile_register:
6740 case Intrinsic::read_register: {
6741 Value *Reg = I.getArgOperand(0);
6742 SDValue Chain = getRoot();
6744 DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
6745 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6746 Res = DAG.getNode(ISD::READ_REGISTER, sdl,
6747 DAG.getVTList(VT, MVT::Other), Chain, RegName);
6748 setValue(&I, Res);
6749 DAG.setRoot(Res.getValue(1));
6750 return;
6751 }
6752 case Intrinsic::write_register: {
6753 Value *Reg = I.getArgOperand(0);
6754 Value *RegValue = I.getArgOperand(1);
6755 SDValue Chain = getRoot();
6757 DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
6758 DAG.setRoot(DAG.getNode(ISD::WRITE_REGISTER, sdl, MVT::Other, Chain,
6759 RegName, getValue(RegValue)));
6760 return;
6761 }
6762 case Intrinsic::write_volatile_register: {
6763 Value *Reg = I.getArgOperand(0);
6764 Value *RegValue = I.getArgOperand(1);
6765 SDValue Chain = getRoot();
6766 const MDNode *MD = cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata());
6767 SDValue RegName = DAG.getMDNode(MD);
6768 EVT VT = TLI.getValueType(DAG.getDataLayout(), RegValue->getType());
6769 SDValue WriteChain = DAG.getNode(ISD::WRITE_REGISTER, sdl, MVT::Other,
6770 Chain, RegName, getValue(RegValue));
6771 // FAKE_USE of the physical register marks it live after the WRITE_REGISTER,
6772 // preventing the backend from dead-eliminating the write. This is
6773 // preferred over READ_REGISTER, which would emit extra register copies
6774 // (e.g. fmov xN, dN for FP/SIMD registers).
6775 const MDString *RegStr = cast<MDString>(MD->getOperand(0));
6776 LLT Ty = VT.isSimple() ? getLLTForMVT(VT.getSimpleVT()) : LLT();
6777 const MachineFunction &MF = DAG.getMachineFunction();
6778 Register PhysReg =
6779 TLI.getRegisterByName(RegStr->getString().data(), Ty, MF);
6780 if (PhysReg.isValid()) {
6781 const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
6782 const TargetRegisterClass *RC = TRI->getMinimalPhysRegClass(PhysReg);
6783 MVT RegVT = *TRI->legalclasstypes_begin(*RC);
6784 DAG.setRoot(DAG.getNode(ISD::FAKE_USE, sdl, MVT::Other,
6785 {WriteChain, DAG.getRegister(PhysReg, RegVT)}));
6786 } else {
6787 DAG.setRoot(WriteChain);
6788 }
6789 return;
6790 }
6791 case Intrinsic::memcpy:
6792 case Intrinsic::memcpy_inline: {
6793 const auto &MCI = cast<MemCpyInst>(I);
6794 SDValue Dst = getValue(I.getArgOperand(0));
6795 SDValue Src = getValue(I.getArgOperand(1));
6796 SDValue Size = getValue(I.getArgOperand(2));
6797 assert((!MCI.isForceInlined() || isa<ConstantSDNode>(Size)) &&
6798 "memcpy_inline needs constant size");
6799 // @llvm.memcpy.inline defines 0 and 1 to both mean no alignment.
6800 Align DstAlign = MCI.getDestAlign().valueOrOne();
6801 Align SrcAlign = MCI.getSourceAlign().valueOrOne();
6802 bool isVol = MCI.isVolatile();
6803 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6804 SDValue MC = DAG.getMemcpy(Root, sdl, Dst, Src, Size, DstAlign, SrcAlign,
6805 isVol, MCI.isForceInlined(), &I, std::nullopt,
6806 MachinePointerInfo(I.getArgOperand(0)),
6807 MachinePointerInfo(I.getArgOperand(1)),
6808 I.getAAMetadata(), BatchAA);
6809 updateDAGForMaybeTailCall(MC);
6810 return;
6811 }
6812 case Intrinsic::memset:
6813 case Intrinsic::memset_inline: {
6814 const auto &MSII = cast<MemSetInst>(I);
6815 SDValue Dst = getValue(I.getArgOperand(0));
6816 SDValue Value = getValue(I.getArgOperand(1));
6817 SDValue Size = getValue(I.getArgOperand(2));
6818 assert((!MSII.isForceInlined() || isa<ConstantSDNode>(Size)) &&
6819 "memset_inline needs constant size");
6820 // @llvm.memset defines 0 and 1 to both mean no alignment.
6821 Align DstAlign = MSII.getDestAlign().valueOrOne();
6822 bool isVol = MSII.isVolatile();
6823 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6824 SDValue MC = DAG.getMemset(
6825 Root, sdl, Dst, Value, Size, DstAlign, isVol, MSII.isForceInlined(),
6826 &I, MachinePointerInfo(I.getArgOperand(0)), I.getAAMetadata());
6827 updateDAGForMaybeTailCall(MC);
6828 return;
6829 }
6830 case Intrinsic::memmove: {
6831 const auto &MMI = cast<MemMoveInst>(I);
6832 SDValue Op1 = getValue(I.getArgOperand(0));
6833 SDValue Op2 = getValue(I.getArgOperand(1));
6834 SDValue Op3 = getValue(I.getArgOperand(2));
6835 // @llvm.memmove defines 0 and 1 to both mean no alignment.
6836 Align DstAlign = MMI.getDestAlign().valueOrOne();
6837 Align SrcAlign = MMI.getSourceAlign().valueOrOne();
6838 bool isVol = MMI.isVolatile();
6839 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6840 SDValue MM = DAG.getMemmove(
6841 Root, sdl, Op1, Op2, Op3, DstAlign, SrcAlign, isVol, &I,
6842 /* OverrideTailCall */ std::nullopt,
6843 MachinePointerInfo(I.getArgOperand(0)),
6844 MachinePointerInfo(I.getArgOperand(1)), I.getAAMetadata(), BatchAA);
6845 updateDAGForMaybeTailCall(MM);
6846 return;
6847 }
6848 case Intrinsic::memcpy_element_unordered_atomic: {
6849 auto &MI = cast<AnyMemCpyInst>(I);
6850 SDValue Dst = getValue(MI.getRawDest());
6851 SDValue Src = getValue(MI.getRawSource());
6852 SDValue Length = getValue(MI.getLength());
6853
6854 Type *LengthTy = MI.getLength()->getType();
6855 unsigned ElemSz = MI.getElementSizeInBytes();
6856 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6857 SDValue MC =
6858 DAG.getAtomicMemcpy(getRoot(), sdl, Dst, Src, Length, LengthTy, ElemSz,
6859 isTC, MachinePointerInfo(MI.getRawDest()),
6860 MachinePointerInfo(MI.getRawSource()));
6861 updateDAGForMaybeTailCall(MC);
6862 return;
6863 }
6864 case Intrinsic::memmove_element_unordered_atomic: {
6865 auto &MI = cast<AnyMemMoveInst>(I);
6866 SDValue Dst = getValue(MI.getRawDest());
6867 SDValue Src = getValue(MI.getRawSource());
6868 SDValue Length = getValue(MI.getLength());
6869
6870 Type *LengthTy = MI.getLength()->getType();
6871 unsigned ElemSz = MI.getElementSizeInBytes();
6872 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6873 SDValue MC =
6874 DAG.getAtomicMemmove(getRoot(), sdl, Dst, Src, Length, LengthTy, ElemSz,
6875 isTC, MachinePointerInfo(MI.getRawDest()),
6876 MachinePointerInfo(MI.getRawSource()));
6877 updateDAGForMaybeTailCall(MC);
6878 return;
6879 }
6880 case Intrinsic::memset_element_unordered_atomic: {
6881 auto &MI = cast<AnyMemSetInst>(I);
6882 SDValue Dst = getValue(MI.getRawDest());
6883 SDValue Val = getValue(MI.getValue());
6884 SDValue Length = getValue(MI.getLength());
6885
6886 Type *LengthTy = MI.getLength()->getType();
6887 unsigned ElemSz = MI.getElementSizeInBytes();
6888 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6889 SDValue MC =
6890 DAG.getAtomicMemset(getRoot(), sdl, Dst, Val, Length, LengthTy, ElemSz,
6891 isTC, MachinePointerInfo(MI.getRawDest()));
6892 updateDAGForMaybeTailCall(MC);
6893 return;
6894 }
6895 case Intrinsic::call_preallocated_setup: {
6896 const CallBase *PreallocatedCall = FindPreallocatedCall(&I);
6897 SDValue SrcValue = DAG.getSrcValue(PreallocatedCall);
6898 SDValue Res = DAG.getNode(ISD::PREALLOCATED_SETUP, sdl, MVT::Other,
6899 getRoot(), SrcValue);
6900 setValue(&I, Res);
6901 DAG.setRoot(Res);
6902 return;
6903 }
6904 case Intrinsic::call_preallocated_arg: {
6905 const CallBase *PreallocatedCall = FindPreallocatedCall(I.getOperand(0));
6906 SDValue SrcValue = DAG.getSrcValue(PreallocatedCall);
6907 SDValue Ops[3];
6908 Ops[0] = getRoot();
6909 Ops[1] = SrcValue;
6910 Ops[2] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(1)), sdl,
6911 MVT::i32); // arg index
6912 SDValue Res = DAG.getNode(
6914 DAG.getVTList(TLI.getPointerTy(DAG.getDataLayout()), MVT::Other), Ops);
6915 setValue(&I, Res);
6916 DAG.setRoot(Res.getValue(1));
6917 return;
6918 }
6919
6920 case Intrinsic::eh_typeid_for: {
6921 // Find the type id for the given typeinfo.
6922 GlobalValue *GV = ExtractTypeInfo(I.getArgOperand(0));
6923 unsigned TypeID = DAG.getMachineFunction().getTypeIDFor(GV);
6924 Res = DAG.getConstant(TypeID, sdl, MVT::i32);
6925 setValue(&I, Res);
6926 return;
6927 }
6928
6929 case Intrinsic::eh_return_i32:
6930 case Intrinsic::eh_return_i64:
6931 DAG.getMachineFunction().setCallsEHReturn(true);
6932 DAG.setRoot(DAG.getNode(ISD::EH_RETURN, sdl,
6933 MVT::Other,
6935 getValue(I.getArgOperand(0)),
6936 getValue(I.getArgOperand(1))));
6937 return;
6938 case Intrinsic::eh_unwind_init:
6939 DAG.getMachineFunction().setCallsUnwindInit(true);
6940 return;
6941 case Intrinsic::eh_dwarf_cfa:
6942 setValue(&I, DAG.getNode(ISD::EH_DWARF_CFA, sdl,
6943 TLI.getPointerTy(DAG.getDataLayout()),
6944 getValue(I.getArgOperand(0))));
6945 return;
6946 case Intrinsic::eh_sjlj_callsite: {
6947 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(0));
6948 assert(FuncInfo.getCurrentCallSite() == 0 && "Overlapping call sites!");
6949
6950 FuncInfo.setCurrentCallSite(CI->getZExtValue());
6951 return;
6952 }
6953 case Intrinsic::eh_sjlj_functioncontext: {
6954 // Get and store the index of the function context.
6955 MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo();
6956 AllocaInst *FnCtx =
6957 cast<AllocaInst>(I.getArgOperand(0)->stripPointerCasts());
6958 int FI = FuncInfo.StaticAllocaMap[FnCtx];
6960 return;
6961 }
6962 case Intrinsic::eh_sjlj_setjmp: {
6963 SDValue Ops[2];
6964 Ops[0] = getRoot();
6965 Ops[1] = getValue(I.getArgOperand(0));
6966 SDValue Op = DAG.getNode(ISD::EH_SJLJ_SETJMP, sdl,
6967 DAG.getVTList(MVT::i32, MVT::Other), Ops);
6968 setValue(&I, Op.getValue(0));
6969 DAG.setRoot(Op.getValue(1));
6970 return;
6971 }
6972 case Intrinsic::eh_sjlj_longjmp:
6973 DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_LONGJMP, sdl, MVT::Other,
6974 getRoot(), getValue(I.getArgOperand(0))));
6975 return;
6976 case Intrinsic::eh_sjlj_setup_dispatch:
6977 DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_SETUP_DISPATCH, sdl, MVT::Other,
6978 getRoot()));
6979 return;
6980 case Intrinsic::masked_gather:
6981 visitMaskedGather(I);
6982 return;
6983 case Intrinsic::masked_load:
6984 visitMaskedLoad(I);
6985 return;
6986 case Intrinsic::masked_scatter:
6987 visitMaskedScatter(I);
6988 return;
6989 case Intrinsic::masked_store:
6990 visitMaskedStore(I);
6991 return;
6992 case Intrinsic::masked_expandload:
6993 visitMaskedLoad(I, true /* IsExpanding */);
6994 return;
6995 case Intrinsic::masked_compressstore:
6996 visitMaskedStore(I, true /* IsCompressing */);
6997 return;
6998 case Intrinsic::powi:
6999 setValue(&I, ExpandPowI(sdl, getValue(I.getArgOperand(0)),
7000 getValue(I.getArgOperand(1)), DAG));
7001 return;
7002 case Intrinsic::log:
7003 setValue(&I, expandLog(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
7004 return;
7005 case Intrinsic::log2:
7006 setValue(&I,
7007 expandLog2(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
7008 return;
7009 case Intrinsic::log10:
7010 setValue(&I,
7011 expandLog10(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
7012 return;
7013 case Intrinsic::exp:
7014 setValue(&I, expandExp(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
7015 return;
7016 case Intrinsic::exp2:
7017 setValue(&I,
7018 expandExp2(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
7019 return;
7020 case Intrinsic::pow:
7021 setValue(&I, expandPow(sdl, getValue(I.getArgOperand(0)),
7022 getValue(I.getArgOperand(1)), DAG, TLI, Flags));
7023 return;
7024 case Intrinsic::sqrt:
7025 case Intrinsic::fabs:
7026 case Intrinsic::sin:
7027 case Intrinsic::cos:
7028 case Intrinsic::tan:
7029 case Intrinsic::asin:
7030 case Intrinsic::acos:
7031 case Intrinsic::atan:
7032 case Intrinsic::sinh:
7033 case Intrinsic::cosh:
7034 case Intrinsic::tanh:
7035 case Intrinsic::exp10:
7036 case Intrinsic::floor:
7037 case Intrinsic::ceil:
7038 case Intrinsic::trunc:
7039 case Intrinsic::rint:
7040 case Intrinsic::nearbyint:
7041 case Intrinsic::round:
7042 case Intrinsic::roundeven:
7043 case Intrinsic::canonicalize: {
7044 unsigned Opcode;
7045 // clang-format off
7046 switch (Intrinsic) {
7047 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
7048 case Intrinsic::sqrt: Opcode = ISD::FSQRT; break;
7049 case Intrinsic::fabs: Opcode = ISD::FABS; break;
7050 case Intrinsic::sin: Opcode = ISD::FSIN; break;
7051 case Intrinsic::cos: Opcode = ISD::FCOS; break;
7052 case Intrinsic::tan: Opcode = ISD::FTAN; break;
7053 case Intrinsic::asin: Opcode = ISD::FASIN; break;
7054 case Intrinsic::acos: Opcode = ISD::FACOS; break;
7055 case Intrinsic::atan: Opcode = ISD::FATAN; break;
7056 case Intrinsic::sinh: Opcode = ISD::FSINH; break;
7057 case Intrinsic::cosh: Opcode = ISD::FCOSH; break;
7058 case Intrinsic::tanh: Opcode = ISD::FTANH; break;
7059 case Intrinsic::exp10: Opcode = ISD::FEXP10; break;
7060 case Intrinsic::floor: Opcode = ISD::FFLOOR; break;
7061 case Intrinsic::ceil: Opcode = ISD::FCEIL; break;
7062 case Intrinsic::trunc: Opcode = ISD::FTRUNC; break;
7063 case Intrinsic::rint: Opcode = ISD::FRINT; break;
7064 case Intrinsic::nearbyint: Opcode = ISD::FNEARBYINT; break;
7065 case Intrinsic::round: Opcode = ISD::FROUND; break;
7066 case Intrinsic::roundeven: Opcode = ISD::FROUNDEVEN; break;
7067 case Intrinsic::canonicalize: Opcode = ISD::FCANONICALIZE; break;
7068 }
7069 // clang-format on
7070
7071 setValue(&I, DAG.getNode(Opcode, sdl,
7072 getValue(I.getArgOperand(0)).getValueType(),
7073 getValue(I.getArgOperand(0)), Flags));
7074 return;
7075 }
7076 case Intrinsic::atan2:
7077 setValue(&I, DAG.getNode(ISD::FATAN2, sdl,
7078 getValue(I.getArgOperand(0)).getValueType(),
7079 getValue(I.getArgOperand(0)),
7080 getValue(I.getArgOperand(1)), Flags));
7081 return;
7082 case Intrinsic::lround:
7083 case Intrinsic::llround:
7084 case Intrinsic::lrint:
7085 case Intrinsic::llrint: {
7086 unsigned Opcode;
7087 // clang-format off
7088 switch (Intrinsic) {
7089 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
7090 case Intrinsic::lround: Opcode = ISD::LROUND; break;
7091 case Intrinsic::llround: Opcode = ISD::LLROUND; break;
7092 case Intrinsic::lrint: Opcode = ISD::LRINT; break;
7093 case Intrinsic::llrint: Opcode = ISD::LLRINT; break;
7094 }
7095 // clang-format on
7096
7097 EVT RetVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7098 setValue(&I, DAG.getNode(Opcode, sdl, RetVT,
7099 getValue(I.getArgOperand(0))));
7100 return;
7101 }
7102 case Intrinsic::minnum:
7103 setValue(&I, DAG.getNode(ISD::FMINNUM, sdl,
7104 getValue(I.getArgOperand(0)).getValueType(),
7105 getValue(I.getArgOperand(0)),
7106 getValue(I.getArgOperand(1)), Flags));
7107 return;
7108 case Intrinsic::maxnum:
7109 setValue(&I, DAG.getNode(ISD::FMAXNUM, sdl,
7110 getValue(I.getArgOperand(0)).getValueType(),
7111 getValue(I.getArgOperand(0)),
7112 getValue(I.getArgOperand(1)), Flags));
7113 return;
7114 case Intrinsic::minimum:
7115 setValue(&I, DAG.getNode(ISD::FMINIMUM, sdl,
7116 getValue(I.getArgOperand(0)).getValueType(),
7117 getValue(I.getArgOperand(0)),
7118 getValue(I.getArgOperand(1)), Flags));
7119 return;
7120 case Intrinsic::maximum:
7121 setValue(&I, DAG.getNode(ISD::FMAXIMUM, sdl,
7122 getValue(I.getArgOperand(0)).getValueType(),
7123 getValue(I.getArgOperand(0)),
7124 getValue(I.getArgOperand(1)), Flags));
7125 return;
7126 case Intrinsic::minimumnum:
7127 setValue(&I, DAG.getNode(ISD::FMINIMUMNUM, sdl,
7128 getValue(I.getArgOperand(0)).getValueType(),
7129 getValue(I.getArgOperand(0)),
7130 getValue(I.getArgOperand(1)), Flags));
7131 return;
7132 case Intrinsic::maximumnum:
7133 setValue(&I, DAG.getNode(ISD::FMAXIMUMNUM, sdl,
7134 getValue(I.getArgOperand(0)).getValueType(),
7135 getValue(I.getArgOperand(0)),
7136 getValue(I.getArgOperand(1)), Flags));
7137 return;
7138 case Intrinsic::copysign:
7139 setValue(&I, DAG.getNode(ISD::FCOPYSIGN, sdl,
7140 getValue(I.getArgOperand(0)).getValueType(),
7141 getValue(I.getArgOperand(0)),
7142 getValue(I.getArgOperand(1)), Flags));
7143 return;
7144 case Intrinsic::ldexp:
7145 setValue(&I, DAG.getNode(ISD::FLDEXP, sdl,
7146 getValue(I.getArgOperand(0)).getValueType(),
7147 getValue(I.getArgOperand(0)),
7148 getValue(I.getArgOperand(1)), Flags));
7149 return;
7150 case Intrinsic::modf:
7151 case Intrinsic::sincos:
7152 case Intrinsic::sincospi:
7153 case Intrinsic::frexp: {
7154 unsigned Opcode;
7155 switch (Intrinsic) {
7156 default:
7157 llvm_unreachable("unexpected intrinsic");
7158 case Intrinsic::sincos:
7159 Opcode = ISD::FSINCOS;
7160 break;
7161 case Intrinsic::sincospi:
7162 Opcode = ISD::FSINCOSPI;
7163 break;
7164 case Intrinsic::modf:
7165 Opcode = ISD::FMODF;
7166 break;
7167 case Intrinsic::frexp:
7168 Opcode = ISD::FFREXP;
7169 break;
7170 }
7171 SmallVector<EVT, 2> ValueVTs;
7172 ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);
7173 SDVTList VTs = DAG.getVTList(ValueVTs);
7174 setValue(
7175 &I, DAG.getNode(Opcode, sdl, VTs, getValue(I.getArgOperand(0)), Flags));
7176 return;
7177 }
7178 case Intrinsic::arithmetic_fence: {
7179 setValue(&I, DAG.getNode(ISD::ARITH_FENCE, sdl,
7180 getValue(I.getArgOperand(0)).getValueType(),
7181 getValue(I.getArgOperand(0)), Flags));
7182 return;
7183 }
7184 case Intrinsic::fma:
7185 setValue(&I, DAG.getNode(
7186 ISD::FMA, sdl, getValue(I.getArgOperand(0)).getValueType(),
7187 getValue(I.getArgOperand(0)), getValue(I.getArgOperand(1)),
7188 getValue(I.getArgOperand(2)), Flags));
7189 return;
7190#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
7191 case Intrinsic::INTRINSIC:
7192#include "llvm/IR/ConstrainedOps.def"
7193 visitConstrainedFPIntrinsic(cast<ConstrainedFPIntrinsic>(I));
7194 return;
7195#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID:
7196#include "llvm/IR/VPIntrinsics.def"
7197 visitVectorPredicationIntrinsic(cast<VPIntrinsic>(I));
7198 return;
7199 case Intrinsic::fptrunc_round: {
7200 // Get the last argument, the metadata and convert it to an integer in the
7201 // call
7202 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(1))->getMetadata();
7203 std::optional<RoundingMode> RoundMode =
7204 convertStrToRoundingMode(cast<MDString>(MD)->getString());
7205
7206 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7207
7208 // Propagate fast-math-flags from IR to node(s).
7209 SDNodeFlags Flags;
7210 Flags.copyFMF(*cast<FPMathOperator>(&I));
7211 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
7212
7214 Result = DAG.getNode(
7215 ISD::FPTRUNC_ROUND, sdl, VT, getValue(I.getArgOperand(0)),
7216 DAG.getTargetConstant((int)*RoundMode, sdl, MVT::i32));
7217 setValue(&I, Result);
7218
7219 return;
7220 }
7221 case Intrinsic::fmuladd: {
7222 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7223 if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
7224 TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), VT)) {
7225 setValue(&I, DAG.getNode(ISD::FMA, sdl,
7226 getValue(I.getArgOperand(0)).getValueType(),
7227 getValue(I.getArgOperand(0)),
7228 getValue(I.getArgOperand(1)),
7229 getValue(I.getArgOperand(2)), Flags));
7230 } else if (TLI.isOperationLegalOrCustom(ISD::FMULADD, VT)) {
7231 // TODO: Support splitting the vector.
7232 setValue(&I, DAG.getNode(ISD::FMULADD, sdl,
7233 getValue(I.getArgOperand(0)).getValueType(),
7234 getValue(I.getArgOperand(0)),
7235 getValue(I.getArgOperand(1)),
7236 getValue(I.getArgOperand(2)), Flags));
7237 } else {
7238 // TODO: Intrinsic calls should have fast-math-flags.
7239 SDValue Mul = DAG.getNode(
7240 ISD::FMUL, sdl, getValue(I.getArgOperand(0)).getValueType(),
7241 getValue(I.getArgOperand(0)), getValue(I.getArgOperand(1)), Flags);
7242 SDValue Add = DAG.getNode(ISD::FADD, sdl,
7243 getValue(I.getArgOperand(0)).getValueType(),
7244 Mul, getValue(I.getArgOperand(2)), Flags);
7245 setValue(&I, Add);
7246 }
7247 return;
7248 }
7249 case Intrinsic::fptosi_sat: {
7250 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7251 setValue(&I, DAG.getNode(ISD::FP_TO_SINT_SAT, sdl, VT,
7252 getValue(I.getArgOperand(0)),
7253 DAG.getValueType(VT.getScalarType())));
7254 return;
7255 }
7256 case Intrinsic::fptoui_sat: {
7257 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7258 setValue(&I, DAG.getNode(ISD::FP_TO_UINT_SAT, sdl, VT,
7259 getValue(I.getArgOperand(0)),
7260 DAG.getValueType(VT.getScalarType())));
7261 return;
7262 }
7263 case Intrinsic::convert_from_arbitrary_fp: {
7264 // Extract format metadata and convert to semantics enum.
7265 EVT DstVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7266 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(1))->getMetadata();
7267 StringRef FormatStr = cast<MDString>(MD)->getString();
7268 const fltSemantics *SrcSem =
7270 if (!SrcSem) {
7271 DAG.getContext()->emitError(
7272 "convert_from_arbitrary_fp: not implemented format '" + FormatStr +
7273 "'");
7274 setValue(&I, DAG.getPOISON(DstVT));
7275 return;
7276 }
7278
7279 SDValue IntVal = getValue(I.getArgOperand(0));
7280
7281 // Emit ISD::CONVERT_FROM_ARBITRARY_FP node.
7282 SDValue SemConst =
7283 DAG.getTargetConstant(static_cast<int>(SemEnum), sdl, MVT::i32);
7284 setValue(&I, DAG.getNode(ISD::CONVERT_FROM_ARBITRARY_FP, sdl, DstVT, IntVal,
7285 SemConst));
7286 return;
7287 }
7288 case Intrinsic::convert_to_arbitrary_fp: {
7289 // Extract format metadata and convert to semantics enum.
7290 EVT DstVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7291 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(1))->getMetadata();
7292 StringRef FormatStr = cast<MDString>(MD)->getString();
7293 const fltSemantics *DstSem =
7295 if (!DstSem) {
7296 DAG.getContext()->emitError(
7297 "convert_to_arbitrary_fp: not implemented format '" + FormatStr +
7298 "'");
7299 setValue(&I, DAG.getPOISON(DstVT));
7300 return;
7301 }
7303
7304 Metadata *RoundMD =
7305 cast<MetadataAsValue>(I.getArgOperand(2))->getMetadata();
7306 StringRef RoundStr = cast<MDString>(RoundMD)->getString();
7307 std::optional<RoundingMode> RoundMode = convertStrToRoundingMode(RoundStr);
7308 assert(RoundMode && *RoundMode != RoundingMode::Dynamic &&
7309 "Dynamic rounding mode should have been rejected by the verifier");
7310
7311 uint64_t Saturate =
7312 cast<ConstantInt>(I.getArgOperand(3))->getZExtValue() ? 1 : 0;
7313
7314 SDValue FloatVal = getValue(I.getArgOperand(0));
7315
7316 SDValue SemConst =
7317 DAG.getTargetConstant(static_cast<int>(SemEnum), sdl, MVT::i32);
7318 SDValue RoundConst =
7319 DAG.getTargetConstant(static_cast<int>(*RoundMode), sdl, MVT::i32);
7320 SDValue SatConst = DAG.getTargetConstant(Saturate, sdl, MVT::i32);
7321 setValue(&I, DAG.getNode(ISD::CONVERT_TO_ARBITRARY_FP, sdl, DstVT, FloatVal,
7322 SemConst, RoundConst, SatConst));
7323 return;
7324 }
7325 case Intrinsic::set_rounding:
7326 Res = DAG.getNode(ISD::SET_ROUNDING, sdl, MVT::Other,
7327 {getRoot(), getValue(I.getArgOperand(0))});
7328 setValue(&I, Res);
7329 DAG.setRoot(Res.getValue(0));
7330 return;
7331 case Intrinsic::is_fpclass: {
7332 const DataLayout DLayout = DAG.getDataLayout();
7333 EVT DestVT = TLI.getValueType(DLayout, I.getType());
7334 EVT ArgVT = TLI.getValueType(DLayout, I.getArgOperand(0)->getType());
7335 FPClassTest Test = static_cast<FPClassTest>(
7336 cast<ConstantInt>(I.getArgOperand(1))->getZExtValue());
7337 MachineFunction &MF = DAG.getMachineFunction();
7338 const Function &F = MF.getFunction();
7339 SDValue Op = getValue(I.getArgOperand(0));
7340 SDNodeFlags Flags;
7341 Flags.setNoFPExcept(
7342 !F.getAttributes().hasFnAttr(llvm::Attribute::StrictFP));
7343 // If ISD::IS_FPCLASS should be expanded, do it right now, because the
7344 // expansion can use illegal types. Making expansion early allows
7345 // legalizing these types prior to selection.
7346 if (!TLI.isOperationLegal(ISD::IS_FPCLASS, ArgVT) &&
7347 !TLI.isOperationCustom(ISD::IS_FPCLASS, ArgVT)) {
7348 SDValue Result = TLI.expandIS_FPCLASS(DestVT, Op, Test, Flags, sdl, DAG);
7349 setValue(&I, Result);
7350 return;
7351 }
7352
7353 SDValue Check = DAG.getTargetConstant(Test, sdl, MVT::i32);
7354 SDValue V = DAG.getNode(ISD::IS_FPCLASS, sdl, DestVT, {Op, Check}, Flags);
7355 setValue(&I, V);
7356 return;
7357 }
7358 case Intrinsic::get_fpenv: {
7359 const DataLayout DLayout = DAG.getDataLayout();
7360 EVT EnvVT = TLI.getValueType(DLayout, I.getType());
7361 Align TempAlign = DAG.getEVTAlign(EnvVT);
7362 SDValue Chain = getRoot();
7363 // Use GET_FPENV if it is legal or custom. Otherwise use memory-based node
7364 // and temporary storage in stack.
7365 if (TLI.isOperationLegalOrCustom(ISD::GET_FPENV, EnvVT)) {
7366 Res = DAG.getNode(
7367 ISD::GET_FPENV, sdl,
7368 DAG.getVTList(TLI.getValueType(DAG.getDataLayout(), I.getType()),
7369 MVT::Other),
7370 Chain);
7371 } else {
7372 SDValue Temp = DAG.CreateStackTemporary(EnvVT, TempAlign.value());
7373 int SPFI = cast<FrameIndexSDNode>(Temp.getNode())->getIndex();
7374 auto MPI =
7375 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI);
7376 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
7378 TempAlign);
7379 Chain = DAG.getGetFPEnv(Chain, sdl, Temp, EnvVT, MMO);
7380 Res = DAG.getLoad(EnvVT, sdl, Chain, Temp, MPI);
7381 }
7382 setValue(&I, Res);
7383 DAG.setRoot(Res.getValue(1));
7384 return;
7385 }
7386 case Intrinsic::set_fpenv: {
7387 const DataLayout DLayout = DAG.getDataLayout();
7388 SDValue Env = getValue(I.getArgOperand(0));
7389 EVT EnvVT = Env.getValueType();
7390 Align TempAlign = DAG.getEVTAlign(EnvVT);
7391 SDValue Chain = getRoot();
7392 // If SET_FPENV is custom or legal, use it. Otherwise use loading
7393 // environment from memory.
7394 if (TLI.isOperationLegalOrCustom(ISD::SET_FPENV, EnvVT)) {
7395 Chain = DAG.getNode(ISD::SET_FPENV, sdl, MVT::Other, Chain, Env);
7396 } else {
7397 // Allocate space in stack, copy environment bits into it and use this
7398 // memory in SET_FPENV_MEM.
7399 SDValue Temp = DAG.CreateStackTemporary(EnvVT, TempAlign.value());
7400 int SPFI = cast<FrameIndexSDNode>(Temp.getNode())->getIndex();
7401 auto MPI =
7402 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI);
7403 Chain = DAG.getStore(Chain, sdl, Env, Temp, MPI, TempAlign,
7405 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
7407 TempAlign);
7408 Chain = DAG.getSetFPEnv(Chain, sdl, Temp, EnvVT, MMO);
7409 }
7410 DAG.setRoot(Chain);
7411 return;
7412 }
7413 case Intrinsic::reset_fpenv:
7414 DAG.setRoot(DAG.getNode(ISD::RESET_FPENV, sdl, MVT::Other, getRoot()));
7415 return;
7416 case Intrinsic::get_fpmode:
7417 Res = DAG.getNode(
7418 ISD::GET_FPMODE, sdl,
7419 DAG.getVTList(TLI.getValueType(DAG.getDataLayout(), I.getType()),
7420 MVT::Other),
7421 DAG.getRoot());
7422 setValue(&I, Res);
7423 DAG.setRoot(Res.getValue(1));
7424 return;
7425 case Intrinsic::set_fpmode:
7426 Res = DAG.getNode(ISD::SET_FPMODE, sdl, MVT::Other, {DAG.getRoot()},
7427 getValue(I.getArgOperand(0)));
7428 DAG.setRoot(Res);
7429 return;
7430 case Intrinsic::reset_fpmode: {
7431 Res = DAG.getNode(ISD::RESET_FPMODE, sdl, MVT::Other, getRoot());
7432 DAG.setRoot(Res);
7433 return;
7434 }
7435 case Intrinsic::pcmarker: {
7436 SDValue Tmp = getValue(I.getArgOperand(0));
7437 DAG.setRoot(DAG.getNode(ISD::PCMARKER, sdl, MVT::Other, getRoot(), Tmp));
7438 return;
7439 }
7440 case Intrinsic::readcyclecounter: {
7441 SDValue Op = getRoot();
7442 Res = DAG.getNode(ISD::READCYCLECOUNTER, sdl,
7443 DAG.getVTList(MVT::i64, MVT::Other), Op);
7444 setValue(&I, Res);
7445 DAG.setRoot(Res.getValue(1));
7446 return;
7447 }
7448 case Intrinsic::readsteadycounter: {
7449 SDValue Op = getRoot();
7450 Res = DAG.getNode(ISD::READSTEADYCOUNTER, sdl,
7451 DAG.getVTList(MVT::i64, MVT::Other), Op);
7452 setValue(&I, Res);
7453 DAG.setRoot(Res.getValue(1));
7454 return;
7455 }
7456 case Intrinsic::bitreverse:
7457 setValue(&I, DAG.getNode(ISD::BITREVERSE, sdl,
7458 getValue(I.getArgOperand(0)).getValueType(),
7459 getValue(I.getArgOperand(0))));
7460 return;
7461 case Intrinsic::bswap:
7462 setValue(&I, DAG.getNode(ISD::BSWAP, sdl,
7463 getValue(I.getArgOperand(0)).getValueType(),
7464 getValue(I.getArgOperand(0))));
7465 return;
7466 case Intrinsic::cttz: {
7467 SDValue Arg = getValue(I.getArgOperand(0));
7468 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
7469 EVT Ty = Arg.getValueType();
7470 setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTTZ : ISD::CTTZ_ZERO_POISON,
7471 sdl, Ty, Arg));
7472 return;
7473 }
7474 case Intrinsic::ctlz: {
7475 SDValue Arg = getValue(I.getArgOperand(0));
7476 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
7477 EVT Ty = Arg.getValueType();
7478 setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTLZ : ISD::CTLZ_ZERO_POISON,
7479 sdl, Ty, Arg));
7480 return;
7481 }
7482 case Intrinsic::ctpop: {
7483 SDValue Arg = getValue(I.getArgOperand(0));
7484 EVT Ty = Arg.getValueType();
7485 setValue(&I, DAG.getNode(ISD::CTPOP, sdl, Ty, Arg));
7486 return;
7487 }
7488 case Intrinsic::fshl:
7489 case Intrinsic::fshr: {
7490 bool IsFSHL = Intrinsic == Intrinsic::fshl;
7491 SDValue X = getValue(I.getArgOperand(0));
7492 SDValue Y = getValue(I.getArgOperand(1));
7493 SDValue Z = getValue(I.getArgOperand(2));
7494 EVT VT = X.getValueType();
7495
7496 if (X == Y) {
7497 auto RotateOpcode = IsFSHL ? ISD::ROTL : ISD::ROTR;
7498 setValue(&I, DAG.getNode(RotateOpcode, sdl, VT, X, Z));
7499 } else {
7500 auto FunnelOpcode = IsFSHL ? ISD::FSHL : ISD::FSHR;
7501 setValue(&I, DAG.getNode(FunnelOpcode, sdl, VT, X, Y, Z));
7502 }
7503 return;
7504 }
7505 case Intrinsic::clmul: {
7506 SDValue X = getValue(I.getArgOperand(0));
7507 SDValue Y = getValue(I.getArgOperand(1));
7508 setValue(&I, DAG.getNode(ISD::CLMUL, sdl, X.getValueType(), X, Y));
7509 return;
7510 }
7511 case Intrinsic::pext: {
7512 SDValue X = getValue(I.getArgOperand(0));
7513 SDValue Y = getValue(I.getArgOperand(1));
7514 setValue(&I, DAG.getNode(ISD::PEXT, sdl, X.getValueType(), X, Y));
7515 return;
7516 }
7517 case Intrinsic::pdep: {
7518 SDValue X = getValue(I.getArgOperand(0));
7519 SDValue Y = getValue(I.getArgOperand(1));
7520 setValue(&I, DAG.getNode(ISD::PDEP, sdl, X.getValueType(), X, Y));
7521 return;
7522 }
7523 case Intrinsic::sadd_sat: {
7524 SDValue Op1 = getValue(I.getArgOperand(0));
7525 SDValue Op2 = getValue(I.getArgOperand(1));
7526 setValue(&I, DAG.getNode(ISD::SADDSAT, sdl, Op1.getValueType(), Op1, Op2));
7527 return;
7528 }
7529 case Intrinsic::uadd_sat: {
7530 SDValue Op1 = getValue(I.getArgOperand(0));
7531 SDValue Op2 = getValue(I.getArgOperand(1));
7532 setValue(&I, DAG.getNode(ISD::UADDSAT, sdl, Op1.getValueType(), Op1, Op2));
7533 return;
7534 }
7535 case Intrinsic::ssub_sat: {
7536 SDValue Op1 = getValue(I.getArgOperand(0));
7537 SDValue Op2 = getValue(I.getArgOperand(1));
7538 setValue(&I, DAG.getNode(ISD::SSUBSAT, sdl, Op1.getValueType(), Op1, Op2));
7539 return;
7540 }
7541 case Intrinsic::usub_sat: {
7542 SDValue Op1 = getValue(I.getArgOperand(0));
7543 SDValue Op2 = getValue(I.getArgOperand(1));
7544 setValue(&I, DAG.getNode(ISD::USUBSAT, sdl, Op1.getValueType(), Op1, Op2));
7545 return;
7546 }
7547 case Intrinsic::sshl_sat:
7548 case Intrinsic::ushl_sat: {
7549 SDValue Op1 = getValue(I.getArgOperand(0));
7550 SDValue Op2 = getValue(I.getArgOperand(1));
7551
7552 EVT ShiftTy = DAG.getTargetLoweringInfo().getShiftAmountTy(
7553 Op1.getValueType(), DAG.getDataLayout());
7554
7555 // Coerce the shift amount to the right type if we can. This exposes the
7556 // truncate or zext to optimization early.
7557 if (!I.getType()->isVectorTy() && Op2.getValueType() != ShiftTy) {
7558 assert(ShiftTy.getSizeInBits() >=
7560 "Unexpected shift type");
7561 Op2 = DAG.getZExtOrTrunc(Op2, getCurSDLoc(), ShiftTy);
7562 }
7563
7564 unsigned Opc =
7565 Intrinsic == Intrinsic::sshl_sat ? ISD::SSHLSAT : ISD::USHLSAT;
7566 setValue(&I, DAG.getNode(Opc, sdl, Op1.getValueType(), Op1, Op2));
7567 return;
7568 }
7569 case Intrinsic::smul_fix:
7570 case Intrinsic::umul_fix:
7571 case Intrinsic::smul_fix_sat:
7572 case Intrinsic::umul_fix_sat: {
7573 SDValue Op1 = getValue(I.getArgOperand(0));
7574 SDValue Op2 = getValue(I.getArgOperand(1));
7575 SDValue Op3 = getValue(I.getArgOperand(2));
7576 setValue(&I, DAG.getNode(FixedPointIntrinsicToOpcode(Intrinsic), sdl,
7577 Op1.getValueType(), Op1, Op2, Op3));
7578 return;
7579 }
7580 case Intrinsic::sdiv_fix:
7581 case Intrinsic::udiv_fix:
7582 case Intrinsic::sdiv_fix_sat:
7583 case Intrinsic::udiv_fix_sat: {
7584 SDValue Op1 = getValue(I.getArgOperand(0));
7585 SDValue Op2 = getValue(I.getArgOperand(1));
7586 SDValue Op3 = getValue(I.getArgOperand(2));
7588 Op1, Op2, Op3, DAG, TLI));
7589 return;
7590 }
7591 case Intrinsic::smax: {
7592 SDValue Op1 = getValue(I.getArgOperand(0));
7593 SDValue Op2 = getValue(I.getArgOperand(1));
7594 setValue(&I, DAG.getNode(ISD::SMAX, sdl, Op1.getValueType(), Op1, Op2));
7595 return;
7596 }
7597 case Intrinsic::smin: {
7598 SDValue Op1 = getValue(I.getArgOperand(0));
7599 SDValue Op2 = getValue(I.getArgOperand(1));
7600 setValue(&I, DAG.getNode(ISD::SMIN, sdl, Op1.getValueType(), Op1, Op2));
7601 return;
7602 }
7603 case Intrinsic::umax: {
7604 SDValue Op1 = getValue(I.getArgOperand(0));
7605 SDValue Op2 = getValue(I.getArgOperand(1));
7606 setValue(&I, DAG.getNode(ISD::UMAX, sdl, Op1.getValueType(), Op1, Op2));
7607 return;
7608 }
7609 case Intrinsic::umin: {
7610 SDValue Op1 = getValue(I.getArgOperand(0));
7611 SDValue Op2 = getValue(I.getArgOperand(1));
7612 setValue(&I, DAG.getNode(ISD::UMIN, sdl, Op1.getValueType(), Op1, Op2));
7613 return;
7614 }
7615 case Intrinsic::abs: {
7616 SDValue Op1 = getValue(I.getArgOperand(0));
7617 bool IntMinIsPoison = cast<ConstantInt>(I.getArgOperand(1))->isOne();
7618 unsigned Opc = IntMinIsPoison ? ISD::ABS_MIN_POISON : ISD::ABS;
7619 setValue(&I, DAG.getNode(Opc, sdl, Op1.getValueType(), Op1));
7620 return;
7621 }
7622 case Intrinsic::scmp: {
7623 SDValue Op1 = getValue(I.getArgOperand(0));
7624 SDValue Op2 = getValue(I.getArgOperand(1));
7625 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7626 setValue(&I, DAG.getNode(ISD::SCMP, sdl, DestVT, Op1, Op2));
7627 break;
7628 }
7629 case Intrinsic::ucmp: {
7630 SDValue Op1 = getValue(I.getArgOperand(0));
7631 SDValue Op2 = getValue(I.getArgOperand(1));
7632 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7633 setValue(&I, DAG.getNode(ISD::UCMP, sdl, DestVT, Op1, Op2));
7634 break;
7635 }
7636 case Intrinsic::stackaddress:
7637 case Intrinsic::stacksave: {
7638 unsigned SDOpcode = Intrinsic == Intrinsic::stackaddress ? ISD::STACKADDRESS
7640 SDValue Op = getRoot();
7641 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7642 Res = DAG.getNode(SDOpcode, sdl, DAG.getVTList(VT, MVT::Other), Op);
7643 setValue(&I, Res);
7644 DAG.setRoot(Res.getValue(1));
7645 return;
7646 }
7647 case Intrinsic::stackrestore:
7648 Res = getValue(I.getArgOperand(0));
7649 DAG.setRoot(DAG.getNode(ISD::STACKRESTORE, sdl, MVT::Other, getRoot(), Res));
7650 return;
7651 case Intrinsic::get_dynamic_area_offset: {
7652 SDValue Op = getRoot();
7653 EVT ResTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
7654 Res = DAG.getNode(ISD::GET_DYNAMIC_AREA_OFFSET, sdl, DAG.getVTList(ResTy),
7655 Op);
7656 DAG.setRoot(Op);
7657 setValue(&I, Res);
7658 return;
7659 }
7660 case Intrinsic::stackguard: {
7661 MachineFunction &MF = DAG.getMachineFunction();
7662 const Module &M = *MF.getFunction().getParent();
7663 EVT PtrTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
7664 SDValue Chain = getRoot();
7665 if (TLI.useLoadStackGuardNode(M)) {
7666 Res = getLoadStackGuard(DAG, sdl, Chain);
7667 Res = DAG.getPtrExtOrTrunc(Res, sdl, PtrTy);
7668 } else {
7669 const Value *Global = TLI.getSDagStackGuard(M, DAG.getLibcalls());
7670 if (!Global) {
7671 LLVMContext &Ctx = *DAG.getContext();
7672 Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
7673 setValue(&I, DAG.getPOISON(PtrTy));
7674 return;
7675 }
7676
7677 Align Align = DAG.getDataLayout().getPrefTypeAlign(Global->getType());
7678 Res = DAG.getLoad(PtrTy, sdl, Chain, getValue(Global),
7679 MachinePointerInfo(Global, 0), Align,
7681 }
7682 // Mix the cookie with FP if enabled. Skip if using LOAD_STACK_GUARD
7683 // with post-RA mixing (AArch64 MSVCRT), as the mixing will be done during
7684 // post-RA expansion of LOAD_STACK_GUARD.
7685 if (TLI.useStackGuardMixFP() && !TLI.useLoadStackGuardNode(M))
7686 Res = TLI.emitStackGuardMixFP(DAG, Res, sdl);
7687 DAG.setRoot(Chain);
7688 setValue(&I, Res);
7689 return;
7690 }
7691 case Intrinsic::stackprotector: {
7692 // Emit code into the DAG to store the stack guard onto the stack.
7693 MachineFunction &MF = DAG.getMachineFunction();
7694 MachineFrameInfo &MFI = MF.getFrameInfo();
7695 const Module &M = *MF.getFunction().getParent();
7696 SDValue Src, Chain = getRoot();
7697
7698 if (TLI.useLoadStackGuardNode(M))
7699 Src = getLoadStackGuard(DAG, sdl, Chain);
7700 else
7701 Src = getValue(I.getArgOperand(0)); // The guard's value.
7702
7703 AllocaInst *Slot = cast<AllocaInst>(I.getArgOperand(1));
7704
7705 int FI = FuncInfo.StaticAllocaMap[Slot];
7706 MFI.setStackProtectorIndex(FI);
7707 EVT PtrTy = TLI.getFrameIndexTy(DAG.getDataLayout());
7708
7709 SDValue FIN = DAG.getFrameIndex(FI, PtrTy);
7710
7711 // Store the stack protector onto the stack.
7712 Res = DAG.getStore(
7713 Chain, sdl, Src, FIN,
7714 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI),
7715 MaybeAlign(), MachineMemOperand::MOVolatile);
7716 setValue(&I, Res);
7717 DAG.setRoot(Res);
7718 return;
7719 }
7720 case Intrinsic::objectsize:
7721 llvm_unreachable("llvm.objectsize.* should have been lowered already");
7722
7723 case Intrinsic::is_constant:
7724 llvm_unreachable("llvm.is.constant.* should have been lowered already");
7725
7726 case Intrinsic::annotation:
7727 case Intrinsic::ptr_annotation:
7728 case Intrinsic::launder_invariant_group:
7729 case Intrinsic::strip_invariant_group:
7730 // Drop the intrinsic, but forward the value
7731 setValue(&I, getValue(I.getOperand(0)));
7732 return;
7733
7734 case Intrinsic::type_test:
7735 case Intrinsic::public_type_test:
7736 case Intrinsic::type_checked_load:
7737 case Intrinsic::type_checked_load_relative: {
7738 // These intrinsics are expected to be lowered by the LowerTypeTests pass
7739 // before code generation. Surviving until here usually indicates a
7740 // misconfiguration, for instance when devirtualization is enabled but LTO
7741 // does not actually run.
7742 DAG.getContext()->diagnose(DiagnosticInfoUnsupported(
7743 *I.getFunction(),
7744 Intrinsic::getBaseName(Intrinsic) +
7745 " intrinsic must be lowered by the LowerTypeTests pass "
7746 "before code generation",
7747 sdl.getDebugLoc()));
7748
7749 // Lower the result to poison so that compilation can continue and collect
7750 // any further diagnostics.
7751 setValueToPoison(&I, sdl);
7752 return;
7753 }
7754
7755 case Intrinsic::assume:
7756 case Intrinsic::experimental_noalias_scope_decl:
7757 case Intrinsic::var_annotation:
7758 case Intrinsic::sideeffect:
7759 // Discard annotate attributes, noalias scope declarations, assumptions, and
7760 // artificial side-effects.
7761 return;
7762
7763 case Intrinsic::codeview_annotation: {
7764 // Emit a label associated with this metadata.
7765 MachineFunction &MF = DAG.getMachineFunction();
7766 MCSymbol *Label = MF.getContext().createTempSymbol("annotation", true);
7767 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(0))->getMetadata();
7768 MF.addCodeViewAnnotation(Label, cast<MDNode>(MD));
7769 Res = DAG.getLabelNode(ISD::ANNOTATION_LABEL, sdl, getRoot(), Label);
7770 DAG.setRoot(Res);
7771 return;
7772 }
7773
7774 case Intrinsic::init_trampoline: {
7775 const Function *F = cast<Function>(I.getArgOperand(1)->stripPointerCasts());
7776
7777 SDValue Ops[6];
7778 Ops[0] = getRoot();
7779 Ops[1] = getValue(I.getArgOperand(0));
7780 Ops[2] = getValue(I.getArgOperand(1));
7781 Ops[3] = getValue(I.getArgOperand(2));
7782 Ops[4] = DAG.getSrcValue(I.getArgOperand(0));
7783 Ops[5] = DAG.getSrcValue(F);
7784
7785 Res = DAG.getNode(ISD::INIT_TRAMPOLINE, sdl, MVT::Other, Ops);
7786
7787 DAG.setRoot(Res);
7788 return;
7789 }
7790 case Intrinsic::adjust_trampoline:
7791 setValue(&I, DAG.getNode(ISD::ADJUST_TRAMPOLINE, sdl,
7792 TLI.getPointerTy(DAG.getDataLayout()),
7793 getValue(I.getArgOperand(0))));
7794 return;
7795 case Intrinsic::gcroot: {
7796 assert(DAG.getMachineFunction().getFunction().hasGC() &&
7797 "only valid in functions with gc specified, enforced by Verifier");
7798 assert(GFI && "implied by previous");
7799 const Value *Alloca = I.getArgOperand(0)->stripPointerCasts();
7800 const Constant *TypeMap = cast<Constant>(I.getArgOperand(1));
7801
7802 FrameIndexSDNode *FI = cast<FrameIndexSDNode>(getValue(Alloca).getNode());
7803 GFI->addStackRoot(FI->getIndex(), TypeMap);
7804 return;
7805 }
7806 case Intrinsic::gcread:
7807 case Intrinsic::gcwrite:
7808 llvm_unreachable("GC failed to lower gcread/gcwrite intrinsics!");
7809 case Intrinsic::get_rounding:
7810 Res = DAG.getNode(ISD::GET_ROUNDING, sdl, {MVT::i32, MVT::Other}, getRoot());
7811 setValue(&I, Res);
7812 DAG.setRoot(Res.getValue(1));
7813 return;
7814
7815 case Intrinsic::expect:
7816 case Intrinsic::expect_with_probability:
7817 // Just replace __builtin_expect(exp, c) and
7818 // __builtin_expect_with_probability(exp, c, p) with EXP.
7819 setValue(&I, getValue(I.getArgOperand(0)));
7820 return;
7821
7822 case Intrinsic::ubsantrap:
7823 case Intrinsic::debugtrap:
7824 case Intrinsic::trap: {
7825 StringRef TrapFuncName =
7826 I.getAttributes().getFnAttr("trap-func-name").getValueAsString();
7827 if (TrapFuncName.empty()) {
7828 switch (Intrinsic) {
7829 case Intrinsic::trap:
7830 DAG.setRoot(DAG.getNode(ISD::TRAP, sdl, MVT::Other, getRoot()));
7831 break;
7832 case Intrinsic::debugtrap:
7833 DAG.setRoot(DAG.getNode(ISD::DEBUGTRAP, sdl, MVT::Other, getRoot()));
7834 break;
7835 case Intrinsic::ubsantrap:
7836 DAG.setRoot(DAG.getNode(
7837 ISD::UBSANTRAP, sdl, MVT::Other, getRoot(),
7838 DAG.getTargetConstant(
7839 cast<ConstantInt>(I.getArgOperand(0))->getZExtValue(), sdl,
7840 MVT::i32)));
7841 break;
7842 default: llvm_unreachable("unknown trap intrinsic");
7843 }
7844 DAG.addNoMergeSiteInfo(DAG.getRoot().getNode(),
7845 I.hasFnAttr(Attribute::NoMerge));
7846 return;
7847 }
7849 if (Intrinsic == Intrinsic::ubsantrap) {
7850 Value *Arg = I.getArgOperand(0);
7851 Args.emplace_back(Arg, getValue(Arg));
7852 }
7853
7854 TargetLowering::CallLoweringInfo CLI(DAG);
7855 CLI.setDebugLoc(sdl).setChain(getRoot()).setLibCallee(
7856 CallingConv::C, I.getType(),
7857 DAG.getExternalSymbol(TrapFuncName.data(),
7858 TLI.getPointerTy(DAG.getDataLayout())),
7859 std::move(Args));
7860 CLI.NoMerge = I.hasFnAttr(Attribute::NoMerge);
7861 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
7862 DAG.setRoot(Result.second);
7863 return;
7864 }
7865
7866 case Intrinsic::allow_runtime_check:
7867 case Intrinsic::allow_ubsan_check:
7868 setValue(&I, getValue(ConstantInt::getTrue(I.getType())));
7869 return;
7870
7871 case Intrinsic::uadd_with_overflow:
7872 case Intrinsic::sadd_with_overflow:
7873 case Intrinsic::usub_with_overflow:
7874 case Intrinsic::ssub_with_overflow:
7875 case Intrinsic::umul_with_overflow:
7876 case Intrinsic::smul_with_overflow: {
7878 switch (Intrinsic) {
7879 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
7880 case Intrinsic::uadd_with_overflow: Op = ISD::UADDO; break;
7881 case Intrinsic::sadd_with_overflow: Op = ISD::SADDO; break;
7882 case Intrinsic::usub_with_overflow: Op = ISD::USUBO; break;
7883 case Intrinsic::ssub_with_overflow: Op = ISD::SSUBO; break;
7884 case Intrinsic::umul_with_overflow: Op = ISD::UMULO; break;
7885 case Intrinsic::smul_with_overflow: Op = ISD::SMULO; break;
7886 }
7887 SDValue Op1 = getValue(I.getArgOperand(0));
7888 SDValue Op2 = getValue(I.getArgOperand(1));
7889
7890 EVT ResultVT = Op1.getValueType();
7891 EVT OverflowVT = ResultVT.changeElementType(*Context, MVT::i1);
7892
7893 SDVTList VTs = DAG.getVTList(ResultVT, OverflowVT);
7894 setValue(&I, DAG.getNode(Op, sdl, VTs, Op1, Op2));
7895 return;
7896 }
7897 case Intrinsic::prefetch: {
7898 SDValue Ops[5];
7899 unsigned rw = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
7901 Ops[0] = DAG.getRoot();
7902 Ops[1] = getValue(I.getArgOperand(0));
7903 Ops[2] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(1)), sdl,
7904 MVT::i32);
7905 Ops[3] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(2)), sdl,
7906 MVT::i32);
7907 Ops[4] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(3)), sdl,
7908 MVT::i32);
7909 SDValue Result = DAG.getMemIntrinsicNode(
7910 ISD::PREFETCH, sdl, DAG.getVTList(MVT::Other), Ops,
7911 EVT::getIntegerVT(*Context, 8), MachinePointerInfo(I.getArgOperand(0)),
7912 /* align */ std::nullopt, Flags);
7913
7914 // Chain the prefetch in parallel with any pending loads, to stay out of
7915 // the way of later optimizations.
7916 PendingLoads.push_back(Result);
7917 Result = getRoot();
7918 DAG.setRoot(Result);
7919 return;
7920 }
7921 case Intrinsic::lifetime_start:
7922 case Intrinsic::lifetime_end: {
7923 bool IsStart = (Intrinsic == Intrinsic::lifetime_start);
7924 // Stack coloring is not enabled in O0, discard region information.
7925 if (TM.getOptLevel() == CodeGenOptLevel::None)
7926 return;
7927
7928 const AllocaInst *LifetimeObject = dyn_cast<AllocaInst>(I.getArgOperand(0));
7929 if (!LifetimeObject)
7930 return;
7931
7932 // First check that the Alloca is static, otherwise it won't have a
7933 // valid frame index.
7934 auto SI = FuncInfo.StaticAllocaMap.find(LifetimeObject);
7935 if (SI == FuncInfo.StaticAllocaMap.end())
7936 return;
7937
7938 const int FrameIndex = SI->second;
7939 Res = DAG.getLifetimeNode(IsStart, sdl, getRoot(), FrameIndex);
7940 DAG.setRoot(Res);
7941 return;
7942 }
7943 case Intrinsic::pseudoprobe: {
7944 auto Guid = cast<ConstantInt>(I.getArgOperand(0))->getZExtValue();
7945 auto Index = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
7946 auto Attr = cast<ConstantInt>(I.getArgOperand(2))->getZExtValue();
7947 Res = DAG.getPseudoProbeNode(sdl, getRoot(), Guid, Index, Attr);
7948 DAG.setRoot(Res);
7949 return;
7950 }
7951 case Intrinsic::invariant_start:
7952 // Discard region information.
7953 setValue(&I,
7954 DAG.getUNDEF(TLI.getValueType(DAG.getDataLayout(), I.getType())));
7955 return;
7956 case Intrinsic::invariant_end:
7957 // Discard region information.
7958 return;
7959 case Intrinsic::clear_cache: {
7960 SDValue InputChain = DAG.getRoot();
7961 SDValue StartVal = getValue(I.getArgOperand(0));
7962 SDValue EndVal = getValue(I.getArgOperand(1));
7963 Res = DAG.getNode(ISD::CLEAR_CACHE, sdl, DAG.getVTList(MVT::Other),
7964 {InputChain, StartVal, EndVal});
7965 setValue(&I, Res);
7966 DAG.setRoot(Res);
7967 return;
7968 }
7969 case Intrinsic::donothing:
7970 case Intrinsic::seh_try_begin:
7971 case Intrinsic::seh_scope_begin:
7972 case Intrinsic::seh_try_end:
7973 case Intrinsic::seh_scope_end:
7974 // ignore
7975 return;
7976 case Intrinsic::experimental_stackmap:
7977 visitStackmap(I);
7978 return;
7979 case Intrinsic::experimental_patchpoint_void:
7980 case Intrinsic::experimental_patchpoint:
7981 visitPatchpoint(I);
7982 return;
7983 case Intrinsic::experimental_gc_statepoint:
7985 return;
7986 case Intrinsic::experimental_gc_result:
7987 visitGCResult(cast<GCResultInst>(I));
7988 return;
7989 case Intrinsic::experimental_gc_relocate:
7990 visitGCRelocate(cast<GCRelocateInst>(I));
7991 return;
7992 case Intrinsic::instrprof_cover:
7993 llvm_unreachable("instrprof failed to lower a cover");
7994 case Intrinsic::instrprof_increment:
7995 llvm_unreachable("instrprof failed to lower an increment");
7996 case Intrinsic::instrprof_timestamp:
7997 llvm_unreachable("instrprof failed to lower a timestamp");
7998 case Intrinsic::instrprof_value_profile:
7999 llvm_unreachable("instrprof failed to lower a value profiling call");
8000 case Intrinsic::instrprof_mcdc_parameters:
8001 llvm_unreachable("instrprof failed to lower mcdc parameters");
8002 case Intrinsic::instrprof_mcdc_tvbitmap_update:
8003 llvm_unreachable("instrprof failed to lower an mcdc tvbitmap update");
8004 case Intrinsic::localescape: {
8005 MachineFunction &MF = DAG.getMachineFunction();
8006 const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo();
8007
8008 // Directly emit some LOCAL_ESCAPE machine instrs. Label assignment emission
8009 // is the same on all targets.
8010 for (unsigned Idx = 0, E = I.arg_size(); Idx < E; ++Idx) {
8011 Value *Arg = I.getArgOperand(Idx)->stripPointerCasts();
8012 if (isa<ConstantPointerNull>(Arg))
8013 continue; // Skip null pointers. They represent a hole in index space.
8014 AllocaInst *Slot = cast<AllocaInst>(Arg);
8015 assert(FuncInfo.StaticAllocaMap.count(Slot) &&
8016 "can only escape static allocas");
8017 int FI = FuncInfo.StaticAllocaMap[Slot];
8018 MCSymbol *FrameAllocSym = MF.getContext().getOrCreateFrameAllocSymbol(
8020 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, dl,
8021 TII->get(TargetOpcode::LOCAL_ESCAPE))
8022 .addSym(FrameAllocSym)
8023 .addFrameIndex(FI);
8024 }
8025
8026 return;
8027 }
8028
8029 case Intrinsic::localrecover: {
8030 // i8* @llvm.localrecover(i8* %fn, i8* %fp, i32 %idx)
8031 MachineFunction &MF = DAG.getMachineFunction();
8032
8033 // Get the symbol that defines the frame offset.
8034 auto *Fn = cast<Function>(I.getArgOperand(0)->stripPointerCasts());
8035 auto *Idx = cast<ConstantInt>(I.getArgOperand(2));
8036 unsigned IdxVal =
8037 unsigned(Idx->getLimitedValue(std::numeric_limits<int>::max()));
8038 MCSymbol *FrameAllocSym = MF.getContext().getOrCreateFrameAllocSymbol(
8040
8041 Value *FP = I.getArgOperand(1);
8042 SDValue FPVal = getValue(FP);
8043 EVT PtrVT = FPVal.getValueType();
8044
8045 // Create a MCSymbol for the label to avoid any target lowering
8046 // that would make this PC relative.
8047 SDValue OffsetSym = DAG.getMCSymbol(FrameAllocSym, PtrVT);
8048 SDValue OffsetVal =
8049 DAG.getNode(ISD::LOCAL_RECOVER, sdl, PtrVT, OffsetSym);
8050
8051 // Add the offset to the FP.
8052 SDValue Add = DAG.getMemBasePlusOffset(FPVal, OffsetVal, sdl);
8053 setValue(&I, Add);
8054
8055 return;
8056 }
8057
8058 case Intrinsic::fake_use: {
8059 Value *V = I.getArgOperand(0);
8060 SDValue Ops[2];
8061 // For Values not declared or previously used in this basic block, the
8062 // NodeMap will not have an entry, and `getValue` will assert if V has no
8063 // valid register value.
8064 auto FakeUseValue = [&]() -> SDValue {
8065 SDValue &N = NodeMap[V];
8066 if (N.getNode())
8067 return N;
8068
8069 // If there's a virtual register allocated and initialized for this
8070 // value, use it.
8071 if (SDValue copyFromReg = getCopyFromRegs(V, V->getType()))
8072 return copyFromReg;
8073 // FIXME: Do we want to preserve constants? It seems pointless.
8074 if (isa<Constant>(V))
8075 return getValue(V);
8076 return SDValue();
8077 }();
8078 if (!FakeUseValue || FakeUseValue.isUndef())
8079 return;
8080 Ops[0] = getRoot();
8081 Ops[1] = FakeUseValue;
8082 // Also, do not translate a fake use with an undef operand, or any other
8083 // empty SDValues.
8084 if (!Ops[1] || Ops[1].isUndef())
8085 return;
8086 DAG.setRoot(DAG.getNode(ISD::FAKE_USE, sdl, MVT::Other, Ops));
8087 return;
8088 }
8089
8090 case Intrinsic::reloc_none: {
8091 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(0))->getMetadata();
8092 StringRef SymbolName = cast<MDString>(MD)->getString();
8093 SDValue Ops[2] = {
8094 getRoot(),
8095 DAG.getTargetExternalSymbol(
8096 SymbolName.data(), TLI.getProgramPointerTy(DAG.getDataLayout()))};
8097 DAG.setRoot(DAG.getNode(ISD::RELOC_NONE, sdl, MVT::Other, Ops));
8098 return;
8099 }
8100
8101 case Intrinsic::cond_loop: {
8102 SDValue InputChain = DAG.getRoot();
8103 SDValue P = getValue(I.getArgOperand(0));
8104 Res = DAG.getNode(ISD::COND_LOOP, sdl, DAG.getVTList(MVT::Other),
8105 {InputChain, P});
8106 setValue(&I, Res);
8107 DAG.setRoot(Res);
8108 return;
8109 }
8110
8111 case Intrinsic::eh_exceptionpointer:
8112 case Intrinsic::eh_exceptioncode: {
8113 // Get the exception pointer vreg, copy from it, and resize it to fit.
8114 const auto *CPI = cast<CatchPadInst>(I.getArgOperand(0));
8115 MVT PtrVT = TLI.getPointerTy(DAG.getDataLayout());
8116 const TargetRegisterClass *PtrRC = TLI.getRegClassFor(PtrVT);
8117 Register VReg = FuncInfo.getCatchPadExceptionPointerVReg(CPI, PtrRC);
8118 SDValue N = DAG.getCopyFromReg(DAG.getEntryNode(), sdl, VReg, PtrVT);
8119 if (Intrinsic == Intrinsic::eh_exceptioncode)
8120 N = DAG.getZExtOrTrunc(N, sdl, MVT::i32);
8121 setValue(&I, N);
8122 return;
8123 }
8124 case Intrinsic::xray_customevent: {
8125 // Here we want to make sure that the intrinsic behaves as if it has a
8126 // specific calling convention.
8127 const auto &Triple = DAG.getTarget().getTargetTriple();
8128 if (!Triple.isAArch64(64) && Triple.getArch() != Triple::x86_64 &&
8129 Triple.getArch() != Triple::hexagon)
8130 return;
8131
8133
8134 // We want to say that we always want the arguments in registers.
8135 SDValue LogEntryVal = getValue(I.getArgOperand(0));
8136 SDValue StrSizeVal = getValue(I.getArgOperand(1));
8137 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
8138 SDValue Chain = getRoot();
8139 Ops.push_back(LogEntryVal);
8140 Ops.push_back(StrSizeVal);
8141 Ops.push_back(Chain);
8142
8143 // We need to enforce the calling convention for the callsite, so that
8144 // argument ordering is enforced correctly, and that register allocation can
8145 // see that some registers may be assumed clobbered and have to preserve
8146 // them across calls to the intrinsic.
8147 MachineSDNode *MN = DAG.getMachineNode(TargetOpcode::PATCHABLE_EVENT_CALL,
8148 sdl, NodeTys, Ops);
8149 SDValue patchableNode = SDValue(MN, 0);
8150 DAG.setRoot(patchableNode);
8151 setValue(&I, patchableNode);
8152 return;
8153 }
8154 case Intrinsic::xray_typedevent: {
8155 // Here we want to make sure that the intrinsic behaves as if it has a
8156 // specific calling convention.
8157 const auto &Triple = DAG.getTarget().getTargetTriple();
8158 if (!Triple.isAArch64(64) && Triple.getArch() != Triple::x86_64 &&
8159 Triple.getArch() != Triple::hexagon)
8160 return;
8161
8163
8164 // We want to say that we always want the arguments in registers.
8165 // It's unclear to me how manipulating the selection DAG here forces callers
8166 // to provide arguments in registers instead of on the stack.
8167 SDValue LogTypeId = getValue(I.getArgOperand(0));
8168 SDValue LogEntryVal = getValue(I.getArgOperand(1));
8169 SDValue StrSizeVal = getValue(I.getArgOperand(2));
8170 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
8171 SDValue Chain = getRoot();
8172 Ops.push_back(LogTypeId);
8173 Ops.push_back(LogEntryVal);
8174 Ops.push_back(StrSizeVal);
8175 Ops.push_back(Chain);
8176
8177 // We need to enforce the calling convention for the callsite, so that
8178 // argument ordering is enforced correctly, and that register allocation can
8179 // see that some registers may be assumed clobbered and have to preserve
8180 // them across calls to the intrinsic.
8181 MachineSDNode *MN = DAG.getMachineNode(
8182 TargetOpcode::PATCHABLE_TYPED_EVENT_CALL, sdl, NodeTys, Ops);
8183 SDValue patchableNode = SDValue(MN, 0);
8184 DAG.setRoot(patchableNode);
8185 setValue(&I, patchableNode);
8186 return;
8187 }
8188 case Intrinsic::experimental_deoptimize:
8190 return;
8191 case Intrinsic::stepvector:
8192 visitStepVector(I);
8193 return;
8194 case Intrinsic::vector_reduce_fadd:
8195 case Intrinsic::vector_reduce_fmul:
8196 case Intrinsic::vector_reduce_add:
8197 case Intrinsic::vector_reduce_mul:
8198 case Intrinsic::vector_reduce_and:
8199 case Intrinsic::vector_reduce_or:
8200 case Intrinsic::vector_reduce_xor:
8201 case Intrinsic::vector_reduce_smax:
8202 case Intrinsic::vector_reduce_smin:
8203 case Intrinsic::vector_reduce_umax:
8204 case Intrinsic::vector_reduce_umin:
8205 case Intrinsic::vector_reduce_fmax:
8206 case Intrinsic::vector_reduce_fmin:
8207 case Intrinsic::vector_reduce_fmaximum:
8208 case Intrinsic::vector_reduce_fminimum:
8209 visitVectorReduce(I, Intrinsic);
8210 return;
8211
8212 case Intrinsic::icall_branch_funnel: {
8214 Ops.push_back(getValue(I.getArgOperand(0)));
8215
8216 int64_t Offset;
8218 I.getArgOperand(1), Offset, DAG.getDataLayout()));
8219 if (!Base)
8221 "llvm.icall.branch.funnel operand must be a GlobalValue");
8222 Ops.push_back(DAG.getTargetGlobalAddress(Base, sdl, MVT::i64, 0));
8223
8224 struct BranchFunnelTarget {
8225 int64_t Offset;
8227 };
8229
8230 for (unsigned Op = 1, N = I.arg_size(); Op != N; Op += 2) {
8232 I.getArgOperand(Op), Offset, DAG.getDataLayout()));
8233 if (ElemBase != Base)
8234 report_fatal_error("all llvm.icall.branch.funnel operands must refer "
8235 "to the same GlobalValue");
8236
8237 SDValue Val = getValue(I.getArgOperand(Op + 1));
8238 auto *GA = dyn_cast<GlobalAddressSDNode>(Val);
8239 if (!GA)
8241 "llvm.icall.branch.funnel operand must be a GlobalValue");
8242 Targets.push_back({Offset, DAG.getTargetGlobalAddress(
8243 GA->getGlobal(), sdl, Val.getValueType(),
8244 GA->getOffset())});
8245 }
8246 llvm::sort(Targets,
8247 [](const BranchFunnelTarget &T1, const BranchFunnelTarget &T2) {
8248 return T1.Offset < T2.Offset;
8249 });
8250
8251 for (auto &T : Targets) {
8252 Ops.push_back(DAG.getTargetConstant(T.Offset, sdl, MVT::i32));
8253 Ops.push_back(T.Target);
8254 }
8255
8256 Ops.push_back(DAG.getRoot()); // Chain
8257 SDValue N(DAG.getMachineNode(TargetOpcode::ICALL_BRANCH_FUNNEL, sdl,
8258 MVT::Other, Ops),
8259 0);
8260 DAG.setRoot(N);
8261 setValue(&I, N);
8262 HasTailCall = true;
8263 return;
8264 }
8265
8266 case Intrinsic::wasm_landingpad_index:
8267 // Information this intrinsic contained has been transferred to
8268 // MachineFunction in SelectionDAGISel::PrepareEHLandingPad. We can safely
8269 // delete it now.
8270 return;
8271
8272 case Intrinsic::aarch64_settag:
8273 case Intrinsic::aarch64_settag_zero: {
8274 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
8275 bool ZeroMemory = Intrinsic == Intrinsic::aarch64_settag_zero;
8277 DAG, sdl, getRoot(), getValue(I.getArgOperand(0)),
8278 getValue(I.getArgOperand(1)), MachinePointerInfo(I.getArgOperand(0)),
8279 ZeroMemory);
8280 DAG.setRoot(Val);
8281 setValue(&I, Val);
8282 return;
8283 }
8284 case Intrinsic::amdgcn_cs_chain: {
8285 // At this point we don't care if it's amdgpu_cs_chain or
8286 // amdgpu_cs_chain_preserve.
8288
8289 Type *RetTy = I.getType();
8290 assert(RetTy->isVoidTy() && "Should not return");
8291
8292 SDValue Callee = getValue(I.getOperand(0));
8293
8294 // We only have 2 actual args: one for the SGPRs and one for the VGPRs.
8295 // We'll also tack the value of the EXEC mask at the end.
8297 Args.reserve(3);
8298
8299 for (unsigned Idx : {2, 3, 1}) {
8300 TargetLowering::ArgListEntry Arg(getValue(I.getOperand(Idx)),
8301 I.getOperand(Idx)->getType());
8302 Arg.setAttributes(&I, Idx);
8303 Args.push_back(Arg);
8304 }
8305
8306 assert(Args[0].IsInReg && "SGPR args should be marked inreg");
8307 assert(!Args[1].IsInReg && "VGPR args should not be marked inreg");
8308 Args[2].IsInReg = true; // EXEC should be inreg
8309
8310 // Forward the flags and any additional arguments.
8311 for (unsigned Idx = 4; Idx < I.arg_size(); ++Idx) {
8312 TargetLowering::ArgListEntry Arg(getValue(I.getOperand(Idx)),
8313 I.getOperand(Idx)->getType());
8314 Arg.setAttributes(&I, Idx);
8315 Args.push_back(Arg);
8316 }
8317
8318 TargetLowering::CallLoweringInfo CLI(DAG);
8319 CLI.setDebugLoc(getCurSDLoc())
8320 .setChain(getRoot())
8321 .setCallee(CC, RetTy, Callee, std::move(Args))
8322 .setNoReturn(true)
8323 .setTailCall(true)
8324 .setConvergent(I.isConvergent());
8325 CLI.CB = &I;
8326 std::pair<SDValue, SDValue> Result =
8327 lowerInvokable(CLI, /*EHPadBB*/ nullptr);
8328 (void)Result;
8329 assert(!Result.first.getNode() && !Result.second.getNode() &&
8330 "Should've lowered as tail call");
8331
8332 HasTailCall = true;
8333 return;
8334 }
8335 case Intrinsic::amdgcn_call_whole_wave: {
8337 bool isTailCall = I.isTailCall();
8338
8339 // The first argument is the callee. Skip it when assembling the call args.
8340 for (unsigned Idx = 1; Idx < I.arg_size(); ++Idx) {
8341 TargetLowering::ArgListEntry Arg(getValue(I.getArgOperand(Idx)),
8342 I.getArgOperand(Idx)->getType());
8343 Arg.setAttributes(&I, Idx);
8344
8345 // If we have an explicit sret argument that is an Instruction, (i.e., it
8346 // might point to function-local memory), we can't meaningfully tail-call.
8347 if (Arg.IsSRet && isa<Instruction>(I.getArgOperand(Idx)))
8348 isTailCall = false;
8349
8350 Args.push_back(Arg);
8351 }
8352
8353 SDValue ConvControlToken;
8354 if (auto Bundle = I.getOperandBundle(LLVMContext::OB_convergencectrl)) {
8355 auto *Token = Bundle->Inputs[0].get();
8356 ConvControlToken = getValue(Token);
8357 }
8358
8359 TargetLowering::CallLoweringInfo CLI(DAG);
8360 CLI.setDebugLoc(getCurSDLoc())
8361 .setChain(getRoot())
8362 .setCallee(CallingConv::AMDGPU_Gfx_WholeWave, I.getType(),
8363 getValue(I.getArgOperand(0)), std::move(Args))
8364 .setTailCall(isTailCall && canTailCall(I))
8365 .setIsPreallocated(
8366 I.countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0)
8367 .setConvergent(I.isConvergent())
8368 .setConvergenceControlToken(ConvControlToken);
8369 CLI.CB = &I;
8370
8371 std::pair<SDValue, SDValue> Result =
8372 lowerInvokable(CLI, /*EHPadBB=*/nullptr);
8373
8374 if (Result.first.getNode())
8375 setValue(&I, Result.first);
8376 return;
8377 }
8378 case Intrinsic::ptrmask: {
8379 SDValue Ptr = getValue(I.getOperand(0));
8380 SDValue Mask = getValue(I.getOperand(1));
8381
8382 // On arm64_32, pointers are 32 bits when stored in memory, but
8383 // zero-extended to 64 bits when in registers. Thus the mask is 32 bits to
8384 // match the index type, but the pointer is 64 bits, so the mask must be
8385 // zero-extended up to 64 bits to match the pointer.
8386 EVT PtrVT =
8387 TLI.getValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
8388 EVT MemVT =
8389 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
8390 assert(PtrVT == Ptr.getValueType());
8391 if (Mask.getValueType().getFixedSizeInBits() < MemVT.getFixedSizeInBits()) {
8392 // For AMDGPU buffer descriptors the mask is 48 bits, but the pointer is
8393 // 128-bit, so we have to pad the mask with ones for unused bits.
8394 auto HighOnes = DAG.getNode(
8395 ISD::SHL, sdl, PtrVT, DAG.getAllOnesConstant(sdl, PtrVT),
8396 DAG.getShiftAmountConstant(Mask.getValueType().getFixedSizeInBits(),
8397 PtrVT, sdl));
8398 Mask = DAG.getNode(ISD::OR, sdl, PtrVT,
8399 DAG.getZExtOrTrunc(Mask, sdl, PtrVT), HighOnes);
8400 } else if (Mask.getValueType() != PtrVT)
8401 Mask = DAG.getPtrExtOrTrunc(Mask, sdl, PtrVT);
8402
8403 assert(Mask.getValueType() == PtrVT);
8404 setValue(&I, DAG.getNode(ISD::AND, sdl, PtrVT, Ptr, Mask));
8405 return;
8406 }
8407 case Intrinsic::threadlocal_address: {
8408 setValue(&I, getValue(I.getOperand(0)));
8409 return;
8410 }
8411 case Intrinsic::get_active_lane_mask: {
8412 EVT CCVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8413 SDValue Index = getValue(I.getOperand(0));
8414 SDValue TripCount = getValue(I.getOperand(1));
8415 EVT ElementVT = Index.getValueType();
8416
8417 if (!TLI.shouldExpandGetActiveLaneMask(CCVT, ElementVT)) {
8418 setValue(&I, DAG.getNode(ISD::GET_ACTIVE_LANE_MASK, sdl, CCVT, Index,
8419 TripCount));
8420 return;
8421 }
8422
8423 EVT VecTy = EVT::getVectorVT(*DAG.getContext(), ElementVT,
8424 CCVT.getVectorElementCount());
8425
8426 SDValue VectorIndex = DAG.getSplat(VecTy, sdl, Index);
8427 SDValue VectorTripCount = DAG.getSplat(VecTy, sdl, TripCount);
8428 SDValue VectorStep = DAG.getStepVector(sdl, VecTy);
8429 SDValue VectorInduction = DAG.getNode(
8430 ISD::UADDSAT, sdl, VecTy, VectorIndex, VectorStep);
8431 SDValue SetCC = DAG.getSetCC(sdl, CCVT, VectorInduction,
8432 VectorTripCount, ISD::CondCode::SETULT);
8433 setValue(&I, SetCC);
8434 return;
8435 }
8436 case Intrinsic::experimental_get_vector_length: {
8437 assert(cast<ConstantInt>(I.getOperand(1))->getSExtValue() > 0 &&
8438 "Expected positive VF");
8439 unsigned VF = cast<ConstantInt>(I.getOperand(1))->getZExtValue();
8440 bool IsScalable = cast<ConstantInt>(I.getOperand(2))->isOne();
8441
8442 SDValue Count = getValue(I.getOperand(0));
8443 EVT CountVT = Count.getValueType();
8444
8445 if (!TLI.shouldExpandGetVectorLength(CountVT, VF, IsScalable)) {
8446 visitTargetIntrinsic(I, Intrinsic);
8447 return;
8448 }
8449
8450 // Expand to a umin between the trip count and the maximum elements the type
8451 // can hold.
8452 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8453
8454 // Extend the trip count to at least the result VT.
8455 if (CountVT.bitsLT(VT)) {
8456 Count = DAG.getNode(ISD::ZERO_EXTEND, sdl, VT, Count);
8457 CountVT = VT;
8458 }
8459
8460 SDValue MaxEVL = DAG.getElementCount(sdl, CountVT,
8461 ElementCount::get(VF, IsScalable));
8462
8463 SDValue UMin = DAG.getNode(ISD::UMIN, sdl, CountVT, Count, MaxEVL);
8464 // Clip to the result type if needed.
8465 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, sdl, VT, UMin);
8466
8467 setValue(&I, Trunc);
8468 return;
8469 }
8470 case Intrinsic::vector_partial_reduce_add: {
8471 SDValue Acc = getValue(I.getOperand(0));
8472 SDValue Input = getValue(I.getOperand(1));
8473 setValue(&I,
8474 DAG.getNode(ISD::PARTIAL_REDUCE_UMLA, sdl, Acc.getValueType(), Acc,
8475 Input, DAG.getConstant(1, sdl, Input.getValueType())));
8476 return;
8477 }
8478 case Intrinsic::vector_partial_reduce_fadd: {
8479 SDValue Acc = getValue(I.getOperand(0));
8480 SDValue Input = getValue(I.getOperand(1));
8481 setValue(&I, DAG.getNode(
8482 ISD::PARTIAL_REDUCE_FMLA, sdl, Acc.getValueType(), Acc,
8483 Input, DAG.getConstantFP(1.0, sdl, Input.getValueType())));
8484 return;
8485 }
8486 case Intrinsic::experimental_cttz_elts: {
8487 SDValue Op = getValue(I.getOperand(0));
8488 EVT OpVT = Op.getValueType();
8489 EVT RetTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
8490 bool ZeroIsPoison =
8491 !cast<ConstantSDNode>(getValue(I.getOperand(1)))->isZero();
8492 if (OpVT.getVectorElementType() != MVT::i1) {
8493 // Compare the input vector elements to zero & use to count trailing
8494 // zeros.
8495 SDValue AllZero = DAG.getConstant(0, sdl, OpVT);
8496 EVT I1OpVT = OpVT.changeVectorElementType(*DAG.getContext(), MVT::i1);
8497 Op = DAG.getSetCC(sdl, I1OpVT, Op, AllZero, ISD::SETNE);
8498 }
8499 setValue(&I, DAG.getNode(ZeroIsPoison ? ISD::CTTZ_ELTS_ZERO_POISON
8501 sdl, RetTy, Op));
8502 return;
8503 }
8504 case Intrinsic::vector_insert: {
8505 SDValue Vec = getValue(I.getOperand(0));
8506 SDValue SubVec = getValue(I.getOperand(1));
8507 SDValue Index = getValue(I.getOperand(2));
8508
8509 // The intrinsic's index type is i64, but the SDNode requires an index type
8510 // suitable for the target. Convert the index as required.
8511 MVT VectorIdxTy = TLI.getVectorIdxTy(DAG.getDataLayout());
8512 if (Index.getValueType() != VectorIdxTy)
8513 Index = DAG.getVectorIdxConstant(Index->getAsZExtVal(), sdl);
8514
8515 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8516 setValue(&I, DAG.getNode(ISD::INSERT_SUBVECTOR, sdl, ResultVT, Vec, SubVec,
8517 Index));
8518 return;
8519 }
8520 case Intrinsic::vector_extract: {
8521 SDValue Vec = getValue(I.getOperand(0));
8522 SDValue Index = getValue(I.getOperand(1));
8523 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8524
8525 // The intrinsic's index type is i64, but the SDNode requires an index type
8526 // suitable for the target. Convert the index as required.
8527 MVT VectorIdxTy = TLI.getVectorIdxTy(DAG.getDataLayout());
8528 if (Index.getValueType() != VectorIdxTy)
8529 Index = DAG.getVectorIdxConstant(Index->getAsZExtVal(), sdl);
8530
8531 setValue(&I,
8532 DAG.getNode(ISD::EXTRACT_SUBVECTOR, sdl, ResultVT, Vec, Index));
8533 return;
8534 }
8535 case Intrinsic::experimental_vector_match: {
8536 SDValue Op1 = getValue(I.getOperand(0));
8537 SDValue Op2 = getValue(I.getOperand(1));
8538 SDValue Mask = getValue(I.getOperand(2));
8539 EVT ResVT = Mask.getValueType();
8540 setValue(&I, DAG.getNode(ISD::VECTOR_MATCH, sdl, ResVT, Op1, Op2, Mask));
8541 return;
8542 }
8543 case Intrinsic::vector_reverse:
8544 visitVectorReverse(I);
8545 return;
8546 case Intrinsic::vector_splice_left:
8547 case Intrinsic::vector_splice_right:
8548 visitVectorSplice(I);
8549 return;
8550 case Intrinsic::callbr_landingpad:
8551 visitCallBrLandingPad(I);
8552 return;
8553 case Intrinsic::vector_interleave2:
8554 visitVectorInterleave(I, 2);
8555 return;
8556 case Intrinsic::vector_interleave3:
8557 visitVectorInterleave(I, 3);
8558 return;
8559 case Intrinsic::vector_interleave4:
8560 visitVectorInterleave(I, 4);
8561 return;
8562 case Intrinsic::vector_interleave5:
8563 visitVectorInterleave(I, 5);
8564 return;
8565 case Intrinsic::vector_interleave6:
8566 visitVectorInterleave(I, 6);
8567 return;
8568 case Intrinsic::vector_interleave7:
8569 visitVectorInterleave(I, 7);
8570 return;
8571 case Intrinsic::vector_interleave8:
8572 visitVectorInterleave(I, 8);
8573 return;
8574 case Intrinsic::vector_deinterleave2:
8575 visitVectorDeinterleave(I, 2);
8576 return;
8577 case Intrinsic::vector_deinterleave3:
8578 visitVectorDeinterleave(I, 3);
8579 return;
8580 case Intrinsic::vector_deinterleave4:
8581 visitVectorDeinterleave(I, 4);
8582 return;
8583 case Intrinsic::vector_deinterleave5:
8584 visitVectorDeinterleave(I, 5);
8585 return;
8586 case Intrinsic::vector_deinterleave6:
8587 visitVectorDeinterleave(I, 6);
8588 return;
8589 case Intrinsic::vector_deinterleave7:
8590 visitVectorDeinterleave(I, 7);
8591 return;
8592 case Intrinsic::vector_deinterleave8:
8593 visitVectorDeinterleave(I, 8);
8594 return;
8595 case Intrinsic::experimental_vector_compress:
8596 setValue(&I, DAG.getNode(ISD::VECTOR_COMPRESS, sdl,
8597 getValue(I.getArgOperand(0)).getValueType(),
8598 getValue(I.getArgOperand(0)),
8599 getValue(I.getArgOperand(1)),
8600 getValue(I.getArgOperand(2)), Flags));
8601 return;
8602 case Intrinsic::experimental_convergence_anchor:
8603 case Intrinsic::experimental_convergence_entry:
8604 case Intrinsic::experimental_convergence_loop:
8605 visitConvergenceControl(I, Intrinsic);
8606 return;
8607 case Intrinsic::experimental_vector_histogram_add: {
8608 visitVectorHistogram(I, Intrinsic);
8609 return;
8610 }
8611 case Intrinsic::experimental_vector_extract_last_active: {
8612 visitVectorExtractLastActive(I, Intrinsic);
8613 return;
8614 }
8615 case Intrinsic::loop_dependence_war_mask:
8616 setValue(&I,
8618 EVT::getEVT(I.getType()), getValue(I.getOperand(0)),
8619 getValue(I.getOperand(1)), getValue(I.getOperand(2)),
8620 DAG.getConstant(0, sdl, MVT::i64)));
8621 return;
8622 case Intrinsic::loop_dependence_raw_mask:
8623 setValue(&I,
8625 EVT::getEVT(I.getType()), getValue(I.getOperand(0)),
8626 getValue(I.getOperand(1)), getValue(I.getOperand(2)),
8627 DAG.getConstant(0, sdl, MVT::i64)));
8628 return;
8629 case Intrinsic::masked_udiv:
8630 setValue(&I,
8631 DAG.getNode(ISD::MASKED_UDIV, sdl, EVT::getEVT(I.getType()),
8632 getValue(I.getOperand(0)), getValue(I.getOperand(1)),
8633 getValue(I.getOperand(2))));
8634 return;
8635 case Intrinsic::masked_sdiv:
8636 setValue(&I,
8637 DAG.getNode(ISD::MASKED_SDIV, sdl, EVT::getEVT(I.getType()),
8638 getValue(I.getOperand(0)), getValue(I.getOperand(1)),
8639 getValue(I.getOperand(2))));
8640 return;
8641 case Intrinsic::masked_urem:
8642 setValue(&I,
8643 DAG.getNode(ISD::MASKED_UREM, sdl, EVT::getEVT(I.getType()),
8644 getValue(I.getOperand(0)), getValue(I.getOperand(1)),
8645 getValue(I.getOperand(2))));
8646 return;
8647 case Intrinsic::masked_srem:
8648 setValue(&I,
8649 DAG.getNode(ISD::MASKED_SREM, sdl, EVT::getEVT(I.getType()),
8650 getValue(I.getOperand(0)), getValue(I.getOperand(1)),
8651 getValue(I.getOperand(2))));
8652 return;
8653 }
8654}
8655
8656void SelectionDAGBuilder::pushFPOpOutChain(SDValue Result,
8658 assert(Result.getNode()->getNumValues() == 2);
8659 SDValue OutChain = Result.getValue(1);
8660 assert(OutChain.getValueType() == MVT::Other);
8661
8662 // Instead of updating the root immediately, push the produced chain to the
8663 // appropriate list, deferring the update until the root is requested. In this
8664 // case, the nodes from the lists are chained using TokenFactor, indicating
8665 // that the operations are independent.
8666 //
8667 // In particular, the root is updated before any call that might access the
8668 // floating-point environment, except for constrained intrinsics.
8669 switch (EB) {
8672 PendingConstrainedFP.push_back(OutChain);
8673 break;
8675 PendingConstrainedFPStrict.push_back(OutChain);
8676 break;
8677 }
8678}
8679
8680void SelectionDAGBuilder::visitConstrainedFPIntrinsic(
8681 const ConstrainedFPIntrinsic &FPI) {
8682 SDLoc sdl = getCurSDLoc();
8683
8684 // We do not need to serialize constrained FP intrinsics against
8685 // each other or against (nonvolatile) loads, so they can be
8686 // chained like loads.
8688 SDValue Chain = getFPOperationRoot(EB);
8690 Opers.push_back(Chain);
8691 for (unsigned I = 0, E = FPI.getNonMetadataArgCount(); I != E; ++I)
8692 Opers.push_back(getValue(FPI.getArgOperand(I)));
8693
8694 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8695 EVT VT = TLI.getValueType(DAG.getDataLayout(), FPI.getType());
8696 SDVTList VTs = DAG.getVTList(VT, MVT::Other);
8697
8698 SDNodeFlags Flags;
8700 Flags.setNoFPExcept(true);
8701
8702 if (auto *FPOp = dyn_cast<FPMathOperator>(&FPI))
8703 Flags.copyFMF(*FPOp);
8704
8705 unsigned Opcode;
8706 switch (FPI.getIntrinsicID()) {
8707 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
8708#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
8709 case Intrinsic::INTRINSIC: \
8710 Opcode = ISD::STRICT_##DAGN; \
8711 break;
8712#include "llvm/IR/ConstrainedOps.def"
8713 case Intrinsic::experimental_constrained_fmuladd: {
8714 Opcode = ISD::STRICT_FMA;
8715 // Break fmuladd into fmul and fadd.
8716 if (TM.Options.AllowFPOpFusion == FPOpFusion::Strict ||
8717 !TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), VT)) {
8718 Opers.pop_back();
8719 SDValue Mul = DAG.getNode(ISD::STRICT_FMUL, sdl, VTs, Opers, Flags);
8720 pushFPOpOutChain(Mul, EB);
8721 Opcode = ISD::STRICT_FADD;
8722 Opers.clear();
8723 Opers.push_back(Mul.getValue(1));
8724 Opers.push_back(Mul.getValue(0));
8725 Opers.push_back(getValue(FPI.getArgOperand(2)));
8726 }
8727 break;
8728 }
8729 }
8730
8731 // A few strict DAG nodes carry additional operands that are not
8732 // set up by the default code above.
8733 switch (Opcode) {
8734 default: break;
8736 Opers.push_back(
8737 DAG.getTargetConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout())));
8738 break;
8739 case ISD::STRICT_FSETCC:
8740 case ISD::STRICT_FSETCCS: {
8741 auto *FPCmp = dyn_cast<ConstrainedFPCmpIntrinsic>(&FPI);
8742 ISD::CondCode Condition = getFCmpCondCode(FPCmp->getPredicate());
8743 if (DAG.isKnownNeverNaN(Opers[1]) && DAG.isKnownNeverNaN(Opers[2]))
8744 Condition = getFCmpCodeWithoutNaN(Condition);
8745 Opers.push_back(DAG.getCondCode(Condition));
8746 break;
8747 }
8748 }
8749
8750 SDValue Result = DAG.getNode(Opcode, sdl, VTs, Opers, Flags);
8751 pushFPOpOutChain(Result, EB);
8752
8753 SDValue FPResult = Result.getValue(0);
8754 setValue(&FPI, FPResult);
8755}
8756
8757static unsigned getISDForVPIntrinsic(const VPIntrinsic &VPIntrin) {
8758 std::optional<unsigned> ResOPC;
8759 switch (VPIntrin.getIntrinsicID()) {
8760 case Intrinsic::vp_cttz_elts: {
8761 bool IsZeroPoison = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8762 ResOPC = IsZeroPoison ? ISD::VP_CTTZ_ELTS_ZERO_POISON : ISD::VP_CTTZ_ELTS;
8763 break;
8764 }
8765#define HELPER_MAP_VPID_TO_VPSD(VPID, VPSD) \
8766 case Intrinsic::VPID: \
8767 ResOPC = ISD::VPSD; \
8768 break;
8769#include "llvm/IR/VPIntrinsics.def"
8770 }
8771
8772 if (!ResOPC)
8774 "Inconsistency: no SDNode available for this VPIntrinsic!");
8775
8776 if (*ResOPC == ISD::VP_REDUCE_SEQ_FADD ||
8777 *ResOPC == ISD::VP_REDUCE_SEQ_FMUL) {
8778 if (VPIntrin.getFastMathFlags().allowReassoc())
8779 return *ResOPC == ISD::VP_REDUCE_SEQ_FADD ? ISD::VP_REDUCE_FADD
8780 : ISD::VP_REDUCE_FMUL;
8781 }
8782
8783 return *ResOPC;
8784}
8785
8786void SelectionDAGBuilder::visitVPLoad(
8787 const VPIntrinsic &VPIntrin, EVT VT,
8788 const SmallVectorImpl<SDValue> &OpValues) {
8789 SDLoc DL = getCurSDLoc();
8790 Value *PtrOperand = VPIntrin.getArgOperand(0);
8791 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8792 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8793 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8794 SDValue LD;
8795 // Do not serialize variable-length loads of constant memory with
8796 // anything.
8797 if (!Alignment)
8798 Alignment = DAG.getEVTAlign(VT);
8799 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8800 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8801 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8802 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8803 MachineMemOperand::Flags MMOFlags =
8804 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8805 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8806 MachinePointerInfo(PtrOperand), MMOFlags,
8808 MMOMetadata(AAInfo, Ranges));
8809 LD = DAG.getLoadVP(VT, DL, InChain, OpValues[0], OpValues[1], OpValues[2],
8810 MMO, false /*IsExpanding */);
8811 if (AddToChain)
8812 PendingLoads.push_back(LD.getValue(1));
8813 setValue(&VPIntrin, LD);
8814}
8815
8816void SelectionDAGBuilder::visitVPLoadFF(
8817 const VPIntrinsic &VPIntrin, EVT VT, EVT EVLVT,
8818 const SmallVectorImpl<SDValue> &OpValues) {
8819 assert(OpValues.size() == 3 && "Unexpected number of operands");
8820 SDLoc DL = getCurSDLoc();
8821 Value *PtrOperand = VPIntrin.getArgOperand(0);
8822 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8823 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8824 const MDNode *Ranges = VPIntrin.getMetadata(LLVMContext::MD_range);
8825 SDValue LD;
8826 // Do not serialize variable-length loads of constant memory with
8827 // anything.
8828 if (!Alignment)
8829 Alignment = DAG.getEVTAlign(VT);
8830 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8831 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8832 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8833 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8834 MachinePointerInfo(PtrOperand), MachineMemOperand::MOLoad,
8836 MMOMetadata(AAInfo, Ranges));
8837 LD = DAG.getLoadFFVP(VT, DL, InChain, OpValues[0], OpValues[1], OpValues[2],
8838 MMO);
8839 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, EVLVT, LD.getValue(1));
8840 if (AddToChain)
8841 PendingLoads.push_back(LD.getValue(2));
8842 setValue(&VPIntrin, DAG.getMergeValues({LD.getValue(0), Trunc}, DL));
8843}
8844
8845void SelectionDAGBuilder::visitVPGather(
8846 const VPIntrinsic &VPIntrin, EVT VT,
8847 const SmallVectorImpl<SDValue> &OpValues) {
8848 SDLoc DL = getCurSDLoc();
8849 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8850 Value *PtrOperand = VPIntrin.getArgOperand(0);
8851 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8852 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8853 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8854 SDValue LD;
8855 if (!Alignment)
8856 Alignment = DAG.getEVTAlign(VT.getScalarType());
8857 unsigned AS =
8858 PtrOperand->getType()->getScalarType()->getPointerAddressSpace();
8859 MachineMemOperand::Flags MMOFlags =
8860 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8861 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8862 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8863 *Alignment, MMOMetadata(AAInfo, Ranges));
8864 SDValue Base, Index, Scale;
8865 bool UniformBase =
8866 getUniformBase(PtrOperand, Base, Index, Scale, this, VPIntrin.getParent(),
8867 VT.getScalarStoreSize());
8868 if (!UniformBase) {
8869 Base = DAG.getConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout()));
8870 Index = getValue(PtrOperand);
8871 Scale = DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout()));
8872 }
8873 EVT IdxVT = Index.getValueType();
8874 EVT EltTy = IdxVT.getVectorElementType();
8875 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
8876 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
8877 Index = DAG.getNode(ISD::SIGN_EXTEND, DL, NewIdxVT, Index);
8878 }
8879 LD = DAG.getGatherVP(
8880 DAG.getVTList(VT, MVT::Other), VT, DL,
8881 {DAG.getRoot(), Base, Index, Scale, OpValues[1], OpValues[2]}, MMO,
8883 PendingLoads.push_back(LD.getValue(1));
8884 setValue(&VPIntrin, LD);
8885}
8886
8887void SelectionDAGBuilder::visitVPStore(
8888 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8889 SDLoc DL = getCurSDLoc();
8890 Value *PtrOperand = VPIntrin.getArgOperand(1);
8891 EVT VT = OpValues[0].getValueType();
8892 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8893 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8894 SDValue ST;
8895 if (!Alignment)
8896 Alignment = DAG.getEVTAlign(VT);
8897 SDValue Ptr = OpValues[1];
8898 SDValue Offset = DAG.getPOISON(Ptr.getValueType());
8899 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8900 MachineMemOperand::Flags MMOFlags =
8901 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8902 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8903 MachinePointerInfo(PtrOperand), MMOFlags,
8904 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo);
8905 ST = DAG.getStoreVP(getMemoryRoot(), DL, OpValues[0], Ptr, Offset,
8906 OpValues[2], OpValues[3], VT, MMO, ISD::UNINDEXED,
8907 /* IsTruncating */ false, /*IsCompressing*/ false);
8908 DAG.setRoot(ST);
8909 setValue(&VPIntrin, ST);
8910}
8911
8912void SelectionDAGBuilder::visitVPScatter(
8913 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8914 SDLoc DL = getCurSDLoc();
8915 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8916 Value *PtrOperand = VPIntrin.getArgOperand(1);
8917 EVT VT = OpValues[0].getValueType();
8918 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8919 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8920 SDValue ST;
8921 if (!Alignment)
8922 Alignment = DAG.getEVTAlign(VT.getScalarType());
8923 unsigned AS =
8924 PtrOperand->getType()->getScalarType()->getPointerAddressSpace();
8925 MachineMemOperand::Flags MMOFlags =
8926 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8927 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8928 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8929 *Alignment, AAInfo);
8930 SDValue Base, Index, Scale;
8931 bool UniformBase =
8932 getUniformBase(PtrOperand, Base, Index, Scale, this, VPIntrin.getParent(),
8933 VT.getScalarStoreSize());
8934 if (!UniformBase) {
8935 Base = DAG.getConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout()));
8936 Index = getValue(PtrOperand);
8937 Scale = DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout()));
8938 }
8939 EVT IdxVT = Index.getValueType();
8940 EVT EltTy = IdxVT.getVectorElementType();
8941 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
8942 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
8943 Index = DAG.getNode(ISD::SIGN_EXTEND, DL, NewIdxVT, Index);
8944 }
8945 ST = DAG.getScatterVP(DAG.getVTList(MVT::Other), VT, DL,
8946 {getMemoryRoot(), OpValues[0], Base, Index, Scale,
8947 OpValues[2], OpValues[3]},
8948 MMO, ISD::SIGNED_SCALED);
8949 DAG.setRoot(ST);
8950 setValue(&VPIntrin, ST);
8951}
8952
8953void SelectionDAGBuilder::visitVPStridedLoad(
8954 const VPIntrinsic &VPIntrin, EVT VT,
8955 const SmallVectorImpl<SDValue> &OpValues) {
8956 SDLoc DL = getCurSDLoc();
8957 Value *PtrOperand = VPIntrin.getArgOperand(0);
8958 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8959 if (!Alignment)
8960 Alignment = DAG.getEVTAlign(VT.getScalarType());
8961 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8962 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8963 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8964 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8965 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8966 unsigned AS = PtrOperand->getType()->getPointerAddressSpace();
8967 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8968 MachineMemOperand::Flags MMOFlags =
8969 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8970 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8971 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8972 *Alignment, MMOMetadata(AAInfo, Ranges));
8973
8974 SDValue LD = DAG.getStridedLoadVP(VT, DL, InChain, OpValues[0], OpValues[1],
8975 OpValues[2], OpValues[3], MMO,
8976 false /*IsExpanding*/);
8977
8978 if (AddToChain)
8979 PendingLoads.push_back(LD.getValue(1));
8980 setValue(&VPIntrin, LD);
8981}
8982
8983void SelectionDAGBuilder::visitVPStridedStore(
8984 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8985 SDLoc DL = getCurSDLoc();
8986 Value *PtrOperand = VPIntrin.getArgOperand(1);
8987 EVT VT = OpValues[0].getValueType();
8988 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8989 if (!Alignment)
8990 Alignment = DAG.getEVTAlign(VT.getScalarType());
8991 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8992 unsigned AS = PtrOperand->getType()->getPointerAddressSpace();
8993 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8994 MachineMemOperand::Flags MMOFlags =
8995 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8996 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8997 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8998 *Alignment, AAInfo);
8999
9000 SDValue ST = DAG.getStridedStoreVP(
9001 getMemoryRoot(), DL, OpValues[0], OpValues[1],
9002 DAG.getPOISON(OpValues[1].getValueType()), OpValues[2], OpValues[3],
9003 OpValues[4], VT, MMO, ISD::UNINDEXED, /*IsTruncating*/ false,
9004 /*IsCompressing*/ false);
9005
9006 DAG.setRoot(ST);
9007 setValue(&VPIntrin, ST);
9008}
9009
9010void SelectionDAGBuilder::visitVectorPredicationIntrinsic(
9011 const VPIntrinsic &VPIntrin) {
9012 SDLoc DL = getCurSDLoc();
9013 unsigned Opcode = getISDForVPIntrinsic(VPIntrin);
9014
9015 auto IID = VPIntrin.getIntrinsicID();
9016
9017 SmallVector<EVT, 4> ValueVTs;
9018 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9019 ComputeValueVTs(TLI, DAG.getDataLayout(), VPIntrin.getType(), ValueVTs);
9020 SDVTList VTs = DAG.getVTList(ValueVTs);
9021
9022 auto EVLParamPos = VPIntrinsic::getVectorLengthParamPos(IID);
9023
9024 MVT EVLParamVT = TLI.getVPExplicitVectorLengthTy();
9025 assert(EVLParamVT.isScalarInteger() && EVLParamVT.bitsGE(MVT::i32) &&
9026 "Unexpected target EVL type");
9027
9028 // Request operands.
9029 SmallVector<SDValue, 7> OpValues;
9030 for (unsigned I = 0; I < VPIntrin.arg_size(); ++I) {
9031 auto Op = getValue(VPIntrin.getArgOperand(I));
9032 if (I == EVLParamPos)
9033 Op = DAG.getNode(ISD::ZERO_EXTEND, DL, EVLParamVT, Op);
9034 OpValues.push_back(Op);
9035 }
9036
9037 switch (Opcode) {
9038 default: {
9039 SDNodeFlags SDFlags;
9040 if (auto *FPMO = dyn_cast<FPMathOperator>(&VPIntrin))
9041 SDFlags.copyFMF(*FPMO);
9042 SDValue Result = DAG.getNode(Opcode, DL, VTs, OpValues, SDFlags);
9043 setValue(&VPIntrin, Result);
9044 break;
9045 }
9046 case ISD::VP_LOAD:
9047 visitVPLoad(VPIntrin, ValueVTs[0], OpValues);
9048 break;
9049 case ISD::VP_LOAD_FF:
9050 visitVPLoadFF(VPIntrin, ValueVTs[0], ValueVTs[1], OpValues);
9051 break;
9052 case ISD::VP_GATHER:
9053 visitVPGather(VPIntrin, ValueVTs[0], OpValues);
9054 break;
9055 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
9056 visitVPStridedLoad(VPIntrin, ValueVTs[0], OpValues);
9057 break;
9058 case ISD::VP_STORE:
9059 visitVPStore(VPIntrin, OpValues);
9060 break;
9061 case ISD::VP_SCATTER:
9062 visitVPScatter(VPIntrin, OpValues);
9063 break;
9064 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
9065 visitVPStridedStore(VPIntrin, OpValues);
9066 break;
9067 case ISD::VP_CTTZ_ELTS_ZERO_POISON:
9068 case ISD::VP_CTTZ_ELTS: {
9069 SDValue Result =
9070 DAG.getNode(Opcode, DL, VTs, {OpValues[0], OpValues[2], OpValues[3]});
9071 setValue(&VPIntrin, Result);
9072 break;
9073 }
9074 }
9075}
9076
9078 const BasicBlock *EHPadBB,
9079 MCSymbol *&BeginLabel) {
9080 MachineFunction &MF = DAG.getMachineFunction();
9081
9082 // Insert a label before the invoke call to mark the try range. This can be
9083 // used to detect deletion of the invoke via the MachineModuleInfo.
9084 BeginLabel = MF.getContext().createTempSymbol();
9085
9086 // For SjLj, keep track of which landing pads go with which invokes
9087 // so as to maintain the ordering of pads in the LSDA.
9088 unsigned CallSiteIndex = FuncInfo.getCurrentCallSite();
9089 if (CallSiteIndex) {
9090 MF.setCallSiteBeginLabel(BeginLabel, CallSiteIndex);
9091 LPadToCallSiteMap[FuncInfo.getMBB(EHPadBB)].push_back(CallSiteIndex);
9092
9093 // Now that the call site is handled, stop tracking it.
9094 FuncInfo.setCurrentCallSite(0);
9095 }
9096
9097 return DAG.getEHLabel(getCurSDLoc(), Chain, BeginLabel);
9098}
9099
9100SDValue SelectionDAGBuilder::lowerEndEH(SDValue Chain, const InvokeInst *II,
9101 const BasicBlock *EHPadBB,
9102 MCSymbol *BeginLabel) {
9103 assert(BeginLabel && "BeginLabel should've been set");
9104
9106
9107 // Insert a label at the end of the invoke call to mark the try range. This
9108 // can be used to detect deletion of the invoke via the MachineModuleInfo.
9109 MCSymbol *EndLabel = MF.getContext().createTempSymbol();
9110 Chain = DAG.getEHLabel(getCurSDLoc(), Chain, EndLabel);
9111
9112 // Inform MachineModuleInfo of range.
9114 // There is a platform (e.g. wasm) that uses funclet style IR but does not
9115 // actually use outlined funclets and their LSDA info style.
9116 if (MF.hasEHFunclets() && isFuncletEHPersonality(Pers)) {
9117 assert(II && "II should've been set");
9118 WinEHFuncInfo *EHInfo = MF.getWinEHFuncInfo();
9119 EHInfo->addIPToStateRange(II, BeginLabel, EndLabel);
9120 } else if (!isScopedEHPersonality(Pers)) {
9121 assert(EHPadBB);
9122 MF.addInvoke(FuncInfo.getMBB(EHPadBB), BeginLabel, EndLabel);
9123 }
9124
9125 return Chain;
9126}
9127
9128std::pair<SDValue, SDValue>
9130 const BasicBlock *EHPadBB) {
9131 MCSymbol *BeginLabel = nullptr;
9132
9133 if (EHPadBB) {
9134 // Both PendingLoads and PendingExports must be flushed here;
9135 // this call might not return.
9136 (void)getRoot();
9137 DAG.setRoot(lowerStartEH(getControlRoot(), EHPadBB, BeginLabel));
9138 CLI.setChain(getRoot());
9139 }
9140
9141 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9142 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
9143
9144 assert((CLI.IsTailCall || Result.second.getNode()) &&
9145 "Non-null chain expected with non-tail call!");
9146 assert((Result.second.getNode() || !Result.first.getNode()) &&
9147 "Null value expected with tail call!");
9148
9149 if (!Result.second.getNode()) {
9150 // As a special case, a null chain means that a tail call has been emitted
9151 // and the DAG root is already updated.
9152 HasTailCall = true;
9153
9154 // Since there's no actual continuation from this block, nothing can be
9155 // relying on us setting vregs for them.
9156 PendingExports.clear();
9157 } else {
9158 DAG.setRoot(Result.second);
9159 }
9160
9161 if (EHPadBB) {
9162 DAG.setRoot(lowerEndEH(getRoot(), cast_or_null<InvokeInst>(CLI.CB), EHPadBB,
9163 BeginLabel));
9164 Result.second = getRoot();
9165 }
9166
9167 return Result;
9168}
9169
9171 bool isMustTailCall = CB.isMustTailCall();
9172
9173 // Avoid emitting tail calls in functions with the disable-tail-calls
9174 // attribute.
9175 const Function *Caller = CB.getParent()->getParent();
9176 if (!isMustTailCall &&
9177 Caller->getFnAttribute("disable-tail-calls").getValueAsBool())
9178 return false;
9179
9180 // We can't tail call inside a function with a swifterror argument. Lowering
9181 // does not support this yet. It would have to move into the swifterror
9182 // register before the call.
9183 if (DAG.hasSwiftErrorArg())
9184 return false;
9185
9186 // Check if target-independent constraints permit a tail call here.
9187 // Target-dependent constraints are checked within TLI->LowerCallTo.
9188 return isInTailCallPosition(CB, DAG.getTarget());
9189}
9190
9192 bool isTailCall, bool isMustTailCall,
9193 const BasicBlock *EHPadBB,
9194 const TargetLowering::PtrAuthInfo *PAI) {
9195 auto &DL = DAG.getDataLayout();
9196 FunctionType *FTy = CB.getFunctionType();
9197 Type *RetTy = CB.getType();
9198
9200 Args.reserve(CB.arg_size());
9201
9202 const Value *SwiftErrorVal = nullptr;
9203 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9204
9205 if (isTailCall)
9206 isTailCall = canTailCall(CB);
9207
9208 for (auto I = CB.arg_begin(), E = CB.arg_end(); I != E; ++I) {
9209 const Value *V = *I;
9210
9211 // Skip empty types
9212 if (V->getType()->isEmptyTy())
9213 continue;
9214
9215 SDValue ArgNode = getValue(V);
9216 TargetLowering::ArgListEntry Entry(ArgNode, V->getType());
9217 Entry.setAttributes(&CB, I - CB.arg_begin());
9218
9219 // Use swifterror virtual register as input to the call.
9220 if (Entry.IsSwiftError && TLI.supportSwiftError()) {
9221 SwiftErrorVal = V;
9222 // We find the virtual register for the actual swifterror argument.
9223 // Instead of using the Value, we use the virtual register instead.
9224 Entry.Node =
9225 DAG.getRegister(SwiftError.getOrCreateVRegUseAt(&CB, FuncInfo.MBB, V),
9226 EVT(TLI.getPointerTy(DL)));
9227 }
9228
9229 Args.push_back(Entry);
9230
9231 // If we have an explicit sret argument that is an Instruction, (i.e., it
9232 // might point to function-local memory), we can't meaningfully tail-call.
9233 if (Entry.IsSRet && isa<Instruction>(V))
9234 isTailCall = false;
9235 }
9236
9237 // If call site has a cfguardtarget operand bundle, create and add an
9238 // additional ArgListEntry.
9239 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_cfguardtarget)) {
9240 Value *V = Bundle->Inputs[0];
9242 Entry.IsCFGuardTarget = true;
9243 Args.push_back(Entry);
9244 }
9245
9246 // Disable tail calls if there is an swifterror argument. Targets have not
9247 // been updated to support tail calls.
9248 if (TLI.supportSwiftError() && SwiftErrorVal)
9249 isTailCall = false;
9250
9251 ConstantInt *CFIType = nullptr;
9252 if (CB.isIndirectCall()) {
9253 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_kcfi)) {
9254 if (!TLI.supportKCFIBundles())
9256 "Target doesn't support calls with kcfi operand bundles.");
9257 CFIType = cast<ConstantInt>(Bundle->Inputs[0]);
9258 assert(CFIType->getType()->isIntegerTy(32) && "Invalid CFI type");
9259 }
9260 }
9261
9262 SDValue ConvControlToken;
9263 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_convergencectrl)) {
9264 auto *Token = Bundle->Inputs[0].get();
9265 ConvControlToken = getValue(Token);
9266 }
9267
9268 GlobalValue *DeactivationSymbol = nullptr;
9270 DeactivationSymbol = cast<GlobalValue>(Bundle->Inputs[0].get());
9271 }
9272
9275 .setChain(getRoot())
9276 .setCallee(RetTy, FTy, Callee, std::move(Args), CB)
9277 .setTailCall(isTailCall)
9281 .setCFIType(CFIType)
9282 .setConvergenceControlToken(ConvControlToken)
9283 .setDeactivationSymbol(DeactivationSymbol);
9284
9285 // Set the pointer authentication info if we have it.
9286 if (PAI) {
9287 if (!TLI.supportPtrAuthBundles())
9289 "This target doesn't support calls with ptrauth operand bundles.");
9290 CLI.setPtrAuth(*PAI);
9291 }
9292
9293 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
9294
9295 if (Result.first.getNode()) {
9296 Result.first = lowerRangeToAssertZExt(DAG, CB, Result.first);
9297 Result.first = lowerNoFPClassToAssertNoFPClass(DAG, CB, Result.first);
9298 setValue(&CB, Result.first);
9299 }
9300
9301 // The last element of CLI.InVals has the SDValue for swifterror return.
9302 // Here we copy it to a virtual register and update SwiftErrorMap for
9303 // book-keeping.
9304 if (SwiftErrorVal && TLI.supportSwiftError()) {
9305 // Get the last element of InVals.
9306 SDValue Src = CLI.InVals.back();
9307 Register VReg =
9308 SwiftError.getOrCreateVRegDefAt(&CB, FuncInfo.MBB, SwiftErrorVal);
9309 SDValue CopyNode = CLI.DAG.getCopyToReg(Result.second, CLI.DL, VReg, Src);
9310 DAG.setRoot(CopyNode);
9311 }
9312}
9313
9314static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT,
9315 SelectionDAGBuilder &Builder) {
9316 // Check to see if this load can be trivially constant folded, e.g. if the
9317 // input is from a string literal.
9318 if (const Constant *LoadInput = dyn_cast<Constant>(PtrVal)) {
9319 // Cast pointer to the type we really want to load.
9320 Type *LoadTy =
9321 Type::getIntNTy(PtrVal->getContext(), LoadVT.getScalarSizeInBits());
9322 if (LoadVT.isVector())
9323 LoadTy = FixedVectorType::get(LoadTy, LoadVT.getVectorNumElements());
9324 if (const Constant *LoadCst =
9325 ConstantFoldLoadFromConstPtr(const_cast<Constant *>(LoadInput),
9326 LoadTy, Builder.DAG.getDataLayout()))
9327 return Builder.getValue(LoadCst);
9328 }
9329
9330 // Otherwise, we have to emit the load. If the pointer is to unfoldable but
9331 // still constant memory, the input chain can be the entry node.
9332 SDValue Root;
9333 bool ConstantMemory = false;
9334
9335 // Do not serialize (non-volatile) loads of constant memory with anything.
9336 if (Builder.BatchAA && Builder.BatchAA->pointsToConstantMemory(PtrVal)) {
9337 Root = Builder.DAG.getEntryNode();
9338 ConstantMemory = true;
9339 } else {
9340 // Do not serialize non-volatile loads against each other.
9341 Root = Builder.DAG.getRoot();
9342 }
9343
9344 SDValue Ptr = Builder.getValue(PtrVal);
9345 SDValue LoadVal =
9346 Builder.DAG.getLoad(LoadVT, Builder.getCurSDLoc(), Root, Ptr,
9347 MachinePointerInfo(PtrVal), Align(1));
9348
9349 if (!ConstantMemory)
9350 Builder.PendingLoads.push_back(LoadVal.getValue(1));
9351 return LoadVal;
9352}
9353
9354/// Record the value for an instruction that produces an integer result,
9355/// converting the type where necessary.
9356void SelectionDAGBuilder::processIntegerCallValue(const Instruction &I,
9357 SDValue Value,
9358 bool IsSigned) {
9359 EVT VT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9360 I.getType(), true);
9361 Value = DAG.getExtOrTrunc(IsSigned, Value, getCurSDLoc(), VT);
9362 setValue(&I, Value);
9363}
9364
9365/// See if we can lower a memcmp/bcmp call into an optimized form. If so, return
9366/// true and lower it. Otherwise return false, and it will be lowered like a
9367/// normal call.
9368/// The caller already checked that \p I calls the appropriate LibFunc with a
9369/// correct prototype.
9370bool SelectionDAGBuilder::visitMemCmpBCmpCall(const CallInst &I) {
9371 const Value *LHS = I.getArgOperand(0), *RHS = I.getArgOperand(1);
9372 const Value *Size = I.getArgOperand(2);
9373 const ConstantSDNode *CSize = dyn_cast<ConstantSDNode>(getValue(Size));
9374 if (CSize && CSize->getZExtValue() == 0) {
9375 EVT CallVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9376 I.getType(), true);
9377 setValue(&I, DAG.getConstant(0, getCurSDLoc(), CallVT));
9378 return true;
9379 }
9380
9381 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9382 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForMemcmp(
9383 DAG, getCurSDLoc(), DAG.getRoot(), getValue(LHS), getValue(RHS),
9384 getValue(Size), &I);
9385 if (Res.first.getNode()) {
9386 processIntegerCallValue(I, Res.first, true);
9387 PendingLoads.push_back(Res.second);
9388 return true;
9389 }
9390
9391 // memcmp(S1,S2,2) != 0 -> (*(short*)LHS != *(short*)RHS) != 0
9392 // memcmp(S1,S2,4) != 0 -> (*(int*)LHS != *(int*)RHS) != 0
9393 if (!CSize || !isOnlyUsedInZeroEqualityComparison(&I))
9394 return false;
9395
9396 // If the target has a fast compare for the given size, it will return a
9397 // preferred load type for that size. Require that the load VT is legal and
9398 // that the target supports unaligned loads of that type. Otherwise, return
9399 // INVALID.
9400 auto hasFastLoadsAndCompare = [&](unsigned NumBits) {
9401 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9402 MVT LVT = TLI.hasFastEqualityCompare(NumBits);
9403 if (LVT != MVT::INVALID_SIMPLE_VALUE_TYPE) {
9404 // TODO: Handle 5 byte compare as 4-byte + 1 byte.
9405 // TODO: Handle 8 byte compare on x86-32 as two 32-bit loads.
9406 // TODO: Check alignment of src and dest ptrs.
9407 unsigned DstAS = LHS->getType()->getPointerAddressSpace();
9408 unsigned SrcAS = RHS->getType()->getPointerAddressSpace();
9409 if (!TLI.isTypeLegal(LVT) ||
9410 !TLI.allowsMisalignedMemoryAccesses(LVT, SrcAS) ||
9411 !TLI.allowsMisalignedMemoryAccesses(LVT, DstAS))
9413 }
9414
9415 return LVT;
9416 };
9417
9418 // This turns into unaligned loads. We only do this if the target natively
9419 // supports the MVT we'll be loading or if it is small enough (<= 4) that
9420 // we'll only produce a small number of byte loads.
9421 MVT LoadVT;
9422 unsigned NumBitsToCompare = CSize->getZExtValue() * 8;
9423 switch (NumBitsToCompare) {
9424 default:
9425 return false;
9426 case 16:
9427 LoadVT = MVT::i16;
9428 break;
9429 case 32:
9430 LoadVT = MVT::i32;
9431 break;
9432 case 64:
9433 case 128:
9434 case 256:
9435 LoadVT = hasFastLoadsAndCompare(NumBitsToCompare);
9436 break;
9437 }
9438
9439 if (LoadVT == MVT::INVALID_SIMPLE_VALUE_TYPE)
9440 return false;
9441
9442 SDValue LoadL = getMemCmpLoad(LHS, LoadVT, *this);
9443 SDValue LoadR = getMemCmpLoad(RHS, LoadVT, *this);
9444
9445 // Bitcast to a wide integer type if the loads are vectors.
9446 if (LoadVT.isVector()) {
9447 EVT CmpVT = EVT::getIntegerVT(LHS->getContext(), LoadVT.getSizeInBits());
9448 LoadL = DAG.getBitcast(CmpVT, LoadL);
9449 LoadR = DAG.getBitcast(CmpVT, LoadR);
9450 }
9451
9452 SDValue Cmp = DAG.getSetCC(getCurSDLoc(), MVT::i1, LoadL, LoadR, ISD::SETNE);
9453 processIntegerCallValue(I, Cmp, false);
9454 return true;
9455}
9456
9457/// See if we can lower a memchr call into an optimized form. If so, return
9458/// true and lower it. Otherwise return false, and it will be lowered like a
9459/// normal call.
9460/// The caller already checked that \p I calls the appropriate LibFunc with a
9461/// correct prototype.
9462bool SelectionDAGBuilder::visitMemChrCall(const CallInst &I) {
9463 const Value *Src = I.getArgOperand(0);
9464 const Value *Char = I.getArgOperand(1);
9465 const Value *Length = I.getArgOperand(2);
9466
9467 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9468 std::pair<SDValue, SDValue> Res =
9469 TSI.EmitTargetCodeForMemchr(DAG, getCurSDLoc(), DAG.getRoot(),
9470 getValue(Src), getValue(Char), getValue(Length),
9471 MachinePointerInfo(Src));
9472 if (Res.first.getNode()) {
9473 setValue(&I, Res.first);
9474 PendingLoads.push_back(Res.second);
9475 return true;
9476 }
9477
9478 return false;
9479}
9480
9481/// See if we can lower a memccpy call into an optimized form. If so, return
9482/// true and lower it, otherwise return false and it will be lowered like a
9483/// normal call.
9484/// The caller already checked that \p I calls the appropriate LibFunc with a
9485/// correct prototype.
9486bool SelectionDAGBuilder::visitMemCCpyCall(const CallInst &I) {
9487 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9488 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForMemccpy(
9489 DAG, getCurSDLoc(), DAG.getRoot(), getValue(I.getArgOperand(0)),
9490 getValue(I.getArgOperand(1)), getValue(I.getArgOperand(2)),
9491 getValue(I.getArgOperand(3)), &I);
9492
9493 if (Res.first) {
9494 processIntegerCallValue(I, Res.first, true);
9495 PendingLoads.push_back(Res.second);
9496 return true;
9497 }
9498 return false;
9499}
9500
9501/// See if we can lower a mempcpy call into an optimized form. If so, return
9502/// true and lower it. Otherwise return false, and it will be lowered like a
9503/// normal call.
9504/// The caller already checked that \p I calls the appropriate LibFunc with a
9505/// correct prototype.
9506bool SelectionDAGBuilder::visitMemPCpyCall(const CallInst &I) {
9507 SDValue Dst = getValue(I.getArgOperand(0));
9508 SDValue Src = getValue(I.getArgOperand(1));
9509 SDValue Size = getValue(I.getArgOperand(2));
9510
9511 Align DstAlign = DAG.InferPtrAlign(Dst).valueOrOne();
9512 Align SrcAlign = DAG.InferPtrAlign(Src).valueOrOne();
9513
9514 SDLoc sdl = getCurSDLoc();
9515
9516 // In the mempcpy context we need to pass in a false value for isTailCall
9517 // because the return pointer needs to be adjusted by the size of
9518 // the copied memory.
9519 SDValue Root = getMemoryRoot();
9520 SDValue MC = DAG.getMemcpy(
9521 Root, sdl, Dst, Src, Size, DstAlign, SrcAlign, false, false,
9522 /*CI=*/nullptr, std::nullopt, MachinePointerInfo(I.getArgOperand(0)),
9523 MachinePointerInfo(I.getArgOperand(1)), I.getAAMetadata());
9524 assert(MC.getNode() != nullptr &&
9525 "** memcpy should not be lowered as TailCall in mempcpy context **");
9526 DAG.setRoot(MC);
9527
9528 // Check if Size needs to be truncated or extended.
9529 Size = DAG.getSExtOrTrunc(Size, sdl, Dst.getValueType());
9530
9531 // Adjust return pointer to point just past the last dst byte.
9532 SDValue DstPlusSize = DAG.getMemBasePlusOffset(Dst, Size, sdl);
9533 setValue(&I, DstPlusSize);
9534 return true;
9535}
9536
9537/// See if we can lower a strcpy call into an optimized form. If so, return
9538/// true and lower it, otherwise return false and it will be lowered like a
9539/// normal call.
9540/// The caller already checked that \p I calls the appropriate LibFunc with a
9541/// correct prototype.
9542bool SelectionDAGBuilder::visitStrCpyCall(const CallInst &I, bool isStpcpy) {
9543 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9544
9545 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9546 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrcpy(
9547 DAG, getCurSDLoc(), getRoot(), getValue(Arg0), getValue(Arg1),
9548 MachinePointerInfo(Arg0), MachinePointerInfo(Arg1), isStpcpy, &I);
9549 if (Res.first.getNode()) {
9550 setValue(&I, Res.first);
9551 DAG.setRoot(Res.second);
9552 return true;
9553 }
9554
9555 return false;
9556}
9557
9558/// See if we can lower a strcmp call into an optimized form. If so, return
9559/// true and lower it, otherwise return false and it will be lowered like a
9560/// normal call.
9561/// The caller already checked that \p I calls the appropriate LibFunc with a
9562/// correct prototype.
9563bool SelectionDAGBuilder::visitStrCmpCall(const CallInst &I) {
9564 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9565
9566 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9567 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrcmp(
9568 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), getValue(Arg1),
9569 MachinePointerInfo(Arg0), MachinePointerInfo(Arg1), &I);
9570 if (Res.first.getNode()) {
9571 processIntegerCallValue(I, Res.first, true);
9572 PendingLoads.push_back(Res.second);
9573 return true;
9574 }
9575
9576 return false;
9577}
9578
9579/// See if we can lower a strlen call into an optimized form. If so, return
9580/// true and lower it, otherwise return false and it will be lowered like a
9581/// normal call.
9582/// The caller already checked that \p I calls the appropriate LibFunc with a
9583/// correct prototype.
9584bool SelectionDAGBuilder::visitStrLenCall(const CallInst &I) {
9585 const Value *Arg0 = I.getArgOperand(0);
9586
9587 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9588 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrlen(
9589 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), &I);
9590 if (Res.first.getNode()) {
9591 processIntegerCallValue(I, Res.first, false);
9592 PendingLoads.push_back(Res.second);
9593 return true;
9594 }
9595
9596 return false;
9597}
9598
9599/// See if we can lower a strnlen call into an optimized form. If so, return
9600/// true and lower it, otherwise return false and it will be lowered like a
9601/// normal call.
9602/// The caller already checked that \p I calls the appropriate LibFunc with a
9603/// correct prototype.
9604bool SelectionDAGBuilder::visitStrNLenCall(const CallInst &I) {
9605 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9606
9607 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9608 std::pair<SDValue, SDValue> Res =
9609 TSI.EmitTargetCodeForStrnlen(DAG, getCurSDLoc(), DAG.getRoot(),
9610 getValue(Arg0), getValue(Arg1),
9611 MachinePointerInfo(Arg0));
9612 if (Res.first.getNode()) {
9613 processIntegerCallValue(I, Res.first, false);
9614 PendingLoads.push_back(Res.second);
9615 return true;
9616 }
9617
9618 return false;
9619}
9620
9621/// See if we can lower a Strstr call into an optimized form. If so, return
9622/// true and lower it, otherwise return false and it will be lowered like a
9623/// normal call.
9624/// The caller already checked that \p I calls the appropriate LibFunc with a
9625/// correct prototype.
9626bool SelectionDAGBuilder::visitStrstrCall(const CallInst &I) {
9627 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9628 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9629 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrstr(
9630 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), getValue(Arg1), &I);
9631 if (Res.first) {
9632 processIntegerCallValue(I, Res.first, false);
9633 PendingLoads.push_back(Res.second);
9634 return true;
9635 }
9636 return false;
9637}
9638
9639/// See if we can lower a unary floating-point operation into an SDNode with
9640/// the specified Opcode. If so, return true and lower it, otherwise return
9641/// false and it will be lowered like a normal call.
9642/// The caller already checked that \p I calls the appropriate LibFunc with a
9643/// correct prototype.
9644bool SelectionDAGBuilder::visitUnaryFloatCall(const CallInst &I,
9645 unsigned Opcode) {
9646 // We already checked this call's prototype; verify it doesn't modify errno.
9647 // Do not perform optimizations for call sites that require strict
9648 // floating-point semantics.
9649 if (!I.onlyReadsMemory() || I.isStrictFP())
9650 return false;
9651
9652 SDNodeFlags Flags;
9653 Flags.copyFMF(cast<FPMathOperator>(I));
9654
9655 SDValue Tmp = getValue(I.getArgOperand(0));
9656 setValue(&I,
9657 DAG.getNode(Opcode, getCurSDLoc(), Tmp.getValueType(), Tmp, Flags));
9658 return true;
9659}
9660
9661/// See if we can lower a binary floating-point operation into an SDNode with
9662/// the specified Opcode. If so, return true and lower it. Otherwise return
9663/// false, and it will be lowered like a normal call.
9664/// The caller already checked that \p I calls the appropriate LibFunc with a
9665/// correct prototype.
9666bool SelectionDAGBuilder::visitBinaryFloatCall(const CallInst &I,
9667 unsigned Opcode) {
9668 // We already checked this call's prototype; verify it doesn't modify errno.
9669 // Do not perform optimizations for call sites that require strict
9670 // floating-point semantics.
9671 if (!I.onlyReadsMemory() || I.isStrictFP())
9672 return false;
9673
9674 SDNodeFlags Flags;
9675 Flags.copyFMF(cast<FPMathOperator>(I));
9676
9677 SDValue Tmp0 = getValue(I.getArgOperand(0));
9678 SDValue Tmp1 = getValue(I.getArgOperand(1));
9679 EVT VT = Tmp0.getValueType();
9680 setValue(&I, DAG.getNode(Opcode, getCurSDLoc(), VT, Tmp0, Tmp1, Flags));
9681 return true;
9682}
9683
9684void SelectionDAGBuilder::visitCall(const CallInst &I) {
9685 // Handle inline assembly differently.
9686 if (I.isInlineAsm()) {
9687 visitInlineAsm(I);
9688 return;
9689 }
9690
9692
9693 if (Function *F = I.getCalledFunction()) {
9694 if (F->isDeclaration()) {
9695 // Is this an LLVM intrinsic?
9696 if (unsigned IID = F->getIntrinsicID()) {
9697 visitIntrinsicCall(I, IID);
9698 return;
9699 }
9700 }
9701
9702 // Check for well-known libc/libm calls. If the function is internal, it
9703 // can't be a library call. Don't do the check if marked as nobuiltin for
9704 // some reason.
9705 // This code should not handle libcalls that are already canonicalized to
9706 // intrinsics by the middle-end.
9707 LibFunc Func = !I.isNoBuiltin() && !F->hasLocalLinkage() && F->hasName()
9708 ? LibInfo->getLibFunc(*F)
9709 : NotLibFunc;
9710 if (LibInfo->hasOptimizedCodeGen(Func)) {
9711 switch (Func) {
9712 default: break;
9713 case LibFunc_bcmp:
9714 if (visitMemCmpBCmpCall(I))
9715 return;
9716 break;
9717 case LibFunc_copysign:
9718 case LibFunc_copysignf:
9719 case LibFunc_copysignl:
9720 // We already checked this call's prototype; verify it doesn't modify
9721 // errno.
9722 if (I.onlyReadsMemory()) {
9723 SDValue LHS = getValue(I.getArgOperand(0));
9724 SDValue RHS = getValue(I.getArgOperand(1));
9726 LHS.getValueType(), LHS, RHS));
9727 return;
9728 }
9729 break;
9730 case LibFunc_sin:
9731 case LibFunc_sinf:
9732 case LibFunc_sinl:
9733 if (visitUnaryFloatCall(I, ISD::FSIN))
9734 return;
9735 break;
9736 case LibFunc_cos:
9737 case LibFunc_cosf:
9738 case LibFunc_cosl:
9739 if (visitUnaryFloatCall(I, ISD::FCOS))
9740 return;
9741 break;
9742 case LibFunc_tan:
9743 case LibFunc_tanf:
9744 case LibFunc_tanl:
9745 if (visitUnaryFloatCall(I, ISD::FTAN))
9746 return;
9747 break;
9748 case LibFunc_asin:
9749 case LibFunc_asinf:
9750 case LibFunc_asinl:
9751 if (visitUnaryFloatCall(I, ISD::FASIN))
9752 return;
9753 break;
9754 case LibFunc_acos:
9755 case LibFunc_acosf:
9756 case LibFunc_acosl:
9757 if (visitUnaryFloatCall(I, ISD::FACOS))
9758 return;
9759 break;
9760 case LibFunc_atan:
9761 case LibFunc_atanf:
9762 case LibFunc_atanl:
9763 if (visitUnaryFloatCall(I, ISD::FATAN))
9764 return;
9765 break;
9766 case LibFunc_atan2:
9767 case LibFunc_atan2f:
9768 case LibFunc_atan2l:
9769 if (visitBinaryFloatCall(I, ISD::FATAN2))
9770 return;
9771 break;
9772 case LibFunc_sinh:
9773 case LibFunc_sinhf:
9774 case LibFunc_sinhl:
9775 if (visitUnaryFloatCall(I, ISD::FSINH))
9776 return;
9777 break;
9778 case LibFunc_cosh:
9779 case LibFunc_coshf:
9780 case LibFunc_coshl:
9781 if (visitUnaryFloatCall(I, ISD::FCOSH))
9782 return;
9783 break;
9784 case LibFunc_tanh:
9785 case LibFunc_tanhf:
9786 case LibFunc_tanhl:
9787 if (visitUnaryFloatCall(I, ISD::FTANH))
9788 return;
9789 break;
9790 case LibFunc_sqrt:
9791 case LibFunc_sqrtf:
9792 case LibFunc_sqrtl:
9793 case LibFunc_sqrt_finite:
9794 case LibFunc_sqrtf_finite:
9795 case LibFunc_sqrtl_finite:
9796 if (visitUnaryFloatCall(I, ISD::FSQRT))
9797 return;
9798 break;
9799 case LibFunc_log2:
9800 case LibFunc_log2f:
9801 case LibFunc_log2l:
9802 if (visitUnaryFloatCall(I, ISD::FLOG2))
9803 return;
9804 break;
9805 case LibFunc_exp2:
9806 case LibFunc_exp2f:
9807 case LibFunc_exp2l:
9808 if (visitUnaryFloatCall(I, ISD::FEXP2))
9809 return;
9810 break;
9811 case LibFunc_exp10:
9812 case LibFunc_exp10f:
9813 case LibFunc_exp10l:
9814 if (visitUnaryFloatCall(I, ISD::FEXP10))
9815 return;
9816 break;
9817 case LibFunc_ldexp:
9818 case LibFunc_ldexpf:
9819 case LibFunc_ldexpl:
9820 if (visitBinaryFloatCall(I, ISD::FLDEXP))
9821 return;
9822 break;
9823 case LibFunc_strstr:
9824 if (visitStrstrCall(I))
9825 return;
9826 break;
9827 case LibFunc_memcmp:
9828 if (visitMemCmpBCmpCall(I))
9829 return;
9830 break;
9831 case LibFunc_memccpy:
9832 if (visitMemCCpyCall(I))
9833 return;
9834 break;
9835 case LibFunc_mempcpy:
9836 if (visitMemPCpyCall(I))
9837 return;
9838 break;
9839 case LibFunc_memchr:
9840 if (visitMemChrCall(I))
9841 return;
9842 break;
9843 case LibFunc_strcpy:
9844 if (visitStrCpyCall(I, false))
9845 return;
9846 break;
9847 case LibFunc_stpcpy:
9848 if (visitStrCpyCall(I, true))
9849 return;
9850 break;
9851 case LibFunc_strcmp:
9852 if (visitStrCmpCall(I))
9853 return;
9854 break;
9855 case LibFunc_strlen:
9856 if (visitStrLenCall(I))
9857 return;
9858 break;
9859 case LibFunc_strnlen:
9860 if (visitStrNLenCall(I))
9861 return;
9862 break;
9863 }
9864 }
9865 }
9866
9867 if (I.countOperandBundlesOfType(LLVMContext::OB_ptrauth)) {
9868 LowerCallSiteWithPtrAuthBundle(cast<CallBase>(I), /*EHPadBB=*/nullptr);
9869 return;
9870 }
9871
9872 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
9873 // have to do anything here to lower funclet bundles.
9874 // CFGuardTarget bundles are lowered in LowerCallTo.
9876 I, "calls",
9881
9882 SDValue Callee = getValue(I.getCalledOperand());
9883
9884 if (I.hasDeoptState())
9885 LowerCallSiteWithDeoptBundle(&I, Callee, nullptr);
9886 else
9887 // Check if we can potentially perform a tail call. More detailed checking
9888 // is be done within LowerCallTo, after more information about the call is
9889 // known.
9890 LowerCallTo(I, Callee, I.isTailCall(), I.isMustTailCall());
9891}
9892
9894 const CallBase &CB, const BasicBlock *EHPadBB) {
9895 auto PAB = CB.getOperandBundle("ptrauth");
9896 const Value *CalleeV = CB.getCalledOperand();
9897
9898 // Gather the call ptrauth data from the operand bundle:
9899 // [ i32 <key>, i64 <discriminator> ]
9900 const auto *Key = cast<ConstantInt>(PAB->Inputs[0]);
9901 const Value *Discriminator = PAB->Inputs[1];
9902
9903 assert(Key->getType()->isIntegerTy(32) && "Invalid ptrauth key");
9904 assert(Discriminator->getType()->isIntegerTy(64) &&
9905 "Invalid ptrauth discriminator");
9906
9907 // Look through ptrauth constants to find the raw callee.
9908 // Do a direct unauthenticated call if we found it and everything matches.
9909 if (const auto *CalleeCPA = dyn_cast<ConstantPtrAuth>(CalleeV))
9910 if (CalleeCPA->isKnownCompatibleWith(Key, Discriminator,
9911 DAG.getDataLayout()))
9912 return LowerCallTo(CB, getValue(CalleeCPA->getPointer()), CB.isTailCall(),
9913 CB.isMustTailCall(), EHPadBB);
9914
9915 // Functions should never be ptrauth-called directly.
9916 assert(!isa<Function>(CalleeV) && "invalid direct ptrauth call");
9917
9918 // Otherwise, do an authenticated indirect call.
9919 TargetLowering::PtrAuthInfo PAI = {Key->getZExtValue(),
9920 getValue(Discriminator)};
9921
9922 LowerCallTo(CB, getValue(CalleeV), CB.isTailCall(), CB.isMustTailCall(),
9923 EHPadBB, &PAI);
9924}
9925
9926namespace {
9927
9928/// AsmOperandInfo - This contains information for each constraint that we are
9929/// lowering.
9930class SDISelAsmOperandInfo : public TargetLowering::AsmOperandInfo {
9931public:
9932 /// CallOperand - If this is the result output operand or a clobber
9933 /// this is null, otherwise it is the incoming operand to the CallInst.
9934 /// This gets modified as the asm is processed.
9935 SDValue CallOperand;
9936
9937 /// AssignedRegs - If this is a register or register class operand, this
9938 /// contains the set of register corresponding to the operand.
9939 RegsForValue AssignedRegs;
9940
9941 explicit SDISelAsmOperandInfo(const TargetLowering::AsmOperandInfo &info)
9942 : TargetLowering::AsmOperandInfo(info), CallOperand(nullptr, 0) {
9943 }
9944
9945 /// Whether or not this operand accesses memory
9946 bool hasMemory(const TargetLowering &TLI) const {
9947 // Indirect operand accesses access memory.
9948 if (isIndirect)
9949 return true;
9950
9951 for (const auto &Code : Codes)
9953 return true;
9954
9955 return false;
9956 }
9957};
9958
9959
9960} // end anonymous namespace
9961
9962/// Make sure that the output operand \p OpInfo and its corresponding input
9963/// operand \p MatchingOpInfo have compatible constraint types (otherwise error
9964/// out).
9965static void patchMatchingInput(const SDISelAsmOperandInfo &OpInfo,
9966 SDISelAsmOperandInfo &MatchingOpInfo,
9967 SelectionDAG &DAG) {
9968 if (OpInfo.ConstraintVT == MatchingOpInfo.ConstraintVT)
9969 return;
9970
9972 const auto &TLI = DAG.getTargetLoweringInfo();
9973
9974 std::pair<unsigned, const TargetRegisterClass *> MatchRC =
9975 TLI.getRegForInlineAsmConstraint(TRI, OpInfo.ConstraintCode,
9976 OpInfo.ConstraintVT);
9977 std::pair<unsigned, const TargetRegisterClass *> InputRC =
9978 TLI.getRegForInlineAsmConstraint(TRI, MatchingOpInfo.ConstraintCode,
9979 MatchingOpInfo.ConstraintVT);
9980 const bool OutOpIsIntOrFP =
9981 OpInfo.ConstraintVT.isInteger() || OpInfo.ConstraintVT.isFloatingPoint();
9982 const bool InOpIsIntOrFP = MatchingOpInfo.ConstraintVT.isInteger() ||
9983 MatchingOpInfo.ConstraintVT.isFloatingPoint();
9984 if ((OutOpIsIntOrFP != InOpIsIntOrFP) || (MatchRC.second != InputRC.second)) {
9985 // FIXME: error out in a more elegant fashion
9986 report_fatal_error("Unsupported asm: input constraint"
9987 " with a matching output constraint of"
9988 " incompatible type!");
9989 }
9990 MatchingOpInfo.ConstraintVT = OpInfo.ConstraintVT;
9991}
9992
9993/// Get a direct memory input to behave well as an indirect operand.
9994/// This may introduce stores, hence the need for a \p Chain.
9995/// \return The (possibly updated) chain.
9996static SDValue getAddressForMemoryInput(SDValue Chain, const SDLoc &Location,
9997 SDISelAsmOperandInfo &OpInfo,
9998 SelectionDAG &DAG) {
9999 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10000
10001 // If we don't have an indirect input, put it in the constpool if we can,
10002 // otherwise spill it to a stack slot.
10003 // TODO: This isn't quite right. We need to handle these according to
10004 // the addressing mode that the constraint wants. Also, this may take
10005 // an additional register for the computation and we don't want that
10006 // either.
10007
10008 // If the operand is a float, integer, or vector constant, spill to a
10009 // constant pool entry to get its address.
10010 const Value *OpVal = OpInfo.CallOperandVal;
10011 if (isa<ConstantFP>(OpVal) || isa<ConstantInt>(OpVal) ||
10013 OpInfo.CallOperand = DAG.getConstantPool(
10014 cast<Constant>(OpVal), TLI.getPointerTy(DAG.getDataLayout()));
10015 return Chain;
10016 }
10017
10018 // Otherwise, create a stack slot and emit a store to it before the asm.
10019 Type *Ty = OpVal->getType();
10020 auto &DL = DAG.getDataLayout();
10021 TypeSize TySize = DL.getTypeAllocSize(Ty);
10024 int StackID = 0;
10025 if (TySize.isScalable())
10026 StackID = TFI->getStackIDForScalableVectors();
10027 int SSFI = MF.getFrameInfo().CreateStackObject(TySize.getKnownMinValue(),
10028 DL.getPrefTypeAlign(Ty), false,
10029 nullptr, StackID);
10030 SDValue StackSlot = DAG.getFrameIndex(SSFI, TLI.getFrameIndexTy(DL));
10031 Chain = DAG.getTruncStore(Chain, Location, OpInfo.CallOperand, StackSlot,
10033 TLI.getMemValueType(DL, Ty));
10034 OpInfo.CallOperand = StackSlot;
10035
10036 return Chain;
10037}
10038
10039/// GetRegistersForValue - Assign registers (virtual or physical) for the
10040/// specified operand. We prefer to assign virtual registers, to allow the
10041/// register allocator to handle the assignment process. However, if the asm
10042/// uses features that we can't model on machineinstrs, we have SDISel do the
10043/// allocation. This produces generally horrible, but correct, code.
10044///
10045/// OpInfo describes the operand
10046/// RefOpInfo describes the matching operand if any, the operand otherwise
10047static std::optional<unsigned>
10049 SDISelAsmOperandInfo &OpInfo,
10050 SDISelAsmOperandInfo &RefOpInfo) {
10051 LLVMContext &Context = *DAG.getContext();
10052 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10053
10057
10058 // No work to do for memory/address operands.
10059 if (OpInfo.ConstraintType == TargetLowering::C_Memory ||
10060 OpInfo.ConstraintType == TargetLowering::C_Address)
10061 return std::nullopt;
10062
10063 // If this is a constraint for a single physreg, or a constraint for a
10064 // register class, find it.
10065 unsigned AssignedReg;
10066 const TargetRegisterClass *RC;
10067 std::tie(AssignedReg, RC) = TLI.getRegForInlineAsmConstraint(
10068 &TRI, RefOpInfo.ConstraintCode, RefOpInfo.ConstraintVT);
10069 // RC is unset only on failure. Return immediately.
10070 if (!RC)
10071 return std::nullopt;
10072
10073 // Get the actual register value type. This is important, because the user
10074 // may have asked for (e.g.) the AX register in i32 type. We need to
10075 // remember that AX is actually i16 to get the right extension.
10076 const MVT RegVT = *TRI.legalclasstypes_begin(*RC);
10077
10078 if (OpInfo.ConstraintVT != MVT::Other && RegVT != MVT::Untyped) {
10079 // If this is an FP operand in an integer register (or visa versa), or more
10080 // generally if the operand value disagrees with the register class we plan
10081 // to stick it in, fix the operand type.
10082 //
10083 // If this is an input value, the bitcast to the new type is done now.
10084 // Bitcast for output value is done at the end of visitInlineAsm().
10085 if ((OpInfo.Type == InlineAsm::isOutput ||
10086 OpInfo.Type == InlineAsm::isInput) &&
10087 !TRI.isTypeLegalForClass(*RC, OpInfo.ConstraintVT)) {
10088 // Try to convert to the first EVT that the reg class contains. If the
10089 // types are identical size, use a bitcast to convert (e.g. two differing
10090 // vector types). Note: output bitcast is done at the end of
10091 // visitInlineAsm().
10092 if (RegVT.getSizeInBits() == OpInfo.ConstraintVT.getSizeInBits()) {
10093 // Exclude indirect inputs while they are unsupported because the code
10094 // to perform the load is missing and thus OpInfo.CallOperand still
10095 // refers to the input address rather than the pointed-to value.
10096 if (OpInfo.Type == InlineAsm::isInput && !OpInfo.isIndirect)
10097 OpInfo.CallOperand =
10098 DAG.getNode(ISD::BITCAST, DL, RegVT, OpInfo.CallOperand);
10099 OpInfo.ConstraintVT = RegVT;
10100 // If the operand is an FP value and we want it in integer registers,
10101 // use the corresponding integer type. This turns an f64 value into
10102 // i64, which can be passed with two i32 values on a 32-bit machine.
10103 } else if (RegVT.isInteger() && OpInfo.ConstraintVT.isFloatingPoint()) {
10104 MVT VT = MVT::getIntegerVT(OpInfo.ConstraintVT.getSizeInBits());
10105 if (OpInfo.Type == InlineAsm::isInput)
10106 OpInfo.CallOperand =
10107 DAG.getNode(ISD::BITCAST, DL, VT, OpInfo.CallOperand);
10108 OpInfo.ConstraintVT = VT;
10109 }
10110 }
10111 }
10112
10113 // No need to allocate a matching input constraint since the constraint it's
10114 // matching to has already been allocated.
10115 if (OpInfo.isMatchingInputConstraint())
10116 return std::nullopt;
10117
10118 EVT ValueVT = OpInfo.ConstraintVT;
10119 if (OpInfo.ConstraintVT == MVT::Other)
10120 ValueVT = RegVT;
10121
10122 // Initialize NumRegs.
10123 unsigned NumRegs = 1;
10124 if (OpInfo.ConstraintVT != MVT::Other)
10125 NumRegs = TLI.getNumRegisters(Context, OpInfo.ConstraintVT, RegVT);
10126
10127 // If this is a constraint for a specific physical register, like {r17},
10128 // assign it now.
10129
10130 // If this associated to a specific register, initialize iterator to correct
10131 // place. If virtual, make sure we have enough registers
10132
10133 // Initialize iterator if necessary
10136
10137 // Do not check for single registers.
10138 if (AssignedReg) {
10139 I = std::find(I, RC->end(), AssignedReg);
10140 if (I == RC->end()) {
10141 // RC does not contain the selected register, which indicates a
10142 // mismatch between the register and the required type/bitwidth.
10143 return {AssignedReg};
10144 }
10145 }
10146
10147 for (; NumRegs; --NumRegs, ++I) {
10148 assert(I != RC->end() && "Ran out of registers to allocate!");
10149 Register R = AssignedReg ? Register(*I) : RegInfo.createVirtualRegister(RC);
10150 Regs.push_back(R);
10151 }
10152
10153 OpInfo.AssignedRegs = RegsForValue(Regs, RegVT, ValueVT);
10154 return std::nullopt;
10155}
10156
10157static unsigned
10159 const std::vector<SDValue> &AsmNodeOperands) {
10160 // Scan until we find the definition we already emitted of this operand.
10161 unsigned CurOp = InlineAsm::Op_FirstOperand;
10162 for (; OperandNo; --OperandNo) {
10163 // Advance to the next operand.
10164 unsigned OpFlag = AsmNodeOperands[CurOp]->getAsZExtVal();
10165 const InlineAsm::Flag F(OpFlag);
10166 assert(
10167 (F.isRegDefKind() || F.isRegDefEarlyClobberKind() || F.isMemKind()) &&
10168 "Skipped past definitions?");
10169 CurOp += F.getNumOperandRegisters() + 1;
10170 }
10171 return CurOp;
10172}
10173
10174namespace {
10175
10176class ExtraFlags {
10177 unsigned Flags = 0;
10178
10179public:
10180 explicit ExtraFlags(const CallBase &Call) {
10181 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
10182 if (IA->hasSideEffects())
10184 if (IA->isAlignStack())
10186 if (IA->canThrow())
10188 if (Call.isConvergent())
10190 Flags |= IA->getDialect() * InlineAsm::Extra_AsmDialect;
10191 }
10192
10193 void update(const TargetLowering::AsmOperandInfo &OpInfo) {
10194 // Ideally, we would only check against memory constraints. However, the
10195 // meaning of an Other constraint can be target-specific and we can't easily
10196 // reason about it. Therefore, be conservative and set MayLoad/MayStore
10197 // for Other constraints as well.
10200 if (OpInfo.Type == InlineAsm::isInput)
10202 else if (OpInfo.Type == InlineAsm::isOutput)
10204 else if (OpInfo.Type == InlineAsm::isClobber)
10206 }
10207 }
10208
10209 unsigned get() const { return Flags; }
10210};
10211
10212} // end anonymous namespace
10213
10214static bool isFunction(SDValue Op) {
10215 if (Op && Op.getOpcode() == ISD::GlobalAddress) {
10216 if (auto *GA = dyn_cast<GlobalAddressSDNode>(Op)) {
10217 auto Fn = dyn_cast_or_null<Function>(GA->getGlobal());
10218
10219 // In normal "call dllimport func" instruction (non-inlineasm) it force
10220 // indirect access by specifing call opcode. And usually specially print
10221 // asm with indirect symbol (i.g: "*") according to opcode. Inline asm can
10222 // not do in this way now. (In fact, this is similar with "Data Access"
10223 // action). So here we ignore dllimport function.
10224 if (Fn && !Fn->hasDLLImportStorageClass())
10225 return true;
10226 }
10227 }
10228 return false;
10229}
10230
10231namespace {
10232
10233struct ConstraintDecisionInfo {
10234 SmallVector<SDISelAsmOperandInfo, 16> ConstraintOperands;
10235 std::vector<SDValue> AsmNodeOperands;
10236 SDValue Glue, Chain;
10237 bool HasSideEffect = false;
10238 MCSymbol *BeginLabel = nullptr;
10239
10240 SmallVector<char> Buffer;
10241 raw_svector_ostream ErrorMsg;
10242
10243 ConstraintDecisionInfo() : ErrorMsg(Buffer) {}
10244};
10245
10246} // end anonymous namespace
10247
10248/// Construct operand info objects.
10249static bool
10250constructOperandInfo(ConstraintDecisionInfo &Info,
10251 TargetLowering::AsmOperandInfoVector &TargetConstraints,
10252 SelectionDAGBuilder &Builder, const TargetLowering &TLI,
10253 ExtraFlags &ExtraInfo) {
10254 for (auto &T : TargetConstraints) {
10255 Info.ConstraintOperands.push_back(SDISelAsmOperandInfo(T));
10256 SDISelAsmOperandInfo &OpInfo = Info.ConstraintOperands.back();
10257
10258 if (OpInfo.CallOperandVal)
10259 OpInfo.CallOperand = Builder.getValue(OpInfo.CallOperandVal);
10260
10261 if (!Info.HasSideEffect)
10262 Info.HasSideEffect = OpInfo.hasMemory(TLI);
10263
10264 // Determine if this InlineAsm MayLoad or MayStore based on the constraints.
10265 // FIXME: Could we compute this on OpInfo rather than T?
10266
10267 // Compute the constraint code and ConstraintType to use.
10269
10270 if (T.ConstraintType == TargetLowering::C_Immediate && OpInfo.CallOperand &&
10271 !isa<ConstantSDNode>(OpInfo.CallOperand)) {
10272 // We've delayed emitting a diagnostic like the "n" constraint because
10273 // inlining could cause an integer showing up.
10274 Info.ErrorMsg << "constraint '" << T.ConstraintCode
10275 << "' expects an integer constant expression";
10276 return true;
10277 }
10278
10279 ExtraInfo.update(T);
10280 }
10281
10282 return false;
10283}
10284
10285/// Compute which constraint option to use for each operand.
10286static void
10287computeConstraintToUse(ConstraintDecisionInfo &Info, const CallBase &Call,
10288 TargetLowering::AsmOperandInfoVector &TargetConstraints,
10289 SelectionDAGBuilder &Builder, const TargetLowering &TLI,
10290 const TargetMachine &TM, SelectionDAG &DAG) {
10291 const auto *IA = cast<InlineAsm>(Call.getCalledOperand());
10293 IA->collectAsmStrs(AsmStrs);
10294
10295 int OpNo = -1;
10296 for (SDISelAsmOperandInfo &OpInfo : Info.ConstraintOperands) {
10297 if (OpInfo.hasArg() || OpInfo.Type == InlineAsm::isOutput)
10298 OpNo++;
10299
10300 // If this is an output operand with a matching input operand, look up the
10301 // matching input. If their types mismatch, e.g. one is an integer, the
10302 // other is floating point, or their sizes are different, flag it as an
10303 // error.
10304 if (OpInfo.hasMatchingInput()) {
10305 SDISelAsmOperandInfo &Input =
10306 Info.ConstraintOperands[OpInfo.MatchingInput];
10307 patchMatchingInput(OpInfo, Input, DAG);
10308 }
10309
10310 // Compute the constraint code and ConstraintType to use.
10311 TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
10312
10313 if ((OpInfo.ConstraintType == TargetLowering::C_Memory &&
10314 OpInfo.Type == InlineAsm::isClobber) ||
10315 OpInfo.ConstraintType == TargetLowering::C_Address)
10316 continue;
10317
10318 // In Linux PIC model, there are 4 cases about value/label addressing:
10319 //
10320 // 1: Function call or Label jmp inside the module.
10321 // 2: Data access (such as global variable, static variable) inside module.
10322 // 3: Function call or Label jmp outside the module.
10323 // 4: Data access (such as global variable) outside the module.
10324 //
10325 // Due to current llvm inline asm architecture designed to not "recognize"
10326 // the asm code, there are quite troubles for us to treat mem addressing
10327 // differently for same value/adress used in different instuctions.
10328 // For example, in pic model, call a func may in plt way or direclty
10329 // pc-related, but lea/mov a function adress may use got.
10330 //
10331 // Here we try to "recognize" function call for the case 1 and case 3 in
10332 // inline asm. And try to adjust the constraint for them.
10333 //
10334 // TODO: Due to current inline asm didn't encourage to jmp to the outsider
10335 // label, so here we don't handle jmp function label now, but we need to
10336 // enhance it (especilly in PIC model) if we meet meaningful requirements.
10337 if (OpInfo.isIndirect && isFunction(OpInfo.CallOperand) &&
10338 TLI.isInlineAsmTargetBranch(AsmStrs, OpNo) &&
10340 OpInfo.isIndirect = false;
10341 OpInfo.ConstraintType = TargetLowering::C_Address;
10342 }
10343
10344 // If this is a memory input, and if the operand is not indirect, do what we
10345 // need to provide an address for the memory input.
10346 if (OpInfo.ConstraintType == TargetLowering::C_Memory &&
10347 !OpInfo.isIndirect) {
10348 assert((OpInfo.isMultipleAlternative ||
10349 (OpInfo.Type == InlineAsm::isInput)) &&
10350 "Can only indirectify direct input operands!");
10351
10352 // Memory operands really want the address of the value.
10353 Info.Chain = getAddressForMemoryInput(Info.Chain, Builder.getCurSDLoc(),
10354 OpInfo, DAG);
10355
10356 // There is no longer a Value* corresponding to this operand.
10357 OpInfo.CallOperandVal = nullptr;
10358
10359 // It is now an indirect operand.
10360 OpInfo.isIndirect = true;
10361 }
10362 }
10363}
10364
10365/// Prepare DAG-level operands. As part of this, assign virtual and physical
10366/// registers for inputs and output.
10367static bool prepareDAGLevelOperands(ConstraintDecisionInfo &Info,
10368 const CallBase &Call,
10369 SelectionDAGBuilder &Builder,
10370 const TargetLowering &TLI,
10371 SelectionDAG &DAG) {
10372 SDLoc DL = Builder.getCurSDLoc();
10373 for (SDISelAsmOperandInfo &OpInfo : Info.ConstraintOperands) {
10374 // Assign Registers.
10375 SDISelAsmOperandInfo &RefOpInfo =
10376 OpInfo.isMatchingInputConstraint()
10377 ? Info.ConstraintOperands[OpInfo.getMatchedOperand()]
10378 : OpInfo;
10379 const auto RegError = getRegistersForValue(DAG, DL, OpInfo, RefOpInfo);
10380 if (RegError) {
10381 const MachineFunction &MF = DAG.getMachineFunction();
10383 const char *RegName = TRI.getName(*RegError);
10384 Info.ErrorMsg << "register '" << RegName << "' allocated for constraint '"
10385 << OpInfo.ConstraintCode
10386 << "' does not match required type";
10387 return true;
10388 }
10389
10390 auto DetectWriteToReservedRegister = [&]() {
10391 const MachineFunction &MF = DAG.getMachineFunction();
10393
10394 for (Register Reg : OpInfo.AssignedRegs.Regs) {
10395 if (Reg.isPhysical() && TRI.isInlineAsmReadOnlyReg(MF, Reg)) {
10396 Info.ErrorMsg << "write to reserved register '"
10397 << TRI.getRegAsmName(Reg) << "'";
10398 return true;
10399 }
10400 }
10401
10402 return false;
10403 };
10404 assert((OpInfo.ConstraintType != TargetLowering::C_Address ||
10405 (OpInfo.Type == InlineAsm::isInput &&
10406 !OpInfo.isMatchingInputConstraint())) &&
10407 "Only address as input operand is allowed.");
10408
10409 switch (OpInfo.Type) {
10411 if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
10412 const InlineAsm::ConstraintCode ConstraintID =
10413 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10415 "Failed to convert memory constraint code to constraint id.");
10416
10417 // Add information to the INLINEASM node to know about this output.
10419 OpFlags.setMemConstraint(ConstraintID);
10420 Info.AsmNodeOperands.push_back(
10421 DAG.getTargetConstant(OpFlags, DL, MVT::i32));
10422 Info.AsmNodeOperands.push_back(OpInfo.CallOperand);
10423 } else {
10424 // Otherwise, this outputs to a register (directly for C_Register /
10425 // C_RegisterClass, and a target-defined fashion for
10426 // C_Immediate/C_Other). Find a register that we can use.
10427 if (OpInfo.AssignedRegs.Regs.empty()) {
10428 Info.ErrorMsg << "could not allocate output register for "
10429 << "constraint '" << OpInfo.ConstraintCode << "'";
10430 return true;
10431 }
10432
10433 if (DetectWriteToReservedRegister())
10434 return true;
10435
10436 // Add information to the INLINEASM node to know that this register is
10437 // set.
10438 OpInfo.AssignedRegs.AddInlineAsmOperands(
10439 OpInfo.isEarlyClobber ? InlineAsm::Kind::RegDefEarlyClobber
10441 false, 0, DL, DAG, Info.AsmNodeOperands);
10442 }
10443 break;
10444
10445 case InlineAsm::isInput:
10446 case InlineAsm::isLabel: {
10447 SDValue InOperandVal = OpInfo.CallOperand;
10448
10449 if (OpInfo.isMatchingInputConstraint()) {
10450 // If this is required to match an output register we have already set,
10451 // just use its register.
10452 auto CurOp = findMatchingInlineAsmOperand(OpInfo.getMatchedOperand(),
10453 Info.AsmNodeOperands);
10454 InlineAsm::Flag Flag(Info.AsmNodeOperands[CurOp]->getAsZExtVal());
10455 if (Flag.isRegDefKind() || Flag.isRegDefEarlyClobberKind()) {
10456 if (OpInfo.isIndirect) {
10457 // This happens on gcc/testsuite/gcc.dg/pr8788-1.c
10458 Info.ErrorMsg << "inline asm not supported yet: cannot handle "
10459 << "tied indirect register inputs";
10460 return true;
10461 }
10462
10465 MachineRegisterInfo &MRI = MF.getRegInfo();
10467 auto *R = cast<RegisterSDNode>(Info.AsmNodeOperands[CurOp + 1]);
10468 Register TiedReg = R->getReg();
10469 MVT RegVT = R->getSimpleValueType(0);
10470 const TargetRegisterClass *RC =
10471 TiedReg.isVirtual() ? MRI.getRegClass(TiedReg)
10472 : RegVT != MVT::Untyped ? TLI.getRegClassFor(RegVT)
10473 : TRI.getMinimalPhysRegClass(TiedReg);
10474 for (unsigned I = 0, E = Flag.getNumOperandRegisters(); I != E; ++I)
10475 Regs.push_back(MRI.createVirtualRegister(RC));
10476
10477 RegsForValue MatchedRegs(Regs, RegVT, InOperandVal.getValueType());
10478
10479 // Use the produced MatchedRegs object to
10480 MatchedRegs.getCopyToRegs(InOperandVal, DAG, DL, Info.Chain,
10481 &Info.Glue, &Call);
10483 OpInfo.getMatchedOperand(), DL, DAG,
10484 Info.AsmNodeOperands);
10485 break;
10486 }
10487
10488 assert(Flag.isMemKind() && "Unknown matching constraint!");
10489 assert(Flag.getNumOperandRegisters() == 1 &&
10490 "Unexpected number of operands");
10491
10492 // Add information to the INLINEASM node to know about this input.
10493 // See InlineAsm.h isUseOperandTiedToDef.
10494 Flag.clearMemConstraint();
10495 Flag.setMatchingOp(OpInfo.getMatchedOperand());
10496 Info.AsmNodeOperands.push_back(DAG.getTargetConstant(
10497 Flag, DL, TLI.getPointerTy(DAG.getDataLayout())));
10498 Info.AsmNodeOperands.push_back(Info.AsmNodeOperands[CurOp + 1]);
10499 break;
10500 }
10501
10502 // Treat indirect 'X' constraint as memory.
10503 if (OpInfo.ConstraintType == TargetLowering::C_Other &&
10504 OpInfo.isIndirect)
10505 OpInfo.ConstraintType = TargetLowering::C_Memory;
10506
10507 if (OpInfo.ConstraintType == TargetLowering::C_Immediate ||
10508 OpInfo.ConstraintType == TargetLowering::C_Other) {
10509 std::vector<SDValue> Ops;
10510 TLI.LowerAsmOperandForConstraint(InOperandVal, OpInfo.ConstraintCode,
10511 Ops, DAG);
10512 if (Ops.empty()) {
10513 if (OpInfo.ConstraintType == TargetLowering::C_Immediate)
10514 if (isa<ConstantSDNode>(InOperandVal)) {
10515 Info.ErrorMsg << "value out of range for constraint '"
10516 << OpInfo.ConstraintCode << "'";
10517 return true;
10518 }
10519
10520 Info.ErrorMsg << "invalid operand for inline asm constraint '"
10521 << OpInfo.ConstraintCode << "'";
10522 return true;
10523 }
10524
10525 // Add information to the INLINEASM node to know about this input.
10526 InlineAsm::Flag ResOpType(InlineAsm::Kind::Imm, Ops.size());
10527 Info.AsmNodeOperands.push_back(DAG.getTargetConstant(
10528 ResOpType, DL, TLI.getPointerTy(DAG.getDataLayout())));
10529 llvm::append_range(Info.AsmNodeOperands, Ops);
10530 break;
10531 }
10532
10533 if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
10534 assert((OpInfo.isIndirect ||
10535 OpInfo.ConstraintType != TargetLowering::C_Memory) &&
10536 "Operand must be indirect to be a mem!");
10537 assert(InOperandVal.getValueType() ==
10538 TLI.getPointerTy(DAG.getDataLayout()) &&
10539 "Memory operands expect pointer values");
10540
10541 const InlineAsm::ConstraintCode ConstraintID =
10542 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10544 "Failed to convert memory constraint code to constraint id.");
10545
10546 // Add information to the INLINEASM node to know about this input.
10548 ResOpType.setMemConstraint(ConstraintID);
10549 Info.AsmNodeOperands.push_back(
10550 DAG.getTargetConstant(ResOpType, DL, MVT::i32));
10551 Info.AsmNodeOperands.push_back(InOperandVal);
10552 break;
10553 }
10554
10555 if (OpInfo.ConstraintType == TargetLowering::C_Address) {
10556 const InlineAsm::ConstraintCode ConstraintID =
10557 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10559 "Failed to convert memory constraint code to constraint id.");
10560
10562
10563 SDValue AsmOp = InOperandVal;
10564 if (isFunction(InOperandVal)) {
10565 auto *GA = cast<GlobalAddressSDNode>(InOperandVal);
10566 ResOpType = InlineAsm::Flag(InlineAsm::Kind::Func, 1);
10567 AsmOp = DAG.getTargetGlobalAddress(GA->getGlobal(), DL,
10568 InOperandVal.getValueType(),
10569 GA->getOffset());
10570 }
10571
10572 // Add information to the INLINEASM node to know about this input.
10573 ResOpType.setMemConstraint(ConstraintID);
10574
10575 Info.AsmNodeOperands.push_back(
10576 DAG.getTargetConstant(ResOpType, DL, MVT::i32));
10577 Info.AsmNodeOperands.push_back(AsmOp);
10578 break;
10579 }
10580
10581 if (OpInfo.ConstraintType != TargetLowering::C_RegisterClass &&
10582 OpInfo.ConstraintType != TargetLowering::C_Register) {
10583 Info.ErrorMsg << "unknown asm constraint '" << OpInfo.ConstraintCode
10584 << "'";
10585 return true;
10586 }
10587
10588 // TODO: Support this.
10589 if (OpInfo.isIndirect) {
10590 Info.ErrorMsg << "cannot handle indirect register inputs yet for "
10591 << "constraint '" << OpInfo.ConstraintCode << "'";
10592 return true;
10593 }
10594
10595 // Copy the input into the appropriate registers.
10596 if (OpInfo.AssignedRegs.Regs.empty()) {
10597 Info.ErrorMsg << "could not allocate input reg for constraint '"
10598 << OpInfo.ConstraintCode << "'";
10599 return true;
10600 }
10601
10602 if (DetectWriteToReservedRegister())
10603 return true;
10604
10605 OpInfo.AssignedRegs.getCopyToRegs(InOperandVal, DAG, DL, Info.Chain,
10606 &Info.Glue, &Call);
10607 OpInfo.AssignedRegs.AddInlineAsmOperands(
10608 InlineAsm::Kind::RegUse, false, 0, DL, DAG, Info.AsmNodeOperands);
10609 break;
10610 }
10611
10613 // Add the clobbered value to the operand list, so that the register
10614 // allocator is aware that the physreg got clobbered.
10615 if (!OpInfo.AssignedRegs.Regs.empty())
10616 OpInfo.AssignedRegs.AddInlineAsmOperands(
10617 InlineAsm::Kind::Clobber, false, 0, DL, DAG, Info.AsmNodeOperands);
10618 break;
10619 }
10620 }
10621
10622 return false;
10623}
10624
10625/// DetermineConstraints - Find the constraints to use for inline asm operands.
10626static bool
10627determineConstraints(ConstraintDecisionInfo &Info,
10628 TargetLowering::AsmOperandInfoVector &TargetConstraints,
10629 const CallBase &Call, SelectionDAGBuilder &Builder,
10630 const TargetLowering &TLI, const TargetMachine &TM,
10631 SelectionDAG &DAG, const BasicBlock *EHPadBB) {
10632 const auto *IA = cast<InlineAsm>(Call.getCalledOperand());
10633 ExtraFlags ExtraInfo(Call);
10634
10635 // First pass: Construct operand info objects.
10636 Info.HasSideEffect = IA->hasSideEffects();
10637 if (constructOperandInfo(Info, TargetConstraints, Builder, TLI, ExtraInfo))
10638 return true;
10639
10640 // We won't need to flush pending loads if this asm doesn't touch
10641 // memory and is nonvolatile.
10642 Info.Chain = Info.HasSideEffect ? Builder.getRoot() : DAG.getRoot();
10643
10644 bool IsCallBr = isa<CallBrInst>(Call);
10645 bool EmitEHLabels = isa<InvokeInst>(Call);
10646 if (IsCallBr || EmitEHLabels)
10647 // If this is a callbr or invoke we need to flush pending exports since
10648 // inlineasm_br and invoke are terminators.
10649 // We need to do this before nodes are glued to the inlineasm_br node.
10650 Info.Chain = Builder.getControlRoot();
10651
10652 if (EmitEHLabels)
10653 Info.Chain = Builder.lowerStartEH(Info.Chain, EHPadBB, Info.BeginLabel);
10654
10655 // Second pass: Compute which constraint option to use.
10656 computeConstraintToUse(Info, Call, TargetConstraints, Builder, TLI, TM, DAG);
10657
10658 // AsmNodeOperands - The operands for the ISD::INLINEASM node.
10659 Info.AsmNodeOperands.push_back(SDValue()); // reserve space for input chain
10660 Info.AsmNodeOperands.push_back(DAG.getTargetExternalSymbol(
10661 IA->getAsmString().data(), TLI.getProgramPointerTy(DAG.getDataLayout())));
10662
10663 // If we have a !srcloc metadata node associated with it, we want to attach
10664 // this to the ultimately generated inline asm machineinstr. To do this, we
10665 // pass in the third operand as this (potentially null) inline asm MDNode.
10666 const MDNode *SrcLoc = Call.getMetadata("srcloc");
10667 Info.AsmNodeOperands.push_back(DAG.getMDNode(SrcLoc));
10668
10669 // Remember the HasSideEffect, AlignStack, AsmDialect, MayLoad and MayStore
10670 // bits as operand 3.
10671 Info.AsmNodeOperands.push_back(
10672 DAG.getTargetConstant(ExtraInfo.get(), Builder.getCurSDLoc(),
10673 TLI.getPointerTy(DAG.getDataLayout())));
10674
10675 // Third pass: Prepare DAG-level operands
10676 return prepareDAGLevelOperands(Info, Call, Builder, TLI, DAG);
10677}
10678
10679/// visitInlineAsm - Handle a call to an InlineAsm object.
10680void SelectionDAGBuilder::visitInlineAsm(const CallBase &Call,
10681 const BasicBlock *EHPadBB) {
10682 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10684 DAG.getDataLayout(), DAG.getSubtarget().getRegisterInfo(), Call);
10685
10686 assert((!isa<InvokeInst>(Call) || EHPadBB) &&
10687 "InvokeInst must have an EHPadBB");
10688
10689 ConstraintDecisionInfo Info;
10690 if (determineConstraints(Info, TargetConstraints, Call, *this, TLI, TM, DAG,
10691 EHPadBB))
10692 return emitInlineAsmError(Call, Info.ErrorMsg.str());
10693
10694 SDValue Glue = Info.Glue;
10695 SDValue Chain = Info.Chain;
10696
10697 // Finish up input operands. Set the input chain and add the flag last.
10698 Info.AsmNodeOperands[InlineAsm::Op_InputChain] = Chain;
10699 if (Glue.getNode())
10700 Info.AsmNodeOperands.push_back(Glue);
10701
10702 bool IsCallBr = isa<CallBrInst>(Call);
10703 unsigned ISDOpc = IsCallBr ? ISD::INLINEASM_BR : ISD::INLINEASM;
10704 Chain =
10705 DAG.getNode(ISDOpc, getCurSDLoc(), DAG.getVTList(MVT::Other, MVT::Glue),
10706 Info.AsmNodeOperands);
10707 Glue = Chain.getValue(1);
10708
10709 // Do additional work to generate outputs.
10710
10711 SmallVector<EVT, 1> ResultVTs;
10712 SmallVector<SDValue, 1> ResultValues;
10713 SmallVector<SDValue, 8> OutChains;
10714
10715 llvm::Type *CallResultType = Call.getType();
10716 ArrayRef<Type *> ResultTypes;
10717 if (StructType *StructResult = dyn_cast<StructType>(CallResultType))
10718 ResultTypes = StructResult->elements();
10719 else if (!CallResultType->isVoidTy())
10720 ResultTypes = ArrayRef(CallResultType);
10721
10722 auto CurResultType = ResultTypes.begin();
10723 auto handleRegAssign = [&](SDValue V) {
10724 assert(CurResultType != ResultTypes.end() && "Unexpected value");
10725 assert((*CurResultType)->isSized() && "Unexpected unsized type");
10726 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), *CurResultType);
10727 ++CurResultType;
10728 // If the type of the inline asm call site return value is different but has
10729 // same size as the type of the asm output bitcast it. One example of this
10730 // is for vectors with different width / number of elements. This can
10731 // happen for register classes that can contain multiple different value
10732 // types. The preg or vreg allocated may not have the same VT as was
10733 // expected.
10734 //
10735 // This can also happen for a return value that disagrees with the register
10736 // class it is put in, eg. a double in a general-purpose register on a
10737 // 32-bit machine.
10738 if (ResultVT != V.getValueType() &&
10739 ResultVT.getSizeInBits() == V.getValueSizeInBits())
10740 V = DAG.getNode(ISD::BITCAST, getCurSDLoc(), ResultVT, V);
10741 else if (ResultVT != V.getValueType() && ResultVT.isInteger() &&
10742 V.getValueType().isInteger()) {
10743 // If a result value was tied to an input value, the computed result
10744 // may have a wider width than the expected result. Extract the
10745 // relevant portion.
10746 V = DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), ResultVT, V);
10747 }
10748 assert(ResultVT == V.getValueType() && "Asm result value mismatch!");
10749 ResultVTs.push_back(ResultVT);
10750 ResultValues.push_back(V);
10751 };
10752
10753 // Deal with output operands.
10754 for (SDISelAsmOperandInfo &OpInfo : Info.ConstraintOperands) {
10755 if (OpInfo.Type == InlineAsm::isOutput) {
10756 SDValue Val;
10757 // Skip trivial output operands.
10758 if (OpInfo.AssignedRegs.Regs.empty())
10759 continue;
10760
10761 switch (OpInfo.ConstraintType) {
10764 Val = OpInfo.AssignedRegs.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(),
10765 Chain, &Glue, &Call);
10766 break;
10769 Val = TLI.LowerAsmOutputForConstraint(Chain, Glue, getCurSDLoc(),
10770 OpInfo, DAG);
10771 break;
10773 break; // Already handled.
10775 break; // Silence warning.
10777 assert(false && "Unexpected unknown constraint");
10778 }
10779
10780 // Indirect output manifest as stores. Record output chains.
10781 if (OpInfo.isIndirect) {
10782 const Value *Ptr = OpInfo.CallOperandVal;
10783 assert(Ptr && "Expected value CallOperandVal for indirect asm operand");
10784 SDValue Store = DAG.getStore(Chain, getCurSDLoc(), Val, getValue(Ptr),
10785 MachinePointerInfo(Ptr));
10786 OutChains.push_back(Store);
10787 } else {
10788 // generate CopyFromRegs to associated registers.
10789 assert(!Call.getType()->isVoidTy() && "Bad inline asm!");
10790 if (Val.getOpcode() == ISD::MERGE_VALUES) {
10791 for (const SDValue &V : Val->op_values())
10792 handleRegAssign(V);
10793 } else
10794 handleRegAssign(Val);
10795 }
10796 }
10797 }
10798
10799 // Set results.
10800 if (!ResultValues.empty()) {
10801 assert(CurResultType == ResultTypes.end() &&
10802 "Mismatch in number of ResultTypes");
10803 assert(ResultValues.size() == ResultTypes.size() &&
10804 "Mismatch in number of output operands in asm result");
10805
10807 DAG.getVTList(ResultVTs), ResultValues);
10808 setValue(&Call, V);
10809 }
10810
10811 // Collect store chains.
10812 if (!OutChains.empty())
10813 Chain = DAG.getNode(ISD::TokenFactor, getCurSDLoc(), MVT::Other, OutChains);
10814
10815 if (const auto *II = dyn_cast<InvokeInst>(&Call))
10816 Chain = lowerEndEH(Chain, II, EHPadBB, Info.BeginLabel);
10817
10818 // Only Update Root if inline assembly has a memory effect.
10819 if (ResultValues.empty() || Info.HasSideEffect || !OutChains.empty() ||
10820 IsCallBr || isa<InvokeInst>(Call))
10821 DAG.setRoot(Chain);
10822}
10823
10824void SelectionDAGBuilder::emitInlineAsmError(const CallBase &Call,
10825 const Twine &Message) {
10826 LLVMContext &Ctx = *DAG.getContext();
10827 Ctx.diagnose(DiagnosticInfoInlineAsm(Call, Message));
10828
10829 // Make sure we leave the DAG in a valid state
10830 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10831 SmallVector<EVT, 1> ValueVTs;
10832 ComputeValueVTs(TLI, DAG.getDataLayout(), Call.getType(), ValueVTs);
10833
10834 if (ValueVTs.empty())
10835 return;
10836
10838 for (const EVT &VT : ValueVTs)
10839 Ops.push_back(DAG.getUNDEF(VT));
10840
10841 setValue(&Call, DAG.getMergeValues(Ops, getCurSDLoc()));
10842}
10843
10844void SelectionDAGBuilder::visitVAStart(const CallInst &I) {
10845 DAG.setRoot(DAG.getNode(ISD::VASTART, getCurSDLoc(),
10846 MVT::Other, getRoot(),
10847 getValue(I.getArgOperand(0)),
10848 DAG.getSrcValue(I.getArgOperand(0))));
10849}
10850
10851void SelectionDAGBuilder::visitVAArg(const VAArgInst &I) {
10852 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10853 const DataLayout &DL = DAG.getDataLayout();
10854 SDValue V = DAG.getVAArg(
10855 TLI.getMemValueType(DAG.getDataLayout(), I.getType()), getCurSDLoc(),
10856 getRoot(), getValue(I.getOperand(0)), DAG.getSrcValue(I.getOperand(0)),
10857 DL.getABITypeAlign(I.getType()).value());
10858 DAG.setRoot(V.getValue(1));
10859
10860 if (I.getType()->isPointerTy())
10861 V = DAG.getPtrExtOrTrunc(
10862 V, getCurSDLoc(), TLI.getValueType(DAG.getDataLayout(), I.getType()));
10863 setValue(&I, V);
10864}
10865
10866void SelectionDAGBuilder::visitVAEnd(const CallInst &I) {
10867 DAG.setRoot(DAG.getNode(ISD::VAEND, getCurSDLoc(),
10868 MVT::Other, getRoot(),
10869 getValue(I.getArgOperand(0)),
10870 DAG.getSrcValue(I.getArgOperand(0))));
10871}
10872
10873void SelectionDAGBuilder::visitVACopy(const CallInst &I) {
10874 DAG.setRoot(DAG.getNode(ISD::VACOPY, getCurSDLoc(),
10875 MVT::Other, getRoot(),
10876 getValue(I.getArgOperand(0)),
10877 getValue(I.getArgOperand(1)),
10878 DAG.getSrcValue(I.getArgOperand(0)),
10879 DAG.getSrcValue(I.getArgOperand(1))));
10880}
10881
10883 const Instruction &I,
10884 SDValue Op) {
10885 std::optional<ConstantRange> CR = getRange(I);
10886
10887 if (!CR || CR->isFullSet() || CR->isEmptySet() || CR->isUpperWrapped())
10888 return Op;
10889
10890 APInt Hi = CR->getUnsignedMax();
10891 unsigned Bits = std::max(Hi.getActiveBits(),
10892 static_cast<unsigned>(IntegerType::MIN_INT_BITS));
10893
10894 EVT SmallVT = EVT::getIntegerVT(*DAG.getContext(), Bits);
10895
10896 SDLoc SL = getCurSDLoc();
10897
10898 SDValue ZExt = DAG.getNode(ISD::AssertZext, SL, Op.getValueType(), Op,
10899 DAG.getValueType(SmallVT));
10900 unsigned NumVals = Op.getNode()->getNumValues();
10901 if (NumVals == 1)
10902 return ZExt;
10903
10905
10906 Ops.push_back(ZExt);
10907 for (unsigned I = 1; I != NumVals; ++I)
10908 Ops.push_back(Op.getValue(I));
10909
10910 return DAG.getMergeValues(Ops, SL);
10911}
10912
10914 SelectionDAG &DAG, const Instruction &I, SDValue Op) {
10915 FPClassTest Classes = getNoFPClass(I);
10916 if (Classes == fcNone)
10917 return Op;
10918
10919 SDLoc SL = getCurSDLoc();
10920 SDValue TestConst = DAG.getTargetConstant(Classes, SDLoc(), MVT::i32);
10921
10922 if (Op.getOpcode() != ISD::MERGE_VALUES) {
10923 return DAG.getNode(ISD::AssertNoFPClass, SL, Op.getValueType(), Op,
10924 TestConst);
10925 }
10926
10927 SmallVector<SDValue, 8> Ops(Op.getNumOperands());
10928 for (unsigned I = 0, E = Ops.size(); I != E; ++I) {
10929 SDValue MergeOp = Op.getOperand(I);
10930 Ops[I] = DAG.getNode(ISD::AssertNoFPClass, SL, MergeOp.getValueType(),
10931 MergeOp, TestConst);
10932 }
10933
10934 return DAG.getMergeValues(Ops, SL);
10935}
10936
10937/// Populate a CallLowerinInfo (into \p CLI) based on the properties of
10938/// the call being lowered.
10939///
10940/// This is a helper for lowering intrinsics that follow a target calling
10941/// convention or require stack pointer adjustment. Only a subset of the
10942/// intrinsic's operands need to participate in the calling convention.
10945 unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy,
10946 AttributeSet RetAttrs, bool IsPatchPoint) {
10948 Args.reserve(NumArgs);
10949
10950 // Populate the argument list.
10951 // Attributes for args start at offset 1, after the return attribute.
10952 for (unsigned ArgI = ArgIdx, ArgE = ArgIdx + NumArgs;
10953 ArgI != ArgE; ++ArgI) {
10954 const Value *V = Call->getOperand(ArgI);
10955
10956 assert(!V->getType()->isEmptyTy() && "Empty type passed to intrinsic.");
10957
10958 TargetLowering::ArgListEntry Entry(getValue(V), V->getType());
10959 Entry.setAttributes(Call, ArgI);
10960 Args.push_back(Entry);
10961 }
10962
10964 .setChain(getRoot())
10965 .setCallee(Call->getCallingConv(), ReturnTy, Callee, std::move(Args),
10966 RetAttrs)
10967 .setDiscardResult(Call->use_empty())
10968 .setIsPatchPoint(IsPatchPoint)
10970 Call->countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0);
10971}
10972
10973/// Add a stack map intrinsic call's live variable operands to a stackmap
10974/// or patchpoint target node's operand list.
10975///
10976/// Constants are converted to TargetConstants purely as an optimization to
10977/// avoid constant materialization and register allocation.
10978///
10979/// FrameIndex operands are converted to TargetFrameIndex so that ISEL does not
10980/// generate addess computation nodes, and so FinalizeISel can convert the
10981/// TargetFrameIndex into a DirectMemRefOp StackMap location. This avoids
10982/// address materialization and register allocation, but may also be required
10983/// for correctness. If a StackMap (or PatchPoint) intrinsic directly uses an
10984/// alloca in the entry block, then the runtime may assume that the alloca's
10985/// StackMap location can be read immediately after compilation and that the
10986/// location is valid at any point during execution (this is similar to the
10987/// assumption made by the llvm.gcroot intrinsic). If the alloca's location were
10988/// only available in a register, then the runtime would need to trap when
10989/// execution reaches the StackMap in order to read the alloca's location.
10990static void addStackMapLiveVars(const CallBase &Call, unsigned StartIdx,
10992 SelectionDAGBuilder &Builder) {
10993 SelectionDAG &DAG = Builder.DAG;
10994 for (unsigned I = StartIdx; I < Call.arg_size(); I++) {
10995 SDValue Op = Builder.getValue(Call.getArgOperand(I));
10996
10997 // Things on the stack are pointer-typed, meaning that they are already
10998 // legal and can be emitted directly to target nodes.
11000 Ops.push_back(DAG.getTargetFrameIndex(FI->getIndex(), Op.getValueType()));
11001 } else {
11002 // Otherwise emit a target independent node to be legalised.
11003 Ops.push_back(Builder.getValue(Call.getArgOperand(I)));
11004 }
11005 }
11006}
11007
11008/// Lower llvm.experimental.stackmap.
11009void SelectionDAGBuilder::visitStackmap(const CallInst &CI) {
11010 // void @llvm.experimental.stackmap(i64 <id>, i32 <numShadowBytes>,
11011 // [live variables...])
11012
11013 assert(CI.getType()->isVoidTy() && "Stackmap cannot return a value.");
11014
11015 SDValue Chain, InGlue, Callee;
11017
11018 SDLoc DL = getCurSDLoc();
11020
11021 // The stackmap intrinsic only records the live variables (the arguments
11022 // passed to it) and emits NOPS (if requested). Unlike the patchpoint
11023 // intrinsic, this won't be lowered to a function call. This means we don't
11024 // have to worry about calling conventions and target specific lowering code.
11025 // Instead we perform the call lowering right here.
11026 //
11027 // chain, flag = CALLSEQ_START(chain, 0, 0)
11028 // chain, flag = STACKMAP(id, nbytes, ..., chain, flag)
11029 // chain, flag = CALLSEQ_END(chain, 0, 0, flag)
11030 //
11031 Chain = DAG.getCALLSEQ_START(getRoot(), 0, 0, DL);
11032 InGlue = Chain.getValue(1);
11033
11034 // Add the STACKMAP operands, starting with DAG house-keeping.
11035 Ops.push_back(Chain);
11036 Ops.push_back(InGlue);
11037
11038 // Add the <id>, <numShadowBytes> operands.
11039 //
11040 // These do not require legalisation, and can be emitted directly to target
11041 // constant nodes.
11043 assert(ID.getValueType() == MVT::i64);
11044 SDValue IDConst =
11045 DAG.getTargetConstant(ID->getAsZExtVal(), DL, ID.getValueType());
11046 Ops.push_back(IDConst);
11047
11048 SDValue Shad = getValue(CI.getArgOperand(1));
11049 assert(Shad.getValueType() == MVT::i32);
11050 SDValue ShadConst =
11051 DAG.getTargetConstant(Shad->getAsZExtVal(), DL, Shad.getValueType());
11052 Ops.push_back(ShadConst);
11053
11054 // Add the live variables.
11055 addStackMapLiveVars(CI, 2, DL, Ops, *this);
11056
11057 // Create the STACKMAP node.
11058 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
11059 Chain = DAG.getNode(ISD::STACKMAP, DL, NodeTys, Ops);
11060 InGlue = Chain.getValue(1);
11061
11062 Chain = DAG.getCALLSEQ_END(Chain, 0, 0, InGlue, DL);
11063
11064 // Stackmaps don't generate values, so nothing goes into the NodeMap.
11065
11066 // Set the root to the target-lowered call chain.
11067 DAG.setRoot(Chain);
11068
11069 // Inform the Frame Information that we have a stackmap in this function.
11070 FuncInfo.MF->getFrameInfo().setHasStackMap();
11071}
11072
11073/// Lower llvm.experimental.patchpoint directly to its target opcode.
11074void SelectionDAGBuilder::visitPatchpoint(const CallBase &CB,
11075 const BasicBlock *EHPadBB) {
11076 // <ty> @llvm.experimental.patchpoint.<ty>(i64 <id>,
11077 // i32 <numBytes>,
11078 // i8* <target>,
11079 // i32 <numArgs>,
11080 // [Args...],
11081 // [live variables...])
11082
11084 bool IsAnyRegCC = CC == CallingConv::AnyReg;
11085 bool HasDef = !CB.getType()->isVoidTy();
11086 SDLoc dl = getCurSDLoc();
11088
11089 // Handle immediate and symbolic callees.
11090 if (auto* ConstCallee = dyn_cast<ConstantSDNode>(Callee))
11091 Callee = DAG.getIntPtrConstant(ConstCallee->getZExtValue(), dl,
11092 /*isTarget=*/true);
11093 else if (auto* SymbolicCallee = dyn_cast<GlobalAddressSDNode>(Callee))
11094 Callee = DAG.getTargetGlobalAddress(SymbolicCallee->getGlobal(),
11095 SDLoc(SymbolicCallee),
11096 SymbolicCallee->getValueType(0));
11097
11098 // Get the real number of arguments participating in the call <numArgs>
11100 unsigned NumArgs = NArgVal->getAsZExtVal();
11101
11102 // Skip the four meta args: <id>, <numNopBytes>, <target>, <numArgs>
11103 // Intrinsics include all meta-operands up to but not including CC.
11104 unsigned NumMetaOpers = PatchPointOpers::CCPos;
11105 assert(CB.arg_size() >= NumMetaOpers + NumArgs &&
11106 "Not enough arguments provided to the patchpoint intrinsic");
11107
11108 // For AnyRegCC the arguments are lowered later on manually.
11109 unsigned NumCallArgs = IsAnyRegCC ? 0 : NumArgs;
11110 Type *ReturnTy =
11111 IsAnyRegCC ? Type::getVoidTy(*DAG.getContext()) : CB.getType();
11112
11113 TargetLowering::CallLoweringInfo CLI(DAG);
11114 populateCallLoweringInfo(CLI, &CB, NumMetaOpers, NumCallArgs, Callee,
11115 ReturnTy, CB.getAttributes().getRetAttrs(), true);
11116 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
11117
11118 SDNode *CallEnd = Result.second.getNode();
11119 if (CallEnd->getOpcode() == ISD::EH_LABEL)
11120 CallEnd = CallEnd->getOperand(0).getNode();
11121 if (HasDef && (CallEnd->getOpcode() == ISD::CopyFromReg))
11122 CallEnd = CallEnd->getOperand(0).getNode();
11123
11124 /// Get a call instruction from the call sequence chain.
11125 /// Tail calls are not allowed.
11126 assert(CallEnd->getOpcode() == ISD::CALLSEQ_END &&
11127 "Expected a callseq node.");
11128 SDNode *Call = CallEnd->getOperand(0).getNode();
11129 bool HasGlue = Call->getGluedNode();
11130
11131 // Replace the target specific call node with the patchable intrinsic.
11133
11134 // Push the chain.
11135 Ops.push_back(*(Call->op_begin()));
11136
11137 // Optionally, push the glue (if any).
11138 if (HasGlue)
11139 Ops.push_back(*(Call->op_end() - 1));
11140
11141 // Push the register mask info.
11142 if (HasGlue)
11143 Ops.push_back(*(Call->op_end() - 2));
11144 else
11145 Ops.push_back(*(Call->op_end() - 1));
11146
11147 // Add the <id> and <numBytes> constants.
11149 Ops.push_back(DAG.getTargetConstant(IDVal->getAsZExtVal(), dl, MVT::i64));
11151 Ops.push_back(DAG.getTargetConstant(NBytesVal->getAsZExtVal(), dl, MVT::i32));
11152
11153 // Add the callee.
11154 Ops.push_back(Callee);
11155
11156 // Adjust <numArgs> to account for any arguments that have been passed on the
11157 // stack instead.
11158 // Call Node: Chain, Target, {Args}, RegMask, [Glue]
11159 unsigned NumCallRegArgs = Call->getNumOperands() - (HasGlue ? 4 : 3);
11160 NumCallRegArgs = IsAnyRegCC ? NumArgs : NumCallRegArgs;
11161 Ops.push_back(DAG.getTargetConstant(NumCallRegArgs, dl, MVT::i32));
11162
11163 // Add the calling convention
11164 Ops.push_back(DAG.getTargetConstant((unsigned)CC, dl, MVT::i32));
11165
11166 // Add the arguments we omitted previously. The register allocator should
11167 // place these in any free register.
11168 if (IsAnyRegCC)
11169 for (unsigned i = NumMetaOpers, e = NumMetaOpers + NumArgs; i != e; ++i)
11170 Ops.push_back(getValue(CB.getArgOperand(i)));
11171
11172 // Push the arguments from the call instruction.
11173 SDNode::op_iterator e = HasGlue ? Call->op_end()-2 : Call->op_end()-1;
11174 Ops.append(Call->op_begin() + 2, e);
11175
11176 // Push live variables for the stack map.
11177 addStackMapLiveVars(CB, NumMetaOpers + NumArgs, dl, Ops, *this);
11178
11179 SDVTList NodeTys;
11180 if (IsAnyRegCC && HasDef) {
11181 // Create the return types based on the intrinsic definition
11182 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11183 SmallVector<EVT, 3> ValueVTs;
11184 ComputeValueVTs(TLI, DAG.getDataLayout(), CB.getType(), ValueVTs);
11185 assert(ValueVTs.size() == 1 && "Expected only one return value type.");
11186
11187 // There is always a chain and a glue type at the end
11188 ValueVTs.push_back(MVT::Other);
11189 ValueVTs.push_back(MVT::Glue);
11190 NodeTys = DAG.getVTList(ValueVTs);
11191 } else
11192 NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
11193
11194 // Replace the target specific call node with a PATCHPOINT node.
11195 SDValue PPV = DAG.getNode(ISD::PATCHPOINT, dl, NodeTys, Ops);
11196
11197 // Update the NodeMap.
11198 if (HasDef) {
11199 if (IsAnyRegCC)
11200 setValue(&CB, SDValue(PPV.getNode(), 0));
11201 else
11202 setValue(&CB, Result.first);
11203 }
11204
11205 // Fixup the consumers of the intrinsic. The chain and glue may be used in the
11206 // call sequence. Furthermore the location of the chain and glue can change
11207 // when the AnyReg calling convention is used and the intrinsic returns a
11208 // value.
11209 if (IsAnyRegCC && HasDef) {
11210 SDValue From[] = {SDValue(Call, 0), SDValue(Call, 1)};
11211 SDValue To[] = {PPV.getValue(1), PPV.getValue(2)};
11212 DAG.ReplaceAllUsesOfValuesWith(From, To, 2);
11213 } else
11214 DAG.ReplaceAllUsesWith(Call, PPV.getNode());
11215 DAG.DeleteNode(Call);
11216
11217 // Inform the Frame Information that we have a patchpoint in this function.
11218 FuncInfo.MF->getFrameInfo().setHasPatchPoint();
11219}
11220
11221void SelectionDAGBuilder::visitVectorReduce(const CallInst &I,
11222 unsigned Intrinsic) {
11223 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11224 SDValue Op1 = getValue(I.getArgOperand(0));
11225 SDValue Op2;
11226 if (I.arg_size() > 1)
11227 Op2 = getValue(I.getArgOperand(1));
11228 SDLoc dl = getCurSDLoc();
11229 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
11230 SDValue Res;
11231 SDNodeFlags SDFlags;
11232 if (auto *FPMO = dyn_cast<FPMathOperator>(&I))
11233 SDFlags.copyFMF(*FPMO);
11234
11235 switch (Intrinsic) {
11236 case Intrinsic::vector_reduce_fadd:
11237 if (SDFlags.hasAllowReassociation())
11238 Res = DAG.getNode(ISD::FADD, dl, VT, Op1,
11239 DAG.getNode(ISD::VECREDUCE_FADD, dl, VT, Op2, SDFlags),
11240 SDFlags);
11241 else
11242 Res = DAG.getNode(ISD::VECREDUCE_SEQ_FADD, dl, VT, Op1, Op2, SDFlags);
11243 break;
11244 case Intrinsic::vector_reduce_fmul:
11245 if (SDFlags.hasAllowReassociation())
11246 Res = DAG.getNode(ISD::FMUL, dl, VT, Op1,
11247 DAG.getNode(ISD::VECREDUCE_FMUL, dl, VT, Op2, SDFlags),
11248 SDFlags);
11249 else
11250 Res = DAG.getNode(ISD::VECREDUCE_SEQ_FMUL, dl, VT, Op1, Op2, SDFlags);
11251 break;
11252 case Intrinsic::vector_reduce_add:
11253 Res = DAG.getNode(ISD::VECREDUCE_ADD, dl, VT, Op1);
11254 break;
11255 case Intrinsic::vector_reduce_mul:
11256 Res = DAG.getNode(ISD::VECREDUCE_MUL, dl, VT, Op1);
11257 break;
11258 case Intrinsic::vector_reduce_and:
11259 Res = DAG.getNode(ISD::VECREDUCE_AND, dl, VT, Op1);
11260 break;
11261 case Intrinsic::vector_reduce_or:
11262 Res = DAG.getNode(ISD::VECREDUCE_OR, dl, VT, Op1);
11263 break;
11264 case Intrinsic::vector_reduce_xor:
11265 Res = DAG.getNode(ISD::VECREDUCE_XOR, dl, VT, Op1);
11266 break;
11267 case Intrinsic::vector_reduce_smax:
11268 Res = DAG.getNode(ISD::VECREDUCE_SMAX, dl, VT, Op1);
11269 break;
11270 case Intrinsic::vector_reduce_smin:
11271 Res = DAG.getNode(ISD::VECREDUCE_SMIN, dl, VT, Op1);
11272 break;
11273 case Intrinsic::vector_reduce_umax:
11274 Res = DAG.getNode(ISD::VECREDUCE_UMAX, dl, VT, Op1);
11275 break;
11276 case Intrinsic::vector_reduce_umin:
11277 Res = DAG.getNode(ISD::VECREDUCE_UMIN, dl, VT, Op1);
11278 break;
11279 case Intrinsic::vector_reduce_fmax:
11280 Res = DAG.getNode(ISD::VECREDUCE_FMAX, dl, VT, Op1, SDFlags);
11281 break;
11282 case Intrinsic::vector_reduce_fmin:
11283 Res = DAG.getNode(ISD::VECREDUCE_FMIN, dl, VT, Op1, SDFlags);
11284 break;
11285 case Intrinsic::vector_reduce_fmaximum:
11286 Res = DAG.getNode(ISD::VECREDUCE_FMAXIMUM, dl, VT, Op1, SDFlags);
11287 break;
11288 case Intrinsic::vector_reduce_fminimum:
11289 Res = DAG.getNode(ISD::VECREDUCE_FMINIMUM, dl, VT, Op1, SDFlags);
11290 break;
11291 default:
11292 llvm_unreachable("Unhandled vector reduce intrinsic");
11293 }
11294 setValue(&I, Res);
11295}
11296
11297/// Returns an AttributeList representing the attributes applied to the return
11298/// value of the given call.
11301 if (CLI.RetSExt)
11302 Attrs.push_back(Attribute::SExt);
11303 if (CLI.RetZExt)
11304 Attrs.push_back(Attribute::ZExt);
11305 if (CLI.IsInReg)
11306 Attrs.push_back(Attribute::InReg);
11307
11308 return AttributeList::get(CLI.RetTy->getContext(), AttributeList::ReturnIndex,
11309 Attrs);
11310}
11311
11312/// TargetLowering::LowerCallTo - This is the default LowerCallTo
11313/// implementation, which just calls LowerCall.
11314/// FIXME: When all targets are
11315/// migrated to using LowerCall, this hook should be integrated into SDISel.
11316std::pair<SDValue, SDValue>
11318 LLVMContext &Context = CLI.RetTy->getContext();
11319
11320 // Handle the incoming return values from the call.
11321 CLI.Ins.clear();
11322 SmallVector<Type *, 4> RetOrigTys;
11324 auto &DL = CLI.DAG.getDataLayout();
11325 ComputeValueTypes(DL, CLI.OrigRetTy, RetOrigTys, &Offsets);
11326
11327 SmallVector<EVT, 4> RetVTs;
11328 if (CLI.RetTy != CLI.OrigRetTy) {
11329 assert(RetOrigTys.size() == 1 &&
11330 "Only supported for non-aggregate returns");
11331 RetVTs.push_back(getValueType(DL, CLI.RetTy));
11332 } else {
11333 for (Type *Ty : RetOrigTys)
11334 RetVTs.push_back(getValueType(DL, Ty));
11335 }
11336
11337 if (CLI.IsPostTypeLegalization) {
11338 // If we are lowering a libcall after legalization, split the return type.
11339 SmallVector<Type *, 4> OldRetOrigTys;
11340 SmallVector<EVT, 4> OldRetVTs;
11341 SmallVector<TypeSize, 4> OldOffsets;
11342 RetOrigTys.swap(OldRetOrigTys);
11343 RetVTs.swap(OldRetVTs);
11344 Offsets.swap(OldOffsets);
11345
11346 for (size_t i = 0, e = OldRetVTs.size(); i != e; ++i) {
11347 EVT RetVT = OldRetVTs[i];
11348 uint64_t Offset = OldOffsets[i];
11349 MVT RegisterVT = getRegisterType(Context, RetVT);
11350 unsigned NumRegs = getNumRegisters(Context, RetVT);
11351 unsigned RegisterVTByteSZ = RegisterVT.getSizeInBits() / 8;
11352 RetOrigTys.append(NumRegs, OldRetOrigTys[i]);
11353 RetVTs.append(NumRegs, RegisterVT);
11354 for (unsigned j = 0; j != NumRegs; ++j)
11355 Offsets.push_back(TypeSize::getFixed(Offset + j * RegisterVTByteSZ));
11356 }
11357 }
11358
11360 GetReturnInfo(CLI.CallConv, CLI.RetTy, getReturnAttrs(CLI), Outs, *this, DL);
11361
11362 bool CanLowerReturn =
11364 CLI.IsVarArg, Outs, Context, CLI.RetTy);
11365
11366 SDValue DemoteStackSlot;
11367 int DemoteStackIdx = -100;
11368 if (!CanLowerReturn) {
11369 // FIXME: equivalent assert?
11370 // assert(!CS.hasInAllocaArgument() &&
11371 // "sret demotion is incompatible with inalloca");
11372 uint64_t TySize = DL.getTypeAllocSize(CLI.RetTy);
11373 Align Alignment = DL.getPrefTypeAlign(CLI.RetTy);
11375 DemoteStackIdx =
11376 MF.getFrameInfo().CreateStackObject(TySize, Alignment, false);
11377 Type *StackSlotPtrType = PointerType::get(Context, DL.getAllocaAddrSpace());
11378
11379 DemoteStackSlot = CLI.DAG.getFrameIndex(DemoteStackIdx, getFrameIndexTy(DL));
11380 ArgListEntry Entry(DemoteStackSlot, StackSlotPtrType);
11381 Entry.IsSRet = true;
11382 Entry.Alignment = Alignment;
11383 CLI.getArgs().insert(CLI.getArgs().begin(), Entry);
11384 CLI.NumFixedArgs += 1;
11385 CLI.getArgs()[0].IndirectType = CLI.RetTy;
11386 CLI.RetTy = CLI.OrigRetTy = Type::getVoidTy(Context);
11387
11388 // sret demotion isn't compatible with tail-calls, since the sret argument
11389 // points into the callers stack frame.
11390 CLI.IsTailCall = false;
11391 } else {
11392 bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
11393 CLI.RetTy, CLI.CallConv, CLI.IsVarArg, DL);
11394 for (unsigned I = 0, E = RetVTs.size(); I != E; ++I) {
11395 ISD::ArgFlagsTy Flags;
11396 if (NeedsRegBlock) {
11397 Flags.setInConsecutiveRegs();
11398 if (I == RetVTs.size() - 1)
11399 Flags.setInConsecutiveRegsLast();
11400 }
11401 EVT VT = RetVTs[I];
11402 MVT RegisterVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11403 unsigned NumRegs =
11404 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11405 for (unsigned i = 0; i != NumRegs; ++i) {
11406 ISD::InputArg Ret(Flags, RegisterVT, VT, RetOrigTys[I],
11408 if (CLI.RetTy->isPointerTy()) {
11409 Ret.Flags.setPointer();
11411 cast<PointerType>(CLI.RetTy)->getAddressSpace());
11412 }
11413 if (CLI.RetSExt)
11414 Ret.Flags.setSExt();
11415 if (CLI.RetZExt)
11416 Ret.Flags.setZExt();
11417 if (CLI.IsInReg)
11418 Ret.Flags.setInReg();
11419 CLI.Ins.push_back(Ret);
11420 }
11421 }
11422 }
11423
11424 // We push in swifterror return as the last element of CLI.Ins.
11425 ArgListTy &Args = CLI.getArgs();
11426 if (supportSwiftError()) {
11427 for (const ArgListEntry &Arg : Args) {
11428 if (Arg.IsSwiftError) {
11429 ISD::ArgFlagsTy Flags;
11430 Flags.setSwiftError();
11432 PointerType::getUnqual(Context),
11433 /*Used=*/true, ISD::InputArg::NoArgIndex, 0);
11434 CLI.Ins.push_back(Ret);
11435 }
11436 }
11437 }
11438
11439 // Handle all of the outgoing arguments.
11440 CLI.Outs.clear();
11441 CLI.OutVals.clear();
11442 for (unsigned i = 0, e = Args.size(); i != e; ++i) {
11443 SmallVector<Type *, 4> OrigArgTys;
11444 ComputeValueTypes(DL, Args[i].OrigTy, OrigArgTys);
11445 // FIXME: Split arguments if CLI.IsPostTypeLegalization
11446 Type *FinalType = Args[i].Ty;
11447 if (Args[i].IsByVal)
11448 FinalType = Args[i].IndirectType;
11449 bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
11450 FinalType, CLI.CallConv, CLI.IsVarArg, DL);
11451 for (unsigned Value = 0, NumValues = OrigArgTys.size(); Value != NumValues;
11452 ++Value) {
11453 Type *OrigArgTy = OrigArgTys[Value];
11454 Type *ArgTy = OrigArgTy;
11455 if (Args[i].Ty != Args[i].OrigTy) {
11456 assert(Value == 0 && "Only supported for non-aggregate arguments");
11457 ArgTy = Args[i].Ty;
11458 }
11459
11460 EVT VT = getValueType(DL, ArgTy);
11461 SDValue Op = SDValue(Args[i].Node.getNode(),
11462 Args[i].Node.getResNo() + Value);
11463 ISD::ArgFlagsTy Flags;
11464
11465 // Certain targets (such as MIPS), may have a different ABI alignment
11466 // for a type depending on the context. Give the target a chance to
11467 // specify the alignment it wants.
11468 const Align OriginalAlignment(getABIAlignmentForCallingConv(ArgTy, DL));
11469 Flags.setOrigAlign(OriginalAlignment);
11470
11471 if (i >= CLI.NumFixedArgs)
11472 Flags.setVarArg();
11473 if (ArgTy->isPointerTy()) {
11474 Flags.setPointer();
11475 Flags.setPointerAddrSpace(cast<PointerType>(ArgTy)->getAddressSpace());
11476 }
11477 if (Args[i].IsZExt)
11478 Flags.setZExt();
11479 if (Args[i].IsSExt)
11480 Flags.setSExt();
11481 if (Args[i].IsNoExt)
11482 Flags.setNoExt();
11483 if (Args[i].IsInReg) {
11484 // If we are using vectorcall calling convention, a structure that is
11485 // passed InReg - is surely an HVA
11487 isa<StructType>(FinalType)) {
11488 // The first value of a structure is marked
11489 if (0 == Value)
11490 Flags.setHvaStart();
11491 Flags.setHva();
11492 }
11493 // Set InReg Flag
11494 Flags.setInReg();
11495 }
11496 if (Args[i].IsSRet)
11497 Flags.setSRet();
11498 if (Args[i].IsSwiftSelf)
11499 Flags.setSwiftSelf();
11500 if (Args[i].IsSwiftAsync)
11501 Flags.setSwiftAsync();
11502 if (Args[i].IsSwiftError)
11503 Flags.setSwiftError();
11504 if (Args[i].IsCFGuardTarget)
11505 Flags.setCFGuardTarget();
11506 if (Args[i].IsByVal)
11507 Flags.setByVal();
11508 if (Args[i].IsByRef)
11509 Flags.setByRef();
11510 if (Args[i].IsPreallocated) {
11511 Flags.setPreallocated();
11512 // Set the byval flag for CCAssignFn callbacks that don't know about
11513 // preallocated. This way we can know how many bytes we should've
11514 // allocated and how many bytes a callee cleanup function will pop. If
11515 // we port preallocated to more targets, we'll have to add custom
11516 // preallocated handling in the various CC lowering callbacks.
11517 Flags.setByVal();
11518 }
11519 if (Args[i].IsInAlloca) {
11520 Flags.setInAlloca();
11521 // Set the byval flag for CCAssignFn callbacks that don't know about
11522 // inalloca. This way we can know how many bytes we should've allocated
11523 // and how many bytes a callee cleanup function will pop. If we port
11524 // inalloca to more targets, we'll have to add custom inalloca handling
11525 // in the various CC lowering callbacks.
11526 Flags.setByVal();
11527 }
11528 Align MemAlign;
11529 if (Args[i].IsByVal || Args[i].IsInAlloca || Args[i].IsPreallocated) {
11530 unsigned FrameSize = DL.getTypeAllocSize(Args[i].IndirectType);
11531 Flags.setByValSize(FrameSize);
11532
11533 // info is not there but there are cases it cannot get right.
11534 if (auto MA = Args[i].Alignment)
11535 MemAlign = *MA;
11536 else
11537 MemAlign = getByValTypeAlignment(Args[i].IndirectType, DL);
11538 } else if (auto MA = Args[i].Alignment) {
11539 MemAlign = *MA;
11540 } else {
11541 MemAlign = OriginalAlignment;
11542 }
11543 Flags.setMemAlign(MemAlign);
11544 if (Args[i].IsNest)
11545 Flags.setNest();
11546 if (NeedsRegBlock)
11547 Flags.setInConsecutiveRegs();
11548
11549 MVT PartVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11550 unsigned NumParts =
11551 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11552 SmallVector<SDValue, 4> Parts(NumParts);
11553 ISD::NodeType ExtendKind = ISD::ANY_EXTEND;
11554
11555 if (Args[i].IsSExt)
11556 ExtendKind = ISD::SIGN_EXTEND;
11557 else if (Args[i].IsZExt)
11558 ExtendKind = ISD::ZERO_EXTEND;
11559
11560 // Conservatively only handle 'returned' on non-vectors that can be lowered,
11561 // for now.
11562 if (Args[i].IsReturned && !Op.getValueType().isVector() &&
11564 assert((CLI.RetTy == Args[i].Ty ||
11565 (CLI.RetTy->isPointerTy() && Args[i].Ty->isPointerTy() &&
11567 Args[i].Ty->getPointerAddressSpace())) &&
11568 RetVTs.size() == NumValues && "unexpected use of 'returned'");
11569 // Before passing 'returned' to the target lowering code, ensure that
11570 // either the register MVT and the actual EVT are the same size or that
11571 // the return value and argument are extended in the same way; in these
11572 // cases it's safe to pass the argument register value unchanged as the
11573 // return register value (although it's at the target's option whether
11574 // to do so)
11575 // TODO: allow code generation to take advantage of partially preserved
11576 // registers rather than clobbering the entire register when the
11577 // parameter extension method is not compatible with the return
11578 // extension method
11579 if ((NumParts * PartVT.getSizeInBits() == VT.getSizeInBits()) ||
11580 (ExtendKind != ISD::ANY_EXTEND && CLI.RetSExt == Args[i].IsSExt &&
11581 CLI.RetZExt == Args[i].IsZExt))
11582 Flags.setReturned();
11583 }
11584
11585 getCopyToParts(CLI.DAG, CLI.DL, Op, &Parts[0], NumParts, PartVT, CLI.CB,
11586 CLI.CallConv, ExtendKind);
11587
11588 for (unsigned j = 0; j != NumParts; ++j) {
11589 // if it isn't first piece, alignment must be 1
11590 // For scalable vectors the scalable part is currently handled
11591 // by individual targets, so we just use the known minimum size here.
11592 ISD::OutputArg MyFlags(
11593 Flags, Parts[j].getValueType().getSimpleVT(), VT, OrigArgTy, i,
11594 j * Parts[j].getValueType().getStoreSize().getKnownMinValue());
11595 if (NumParts > 1 && j == 0)
11596 MyFlags.Flags.setSplit();
11597 else if (j != 0) {
11598 MyFlags.Flags.setOrigAlign(Align(1));
11599 if (j == NumParts - 1)
11600 MyFlags.Flags.setSplitEnd();
11601 }
11602
11603 CLI.Outs.push_back(MyFlags);
11604 CLI.OutVals.push_back(Parts[j]);
11605 }
11606
11607 if (NeedsRegBlock && Value == NumValues - 1)
11608 CLI.Outs[CLI.Outs.size() - 1].Flags.setInConsecutiveRegsLast();
11609 }
11610 }
11611
11613 CLI.Chain = LowerCall(CLI, InVals);
11614
11615 // Update CLI.InVals to use outside of this function.
11616 CLI.InVals = InVals;
11617
11618 // Verify that the target's LowerCall behaved as expected.
11619 assert(CLI.Chain.getNode() && CLI.Chain.getValueType() == MVT::Other &&
11620 "LowerCall didn't return a valid chain!");
11621 assert((!CLI.IsTailCall || InVals.empty()) &&
11622 "LowerCall emitted a return value for a tail call!");
11623 assert((CLI.IsTailCall || InVals.size() == CLI.Ins.size()) &&
11624 "LowerCall didn't emit the correct number of values!");
11625
11626 // For a tail call, the return value is merely live-out and there aren't
11627 // any nodes in the DAG representing it. Return a special value to
11628 // indicate that a tail call has been emitted and no more Instructions
11629 // should be processed in the current block.
11630 if (CLI.IsTailCall) {
11631 CLI.DAG.setRoot(CLI.Chain);
11632 return std::make_pair(SDValue(), SDValue());
11633 }
11634
11635#ifndef NDEBUG
11636 for (unsigned i = 0, e = CLI.Ins.size(); i != e; ++i) {
11637 assert(InVals[i].getNode() && "LowerCall emitted a null value!");
11638 assert(EVT(CLI.Ins[i].VT) == InVals[i].getValueType() &&
11639 "LowerCall emitted a value with the wrong type!");
11640 }
11641#endif
11642
11643 SmallVector<SDValue, 4> ReturnValues;
11644 if (!CanLowerReturn) {
11645 // The instruction result is the result of loading from the
11646 // hidden sret parameter.
11647 MVT PtrVT = getPointerTy(DL, DL.getAllocaAddrSpace());
11648
11649 unsigned NumValues = RetVTs.size();
11650 ReturnValues.resize(NumValues);
11651 SmallVector<SDValue, 4> Chains(NumValues);
11652
11653 // An aggregate return value cannot wrap around the address space, so
11654 // offsets to its parts don't wrap either.
11656 Align HiddenSRetAlign = MF.getFrameInfo().getObjectAlign(DemoteStackIdx);
11657 for (unsigned i = 0; i < NumValues; ++i) {
11659 DemoteStackSlot, CLI.DAG.getConstant(Offsets[i], CLI.DL, PtrVT),
11661 SDValue L = CLI.DAG.getLoad(
11662 RetVTs[i], CLI.DL, CLI.Chain, Add,
11664 DemoteStackIdx, Offsets[i]),
11665 HiddenSRetAlign);
11666 ReturnValues[i] = L;
11667 Chains[i] = L.getValue(1);
11668 }
11669
11670 CLI.Chain = CLI.DAG.getNode(ISD::TokenFactor, CLI.DL, MVT::Other, Chains);
11671 } else {
11672 // Collect the legal value parts into potentially illegal values
11673 // that correspond to the original function's return values.
11674 std::optional<ISD::NodeType> AssertOp;
11675 if (CLI.RetSExt)
11676 AssertOp = ISD::AssertSext;
11677 else if (CLI.RetZExt)
11678 AssertOp = ISD::AssertZext;
11679 unsigned CurReg = 0;
11680 for (EVT VT : RetVTs) {
11681 MVT RegisterVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11682 unsigned NumRegs =
11683 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11684
11685 ReturnValues.push_back(getCopyFromParts(
11686 CLI.DAG, CLI.DL, &InVals[CurReg], NumRegs, RegisterVT, VT, nullptr,
11687 CLI.Chain, CLI.CallConv, AssertOp));
11688 CurReg += NumRegs;
11689 }
11690
11691 // For a function returning void, there is no return value. We can't create
11692 // such a node, so we just return a null return value in that case. In
11693 // that case, nothing will actually look at the value.
11694 if (ReturnValues.empty())
11695 return std::make_pair(SDValue(), CLI.Chain);
11696 }
11697
11698 SDValue Res = CLI.DAG.getNode(ISD::MERGE_VALUES, CLI.DL,
11699 CLI.DAG.getVTList(RetVTs), ReturnValues);
11700 return std::make_pair(Res, CLI.Chain);
11701}
11702
11703/// Places new result values for the node in Results (their number
11704/// and types must exactly match those of the original return values of
11705/// the node), or leaves Results empty, which indicates that the node is not
11706/// to be custom lowered after all.
11709 SelectionDAG &DAG) const {
11710 SDValue Res = LowerOperation(SDValue(N, 0), DAG);
11711
11712 if (!Res.getNode())
11713 return;
11714
11715 // If the original node has one result, take the return value from
11716 // LowerOperation as is. It might not be result number 0.
11717 if (N->getNumValues() == 1) {
11718 Results.push_back(Res);
11719 return;
11720 }
11721
11722 // If the original node has multiple results, then the return node should
11723 // have the same number of results.
11724 assert((N->getNumValues() == Res->getNumValues()) &&
11725 "Lowering returned the wrong number of results!");
11726
11727 // Places new result values base on N result number.
11728 for (unsigned I = 0, E = N->getNumValues(); I != E; ++I)
11729 Results.push_back(Res.getValue(I));
11730}
11731
11733 llvm_unreachable("LowerOperation not implemented for this target!");
11734}
11735
11737 Register Reg,
11738 ISD::NodeType ExtendType) {
11740 assert((Op.getOpcode() != ISD::CopyFromReg ||
11741 cast<RegisterSDNode>(Op.getOperand(1))->getReg() != Reg) &&
11742 "Copy from a reg to the same reg!");
11743 assert(!Reg.isPhysical() && "Is a physreg");
11744
11745 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11746 // If this is an InlineAsm we have to match the registers required, not the
11747 // notional registers required by the type.
11748
11749 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), Reg, V->getType(),
11750 std::nullopt); // This is not an ABI copy.
11751 SDValue Chain = DAG.getEntryNode();
11752
11753 if (ExtendType == ISD::ANY_EXTEND) {
11754 auto PreferredExtendIt = FuncInfo.PreferredExtendType.find(V);
11755 if (PreferredExtendIt != FuncInfo.PreferredExtendType.end())
11756 ExtendType = PreferredExtendIt->second;
11757 }
11758 RFV.getCopyToRegs(Op, DAG, getCurSDLoc(), Chain, nullptr, V, ExtendType);
11759 PendingExports.push_back(Chain);
11760}
11761
11763
11764/// isOnlyUsedInEntryBlock - If the specified argument is only used in the
11765/// entry block, return true. This includes arguments used by switches, since
11766/// the switch may expand into multiple basic blocks.
11767static bool isOnlyUsedInEntryBlock(const Argument *A, bool FastISel) {
11768 // With FastISel active, we may be splitting blocks, so force creation
11769 // of virtual registers for all non-dead arguments.
11770 if (FastISel)
11771 return A->use_empty();
11772
11773 const BasicBlock &Entry = A->getParent()->front();
11774 for (const User *U : A->users())
11775 if (cast<Instruction>(U)->getParent() != &Entry || isa<SwitchInst>(U))
11776 return false; // Use not in entry block.
11777
11778 return true;
11779}
11780
11782 DenseMap<const Argument *,
11783 std::pair<const AllocaInst *, const StoreInst *>>;
11784
11785/// Scan the entry block of the function in FuncInfo for arguments that look
11786/// like copies into a local alloca. Record any copied arguments in
11787/// ArgCopyElisionCandidates.
11788static void
11790 FunctionLoweringInfo *FuncInfo,
11791 ArgCopyElisionMapTy &ArgCopyElisionCandidates) {
11792 // Record the state of every static alloca used in the entry block. Argument
11793 // allocas are all used in the entry block, so we need approximately as many
11794 // entries as we have arguments.
11795 enum StaticAllocaInfo { Unknown, Clobbered, Elidable };
11797 unsigned NumArgs = FuncInfo->Fn->arg_size();
11798 StaticAllocas.reserve(NumArgs * 2);
11799
11800 auto GetInfoIfStaticAlloca = [&](const Value *V) -> StaticAllocaInfo * {
11801 if (!V)
11802 return nullptr;
11803 V = V->stripPointerCasts();
11804 const auto *AI = dyn_cast<AllocaInst>(V);
11805 if (!AI || !AI->isStaticAlloca() || !FuncInfo->StaticAllocaMap.count(AI))
11806 return nullptr;
11807 auto Iter = StaticAllocas.insert({AI, Unknown});
11808 return &Iter.first->second;
11809 };
11810
11811 // Look for stores of arguments to static allocas. Look through bitcasts and
11812 // GEPs to handle type coercions, as long as the alloca is fully initialized
11813 // by the store. Any non-store use of an alloca escapes it and any subsequent
11814 // unanalyzed store might write it.
11815 // FIXME: Handle structs initialized with multiple stores.
11816 for (const Instruction &I : FuncInfo->Fn->getEntryBlock()) {
11817 // Look for stores, and handle non-store uses conservatively.
11818 const auto *SI = dyn_cast<StoreInst>(&I);
11819 if (!SI) {
11820 // We will look through cast uses, so ignore them completely.
11821 if (I.isCast())
11822 continue;
11823 // Ignore debug info and pseudo op intrinsics, they don't escape or store
11824 // to allocas.
11825 if (I.isDebugOrPseudoInst())
11826 continue;
11827 // This is an unknown instruction. Assume it escapes or writes to all
11828 // static alloca operands.
11829 for (const Use &U : I.operands()) {
11830 if (StaticAllocaInfo *Info = GetInfoIfStaticAlloca(U))
11831 *Info = StaticAllocaInfo::Clobbered;
11832 }
11833 continue;
11834 }
11835
11836 // If the stored value is a static alloca, mark it as escaped.
11837 if (StaticAllocaInfo *Info = GetInfoIfStaticAlloca(SI->getValueOperand()))
11838 *Info = StaticAllocaInfo::Clobbered;
11839
11840 // Check if the destination is a static alloca.
11841 const Value *Dst = SI->getPointerOperand()->stripPointerCasts();
11842 StaticAllocaInfo *Info = GetInfoIfStaticAlloca(Dst);
11843 if (!Info)
11844 continue;
11845 const AllocaInst *AI = cast<AllocaInst>(Dst);
11846
11847 // Skip allocas that have been initialized or clobbered.
11848 if (*Info != StaticAllocaInfo::Unknown)
11849 continue;
11850
11851 // Check if the stored value is an argument, and that this store fully
11852 // initializes the alloca.
11853 // If the argument type has padding bits we can't directly forward a pointer
11854 // as the upper bits may contain garbage.
11855 // Don't elide copies from the same argument twice.
11856 const Value *Val = SI->getValueOperand()->stripPointerCasts();
11857 const auto *Arg = dyn_cast<Argument>(Val);
11858 std::optional<TypeSize> AllocaSize = AI->getAllocationSize(DL);
11859 if (!Arg || Arg->hasPassPointeeByValueCopyAttr() ||
11860 Arg->getType()->isEmptyTy() || !AllocaSize ||
11861 DL.getTypeStoreSize(Arg->getType()) != *AllocaSize ||
11862 !DL.typeSizeEqualsStoreSize(Arg->getType()) ||
11863 ArgCopyElisionCandidates.count(Arg)) {
11864 *Info = StaticAllocaInfo::Clobbered;
11865 continue;
11866 }
11867
11868 LLVM_DEBUG(dbgs() << "Found argument copy elision candidate: " << *AI
11869 << '\n');
11870
11871 // Mark this alloca and store for argument copy elision.
11872 *Info = StaticAllocaInfo::Elidable;
11873 ArgCopyElisionCandidates.insert({Arg, {AI, SI}});
11874
11875 // Stop scanning if we've seen all arguments. This will happen early in -O0
11876 // builds, which is useful, because -O0 builds have large entry blocks and
11877 // many allocas.
11878 if (ArgCopyElisionCandidates.size() == NumArgs)
11879 break;
11880 }
11881}
11882
11883/// Try to elide argument copies from memory into a local alloca. Succeeds if
11884/// ArgVal is a load from a suitable fixed stack object.
11887 DenseMap<int, int> &ArgCopyElisionFrameIndexMap,
11888 SmallPtrSetImpl<const Instruction *> &ElidedArgCopyInstrs,
11889 ArgCopyElisionMapTy &ArgCopyElisionCandidates, const Argument &Arg,
11890 ArrayRef<SDValue> ArgVals, bool &ArgHasUses) {
11891 // Check if this is a load from a fixed stack object.
11892 auto *LNode = dyn_cast<LoadSDNode>(ArgVals[0]);
11893 if (!LNode)
11894 return;
11895 auto *FINode = dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode());
11896 if (!FINode)
11897 return;
11898
11899 // Check that the fixed stack object is the right size and alignment.
11900 // Look at the alignment that the user wrote on the alloca instead of looking
11901 // at the stack object.
11902 auto ArgCopyIter = ArgCopyElisionCandidates.find(&Arg);
11903 assert(ArgCopyIter != ArgCopyElisionCandidates.end());
11904 const AllocaInst *AI = ArgCopyIter->second.first;
11905 int FixedIndex = FINode->getIndex();
11906 int &AllocaIndex = FuncInfo.StaticAllocaMap[AI];
11907 int OldIndex = AllocaIndex;
11908 MachineFrameInfo &MFI = FuncInfo.MF->getFrameInfo();
11909 if (MFI.getObjectSize(FixedIndex) != MFI.getObjectSize(OldIndex)) {
11910 LLVM_DEBUG(
11911 dbgs() << " argument copy elision failed due to bad fixed stack "
11912 "object size\n");
11913 return;
11914 }
11915 Align RequiredAlignment = AI->getAlign();
11916 if (MFI.getObjectAlign(FixedIndex) < RequiredAlignment) {
11917 LLVM_DEBUG(dbgs() << " argument copy elision failed: alignment of alloca "
11918 "greater than stack argument alignment ("
11919 << DebugStr(RequiredAlignment) << " vs "
11920 << DebugStr(MFI.getObjectAlign(FixedIndex)) << ")\n");
11921 return;
11922 }
11923
11924 // Perform the elision. Delete the old stack object and replace its only use
11925 // in the variable info map. Mark the stack object as mutable and aliased.
11926 LLVM_DEBUG({
11927 dbgs() << "Eliding argument copy from " << Arg << " to " << *AI << '\n'
11928 << " Replacing frame index " << OldIndex << " with " << FixedIndex
11929 << '\n';
11930 });
11931 MFI.RemoveStackObject(OldIndex);
11932 MFI.setIsImmutableObjectIndex(FixedIndex, false);
11933 MFI.setIsAliasedObjectIndex(FixedIndex, true);
11934 AllocaIndex = FixedIndex;
11935 ArgCopyElisionFrameIndexMap.insert({OldIndex, FixedIndex});
11936 for (SDValue ArgVal : ArgVals)
11937 Chains.push_back(ArgVal.getValue(1));
11938
11939 // Avoid emitting code for the store implementing the copy.
11940 const StoreInst *SI = ArgCopyIter->second.second;
11941 ElidedArgCopyInstrs.insert(SI);
11942
11943 // Check for uses of the argument again so that we can avoid exporting ArgVal
11944 // if it is't used by anything other than the store.
11945 for (const Value *U : Arg.users()) {
11946 if (U != SI) {
11947 ArgHasUses = true;
11948 break;
11949 }
11950 }
11951}
11952
11953void SelectionDAGISel::LowerArguments(const Function &F) {
11954 SelectionDAG &DAG = SDB->DAG;
11955 SDLoc dl = SDB->getCurSDLoc();
11956 const DataLayout &DL = DAG.getDataLayout();
11958
11959 // In Naked functions we aren't going to save any registers.
11960 if (F.hasFnAttribute(Attribute::Naked))
11961 return;
11962
11963 if (!FuncInfo->CanLowerReturn) {
11964 // Put in an sret pointer parameter before all the other parameters.
11965 MVT ValueVT = TLI->getPointerTy(DL, DL.getAllocaAddrSpace());
11966
11967 ISD::ArgFlagsTy Flags;
11968 Flags.setSRet();
11969 MVT RegisterVT = TLI->getRegisterType(*DAG.getContext(), ValueVT);
11970 ISD::InputArg RetArg(Flags, RegisterVT, ValueVT, F.getReturnType(), true,
11972 Ins.push_back(RetArg);
11973 }
11974
11975 // Look for stores of arguments to static allocas. Mark such arguments with a
11976 // flag to ask the target to give us the memory location of that argument if
11977 // available.
11978 ArgCopyElisionMapTy ArgCopyElisionCandidates;
11980 ArgCopyElisionCandidates);
11981
11982 // Set up the incoming argument description vector.
11983 for (const Argument &Arg : F.args()) {
11984 unsigned ArgNo = Arg.getArgNo();
11986 ComputeValueTypes(DAG.getDataLayout(), Arg.getType(), Types);
11987 bool isArgValueUsed = !Arg.use_empty();
11988 Type *FinalType = Arg.getType();
11989 if (Arg.hasAttribute(Attribute::ByVal))
11990 FinalType = Arg.getParamByValType();
11991 bool NeedsRegBlock = TLI->functionArgumentNeedsConsecutiveRegisters(
11992 FinalType, F.getCallingConv(), F.isVarArg(), DL);
11993 for (unsigned Value = 0, NumValues = Types.size(); Value != NumValues;
11994 ++Value) {
11995 Type *ArgTy = Types[Value];
11996 EVT VT = TLI->getValueType(DL, ArgTy);
11997 ISD::ArgFlagsTy Flags;
11998
11999 if (ArgTy->isPointerTy()) {
12000 Flags.setPointer();
12001 Flags.setPointerAddrSpace(cast<PointerType>(ArgTy)->getAddressSpace());
12002 }
12003 if (Arg.hasAttribute(Attribute::ZExt))
12004 Flags.setZExt();
12005 if (Arg.hasAttribute(Attribute::SExt))
12006 Flags.setSExt();
12007 if (Arg.hasAttribute(Attribute::InReg)) {
12008 // If we are using vectorcall calling convention, a structure that is
12009 // passed InReg - is surely an HVA
12010 if (F.getCallingConv() == CallingConv::X86_VectorCall &&
12011 isa<StructType>(Arg.getType())) {
12012 // The first value of a structure is marked
12013 if (0 == Value)
12014 Flags.setHvaStart();
12015 Flags.setHva();
12016 }
12017 // Set InReg Flag
12018 Flags.setInReg();
12019 }
12020 if (Arg.hasAttribute(Attribute::StructRet))
12021 Flags.setSRet();
12022 if (Arg.hasAttribute(Attribute::SwiftSelf))
12023 Flags.setSwiftSelf();
12024 if (Arg.hasAttribute(Attribute::SwiftAsync))
12025 Flags.setSwiftAsync();
12026 if (Arg.hasAttribute(Attribute::SwiftError))
12027 Flags.setSwiftError();
12028 if (Arg.hasAttribute(Attribute::ByVal))
12029 Flags.setByVal();
12030 if (Arg.hasAttribute(Attribute::ByRef))
12031 Flags.setByRef();
12032 if (Arg.hasAttribute(Attribute::InAlloca)) {
12033 Flags.setInAlloca();
12034 // Set the byval flag for CCAssignFn callbacks that don't know about
12035 // inalloca. This way we can know how many bytes we should've allocated
12036 // and how many bytes a callee cleanup function will pop. If we port
12037 // inalloca to more targets, we'll have to add custom inalloca handling
12038 // in the various CC lowering callbacks.
12039 Flags.setByVal();
12040 }
12041 if (Arg.hasAttribute(Attribute::Preallocated)) {
12042 Flags.setPreallocated();
12043 // Set the byval flag for CCAssignFn callbacks that don't know about
12044 // preallocated. This way we can know how many bytes we should've
12045 // allocated and how many bytes a callee cleanup function will pop. If
12046 // we port preallocated to more targets, we'll have to add custom
12047 // preallocated handling in the various CC lowering callbacks.
12048 Flags.setByVal();
12049 }
12050
12051 // Certain targets (such as MIPS), may have a different ABI alignment
12052 // for a type depending on the context. Give the target a chance to
12053 // specify the alignment it wants.
12054 const Align OriginalAlignment(
12055 TLI->getABIAlignmentForCallingConv(ArgTy, DL));
12056 Flags.setOrigAlign(OriginalAlignment);
12057
12058 Align MemAlign;
12059 Type *ArgMemTy = nullptr;
12060 if (Flags.isByVal() || Flags.isInAlloca() || Flags.isPreallocated() ||
12061 Flags.isByRef()) {
12062 if (!ArgMemTy)
12063 ArgMemTy = Arg.getPointeeInMemoryValueType();
12064
12065 uint64_t MemSize = DL.getTypeAllocSize(ArgMemTy);
12066
12067 // For in-memory arguments, size and alignment should be passed from FE.
12068 // BE will guess if this info is not there but there are cases it cannot
12069 // get right.
12070 if (auto ParamAlign = Arg.getParamStackAlign())
12071 MemAlign = *ParamAlign;
12072 else if ((ParamAlign = Arg.getParamAlign()))
12073 MemAlign = *ParamAlign;
12074 else
12075 MemAlign = TLI->getByValTypeAlignment(ArgMemTy, DL);
12076 if (Flags.isByRef())
12077 Flags.setByRefSize(MemSize);
12078 else
12079 Flags.setByValSize(MemSize);
12080 } else if (auto ParamAlign = Arg.getParamStackAlign()) {
12081 MemAlign = *ParamAlign;
12082 } else {
12083 MemAlign = OriginalAlignment;
12084 }
12085 Flags.setMemAlign(MemAlign);
12086
12087 if (Arg.hasAttribute(Attribute::Nest))
12088 Flags.setNest();
12089 if (NeedsRegBlock)
12090 Flags.setInConsecutiveRegs();
12091 if (ArgCopyElisionCandidates.count(&Arg))
12092 Flags.setCopyElisionCandidate();
12093 if (Arg.hasAttribute(Attribute::Returned))
12094 Flags.setReturned();
12095
12096 MVT RegisterVT = TLI->getRegisterTypeForCallingConv(
12097 *CurDAG->getContext(), F.getCallingConv(), VT);
12098 unsigned NumRegs = TLI->getNumRegistersForCallingConv(
12099 *CurDAG->getContext(), F.getCallingConv(), VT);
12100 for (unsigned i = 0; i != NumRegs; ++i) {
12101 // For scalable vectors, use the minimum size; individual targets
12102 // are responsible for handling scalable vector arguments and
12103 // return values.
12104 ISD::InputArg MyFlags(
12105 Flags, RegisterVT, VT, ArgTy, isArgValueUsed, ArgNo,
12106 i * RegisterVT.getStoreSize().getKnownMinValue());
12107 if (NumRegs > 1 && i == 0)
12108 MyFlags.Flags.setSplit();
12109 // if it isn't first piece, alignment must be 1
12110 else if (i > 0) {
12111 MyFlags.Flags.setOrigAlign(Align(1));
12112 if (i == NumRegs - 1)
12113 MyFlags.Flags.setSplitEnd();
12114 }
12115 Ins.push_back(MyFlags);
12116 }
12117 if (NeedsRegBlock && Value == NumValues - 1)
12118 Ins[Ins.size() - 1].Flags.setInConsecutiveRegsLast();
12119 }
12120 }
12121
12122 // Call the target to set up the argument values.
12124 SDValue NewRoot = TLI->LowerFormalArguments(
12125 DAG.getRoot(), F.getCallingConv(), F.isVarArg(), Ins, dl, DAG, InVals);
12126
12127 // Verify that the target's LowerFormalArguments behaved as expected.
12128 assert(NewRoot.getNode() && NewRoot.getValueType() == MVT::Other &&
12129 "LowerFormalArguments didn't return a valid chain!");
12130 assert(InVals.size() == Ins.size() &&
12131 "LowerFormalArguments didn't emit the correct number of values!");
12132 assert(all_of(InVals, [](SDValue InVal) { return InVal.getNode(); }) &&
12133 "LowerFormalArguments emitted a null value!");
12134
12135 // Update the DAG with the new chain value resulting from argument lowering.
12136 DAG.setRoot(NewRoot);
12137
12138 // Set up the argument values.
12139 unsigned i = 0;
12140 if (!FuncInfo->CanLowerReturn) {
12141 // Create a virtual register for the sret pointer, and put in a copy
12142 // from the sret argument into it.
12143 MVT VT = TLI->getPointerTy(DL, DL.getAllocaAddrSpace());
12144 MVT RegVT = TLI->getRegisterType(*CurDAG->getContext(), VT);
12145 std::optional<ISD::NodeType> AssertOp;
12146 SDValue ArgValue =
12147 getCopyFromParts(DAG, dl, &InVals[0], 1, RegVT, VT, nullptr, NewRoot,
12148 F.getCallingConv(), AssertOp);
12149
12150 MachineFunction& MF = SDB->DAG.getMachineFunction();
12151 MachineRegisterInfo& RegInfo = MF.getRegInfo();
12152 Register SRetReg =
12153 RegInfo.createVirtualRegister(TLI->getRegClassFor(RegVT));
12154 FuncInfo->DemoteRegister = SRetReg;
12155 NewRoot =
12156 SDB->DAG.getCopyToReg(NewRoot, SDB->getCurSDLoc(), SRetReg, ArgValue);
12157 DAG.setRoot(NewRoot);
12158
12159 // i indexes lowered arguments. Bump it past the hidden sret argument.
12160 ++i;
12161 }
12162
12164 DenseMap<int, int> ArgCopyElisionFrameIndexMap;
12165 for (const Argument &Arg : F.args()) {
12166 SmallVector<SDValue, 4> ArgValues;
12167 SmallVector<EVT, 4> ValueVTs;
12168 ComputeValueVTs(*TLI, DAG.getDataLayout(), Arg.getType(), ValueVTs);
12169 unsigned NumValues = ValueVTs.size();
12170 if (NumValues == 0)
12171 continue;
12172
12173 bool ArgHasUses = !Arg.use_empty();
12174
12175 // Elide the copying store if the target loaded this argument from a
12176 // suitable fixed stack object.
12177 if (Ins[i].Flags.isCopyElisionCandidate()) {
12178 unsigned NumParts = 0;
12179 for (EVT VT : ValueVTs)
12180 NumParts += TLI->getNumRegistersForCallingConv(*CurDAG->getContext(),
12181 F.getCallingConv(), VT);
12182
12183 tryToElideArgumentCopy(*FuncInfo, Chains, ArgCopyElisionFrameIndexMap,
12184 ElidedArgCopyInstrs, ArgCopyElisionCandidates, Arg,
12185 ArrayRef(&InVals[i], NumParts), ArgHasUses);
12186 }
12187
12188 // If this argument is unused then remember its value. It is used to generate
12189 // debugging information.
12190 bool isSwiftErrorArg =
12191 TLI->supportSwiftError() &&
12192 Arg.hasAttribute(Attribute::SwiftError);
12193 if (!ArgHasUses && !isSwiftErrorArg) {
12194 SDB->setUnusedArgValue(&Arg, InVals[i]);
12195
12196 // Also remember any frame index for use in FastISel.
12197 if (FrameIndexSDNode *FI =
12199 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12200 }
12201
12202 for (unsigned Val = 0; Val != NumValues; ++Val) {
12203 EVT VT = ValueVTs[Val];
12204 MVT PartVT = TLI->getRegisterTypeForCallingConv(*CurDAG->getContext(),
12205 F.getCallingConv(), VT);
12206 unsigned NumParts = TLI->getNumRegistersForCallingConv(
12207 *CurDAG->getContext(), F.getCallingConv(), VT);
12208
12209 // Even an apparent 'unused' swifterror argument needs to be returned. So
12210 // we do generate a copy for it that can be used on return from the
12211 // function.
12212 if (ArgHasUses || isSwiftErrorArg) {
12213 std::optional<ISD::NodeType> AssertOp;
12214 if (Arg.hasAttribute(Attribute::SExt))
12215 AssertOp = ISD::AssertSext;
12216 else if (Arg.hasAttribute(Attribute::ZExt))
12217 AssertOp = ISD::AssertZext;
12218
12219 SDValue OutVal =
12220 getCopyFromParts(DAG, dl, &InVals[i], NumParts, PartVT, VT, nullptr,
12221 NewRoot, F.getCallingConv(), AssertOp);
12222
12223 FPClassTest NoFPClass = Arg.getNoFPClass();
12224 if (NoFPClass != fcNone) {
12225 SDValue SDNoFPClass = DAG.getTargetConstant(
12226 static_cast<uint64_t>(NoFPClass), dl, MVT::i32);
12227 OutVal = DAG.getNode(ISD::AssertNoFPClass, dl, OutVal.getValueType(),
12228 OutVal, SDNoFPClass);
12229 }
12230 ArgValues.push_back(OutVal);
12231 }
12232
12233 i += NumParts;
12234 }
12235
12236 // We don't need to do anything else for unused arguments.
12237 if (ArgValues.empty())
12238 continue;
12239
12240 // Note down frame index.
12241 if (FrameIndexSDNode *FI =
12242 dyn_cast<FrameIndexSDNode>(ArgValues[0].getNode()))
12243 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12244
12245 SDValue Res = DAG.getMergeValues(ArrayRef(ArgValues.data(), NumValues),
12246 SDB->getCurSDLoc());
12247
12248 SDB->setValue(&Arg, Res);
12249 if (!TM.Options.EnableFastISel && Res.getOpcode() == ISD::BUILD_PAIR) {
12250 // We want to associate the argument with the frame index, among
12251 // involved operands, that correspond to the lowest address. The
12252 // getCopyFromParts function, called earlier, is swapping the order of
12253 // the operands to BUILD_PAIR depending on endianness. The result of
12254 // that swapping is that the least significant bits of the argument will
12255 // be in the first operand of the BUILD_PAIR node, and the most
12256 // significant bits will be in the second operand.
12257 unsigned LowAddressOp = DAG.getDataLayout().isBigEndian() ? 1 : 0;
12258 if (LoadSDNode *LNode =
12259 dyn_cast<LoadSDNode>(Res.getOperand(LowAddressOp).getNode()))
12260 if (FrameIndexSDNode *FI =
12261 dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
12262 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12263 }
12264
12265 // Analyses past this point are naive and don't expect an assertion.
12266 if (Res.getOpcode() == ISD::AssertZext)
12267 Res = Res.getOperand(0);
12268
12269 // Update the SwiftErrorVRegDefMap.
12270 if (Res.getOpcode() == ISD::CopyFromReg && isSwiftErrorArg) {
12271 Register Reg = cast<RegisterSDNode>(Res.getOperand(1))->getReg();
12272 if (Reg.isVirtual())
12273 SwiftError->setCurrentVReg(FuncInfo->MBB, SwiftError->getFunctionArg(),
12274 Reg);
12275 }
12276
12277 // If this argument is live outside of the entry block, insert a copy from
12278 // wherever we got it to the vreg that other BB's will reference it as.
12279 if (Res.getOpcode() == ISD::CopyFromReg) {
12280 // If we can, though, try to skip creating an unnecessary vreg.
12281 // FIXME: This isn't very clean... it would be nice to make this more
12282 // general.
12283 Register Reg = cast<RegisterSDNode>(Res.getOperand(1))->getReg();
12284 if (Reg.isVirtual()) {
12285 FuncInfo->ValueMap[&Arg] = Reg;
12286 continue;
12287 }
12288 }
12289 if (!isOnlyUsedInEntryBlock(&Arg, TM.Options.EnableFastISel)) {
12290 FuncInfo->InitializeRegForValue(&Arg);
12291 SDB->CopyToExportRegsIfNeeded(&Arg);
12292 }
12293 }
12294
12295 if (!Chains.empty()) {
12296 Chains.push_back(NewRoot);
12297 NewRoot = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chains);
12298 }
12299
12300 DAG.setRoot(NewRoot);
12301
12302 assert(i == InVals.size() && "Argument register count mismatch!");
12303
12304 // If any argument copy elisions occurred and we have debug info, update the
12305 // stale frame indices used in the dbg.declare variable info table.
12306 if (!ArgCopyElisionFrameIndexMap.empty()) {
12307 for (MachineFunction::VariableDbgInfo &VI :
12308 MF->getInStackSlotVariableDbgInfo()) {
12309 auto I = ArgCopyElisionFrameIndexMap.find(VI.getStackSlot());
12310 if (I != ArgCopyElisionFrameIndexMap.end())
12311 VI.updateStackSlot(I->second);
12312 }
12313 }
12314
12315 // Finally, if the target has anything special to do, allow it to do so.
12317}
12318
12319/// Handle PHI nodes in successor blocks. Emit code into the SelectionDAG to
12320/// ensure constants are generated when needed. Remember the virtual registers
12321/// that need to be added to the Machine PHI nodes as input. We cannot just
12322/// directly add them, because expansion might result in multiple MBB's for one
12323/// BB. As such, the start of the BB might correspond to a different MBB than
12324/// the end.
12325void
12326SelectionDAGBuilder::HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) {
12327 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12328
12329 SmallPtrSet<MachineBasicBlock *, 4> SuccsHandled;
12330
12331 // Check PHI nodes in successors that expect a value to be available from this
12332 // block.
12333 for (const BasicBlock *SuccBB : successors(LLVMBB->getTerminator())) {
12334 if (!isa<PHINode>(SuccBB->begin())) continue;
12335 MachineBasicBlock *SuccMBB = FuncInfo.getMBB(SuccBB);
12336
12337 // If this terminator has multiple identical successors (common for
12338 // switches), only handle each succ once.
12339 if (!SuccsHandled.insert(SuccMBB).second)
12340 continue;
12341
12343
12344 // At this point we know that there is a 1-1 correspondence between LLVM PHI
12345 // nodes and Machine PHI nodes, but the incoming operands have not been
12346 // emitted yet.
12347 for (const PHINode &PN : SuccBB->phis()) {
12348 // Ignore dead phi's.
12349 if (PN.use_empty())
12350 continue;
12351
12352 // Skip empty types
12353 if (PN.getType()->isEmptyTy())
12354 continue;
12355
12356 Register Reg;
12357 const Value *PHIOp = PN.getIncomingValueForBlock(LLVMBB);
12358
12359 if (const auto *C = dyn_cast<Constant>(PHIOp)) {
12360 Register &RegOut = ConstantsOut[C];
12361 if (!RegOut) {
12362 RegOut = FuncInfo.CreateRegs(&PN);
12363 // We need to zero/sign extend ConstantInt phi operands to match
12364 // assumptions in FunctionLoweringInfo::ComputePHILiveOutRegInfo.
12365 ISD::NodeType ExtendType = ISD::ANY_EXTEND;
12366 if (auto *CI = dyn_cast<ConstantInt>(C))
12367 ExtendType = TLI.signExtendConstant(CI) ? ISD::SIGN_EXTEND
12369 CopyValueToVirtualRegister(C, RegOut, ExtendType);
12370 }
12371 Reg = RegOut;
12372 } else {
12373 auto I = FuncInfo.ValueMap.find(PHIOp);
12374 if (I != FuncInfo.ValueMap.end())
12375 Reg = I->second;
12376 else {
12377 assert(isa<AllocaInst>(PHIOp) &&
12378 FuncInfo.StaticAllocaMap.count(cast<AllocaInst>(PHIOp)) &&
12379 "Didn't codegen value into a register!??");
12380 Reg = FuncInfo.CreateRegs(&PN);
12382 }
12383 }
12384
12385 // Remember that this register needs to added to the machine PHI node as
12386 // the input for this MBB.
12387 SmallVector<EVT, 4> ValueVTs;
12388 ComputeValueVTs(TLI, DAG.getDataLayout(), PN.getType(), ValueVTs);
12389 for (EVT VT : ValueVTs) {
12390 const unsigned NumRegisters = TLI.getNumRegisters(*DAG.getContext(), VT);
12391 for (unsigned i = 0; i != NumRegisters; ++i)
12392 FuncInfo.PHINodesToUpdate.emplace_back(&*MBBI++, Reg + i);
12393 Reg += NumRegisters;
12394 }
12395 }
12396 }
12397
12398 ConstantsOut.clear();
12399}
12400
12401MachineBasicBlock *SelectionDAGBuilder::NextBlock(MachineBasicBlock *MBB) {
12403 if (++I == FuncInfo.MF->end())
12404 return nullptr;
12405 return &*I;
12406}
12407
12408/// During lowering new call nodes can be created (such as memset, etc.).
12409/// Those will become new roots of the current DAG, but complications arise
12410/// when they are tail calls. In such cases, the call lowering will update
12411/// the root, but the builder still needs to know that a tail call has been
12412/// lowered in order to avoid generating an additional return.
12413void SelectionDAGBuilder::updateDAGForMaybeTailCall(SDValue MaybeTC) {
12414 // If the node is null, we do have a tail call.
12415 if (MaybeTC.getNode() != nullptr)
12416 DAG.setRoot(MaybeTC);
12417 else
12418 HasTailCall = true;
12419}
12420
12421void SelectionDAGBuilder::lowerWorkItem(SwitchWorkListItem W, Value *Cond,
12422 MachineBasicBlock *SwitchMBB,
12423 MachineBasicBlock *DefaultMBB) {
12424 MachineFunction *CurMF = FuncInfo.MF;
12425 MachineBasicBlock *NextMBB = nullptr;
12427 if (++BBI != FuncInfo.MF->end())
12428 NextMBB = &*BBI;
12429
12430 unsigned Size = W.LastCluster - W.FirstCluster + 1;
12431
12432 BranchProbabilityInfo *BPI = FuncInfo.BPI;
12433
12434 if (Size == 2 && W.MBB == SwitchMBB) {
12435 // If any two of the cases has the same destination, and if one value
12436 // is the same as the other, but has one bit unset that the other has set,
12437 // use bit manipulation to do two compares at once. For example:
12438 // "if (X == 6 || X == 4)" -> "if ((X|2) == 6)"
12439 // TODO: This could be extended to merge any 2 cases in switches with 3
12440 // cases.
12441 // TODO: Handle cases where W.CaseBB != SwitchBB.
12442 CaseCluster &Small = *W.FirstCluster;
12443 CaseCluster &Big = *W.LastCluster;
12444
12445 if (Small.Low == Small.High && Big.Low == Big.High &&
12446 Small.MBB == Big.MBB) {
12447 const APInt &SmallValue = Small.Low->getValue();
12448 const APInt &BigValue = Big.Low->getValue();
12449
12450 // Check that there is only one bit different.
12451 APInt CommonBit = BigValue ^ SmallValue;
12452 if (CommonBit.isPowerOf2()) {
12453 SDValue CondLHS = getValue(Cond);
12454 EVT VT = CondLHS.getValueType();
12455 SDLoc DL = getCurSDLoc();
12456
12457 SDValue Or = DAG.getNode(ISD::OR, DL, VT, CondLHS,
12458 DAG.getConstant(CommonBit, DL, VT));
12459 SDValue Cond = DAG.getSetCC(
12460 DL, MVT::i1, Or, DAG.getConstant(BigValue | SmallValue, DL, VT),
12461 ISD::SETEQ);
12462
12463 // Update successor info.
12464 // Both Small and Big will jump to Small.BB, so we sum up the
12465 // probabilities.
12466 addSuccessorWithProb(SwitchMBB, Small.MBB, Small.Prob + Big.Prob);
12467 if (BPI)
12468 addSuccessorWithProb(
12469 SwitchMBB, DefaultMBB,
12470 // The default destination is the first successor in IR.
12471 BPI->getEdgeProbability(SwitchMBB->getBasicBlock(), (unsigned)0));
12472 else
12473 addSuccessorWithProb(SwitchMBB, DefaultMBB);
12474
12475 // Insert the true branch.
12476 SDValue BrCond =
12477 DAG.getNode(ISD::BRCOND, DL, MVT::Other, getControlRoot(), Cond,
12478 DAG.getBasicBlock(Small.MBB));
12479 // Insert the false branch.
12480 BrCond = DAG.getNode(ISD::BR, DL, MVT::Other, BrCond,
12481 DAG.getBasicBlock(DefaultMBB));
12482
12483 DAG.setRoot(BrCond);
12484 return;
12485 }
12486 }
12487 }
12488
12489 if (TM.getOptLevel() != CodeGenOptLevel::None) {
12490 // Here, we order cases by probability so the most likely case will be
12491 // checked first. However, two clusters can have the same probability in
12492 // which case their relative ordering is non-deterministic. So we use Low
12493 // as a tie-breaker as clusters are guaranteed to never overlap.
12494 llvm::sort(W.FirstCluster, W.LastCluster + 1,
12495 [](const CaseCluster &a, const CaseCluster &b) {
12496 return a.Prob != b.Prob ?
12497 a.Prob > b.Prob :
12498 a.Low->getValue().slt(b.Low->getValue());
12499 });
12500
12501 // Rearrange the case blocks so that the last one falls through if possible
12502 // without changing the order of probabilities.
12503 for (CaseClusterIt I = W.LastCluster; I > W.FirstCluster; ) {
12504 --I;
12505 if (I->Prob > W.LastCluster->Prob)
12506 break;
12507 if (I->Kind == CC_Range && I->MBB == NextMBB) {
12508 std::swap(*I, *W.LastCluster);
12509 break;
12510 }
12511 }
12512 }
12513
12514 // Compute total probability.
12515 BranchProbability DefaultProb = W.DefaultProb;
12516 BranchProbability UnhandledProbs = DefaultProb;
12517 for (CaseClusterIt I = W.FirstCluster; I <= W.LastCluster; ++I)
12518 UnhandledProbs += I->Prob;
12519
12520 MachineBasicBlock *CurMBB = W.MBB;
12521 for (CaseClusterIt I = W.FirstCluster, E = W.LastCluster; I <= E; ++I) {
12522 bool FallthroughUnreachable = false;
12523 MachineBasicBlock *Fallthrough;
12524 if (I == W.LastCluster) {
12525 // For the last cluster, fall through to the default destination.
12526 Fallthrough = DefaultMBB;
12527 FallthroughUnreachable = isa<UnreachableInst>(
12528 DefaultMBB->getBasicBlock()->getFirstNonPHIOrDbg());
12529 } else {
12530 Fallthrough = CurMF->CreateMachineBasicBlock(CurMBB->getBasicBlock());
12531 CurMF->insert(BBI, Fallthrough);
12532 // Put Cond in a virtual register to make it available from the new blocks.
12534 }
12535 UnhandledProbs -= I->Prob;
12536
12537 switch (I->Kind) {
12538 case CC_JumpTable: {
12539 // FIXME: Optimize away range check based on pivot comparisons.
12540 JumpTableHeader *JTH = &SL->JTCases[I->JTCasesIndex].first;
12541 SwitchCG::JumpTable *JT = &SL->JTCases[I->JTCasesIndex].second;
12542
12543 // The jump block hasn't been inserted yet; insert it here.
12544 MachineBasicBlock *JumpMBB = JT->MBB;
12545 CurMF->insert(BBI, JumpMBB);
12546
12547 auto JumpProb = I->Prob;
12548 auto FallthroughProb = UnhandledProbs;
12549
12550 // If the default statement is a target of the jump table, we evenly
12551 // distribute the default probability to successors of CurMBB. Also
12552 // update the probability on the edge from JumpMBB to Fallthrough.
12553 for (MachineBasicBlock::succ_iterator SI = JumpMBB->succ_begin(),
12554 SE = JumpMBB->succ_end();
12555 SI != SE; ++SI) {
12556 if (*SI == DefaultMBB) {
12557 JumpProb += DefaultProb / 2;
12558 FallthroughProb -= DefaultProb / 2;
12559 JumpMBB->setSuccProbability(SI, DefaultProb / 2);
12560 JumpMBB->normalizeSuccProbs();
12561 break;
12562 }
12563 }
12564
12565 // If the default clause is unreachable, propagate that knowledge into
12566 // JTH->FallthroughUnreachable which will use it to suppress the range
12567 // check.
12568 //
12569 // However, don't do this if we're doing branch target enforcement,
12570 // because a table branch _without_ a range check can be a tempting JOP
12571 // gadget - out-of-bounds inputs that are impossible in correct
12572 // execution become possible again if an attacker can influence the
12573 // control flow. So if an attacker doesn't already have a BTI bypass
12574 // available, we don't want them to be able to get one out of this
12575 // table branch.
12576 if (FallthroughUnreachable) {
12577 Function &CurFunc = CurMF->getFunction();
12578 if (!CurFunc.hasFnAttribute("branch-target-enforcement"))
12579 JTH->FallthroughUnreachable = true;
12580 }
12581
12582 if (!JTH->FallthroughUnreachable)
12583 addSuccessorWithProb(CurMBB, Fallthrough, FallthroughProb);
12584 addSuccessorWithProb(CurMBB, JumpMBB, JumpProb);
12585 CurMBB->normalizeSuccProbs();
12586
12587 // The jump table header will be inserted in our current block, do the
12588 // range check, and fall through to our fallthrough block.
12589 JTH->HeaderBB = CurMBB;
12590 JT->Default = Fallthrough; // FIXME: Move Default to JumpTableHeader.
12591
12592 // If we're in the right place, emit the jump table header right now.
12593 if (CurMBB == SwitchMBB) {
12594 visitJumpTableHeader(*JT, *JTH, SwitchMBB);
12595 JTH->Emitted = true;
12596 }
12597 break;
12598 }
12599 case CC_BitTests: {
12600 // FIXME: Optimize away range check based on pivot comparisons.
12601 BitTestBlock *BTB = &SL->BitTestCases[I->BTCasesIndex];
12602
12603 // The bit test blocks haven't been inserted yet; insert them here.
12604 for (BitTestCase &BTC : BTB->Cases)
12605 CurMF->insert(BBI, BTC.ThisBB);
12606
12607 // Fill in fields of the BitTestBlock.
12608 BTB->Parent = CurMBB;
12609 BTB->Default = Fallthrough;
12610
12611 BTB->DefaultProb = UnhandledProbs;
12612 // If the cases in bit test don't form a contiguous range, we evenly
12613 // distribute the probability on the edge to Fallthrough to two
12614 // successors of CurMBB.
12615 if (!BTB->ContiguousRange) {
12616 BTB->Prob += DefaultProb / 2;
12617 BTB->DefaultProb -= DefaultProb / 2;
12618 }
12619
12620 if (FallthroughUnreachable)
12621 BTB->FallthroughUnreachable = true;
12622
12623 // If we're in the right place, emit the bit test header right now.
12624 if (CurMBB == SwitchMBB) {
12625 visitBitTestHeader(*BTB, SwitchMBB);
12626 BTB->Emitted = true;
12627 }
12628 break;
12629 }
12630 case CC_Range: {
12631 const Value *RHS, *LHS, *MHS;
12632 ISD::CondCode CC;
12633 if (I->Low == I->High) {
12634 // Check Cond == I->Low.
12635 CC = ISD::SETEQ;
12636 LHS = Cond;
12637 RHS=I->Low;
12638 MHS = nullptr;
12639 } else {
12640 // Check I->Low <= Cond <= I->High.
12641 CC = ISD::SETLE;
12642 LHS = I->Low;
12643 MHS = Cond;
12644 RHS = I->High;
12645 }
12646
12647 // If Fallthrough is unreachable, fold away the comparison.
12648 if (FallthroughUnreachable)
12649 CC = ISD::SETTRUE;
12650
12651 // The false probability is the sum of all unhandled cases.
12652 CaseBlock CB(CC, LHS, RHS, MHS, I->MBB, Fallthrough, CurMBB,
12653 getCurSDLoc(), I->Prob, UnhandledProbs);
12654
12655 if (CurMBB == SwitchMBB)
12656 visitSwitchCase(CB, SwitchMBB);
12657 else
12658 SL->SwitchCases.push_back(CB);
12659
12660 break;
12661 }
12662 }
12663 CurMBB = Fallthrough;
12664 }
12665}
12666
12667void SelectionDAGBuilder::splitWorkItem(SwitchWorkList &WorkList,
12668 const SwitchWorkListItem &W,
12669 Value *Cond,
12670 MachineBasicBlock *SwitchMBB) {
12671 assert(W.FirstCluster->Low->getValue().slt(W.LastCluster->Low->getValue()) &&
12672 "Clusters not sorted?");
12673 assert(W.LastCluster - W.FirstCluster + 1 >= 2 && "Too small to split!");
12674
12675 auto [LastLeft, FirstRight, LeftProb, RightProb] =
12676 SL->computeSplitWorkItemInfo(W);
12677
12678 // Use the first element on the right as pivot since we will make less-than
12679 // comparisons against it.
12680 CaseClusterIt PivotCluster = FirstRight;
12681 assert(PivotCluster > W.FirstCluster);
12682 assert(PivotCluster <= W.LastCluster);
12683
12684 CaseClusterIt FirstLeft = W.FirstCluster;
12685 CaseClusterIt LastRight = W.LastCluster;
12686
12687 const ConstantInt *Pivot = PivotCluster->Low;
12688
12689 // New blocks will be inserted immediately after the current one.
12691 ++BBI;
12692
12693 // We will branch to the LHS if Value < Pivot. If LHS is a single cluster,
12694 // we can branch to its destination directly if it's squeezed exactly in
12695 // between the known lower bound and Pivot - 1.
12696 MachineBasicBlock *LeftMBB;
12697 if (FirstLeft == LastLeft && FirstLeft->Kind == CC_Range &&
12698 FirstLeft->Low == W.GE &&
12699 (FirstLeft->High->getValue() + 1LL) == Pivot->getValue()) {
12700 LeftMBB = FirstLeft->MBB;
12701 } else {
12702 LeftMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
12703 FuncInfo.MF->insert(BBI, LeftMBB);
12704 WorkList.push_back(
12705 {LeftMBB, FirstLeft, LastLeft, W.GE, Pivot, W.DefaultProb / 2});
12706 // Put Cond in a virtual register to make it available from the new blocks.
12708 }
12709
12710 // Similarly, we will branch to the RHS if Value >= Pivot. If RHS is a
12711 // single cluster, RHS.Low == Pivot, and we can branch to its destination
12712 // directly if RHS.High equals the current upper bound.
12713 MachineBasicBlock *RightMBB;
12714 if (FirstRight == LastRight && FirstRight->Kind == CC_Range &&
12715 W.LT && (FirstRight->High->getValue() + 1ULL) == W.LT->getValue()) {
12716 RightMBB = FirstRight->MBB;
12717 } else {
12718 RightMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
12719 FuncInfo.MF->insert(BBI, RightMBB);
12720 WorkList.push_back(
12721 {RightMBB, FirstRight, LastRight, Pivot, W.LT, W.DefaultProb / 2});
12722 // Put Cond in a virtual register to make it available from the new blocks.
12724 }
12725
12726 // Create the CaseBlock record that will be used to lower the branch.
12727 CaseBlock CB(ISD::SETLT, Cond, Pivot, nullptr, LeftMBB, RightMBB, W.MBB,
12728 getCurSDLoc(), LeftProb, RightProb);
12729
12730 if (W.MBB == SwitchMBB)
12731 visitSwitchCase(CB, SwitchMBB);
12732 else
12733 SL->SwitchCases.push_back(CB);
12734}
12735
12736// Scale CaseProb after peeling a case with the probablity of PeeledCaseProb
12737// from the swith statement.
12739 BranchProbability PeeledCaseProb) {
12740 if (PeeledCaseProb == BranchProbability::getOne())
12742 BranchProbability SwitchProb = PeeledCaseProb.getCompl();
12743
12744 uint32_t Numerator = CaseProb.getNumerator();
12745 uint32_t Denominator = SwitchProb.scale(CaseProb.getDenominator());
12746 return BranchProbability(Numerator, std::max(Numerator, Denominator));
12747}
12748
12749// Try to peel the top probability case if it exceeds the threshold.
12750// Return current MachineBasicBlock for the switch statement if the peeling
12751// does not occur.
12752// If the peeling is performed, return the newly created MachineBasicBlock
12753// for the peeled switch statement. Also update Clusters to remove the peeled
12754// case. PeeledCaseProb is the BranchProbability for the peeled case.
12755MachineBasicBlock *SelectionDAGBuilder::peelDominantCaseCluster(
12756 const SwitchInst &SI, CaseClusterVector &Clusters,
12757 BranchProbability &PeeledCaseProb) {
12758 MachineBasicBlock *SwitchMBB = FuncInfo.MBB;
12759 // Don't perform if there is only one cluster or optimizing for size.
12760 if (SwitchPeelThreshold > 100 || !FuncInfo.BPI || Clusters.size() < 2 ||
12761 TM.getOptLevel() == CodeGenOptLevel::None ||
12762 SwitchMBB->getParent()->getFunction().hasMinSize())
12763 return SwitchMBB;
12764
12765 BranchProbability TopCaseProb = BranchProbability(SwitchPeelThreshold, 100);
12766 unsigned PeeledCaseIndex = 0;
12767 bool SwitchPeeled = false;
12768 for (unsigned Index = 0; Index < Clusters.size(); ++Index) {
12769 CaseCluster &CC = Clusters[Index];
12770 if (CC.Prob < TopCaseProb)
12771 continue;
12772 TopCaseProb = CC.Prob;
12773 PeeledCaseIndex = Index;
12774 SwitchPeeled = true;
12775 }
12776 if (!SwitchPeeled)
12777 return SwitchMBB;
12778
12779 LLVM_DEBUG(dbgs() << "Peeled one top case in switch stmt, prob: "
12780 << TopCaseProb << "\n");
12781
12782 // Record the MBB for the peeled switch statement.
12783 MachineFunction::iterator BBI(SwitchMBB);
12784 ++BBI;
12785 MachineBasicBlock *PeeledSwitchMBB =
12786 FuncInfo.MF->CreateMachineBasicBlock(SwitchMBB->getBasicBlock());
12787 FuncInfo.MF->insert(BBI, PeeledSwitchMBB);
12788
12789 ExportFromCurrentBlock(SI.getCondition());
12790 auto PeeledCaseIt = Clusters.begin() + PeeledCaseIndex;
12791 SwitchWorkListItem W = {SwitchMBB, PeeledCaseIt, PeeledCaseIt,
12792 nullptr, nullptr, TopCaseProb.getCompl()};
12793 lowerWorkItem(W, SI.getCondition(), SwitchMBB, PeeledSwitchMBB);
12794
12795 Clusters.erase(PeeledCaseIt);
12796 for (CaseCluster &CC : Clusters) {
12797 LLVM_DEBUG(
12798 dbgs() << "Scale the probablity for one cluster, before scaling: "
12799 << CC.Prob << "\n");
12800 CC.Prob = scaleCaseProbality(CC.Prob, TopCaseProb);
12801 LLVM_DEBUG(dbgs() << "After scaling: " << CC.Prob << "\n");
12802 }
12803 PeeledCaseProb = TopCaseProb;
12804 return PeeledSwitchMBB;
12805}
12806
12807void SelectionDAGBuilder::visitSwitch(const SwitchInst &SI) {
12808 // Extract cases from the switch.
12809 BranchProbabilityInfo *BPI = FuncInfo.BPI;
12810 CaseClusterVector Clusters;
12811 Clusters.reserve(SI.getNumCases());
12812 for (auto I : SI.cases()) {
12813 MachineBasicBlock *Succ = FuncInfo.getMBB(I.getCaseSuccessor());
12814 const ConstantInt *CaseVal = I.getCaseValue();
12815 BranchProbability Prob =
12816 BPI ? BPI->getEdgeProbability(SI.getParent(), I.getSuccessorIndex())
12817 : BranchProbability(1, SI.getNumCases() + 1);
12818 Clusters.push_back(CaseCluster::range(CaseVal, CaseVal, Succ, Prob));
12819 }
12820
12821 MachineBasicBlock *DefaultMBB = FuncInfo.getMBB(SI.getDefaultDest());
12822
12823 // Cluster adjacent cases with the same destination. We do this at all
12824 // optimization levels because it's cheap to do and will make codegen faster
12825 // if there are many clusters.
12826 sortAndRangeify(Clusters);
12827
12828 // The branch probablity of the peeled case.
12829 BranchProbability PeeledCaseProb = BranchProbability::getZero();
12830 MachineBasicBlock *PeeledSwitchMBB =
12831 peelDominantCaseCluster(SI, Clusters, PeeledCaseProb);
12832
12833 // If there is only the default destination, jump there directly.
12834 MachineBasicBlock *SwitchMBB = FuncInfo.MBB;
12835 if (Clusters.empty()) {
12836 assert(PeeledSwitchMBB == SwitchMBB);
12837 SwitchMBB->addSuccessor(DefaultMBB);
12838 if (DefaultMBB != NextBlock(SwitchMBB)) {
12839 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
12840 getControlRoot(), DAG.getBasicBlock(DefaultMBB)));
12841 }
12842 return;
12843 }
12844
12845 SL->findJumpTables(Clusters, &SI, getCurSDLoc(), DefaultMBB, DAG.getPSI(),
12846 DAG.getBFI());
12847 SL->findBitTestClusters(Clusters, &SI);
12848
12849 LLVM_DEBUG({
12850 dbgs() << "Case clusters: ";
12851 for (const CaseCluster &C : Clusters) {
12852 if (C.Kind == CC_JumpTable)
12853 dbgs() << "JT:";
12854 if (C.Kind == CC_BitTests)
12855 dbgs() << "BT:";
12856
12857 C.Low->getValue().print(dbgs(), true);
12858 if (C.Low != C.High) {
12859 dbgs() << '-';
12860 C.High->getValue().print(dbgs(), true);
12861 }
12862 dbgs() << ' ';
12863 }
12864 dbgs() << '\n';
12865 });
12866
12867 assert(!Clusters.empty());
12868 SwitchWorkList WorkList;
12869 CaseClusterIt First = Clusters.begin();
12870 CaseClusterIt Last = Clusters.end() - 1;
12871 auto DefaultProb = getEdgeProbability(PeeledSwitchMBB, DefaultMBB);
12872 // Scale the branchprobability for DefaultMBB if the peel occurs and
12873 // DefaultMBB is not replaced.
12874 if (PeeledCaseProb != BranchProbability::getZero() &&
12875 DefaultMBB == FuncInfo.getMBB(SI.getDefaultDest()))
12876 DefaultProb = scaleCaseProbality(DefaultProb, PeeledCaseProb);
12877 WorkList.push_back(
12878 {PeeledSwitchMBB, First, Last, nullptr, nullptr, DefaultProb});
12879
12880 while (!WorkList.empty()) {
12881 SwitchWorkListItem W = WorkList.pop_back_val();
12882 unsigned NumClusters = W.LastCluster - W.FirstCluster + 1;
12883
12884 if (NumClusters > 3 && TM.getOptLevel() != CodeGenOptLevel::None &&
12885 !DefaultMBB->getParent()->getFunction().hasMinSize()) {
12886 // For optimized builds, lower large range as a balanced binary tree.
12887 splitWorkItem(WorkList, W, SI.getCondition(), SwitchMBB);
12888 continue;
12889 }
12890
12891 lowerWorkItem(W, SI.getCondition(), SwitchMBB, DefaultMBB);
12892 }
12893}
12894
12895void SelectionDAGBuilder::visitStepVector(const CallInst &I) {
12896 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12897 auto DL = getCurSDLoc();
12898 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12899 setValue(&I, DAG.getStepVector(DL, ResultVT));
12900}
12901
12902void SelectionDAGBuilder::visitVectorReverse(const CallInst &I) {
12903 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12904 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12905
12906 SDLoc DL = getCurSDLoc();
12907 SDValue V = getValue(I.getOperand(0));
12908 assert(VT == V.getValueType() && "Malformed vector.reverse!");
12909
12910 if (VT.isScalableVector()) {
12911 setValue(&I, DAG.getNode(ISD::VECTOR_REVERSE, DL, VT, V));
12912 return;
12913 }
12914
12915 // Use VECTOR_SHUFFLE for the fixed-length vector
12916 // to maintain existing behavior.
12917 SmallVector<int, 8> Mask;
12918 unsigned NumElts = VT.getVectorMinNumElements();
12919 for (unsigned i = 0; i != NumElts; ++i)
12920 Mask.push_back(NumElts - 1 - i);
12921
12922 setValue(&I, DAG.getVectorShuffle(VT, DL, V, DAG.getUNDEF(VT), Mask));
12923}
12924
12925void SelectionDAGBuilder::visitVectorDeinterleave(const CallInst &I,
12926 unsigned Factor) {
12927 auto DL = getCurSDLoc();
12928 SDValue InVec = getValue(I.getOperand(0));
12929
12930 SmallVector<EVT, 4> ValueVTs;
12931 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
12932 ValueVTs);
12933
12934 EVT OutVT = ValueVTs[0];
12935 unsigned OutNumElts = OutVT.getVectorMinNumElements();
12936
12937 SmallVector<SDValue, 4> SubVecs(Factor);
12938 for (unsigned i = 0; i != Factor; ++i) {
12939 assert(ValueVTs[i] == OutVT && "Expected VTs to be the same");
12940 SubVecs[i] = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, OutVT, InVec,
12941 DAG.getVectorIdxConstant(OutNumElts * i, DL));
12942 }
12943
12944 // Use VECTOR_SHUFFLE for fixed-length vectors with factor of 2 to benefit
12945 // from existing legalisation and combines.
12946 if (OutVT.isFixedLengthVector() && Factor == 2) {
12947 SDValue Even = DAG.getVectorShuffle(OutVT, DL, SubVecs[0], SubVecs[1],
12948 createStrideMask(0, 2, OutNumElts));
12949 SDValue Odd = DAG.getVectorShuffle(OutVT, DL, SubVecs[0], SubVecs[1],
12950 createStrideMask(1, 2, OutNumElts));
12951 SDValue Res = DAG.getMergeValues({Even, Odd}, getCurSDLoc());
12952 setValue(&I, Res);
12953 return;
12954 }
12955
12956 SDValue Res = DAG.getNode(ISD::VECTOR_DEINTERLEAVE, DL,
12957 DAG.getVTList(ValueVTs), SubVecs);
12958 setValue(&I, Res);
12959}
12960
12961void SelectionDAGBuilder::visitVectorInterleave(const CallInst &I,
12962 unsigned Factor) {
12963 auto DL = getCurSDLoc();
12964 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12965 EVT InVT = getValue(I.getOperand(0)).getValueType();
12966 EVT OutVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12967
12968 SmallVector<SDValue, 8> InVecs(Factor);
12969 for (unsigned i = 0; i < Factor; ++i) {
12970 InVecs[i] = getValue(I.getOperand(i));
12971 assert(InVecs[i].getValueType() == InVecs[0].getValueType() &&
12972 "Expected VTs to be the same");
12973 }
12974
12975 // Use VECTOR_SHUFFLE for fixed-length vectors with factor of 2 to benefit
12976 // from existing legalisation and combines.
12977 if (OutVT.isFixedLengthVector() && Factor == 2) {
12978 unsigned NumElts = InVT.getVectorMinNumElements();
12979 SDValue V = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, InVecs);
12980 setValue(&I, DAG.getVectorShuffle(OutVT, DL, V, DAG.getUNDEF(OutVT),
12981 createInterleaveMask(NumElts, 2)));
12982 return;
12983 }
12984
12985 SmallVector<EVT, 8> ValueVTs(Factor, InVT);
12986 SDValue Res =
12987 DAG.getNode(ISD::VECTOR_INTERLEAVE, DL, DAG.getVTList(ValueVTs), InVecs);
12988
12990 for (unsigned i = 0; i < Factor; ++i)
12991 Results[i] = Res.getValue(i);
12992
12993 Res = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, Results);
12994 setValue(&I, Res);
12995}
12996
12997void SelectionDAGBuilder::visitFreeze(const FreezeInst &I) {
12998 SmallVector<EVT, 4> ValueVTs;
12999 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
13000 ValueVTs);
13001 unsigned NumValues = ValueVTs.size();
13002 if (NumValues == 0) return;
13003
13005 SDValue Op = getValue(I.getOperand(0));
13006
13007 for (unsigned i = 0; i != NumValues; ++i)
13008 Values[i] = DAG.getNode(ISD::FREEZE, getCurSDLoc(), ValueVTs[i],
13009 SDValue(Op.getNode(), Op.getResNo() + i));
13010
13012 DAG.getVTList(ValueVTs), Values));
13013}
13014
13015void SelectionDAGBuilder::visitVectorSplice(const CallInst &I) {
13016 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
13017 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
13018
13019 SDLoc DL = getCurSDLoc();
13020 SDValue V1 = getValue(I.getOperand(0));
13021 SDValue V2 = getValue(I.getOperand(1));
13022 const bool IsLeft = I.getIntrinsicID() == Intrinsic::vector_splice_left;
13023
13024 // VECTOR_SHUFFLE doesn't support a scalable or non-constant mask.
13025 if (VT.isScalableVector() || !isa<ConstantInt>(I.getOperand(2))) {
13026 SDValue Offset = DAG.getZExtOrTrunc(
13027 getValue(I.getOperand(2)), DL, TLI.getVectorIdxTy(DAG.getDataLayout()));
13028 setValue(&I, DAG.getNode(IsLeft ? ISD::VECTOR_SPLICE_LEFT
13030 DL, VT, V1, V2, Offset));
13031 return;
13032 }
13033 uint64_t Imm = cast<ConstantInt>(I.getOperand(2))->getZExtValue();
13034
13035 unsigned NumElts = VT.getVectorNumElements();
13036
13037 uint64_t Idx = IsLeft ? Imm : NumElts - Imm;
13038
13039 // Use VECTOR_SHUFFLE to maintain original behaviour for fixed-length vectors.
13040 SmallVector<int, 8> Mask;
13041 for (unsigned i = 0; i < NumElts; ++i)
13042 Mask.push_back(Idx + i);
13043 setValue(&I, DAG.getVectorShuffle(VT, DL, V1, V2, Mask));
13044}
13045
13046// Consider the following MIR after SelectionDAG, which produces output in
13047// phyregs in the first case or virtregs in the second case.
13048//
13049// INLINEASM_BR ..., implicit-def $ebx, ..., implicit-def $edx
13050// %5:gr32 = COPY $ebx
13051// %6:gr32 = COPY $edx
13052// %1:gr32 = COPY %6:gr32
13053// %0:gr32 = COPY %5:gr32
13054//
13055// INLINEASM_BR ..., def %5:gr32, ..., def %6:gr32
13056// %1:gr32 = COPY %6:gr32
13057// %0:gr32 = COPY %5:gr32
13058//
13059// Given %0, we'd like to return $ebx in the first case and %5 in the second.
13060// Given %1, we'd like to return $edx in the first case and %6 in the second.
13061//
13062// If a callbr has outputs, it will have a single mapping in FuncInfo.ValueMap
13063// to a single virtreg (such as %0). The remaining outputs monotonically
13064// increase in virtreg number from there. If a callbr has no outputs, then it
13065// should not have a corresponding callbr landingpad; in fact, the callbr
13066// landingpad would not even be able to refer to such a callbr.
13069 // There is definitely at least one copy.
13070 assert(MI->getOpcode() == TargetOpcode::COPY &&
13071 "start of copy chain MUST be COPY");
13072 Reg = MI->getOperand(1).getReg();
13073
13074 // If the copied register in the first copy must be virtual.
13075 assert(Reg.isVirtual() && "expected COPY of virtual register");
13076 MI = MRI.def_begin(Reg)->getParent();
13077
13078 // There may be an optional second copy.
13079 if (MI->getOpcode() == TargetOpcode::COPY) {
13080 assert(Reg.isVirtual() && "expected COPY of virtual register");
13081 Reg = MI->getOperand(1).getReg();
13082 assert(Reg.isPhysical() && "expected COPY of physical register");
13083 } else {
13084 // The start of the chain must be an INLINEASM_BR.
13085 assert(MI->getOpcode() == TargetOpcode::INLINEASM_BR &&
13086 "end of copy chain MUST be INLINEASM_BR");
13087 }
13088
13089 return Reg;
13090}
13091
13092// We must do this walk rather than the simpler
13093// setValue(&I, getCopyFromRegs(CBR, CBR->getType()));
13094// otherwise we will end up with copies of virtregs only valid along direct
13095// edges.
13096void SelectionDAGBuilder::visitCallBrLandingPad(const CallInst &I) {
13097 SmallVector<EVT, 8> ResultVTs;
13098 SmallVector<SDValue, 8> ResultValues;
13099 const auto *CBR =
13100 cast<CallBrInst>(I.getParent()->getUniquePredecessor()->getTerminator());
13101
13102 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
13103 const TargetRegisterInfo *TRI = DAG.getSubtarget().getRegisterInfo();
13104 MachineRegisterInfo &MRI = DAG.getMachineFunction().getRegInfo();
13105
13106 Register InitialDef = FuncInfo.ValueMap[CBR];
13107 SDValue Chain = DAG.getRoot();
13108
13109 // Re-parse the asm constraints string.
13110 TargetLowering::AsmOperandInfoVector TargetConstraints =
13111 TLI.ParseConstraints(DAG.getDataLayout(), TRI, *CBR);
13112 for (auto &T : TargetConstraints) {
13113 SDISelAsmOperandInfo OpInfo(T);
13114 if (OpInfo.Type != InlineAsm::isOutput)
13115 continue;
13116
13117 // Pencil in OpInfo.ConstraintType and OpInfo.ConstraintVT based on the
13118 // individual constraint.
13119 TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
13120
13121 switch (OpInfo.ConstraintType) {
13124 // Fill in OpInfo.AssignedRegs.Regs.
13125 getRegistersForValue(DAG, getCurSDLoc(), OpInfo, OpInfo);
13126
13127 // getRegistersForValue may produce 1 to many registers based on whether
13128 // the OpInfo.ConstraintVT is legal on the target or not.
13129 for (Register &Reg : OpInfo.AssignedRegs.Regs) {
13130 Register OriginalDef = FollowCopyChain(MRI, InitialDef++);
13131 if (OriginalDef.isPhysical())
13132 FuncInfo.MBB->addLiveIn(OriginalDef);
13133 // Update the assigned registers to use the original defs.
13134 Reg = OriginalDef;
13135 }
13136
13137 SDValue V = OpInfo.AssignedRegs.getCopyFromRegs(
13138 DAG, FuncInfo, getCurSDLoc(), Chain, nullptr, CBR);
13139 ResultValues.push_back(V);
13140 ResultVTs.push_back(OpInfo.ConstraintVT);
13141 break;
13142 }
13144 SDValue Flag;
13145 SDValue V = TLI.LowerAsmOutputForConstraint(Chain, Flag, getCurSDLoc(),
13146 OpInfo, DAG);
13147 ++InitialDef;
13148 ResultValues.push_back(V);
13149 ResultVTs.push_back(OpInfo.ConstraintVT);
13150 break;
13151 }
13152 default:
13153 break;
13154 }
13155 }
13157 DAG.getVTList(ResultVTs), ResultValues);
13158 setValue(&I, V);
13159}
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)
unsigned Imm
unsigned uint64_t
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:856
This file implements the BitVector class.
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
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.
static void computeConstraintToUse(const TargetLowering *TLI, TargetLowering::AsmOperandInfo &OpInfo)
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
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)
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, bool LookThroughCmp=false)
Returns the "element 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 bool prepareDAGLevelOperands(ConstraintDecisionInfo &Info, const CallBase &Call, SelectionDAGBuilder &Builder, const TargetLowering &TLI, SelectionDAG &DAG)
Prepare DAG-level operands.
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 bool determineConstraints(ConstraintDecisionInfo &Info, TargetLowering::AsmOperandInfoVector &TargetConstraints, const CallBase &Call, SelectionDAGBuilder &Builder, const TargetLowering &TLI, const TargetMachine &TM, SelectionDAG &DAG, const BasicBlock *EHPadBB)
DetermineConstraints - Find the constraints to use for inline asm operands.
static bool constructOperandInfo(ConstraintDecisionInfo &Info, TargetLowering::AsmOperandInfoVector &TargetConstraints, SelectionDAGBuilder &Builder, const TargetLowering &TLI, ExtraFlags &ExtraInfo)
Construct operand info objects.
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:119
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
The Input class is used to parse a yaml document into in-memory structs and vectors.
static const fltSemantics & IEEEsingle()
Definition APFloat.h:304
static LLVM_ABI Semantics SemanticsToEnum(const llvm::fltSemantics &Sem)
Definition APFloat.cpp:183
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:6067
Class for arbitrary precision integers.
Definition APInt.h:78
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:331
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:437
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:333
unsigned getArgNo() const
Return the index of this formal argument in its containing function.
Definition Argument.h:50
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator end() const
Definition ArrayRef.h:130
size_t size() const
Get the array size.
Definition ArrayRef.h:141
iterator begin() const
Definition ArrayRef.h:129
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; assumes that the block is well-formed.
Definition BasicBlock.h:237
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:1088
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 constexpr BranchProbability getOne()
static uint32_t getDenominator()
static constexpr BranchProbability getUnknown()
static constexpr BranchProbability getZero()
uint32_t getNumerator() const
LLVM_ABI uint64_t scale(uint64_t Num) const
Scale a large integer.
BranchProbability getCompl() const
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:728
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
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:755
A constant value that is initialized with an expression using other constant values.
Definition Constants.h:1316
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:1223
uint64_t getZExtValue() const
Constant Vector Declarations.
Definition Constants.h:674
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:218
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:126
LLVM_ABI DILocation * getInlinedAt() const
Definition DebugLoc.cpp:58
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:223
bool empty() const
Definition DenseMap.h:171
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT, true > const_iterator
Definition DenseMap.h:134
iterator end()
Definition DenseMap.h:141
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:284
void reserve(size_type NumEntries)
Grow the densemap so that it can contain at least NumEntries items before resizing again.
Definition DenseMap.h:176
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:67
bool allowReassoc() const
Flag queries.
Definition FMF.h:64
An instruction for ordering other memory operations.
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
Definition Type.cpp:867
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:793
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:695
bool hasParamAttribute(unsigned ArgNo, Attribute::AttrKind Kind) const
check if an attributes is in the list of attributes.
Definition Function.cpp:739
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:328
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:885
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:727
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.
void setMemConstraint(ConstraintCode C)
setMemConstraint - Augment an existing flag with the constraint code for a memory constraint.
Definition InlineAsm.h:414
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).
static LocationSize upperBound(uint64_t Value)
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.
unsigned getID() const
getID() - Return the register class ID number.
const MCPhysReg * iterator
iterator begin() const
begin/end - Return all of the registers in this class.
iterator end() const
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:1069
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1426
LLVM_ABI StringRef getString() const
Definition Metadata.cpp:633
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.
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
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags F, LLT MemTy, Align BaseAlignment, const MMOMetadata &Metadata=MMOMetadata(), SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
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.
std::pair< iterator, bool > try_emplace(const KeyT &Key, Ts &&...Args)
Definition MapVector.h:118
bool contains(const KeyT &Key) const
Definition MapVector.h:148
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(LLVMContext &C)
This constructs an opaque pointer to an object in the default address space (address space zero).
static LLVM_ABI PointerType * get(LLVMContext &C, unsigned AddressSpace)
This constructs an opaque pointer to an object in a numbered address space.
Definition Type.cpp:911
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 isValid() const
Definition Register.h:112
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...
const DebugLoc & getDebugLoc() const
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.
SDValue lowerStartEH(SDValue Chain, const BasicBlock *EHPadBB, MCSymbol *&BeginLabel)
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 setValueToPoison(const Value *V, const SDLoc &dl)
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 getTargetGlobalAddress(const GlobalValue *GV, const SDLoc &DL, EVT VT, int64_t offset=0, unsigned TargetFlags=0)
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 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 getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, SDValue Offset, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
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 getMDNode(const MDNode *MD)
Return an MDNodeSDNode which holds an MDNode.
LLVM_ABI SDValue getBasicBlock(MachineBasicBlock *MBB)
LLVM_ABI SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
Loads are not normal binary operators: their result type is not determined by their operands,...
LLVM_ABI SDValue getEHLabel(const SDLoc &dl, SDValue Root, MCSymbol *Label)
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.
LLVM_ABI SDValue getTargetExternalSymbol(const char *Sym, EVT VT, unsigned TargetFlags=0)
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.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr bool empty() const
Check if the string is empty.
Definition StringRef.h:141
constexpr const char * data() const
Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:138
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 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...
const TargetMachine & getTargetMachine() const
virtual unsigned getNumRegistersForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain targets require unusual breakdowns of certain types.
virtual MachineMemOperand::Flags getTargetMMOFlags(const Instruction &I) const
This callback is used to inspect load/store instructions and add target-specific MachineMemOperand fl...
virtual Register getExceptionSelectorRegister(ExceptionHandling EH, const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception typeid on entry to a la...
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 bool useStackGuardMixFP() const
If this function returns true, stack protection checks should mix the frame pointer (or whichever poi...
MVT getRegisterType(LLVMContext &Context, EVT VT) const
Return the type of registers that this ValueType will eventually require.
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.
MachineMemOperand::Flags getLoadMemOperandFlags(const LoadInst &LI, const DataLayout &DL, AssumptionCache *AC=nullptr, const TargetLibraryInfo *LibInfo=nullptr, CodeGenOptLevel OptLevel=CodeGenOptLevel::Default) const
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.
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 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...
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 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 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 ...
bool supportsUnalignedAtomics() const
Whether the target supports unaligned atomic operations.
std::vector< ArgListEntry > ArgListTy
virtual Register getExceptionPointerRegister(ExceptionHandling EH, const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception address on entry to an ...
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 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 ...
virtual MVT getVPExplicitVectorLengthTy() const
Returns the type to be used for the EVL/AVL operand of VP nodes: ISD::VP_UDIV, ISD::VP_SDIV,...
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 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 Register getRegisterByName(const char *RegName, LLT Ty, const MachineFunction &MF) const
Return the register ID of the name passed in.
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 SDValue emitStackGuardMixFP(SelectionDAG &DAG, SDValue Val, const SDLoc &DL) const
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 ...
SDValue annotateStackObjectPointer(SDValue Ptr, SelectionDAG &DAG, const SDLoc &DL, Align Alignment) const
Annotate a stack object pointer with known-bits assertions.
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...
Primary interface to the complete machine description for the target machine.
CodeGenOptLevel getOptLevel() const
Returns the optimization level: None, Less, Default, or Aggressive.
ExceptionHandling getExceptionModel() const
Return the ExceptionHandling to use, considering TargetOptions and the Triple's default.
CodeModel::Model getCodeModel() const
Returns the code model.
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.
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:180
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:288
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:282
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:282
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:368
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:306
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:313
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
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...
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:255
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:439
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:258
iterator_range< user_iterator > users()
Definition Value.h:426
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:346
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
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.
@ 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:513
@ 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:602
@ STACKADDRESS
STACKADDRESS - Represents the llvm.stackaddress intrinsic.
Definition ISDOpcodes.h:127
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:789
@ 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:863
@ 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:520
@ 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:890
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition ISDOpcodes.h:586
@ 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:749
@ 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:530
@ FPTRUNC_ROUND
FPTRUNC_ROUND - This corresponds to the fptrunc_round intrinsic.
Definition ISDOpcodes.h:517
@ 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...
@ 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:780
@ 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
@ CTLZ_ZERO_POISON
Definition ISDOpcodes.h:798
@ 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:985
@ CONVERGENCECTRL_GLUE
This does not correspond to any convergence control intrinsic.
@ PARTIAL_REDUCE_UMLA
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:854
@ 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.
@ 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:637
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition ISDOpcodes.h:543
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
Definition ISDOpcodes.h:550
@ 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:806
@ 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:674
@ 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:980
@ 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:771
@ 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:616
@ 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:578
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:860
@ 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:655
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:729
@ MASKED_UDIV
Masked vector arithmetic that returns poison on disabled lanes.
@ VECTOR_REVERSE
VECTOR_REVERSE(VECTOR) - Returns a vector, of the same type as VECTOR, whose elements are shuffled us...
Definition ISDOpcodes.h:642
@ 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:988
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition ISDOpcodes.h:815
@ 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
@ PEXT
Parallel bit extract (compress) and parallel bit deposit (expand).
Definition ISDOpcodes.h:785
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition ISDOpcodes.h:502
@ 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:936
@ 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:741
@ 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:737
@ VECTOR_MATCH
VECTOR_MATCH - this corresponds to the llvm.experimental.vector.match intrinsic.
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1,VEC2) right by OFFSET elements a...
Definition ISDOpcodes.h:659
@ 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:567
@ 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,...
@ CTTZ_ZERO_POISON
Bit counting operators with a poisoned result for zero inputs.
Definition ISDOpcodes.h:797
@ 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:969
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
Definition ISDOpcodes.h:701
@ 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:955
@ 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:866
@ BRCOND
BRCOND - Conditional branch.
@ VECREDUCE_SEQ_FMUL
@ CONVERT_TO_ARBITRARY_FP
CONVERT_TO_ARBITRARY_FP - Converts a native FP value to an arbitrary floating-point format,...
@ 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:536
@ 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:626
@ 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
@ ABS_MIN_POISON
ABS with a poison result for INT_MIN.
Definition ISDOpcodes.h:753
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:558
@ 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.
LLVM_ABI StringRef getBaseName(ID id)
Return the LLVM name for an intrinsic, without encoded types for overloading, such as "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.
auto m_Value()
Match an arbitrary value and ignore it.
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
auto m_VScale()
Matches a call to llvm.vscale().
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
LLVM_ABI 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:52
constexpr double e
constexpr float ln2f
Definition MathExtras.h:50
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.
@ 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:339
@ Offset
Definition DWP.cpp:578
@ Length
Definition DWP.cpp:578
LLVM_ABI 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
SDValue peekThroughFreeze(SDValue V)
Return the non-frozen source operand of V if it exists.
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.
RelativeUniformCounterPtr Values
Definition InstrProf.h:91
LLVM_ABI bool isOnlyUsedInZeroEqualityComparison(const Instruction *CxtI)
LLVM_ABI 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:315
LLVM_ABI void diagnoseDontCall(const CallInst &CI)
auto successors(const MachineBasicBlock *BB)
@ Load
The value being inserted comes from a load (InsertElement only).
@ Store
The extracted value is stored (ExtractElement only).
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:244
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:541
gep_type_iterator gep_type_end(const User *GEP)
LLVM_ABI LLT getLLTForMVT(MVT Ty)
Get a rough equivalent of an LLT for a given MVT.
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:156
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:1151
bool isScopedEHPersonality(EHPersonality Pers)
Returns true if this personality uses scope-style EH IR instructions: catchswitch,...
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
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:204
LLVM_ABI 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:853
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 const MDNode * getMemCacheHintMetadata(const Instruction &I, unsigned OperandNo=0)
Return the cache hint metadata node for memory operand OperandNo on I, or nullptr when the instructio...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:144
generic_gep_type_iterator<> gep_type_iterator
auto succ_size(const MachineBasicBlock *BB)
bool hasSingleElement(ContainerTy &&C)
Returns true if the given container only contains a single element.
Definition STLExtras.h:299
LLVM_ABI 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:2317
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...
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.
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
@ 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.
LLVM_ABI 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
@ Dynamic
Denotes mode unknown at compile time.
LLVM_ABI 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
LLVM_ABI 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...
LLVM_ABI 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:347
@ Default
The result value is uniform if and only if all operands are uniform.
Definition Uniformity.h:20
MCRegisterClass TargetRegisterClass
Definition FastISel.h:58
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:880
#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:418
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
Definition ValueTypes.h:145
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:425
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition ValueTypes.h:307
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:323
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:373
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:396
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition ValueTypes.h:382
uint64_t getScalarSizeInBits() const
Definition ValueTypes.h:408
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:339
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:197
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
Definition ValueTypes.h:404
bool isFixedLengthVector() const
Definition ValueTypes.h:199
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:346
bool bitsGE(EVT VT) const
Return true if this has no less bits than VT.
Definition ValueTypes.h:315
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
Definition ValueTypes.h:187
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:351
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:359
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:262
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:342
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.
LLVM_ABI void addIPToStateRange(const InvokeInst *II, MCSymbol *InvokeBegin, MCSymbol *InvokeEnd)