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();
3642 if (TLI.getExceptionPointerRegister(PersonalityFn) == 0 &&
3643 TLI.getExceptionSelectorRegister(PersonalityFn) == 0)
3644 return;
3645
3646 // If landingpad's return type is token type, we don't create DAG nodes
3647 // for its exception pointer and selector value. The extraction of exception
3648 // pointer or selector value from token type landingpads is not currently
3649 // supported.
3650 if (LP.getType()->isTokenTy())
3651 return;
3652
3653 SmallVector<EVT, 2> ValueVTs;
3654 SDLoc dl = getCurSDLoc();
3655 ComputeValueVTs(TLI, DAG.getDataLayout(), LP.getType(), ValueVTs);
3656 assert(ValueVTs.size() == 2 && "Only two-valued landingpads are supported");
3657
3658 // Get the two live-in registers as SDValues. The physregs have already been
3659 // copied into virtual registers.
3660 SDValue Ops[2];
3661 if (FuncInfo.ExceptionPointerVirtReg) {
3662 Ops[0] = DAG.getZExtOrTrunc(
3663 DAG.getCopyFromReg(DAG.getEntryNode(), dl,
3664 FuncInfo.ExceptionPointerVirtReg,
3665 TLI.getPointerTy(DAG.getDataLayout())),
3666 dl, ValueVTs[0]);
3667 } else {
3668 Ops[0] = DAG.getConstant(0, dl, TLI.getPointerTy(DAG.getDataLayout()));
3669 }
3670 Ops[1] = DAG.getZExtOrTrunc(
3671 DAG.getCopyFromReg(DAG.getEntryNode(), dl,
3672 FuncInfo.ExceptionSelectorVirtReg,
3673 TLI.getPointerTy(DAG.getDataLayout())),
3674 dl, ValueVTs[1]);
3675
3676 // Merge into one.
3677 SDValue Res = DAG.getNode(ISD::MERGE_VALUES, dl,
3678 DAG.getVTList(ValueVTs), Ops);
3679 setValue(&LP, Res);
3680}
3681
3684 // Update JTCases.
3685 for (JumpTableBlock &JTB : SL->JTCases)
3686 if (JTB.first.HeaderBB == First)
3687 JTB.first.HeaderBB = Last;
3688
3689 // Update BitTestCases.
3690 for (BitTestBlock &BTB : SL->BitTestCases)
3691 if (BTB.Parent == First)
3692 BTB.Parent = Last;
3693}
3694
3695void SelectionDAGBuilder::visitIndirectBr(const IndirectBrInst &I) {
3696 MachineBasicBlock *IndirectBrMBB = FuncInfo.MBB;
3697
3698 // Update machine-CFG edges with unique successors.
3700 for (unsigned i = 0, e = I.getNumSuccessors(); i != e; ++i) {
3701 BasicBlock *BB = I.getSuccessor(i);
3702 bool Inserted = Done.insert(BB).second;
3703 if (!Inserted)
3704 continue;
3705
3706 MachineBasicBlock *Succ = FuncInfo.getMBB(BB);
3707 addSuccessorWithProb(IndirectBrMBB, Succ);
3708 }
3709 IndirectBrMBB->normalizeSuccProbs();
3710
3712 MVT::Other, getControlRoot(),
3713 getValue(I.getAddress())));
3714}
3715
3716void SelectionDAGBuilder::visitUnreachable(const UnreachableInst &I) {
3717 if (!I.shouldLowerToTrap(DAG.getTarget().Options.TrapUnreachable,
3718 DAG.getTarget().Options.NoTrapAfterNoreturn))
3719 return;
3720
3721 DAG.setRoot(DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, DAG.getRoot()));
3722}
3723
3724void SelectionDAGBuilder::visitUnary(const User &I, unsigned Opcode) {
3725 SDNodeFlags Flags;
3726 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3727 Flags.copyFMF(*FPOp);
3728
3729 SDValue Op = getValue(I.getOperand(0));
3730 SDValue UnNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op.getValueType(),
3731 Op, Flags);
3732 setValue(&I, UnNodeValue);
3733}
3734
3735void SelectionDAGBuilder::visitBinary(const User &I, unsigned Opcode) {
3736 SDNodeFlags Flags;
3737 if (auto *OFBinOp = dyn_cast<OverflowingBinaryOperator>(&I)) {
3738 Flags.setNoSignedWrap(OFBinOp->hasNoSignedWrap());
3739 Flags.setNoUnsignedWrap(OFBinOp->hasNoUnsignedWrap());
3740 }
3741 if (auto *ExactOp = dyn_cast<PossiblyExactOperator>(&I))
3742 Flags.setExact(ExactOp->isExact());
3743 if (auto *DisjointOp = dyn_cast<PossiblyDisjointInst>(&I))
3744 Flags.setDisjoint(DisjointOp->isDisjoint());
3745 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3746 Flags.copyFMF(*FPOp);
3747
3748 SDValue Op1 = getValue(I.getOperand(0));
3749 SDValue Op2 = getValue(I.getOperand(1));
3750 SDValue BinNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(),
3751 Op1, Op2, Flags);
3752 setValue(&I, BinNodeValue);
3753}
3754
3755void SelectionDAGBuilder::visitShift(const User &I, unsigned Opcode) {
3756 SDValue Op1 = getValue(I.getOperand(0));
3757 SDValue Op2 = getValue(I.getOperand(1));
3758
3759 EVT ShiftTy = DAG.getTargetLoweringInfo().getShiftAmountTy(
3760 Op1.getValueType(), DAG.getDataLayout());
3761
3762 // Coerce the shift amount to the right type if we can. This exposes the
3763 // truncate or zext to optimization early.
3764 if (!I.getType()->isVectorTy() && Op2.getValueType() != ShiftTy) {
3766 "Unexpected shift type");
3767 Op2 = DAG.getZExtOrTrunc(Op2, getCurSDLoc(), ShiftTy);
3768 }
3769
3770 bool nuw = false;
3771 bool nsw = false;
3772 bool exact = false;
3773
3774 if (Opcode == ISD::SRL || Opcode == ISD::SRA || Opcode == ISD::SHL) {
3775
3776 if (const OverflowingBinaryOperator *OFBinOp =
3778 nuw = OFBinOp->hasNoUnsignedWrap();
3779 nsw = OFBinOp->hasNoSignedWrap();
3780 }
3781 if (const PossiblyExactOperator *ExactOp =
3783 exact = ExactOp->isExact();
3784 }
3785 SDNodeFlags Flags;
3786 Flags.setExact(exact);
3787 Flags.setNoSignedWrap(nsw);
3788 Flags.setNoUnsignedWrap(nuw);
3789 SDValue Res = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(), Op1, Op2,
3790 Flags);
3791 setValue(&I, Res);
3792}
3793
3794void SelectionDAGBuilder::visitSDiv(const User &I) {
3795 SDValue Op1 = getValue(I.getOperand(0));
3796 SDValue Op2 = getValue(I.getOperand(1));
3797
3798 SDNodeFlags Flags;
3799 Flags.setExact(isa<PossiblyExactOperator>(&I) &&
3800 cast<PossiblyExactOperator>(&I)->isExact());
3801 setValue(&I, DAG.getNode(ISD::SDIV, getCurSDLoc(), Op1.getValueType(), Op1,
3802 Op2, Flags));
3803}
3804
3805void SelectionDAGBuilder::visitICmp(const ICmpInst &I) {
3806 ICmpInst::Predicate predicate = I.getPredicate();
3807 SDValue Op1 = getValue(I.getOperand(0));
3808 SDValue Op2 = getValue(I.getOperand(1));
3809 ISD::CondCode Opcode = getICmpCondCode(predicate);
3810
3811 auto &TLI = DAG.getTargetLoweringInfo();
3812 EVT MemVT =
3813 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
3814
3815 // If a pointer's DAG type is larger than its memory type then the DAG values
3816 // are zero-extended. This breaks signed comparisons so truncate back to the
3817 // underlying type before doing the compare.
3818 if (Op1.getValueType() != MemVT) {
3819 Op1 = DAG.getPtrExtOrTrunc(Op1, getCurSDLoc(), MemVT);
3820 Op2 = DAG.getPtrExtOrTrunc(Op2, getCurSDLoc(), MemVT);
3821 }
3822
3823 SDNodeFlags Flags;
3824 Flags.setSameSign(I.hasSameSign());
3825
3826 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3827 I.getType());
3828 setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Opcode,
3829 /*Chain=*/{}, /*IsSignaling=*/false, Flags));
3830}
3831
3832void SelectionDAGBuilder::visitFCmp(const FCmpInst &I) {
3833 FCmpInst::Predicate predicate = I.getPredicate();
3834 SDValue Op1 = getValue(I.getOperand(0));
3835 SDValue Op2 = getValue(I.getOperand(1));
3836
3837 ISD::CondCode Condition = getFCmpCondCode(predicate);
3838 auto *FPMO = cast<FPMathOperator>(&I);
3839 if (FPMO->hasNoNaNs() ||
3840 (DAG.isKnownNeverNaN(Op1) && DAG.isKnownNeverNaN(Op2)))
3841 Condition = getFCmpCodeWithoutNaN(Condition);
3842
3843 SDNodeFlags Flags;
3844 Flags.copyFMF(*FPMO);
3845
3846 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3847 I.getType());
3848 setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Condition,
3849 /*Chain=*/{}, /*IsSignaling=*/false, Flags));
3850}
3851
3852// Check if the condition of the select has one use or two users that are both
3853// selects with the same condition.
3854static bool hasOnlySelectUsers(const Value *Cond) {
3855 return llvm::all_of(Cond->users(), [](const Value *V) {
3856 return isa<SelectInst>(V);
3857 });
3858}
3859
3860void SelectionDAGBuilder::visitSelect(const User &I) {
3861 SmallVector<EVT, 4> ValueVTs;
3862 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
3863 ValueVTs);
3864 unsigned NumValues = ValueVTs.size();
3865 if (NumValues == 0) return;
3866
3868 SDValue Cond = getValue(I.getOperand(0));
3869 SDValue LHSVal = getValue(I.getOperand(1));
3870 SDValue RHSVal = getValue(I.getOperand(2));
3871 SmallVector<SDValue, 1> BaseOps(1, Cond);
3873 Cond.getValueType().isVector() ? ISD::VSELECT : ISD::SELECT;
3874
3875 bool IsUnaryAbs = false;
3876 bool Negate = false;
3877
3878 SDNodeFlags Flags;
3879 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3880 Flags.copyFMF(*FPOp);
3881
3882 Flags.setUnpredictable(
3883 cast<SelectInst>(I).getMetadata(LLVMContext::MD_unpredictable));
3884
3885 // Min/max matching is only viable if all output VTs are the same.
3886 if (all_equal(ValueVTs)) {
3887 EVT VT = ValueVTs[0];
3888 LLVMContext &Ctx = *DAG.getContext();
3889 auto &TLI = DAG.getTargetLoweringInfo();
3890
3891 // We care about the legality of the operation after it has been type
3892 // legalized.
3893 while (TLI.getTypeAction(Ctx, VT) != TargetLoweringBase::TypeLegal)
3894 VT = TLI.getTypeToTransformTo(Ctx, VT);
3895
3896 // If the vselect is legal, assume we want to leave this as a vector setcc +
3897 // vselect. Otherwise, if this is going to be scalarized, we want to see if
3898 // min/max is legal on the scalar type.
3899 bool UseScalarMinMax = VT.isVector() &&
3901
3902 // ValueTracking's select pattern matching does not account for -0.0,
3903 // so we can't lower to FMINIMUM/FMAXIMUM because those nodes specify that
3904 // -0.0 is less than +0.0.
3905 const Value *LHS, *RHS;
3906 auto SPR = matchSelectPattern(&I, LHS, RHS);
3908 switch (SPR.Flavor) {
3909 case SPF_UMAX: Opc = ISD::UMAX; break;
3910 case SPF_UMIN: Opc = ISD::UMIN; break;
3911 case SPF_SMAX: Opc = ISD::SMAX; break;
3912 case SPF_SMIN: Opc = ISD::SMIN; break;
3913 case SPF_FMINNUM:
3915 break;
3916
3917 switch (SPR.NaNBehavior) {
3918 case SPNB_NA: llvm_unreachable("No NaN behavior for FP op?");
3919 case SPNB_RETURNS_ANY:
3920 case SPNB_RETURNS_NAN:
3921 break;
3922 case SPNB_RETURNS_OTHER:
3924 Flags.setNoSignedZeros(true);
3925 break;
3926 }
3927 break;
3928 case SPF_FMAXNUM:
3930 break;
3931
3932 switch (SPR.NaNBehavior) {
3933 case SPNB_NA: llvm_unreachable("No NaN behavior for FP op?");
3934 case SPNB_RETURNS_NAN:
3935 case SPNB_RETURNS_ANY:
3936 break;
3937 case SPNB_RETURNS_OTHER:
3939 Flags.setNoSignedZeros(true);
3940 break;
3941 }
3942 break;
3943 case SPF_NABS:
3944 Negate = true;
3945 [[fallthrough]];
3946 case SPF_ABS:
3947 IsUnaryAbs = true;
3948 Opc = ISD::ABS;
3949 break;
3950 default: break;
3951 }
3952
3953 if (!IsUnaryAbs && Opc != ISD::DELETED_NODE &&
3954 (TLI.isOperationLegalOrCustom(Opc, VT) ||
3955 (UseScalarMinMax &&
3957 // If the underlying comparison instruction is used by any other
3958 // instruction, the consumed instructions won't be destroyed, so it is
3959 // not profitable to convert to a min/max.
3961 OpCode = Opc;
3962 LHSVal = getValue(LHS);
3963 RHSVal = getValue(RHS);
3964 BaseOps.clear();
3965 }
3966
3967 if (IsUnaryAbs) {
3968 OpCode = Opc;
3969 LHSVal = getValue(LHS);
3970 BaseOps.clear();
3971 }
3972 }
3973
3974 if (IsUnaryAbs) {
3975 for (unsigned i = 0; i != NumValues; ++i) {
3976 SDLoc dl = getCurSDLoc();
3977 EVT VT = LHSVal.getNode()->getValueType(LHSVal.getResNo() + i);
3978 Values[i] =
3979 DAG.getNode(OpCode, dl, VT, LHSVal.getValue(LHSVal.getResNo() + i));
3980 if (Negate)
3981 Values[i] = DAG.getNegative(Values[i], dl, VT);
3982 }
3983 } else {
3984 for (unsigned i = 0; i != NumValues; ++i) {
3985 SmallVector<SDValue, 3> Ops(BaseOps.begin(), BaseOps.end());
3986 Ops.push_back(SDValue(LHSVal.getNode(), LHSVal.getResNo() + i));
3987 Ops.push_back(SDValue(RHSVal.getNode(), RHSVal.getResNo() + i));
3988 Values[i] = DAG.getNode(
3989 OpCode, getCurSDLoc(),
3990 LHSVal.getNode()->getValueType(LHSVal.getResNo() + i), Ops, Flags);
3991 }
3992 }
3993
3995 DAG.getVTList(ValueVTs), Values));
3996}
3997
3998void SelectionDAGBuilder::visitTrunc(const User &I) {
3999 // TruncInst cannot be a no-op cast because sizeof(src) > sizeof(dest).
4000 SDValue N = getValue(I.getOperand(0));
4001 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4002 I.getType());
4003 SDNodeFlags Flags;
4004 if (auto *Trunc = dyn_cast<TruncInst>(&I)) {
4005 Flags.setNoSignedWrap(Trunc->hasNoSignedWrap());
4006 Flags.setNoUnsignedWrap(Trunc->hasNoUnsignedWrap());
4007 }
4008
4009 setValue(&I, DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), DestVT, N, Flags));
4010}
4011
4012void SelectionDAGBuilder::visitZExt(const User &I) {
4013 // ZExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
4014 // ZExt also can't be a cast to bool for same reason. So, nothing much to do
4015 SDValue N = getValue(I.getOperand(0));
4016 auto &TLI = DAG.getTargetLoweringInfo();
4017 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4018
4019 SDNodeFlags Flags;
4020 if (auto *PNI = dyn_cast<PossiblyNonNegInst>(&I))
4021 Flags.setNonNeg(PNI->hasNonNeg());
4022
4023 // Eagerly use nonneg information to canonicalize towards sign_extend if
4024 // that is the target's preference.
4025 // TODO: Let the target do this later.
4026 if (Flags.hasNonNeg() &&
4027 TLI.isSExtCheaperThanZExt(N.getValueType(), DestVT)) {
4028 setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));
4029 return;
4030 }
4031
4032 setValue(&I, DAG.getNode(ISD::ZERO_EXTEND, getCurSDLoc(), DestVT, N, Flags));
4033}
4034
4035void SelectionDAGBuilder::visitSExt(const User &I) {
4036 // SExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
4037 // SExt also can't be a cast to bool for same reason. So, nothing much to do
4038 SDValue N = getValue(I.getOperand(0));
4039 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4040 I.getType());
4041 setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));
4042}
4043
4044void SelectionDAGBuilder::visitFPTrunc(const User &I) {
4045 // FPTrunc is never a no-op cast, no need to check
4046 SDValue N = getValue(I.getOperand(0));
4047 SDLoc dl = getCurSDLoc();
4048 SDNodeFlags Flags;
4049 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
4050 Flags.copyFMF(*FPOp);
4051 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4052 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4053 setValue(&I, DAG.getNode(ISD::FP_ROUND, dl, DestVT, N,
4054 DAG.getTargetConstant(
4055 0, dl, TLI.getPointerTy(DAG.getDataLayout())),
4056 Flags));
4057}
4058
4059void SelectionDAGBuilder::visitFPExt(const User &I) {
4060 // FPExt is never a no-op cast, no need to check
4061 SDValue N = getValue(I.getOperand(0));
4062 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4063 I.getType());
4064 SDNodeFlags Flags;
4065 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
4066 Flags.copyFMF(*FPOp);
4067 setValue(&I, DAG.getNode(ISD::FP_EXTEND, getCurSDLoc(), DestVT, N, Flags));
4068}
4069
4070void SelectionDAGBuilder::visitFPToUI(const User &I) {
4071 // FPToUI is never a no-op cast, no need to check
4072 SDValue N = getValue(I.getOperand(0));
4073 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4074 I.getType());
4075 setValue(&I, DAG.getNode(ISD::FP_TO_UINT, getCurSDLoc(), DestVT, N));
4076}
4077
4078void SelectionDAGBuilder::visitFPToSI(const User &I) {
4079 // FPToSI is never a no-op cast, no need to check
4080 SDValue N = getValue(I.getOperand(0));
4081 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4082 I.getType());
4083 setValue(&I, DAG.getNode(ISD::FP_TO_SINT, getCurSDLoc(), DestVT, N));
4084}
4085
4086void SelectionDAGBuilder::visitUIToFP(const User &I) {
4087 // UIToFP is never a no-op cast, no need to check
4088 SDValue N = getValue(I.getOperand(0));
4089 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4090 I.getType());
4091 SDNodeFlags Flags;
4092 Flags.setNonNeg(cast<PossiblyNonNegInst>(&I)->hasNonNeg());
4093 Flags.copyFMF(*cast<FPMathOperator>(&I));
4094
4095 setValue(&I, DAG.getNode(ISD::UINT_TO_FP, getCurSDLoc(), DestVT, N, Flags));
4096}
4097
4098void SelectionDAGBuilder::visitSIToFP(const User &I) {
4099 // SIToFP is never a no-op cast, no need to check
4100 SDValue N = getValue(I.getOperand(0));
4101 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4102 I.getType());
4103 SDNodeFlags Flags;
4104 Flags.copyFMF(*cast<FPMathOperator>(&I));
4105
4106 setValue(&I, DAG.getNode(ISD::SINT_TO_FP, getCurSDLoc(), DestVT, N, Flags));
4107}
4108
4109void SelectionDAGBuilder::visitPtrToAddr(const User &I) {
4110 SDValue N = getValue(I.getOperand(0));
4111 // By definition the type of the ptrtoaddr must be equal to the address type.
4112 const auto &TLI = DAG.getTargetLoweringInfo();
4113 EVT AddrVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4114 // The address width must be smaller or equal to the pointer representation
4115 // width, so we lower ptrtoaddr as a truncate (possibly folded to a no-op).
4116 N = DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), AddrVT, N);
4117 setValue(&I, N);
4118}
4119
4120void SelectionDAGBuilder::visitPtrToInt(const User &I) {
4121 // What to do depends on the size of the integer and the size of the pointer.
4122 // We can either truncate, zero extend, or no-op, accordingly.
4123 SDValue N = getValue(I.getOperand(0));
4124 auto &TLI = DAG.getTargetLoweringInfo();
4125 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4126 I.getType());
4127 EVT PtrMemVT =
4128 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
4129 N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), PtrMemVT);
4130 N = DAG.getZExtOrTrunc(N, getCurSDLoc(), DestVT);
4131 setValue(&I, N);
4132}
4133
4134void SelectionDAGBuilder::visitIntToPtr(const User &I) {
4135 // What to do depends on the size of the integer and the size of the pointer.
4136 // We can either truncate, zero extend, or no-op, accordingly.
4137 SDValue N = getValue(I.getOperand(0));
4138 auto &TLI = DAG.getTargetLoweringInfo();
4139 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4140 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(), I.getType());
4141 N = DAG.getZExtOrTrunc(N, getCurSDLoc(), PtrMemVT);
4142 N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), DestVT);
4143 setValue(&I, N);
4144}
4145
4146void SelectionDAGBuilder::visitBitCast(const User &I) {
4147 SDValue N = getValue(I.getOperand(0));
4148 SDLoc dl = getCurSDLoc();
4149 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4150 I.getType());
4151
4152 // BitCast assures us that source and destination are the same size so this is
4153 // either a BITCAST or a no-op.
4154 if (DestVT != N.getValueType())
4155 setValue(&I, DAG.getNode(ISD::BITCAST, dl,
4156 DestVT, N)); // convert types.
4157 // Check if the original LLVM IR Operand was a ConstantInt, because getValue()
4158 // might fold any kind of constant expression to an integer constant and that
4159 // is not what we are looking for. Only recognize a bitcast of a genuine
4160 // constant integer as an opaque constant.
4161 else if(ConstantInt *C = dyn_cast<ConstantInt>(I.getOperand(0)))
4162 setValue(&I, DAG.getConstant(C->getValue(), dl, DestVT, /*isTarget=*/false,
4163 /*isOpaque*/true));
4164 else
4165 setValue(&I, N); // noop cast.
4166}
4167
4168void SelectionDAGBuilder::visitAddrSpaceCast(const User &I) {
4169 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4170 const Value *SV = I.getOperand(0);
4171 SDValue N = getValue(SV);
4172 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4173
4174 unsigned SrcAS = SV->getType()->getPointerAddressSpace();
4175 unsigned DestAS = I.getType()->getPointerAddressSpace();
4176
4177 if (!TM.isNoopAddrSpaceCast(SrcAS, DestAS))
4178 N = DAG.getAddrSpaceCast(getCurSDLoc(), DestVT, N, SrcAS, DestAS);
4179
4180 setValue(&I, N);
4181}
4182
4183void SelectionDAGBuilder::visitInsertElement(const User &I) {
4184 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4185 SDValue InVec = getValue(I.getOperand(0));
4186 SDValue InVal = getValue(I.getOperand(1));
4187 SDValue InIdx = DAG.getZExtOrTrunc(getValue(I.getOperand(2)), getCurSDLoc(),
4188 TLI.getVectorIdxTy(DAG.getDataLayout()));
4190 TLI.getValueType(DAG.getDataLayout(), I.getType()),
4191 InVec, InVal, InIdx));
4192}
4193
4194void SelectionDAGBuilder::visitExtractElement(const User &I) {
4195 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4196 SDValue InVec = getValue(I.getOperand(0));
4197 SDValue InIdx = DAG.getZExtOrTrunc(getValue(I.getOperand(1)), getCurSDLoc(),
4198 TLI.getVectorIdxTy(DAG.getDataLayout()));
4200 TLI.getValueType(DAG.getDataLayout(), I.getType()),
4201 InVec, InIdx));
4202}
4203
4204void SelectionDAGBuilder::visitShuffleVector(const User &I) {
4205 SDValue Src1 = getValue(I.getOperand(0));
4206 SDValue Src2 = getValue(I.getOperand(1));
4207 ArrayRef<int> Mask;
4208 if (auto *SVI = dyn_cast<ShuffleVectorInst>(&I))
4209 Mask = SVI->getShuffleMask();
4210 else
4211 Mask = cast<ConstantExpr>(I).getShuffleMask();
4212 SDLoc DL = getCurSDLoc();
4213 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4214 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4215 EVT SrcVT = Src1.getValueType();
4216
4217 if (all_of(Mask, equal_to(0)) && VT.isScalableVector()) {
4218 // Canonical splat form of first element of first input vector.
4219 SDValue FirstElt =
4220 DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, SrcVT.getScalarType(), Src1,
4221 DAG.getVectorIdxConstant(0, DL));
4222 setValue(&I, DAG.getNode(ISD::SPLAT_VECTOR, DL, VT, FirstElt));
4223 return;
4224 }
4225
4226 // For now, we only handle splats for scalable vectors.
4227 // The DAGCombiner will perform a BUILD_VECTOR -> SPLAT_VECTOR transformation
4228 // for targets that support a SPLAT_VECTOR for non-scalable vector types.
4229 assert(!VT.isScalableVector() && "Unsupported scalable vector shuffle");
4230
4231 unsigned SrcNumElts = SrcVT.getVectorNumElements();
4232 unsigned MaskNumElts = Mask.size();
4233
4234 if (SrcNumElts == MaskNumElts) {
4235 setValue(&I, DAG.getVectorShuffle(VT, DL, Src1, Src2, Mask));
4236 return;
4237 }
4238
4239 // Normalize the shuffle vector since mask and vector length don't match.
4240 if (SrcNumElts < MaskNumElts) {
4241 // Mask is longer than the source vectors. We can use concatenate vector to
4242 // make the mask and vectors lengths match.
4243
4244 if (MaskNumElts % SrcNumElts == 0) {
4245 // Mask length is a multiple of the source vector length.
4246 // Check if the shuffle is some kind of concatenation of the input
4247 // vectors.
4248 unsigned NumConcat = MaskNumElts / SrcNumElts;
4249 bool IsConcat = true;
4250 SmallVector<int, 8> ConcatSrcs(NumConcat, -1);
4251 for (unsigned i = 0; i != MaskNumElts; ++i) {
4252 int Idx = Mask[i];
4253 if (Idx < 0)
4254 continue;
4255 // Ensure the indices in each SrcVT sized piece are sequential and that
4256 // the same source is used for the whole piece.
4257 if ((Idx % SrcNumElts != (i % SrcNumElts)) ||
4258 (ConcatSrcs[i / SrcNumElts] >= 0 &&
4259 ConcatSrcs[i / SrcNumElts] != (int)(Idx / SrcNumElts))) {
4260 IsConcat = false;
4261 break;
4262 }
4263 // Remember which source this index came from.
4264 ConcatSrcs[i / SrcNumElts] = Idx / SrcNumElts;
4265 }
4266
4267 // The shuffle is concatenating multiple vectors together. Just emit
4268 // a CONCAT_VECTORS operation.
4269 if (IsConcat) {
4270 SmallVector<SDValue, 8> ConcatOps;
4271 for (auto Src : ConcatSrcs) {
4272 if (Src < 0)
4273 ConcatOps.push_back(DAG.getUNDEF(SrcVT));
4274 else if (Src == 0)
4275 ConcatOps.push_back(Src1);
4276 else
4277 ConcatOps.push_back(Src2);
4278 }
4279 setValue(&I, DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, ConcatOps));
4280 return;
4281 }
4282 }
4283
4284 unsigned PaddedMaskNumElts = alignTo(MaskNumElts, SrcNumElts);
4285 unsigned NumConcat = PaddedMaskNumElts / SrcNumElts;
4286 EVT PaddedVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(),
4287 PaddedMaskNumElts);
4288
4289 // Pad both vectors with undefs to make them the same length as the mask.
4290 SDValue UndefVal = DAG.getUNDEF(SrcVT);
4291
4292 SmallVector<SDValue, 8> MOps1(NumConcat, UndefVal);
4293 SmallVector<SDValue, 8> MOps2(NumConcat, UndefVal);
4294 MOps1[0] = Src1;
4295 MOps2[0] = Src2;
4296
4297 Src1 = DAG.getNode(ISD::CONCAT_VECTORS, DL, PaddedVT, MOps1);
4298 Src2 = DAG.getNode(ISD::CONCAT_VECTORS, DL, PaddedVT, MOps2);
4299
4300 // Readjust mask for new input vector length.
4301 SmallVector<int, 8> MappedOps(PaddedMaskNumElts, -1);
4302 for (unsigned i = 0; i != MaskNumElts; ++i) {
4303 int Idx = Mask[i];
4304 if (Idx >= (int)SrcNumElts)
4305 Idx -= SrcNumElts - PaddedMaskNumElts;
4306 MappedOps[i] = Idx;
4307 }
4308
4309 SDValue Result = DAG.getVectorShuffle(PaddedVT, DL, Src1, Src2, MappedOps);
4310
4311 // If the concatenated vector was padded, extract a subvector with the
4312 // correct number of elements.
4313 if (MaskNumElts != PaddedMaskNumElts)
4314 Result = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Result,
4315 DAG.getVectorIdxConstant(0, DL));
4316
4317 setValue(&I, Result);
4318 return;
4319 }
4320
4321 assert(SrcNumElts > MaskNumElts);
4322
4323 // Analyze the access pattern of the vector to see if we can extract
4324 // two subvectors and do the shuffle.
4325 int StartIdx[2] = {-1, -1}; // StartIdx to extract from
4326 bool CanExtract = true;
4327 for (int Idx : Mask) {
4328 unsigned Input = 0;
4329 if (Idx < 0)
4330 continue;
4331
4332 if (Idx >= (int)SrcNumElts) {
4333 Input = 1;
4334 Idx -= SrcNumElts;
4335 }
4336
4337 // If all the indices come from the same MaskNumElts sized portion of
4338 // the sources we can use extract. Also make sure the extract wouldn't
4339 // extract past the end of the source.
4340 int NewStartIdx = alignDown(Idx, MaskNumElts);
4341 if (NewStartIdx + MaskNumElts > SrcNumElts ||
4342 (StartIdx[Input] >= 0 && StartIdx[Input] != NewStartIdx))
4343 CanExtract = false;
4344 // Make sure we always update StartIdx as we use it to track if all
4345 // elements are undef.
4346 StartIdx[Input] = NewStartIdx;
4347 }
4348
4349 if (StartIdx[0] < 0 && StartIdx[1] < 0) {
4350 setValue(&I, DAG.getUNDEF(VT)); // Vectors are not used.
4351 return;
4352 }
4353 if (CanExtract) {
4354 // Extract appropriate subvector and generate a vector shuffle
4355 for (unsigned Input = 0; Input < 2; ++Input) {
4356 SDValue &Src = Input == 0 ? Src1 : Src2;
4357 if (StartIdx[Input] < 0)
4358 Src = DAG.getUNDEF(VT);
4359 else {
4360 Src = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Src,
4361 DAG.getVectorIdxConstant(StartIdx[Input], DL));
4362 }
4363 }
4364
4365 // Calculate new mask.
4366 SmallVector<int, 8> MappedOps(Mask);
4367 for (int &Idx : MappedOps) {
4368 if (Idx >= (int)SrcNumElts)
4369 Idx -= SrcNumElts + StartIdx[1] - MaskNumElts;
4370 else if (Idx >= 0)
4371 Idx -= StartIdx[0];
4372 }
4373
4374 setValue(&I, DAG.getVectorShuffle(VT, DL, Src1, Src2, MappedOps));
4375 return;
4376 }
4377
4378 // We can't use either concat vectors or extract subvectors so fall back to
4379 // replacing the shuffle with extract and build vector.
4380 // to insert and build vector.
4381 EVT EltVT = VT.getVectorElementType();
4383 for (int Idx : Mask) {
4384 SDValue Res;
4385
4386 if (Idx < 0) {
4387 Res = DAG.getUNDEF(EltVT);
4388 } else {
4389 SDValue &Src = Idx < (int)SrcNumElts ? Src1 : Src2;
4390 if (Idx >= (int)SrcNumElts) Idx -= SrcNumElts;
4391
4392 Res = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Src,
4393 DAG.getVectorIdxConstant(Idx, DL));
4394 }
4395
4396 Ops.push_back(Res);
4397 }
4398
4399 setValue(&I, DAG.getBuildVector(VT, DL, Ops));
4400}
4401
4402void SelectionDAGBuilder::visitInsertValue(const InsertValueInst &I) {
4403 ArrayRef<unsigned> Indices = I.getIndices();
4404 const Value *Op0 = I.getOperand(0);
4405 const Value *Op1 = I.getOperand(1);
4406 Type *AggTy = I.getType();
4407 Type *ValTy = Op1->getType();
4408 bool IntoUndef = isa<UndefValue>(Op0);
4409 bool FromUndef = isa<UndefValue>(Op1);
4410
4411 unsigned LinearIndex = ComputeLinearIndex(AggTy, Indices);
4412
4413 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4414 SmallVector<EVT, 4> AggValueVTs;
4415 ComputeValueVTs(TLI, DAG.getDataLayout(), AggTy, AggValueVTs);
4416 SmallVector<EVT, 4> ValValueVTs;
4417 ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);
4418
4419 unsigned NumAggValues = AggValueVTs.size();
4420 unsigned NumValValues = ValValueVTs.size();
4421 SmallVector<SDValue, 4> Values(NumAggValues);
4422
4423 // Ignore an insertvalue that produces an empty object
4424 if (!NumAggValues) {
4425 setValue(&I, DAG.getUNDEF(MVT(MVT::Other)));
4426 return;
4427 }
4428
4429 SDValue Agg = getValue(Op0);
4430 unsigned i = 0;
4431 // Copy the beginning value(s) from the original aggregate.
4432 for (; i != LinearIndex; ++i)
4433 Values[i] = IntoUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4434 SDValue(Agg.getNode(), Agg.getResNo() + i);
4435 // Copy values from the inserted value(s).
4436 if (NumValValues) {
4437 SDValue Val = getValue(Op1);
4438 for (; i != LinearIndex + NumValValues; ++i)
4439 Values[i] = FromUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4440 SDValue(Val.getNode(), Val.getResNo() + i - LinearIndex);
4441 }
4442 // Copy remaining value(s) from the original aggregate.
4443 for (; i != NumAggValues; ++i)
4444 Values[i] = IntoUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4445 SDValue(Agg.getNode(), Agg.getResNo() + i);
4446
4448 DAG.getVTList(AggValueVTs), Values));
4449}
4450
4451void SelectionDAGBuilder::visitExtractValue(const ExtractValueInst &I) {
4452 ArrayRef<unsigned> Indices = I.getIndices();
4453 const Value *Op0 = I.getOperand(0);
4454 Type *AggTy = Op0->getType();
4455 Type *ValTy = I.getType();
4456 bool OutOfUndef = isa<UndefValue>(Op0);
4457
4458 unsigned LinearIndex = ComputeLinearIndex(AggTy, Indices);
4459
4460 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4461 SmallVector<EVT, 4> ValValueVTs;
4462 ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);
4463
4464 unsigned NumValValues = ValValueVTs.size();
4465
4466 // Ignore a extractvalue that produces an empty object
4467 if (!NumValValues) {
4468 setValue(&I, DAG.getUNDEF(MVT(MVT::Other)));
4469 return;
4470 }
4471
4472 SmallVector<SDValue, 4> Values(NumValValues);
4473
4474 SDValue Agg = getValue(Op0);
4475 // Copy out the selected value(s).
4476 for (unsigned i = LinearIndex; i != LinearIndex + NumValValues; ++i)
4477 Values[i - LinearIndex] =
4478 OutOfUndef ?
4479 DAG.getUNDEF(Agg.getNode()->getValueType(Agg.getResNo() + i)) :
4480 SDValue(Agg.getNode(), Agg.getResNo() + i);
4481
4483 DAG.getVTList(ValValueVTs), Values));
4484}
4485
4486void SelectionDAGBuilder::visitGetElementPtr(const User &I) {
4487 Value *Op0 = I.getOperand(0);
4488 // Note that the pointer operand may be a vector of pointers. Take the scalar
4489 // element which holds a pointer.
4490 unsigned AS = Op0->getType()->getScalarType()->getPointerAddressSpace();
4491 SDValue N = getValue(Op0);
4492 SDLoc dl = getCurSDLoc();
4493 auto &TLI = DAG.getTargetLoweringInfo();
4494 GEPNoWrapFlags NW = cast<GEPOperator>(I).getNoWrapFlags();
4495
4496 // For a vector GEP, keep the prefix scalar as long as possible, then
4497 // convert any scalars encountered after the first vector operand to vectors.
4498 bool IsVectorGEP = I.getType()->isVectorTy();
4499 ElementCount VectorElementCount =
4500 IsVectorGEP ? cast<VectorType>(I.getType())->getElementCount()
4502
4504 GTI != E; ++GTI) {
4505 const Value *Idx = GTI.getOperand();
4506 if (StructType *StTy = GTI.getStructTypeOrNull()) {
4507 unsigned Field = cast<Constant>(Idx)->getUniqueInteger().getZExtValue();
4508 if (Field) {
4509 // N = N + Offset
4510 uint64_t Offset =
4511 DAG.getDataLayout().getStructLayout(StTy)->getElementOffset(Field);
4512
4513 // In an inbounds GEP with an offset that is nonnegative even when
4514 // interpreted as signed, assume there is no unsigned overflow.
4515 SDNodeFlags Flags;
4516 if (NW.hasNoUnsignedWrap() ||
4517 (int64_t(Offset) >= 0 && NW.hasNoUnsignedSignedWrap()))
4519 Flags.setInBounds(NW.isInBounds());
4520
4521 N = DAG.getMemBasePlusOffset(
4522 N, DAG.getConstant(Offset, dl, N.getValueType()), dl, Flags);
4523 }
4524 } else {
4525 // IdxSize is the width of the arithmetic according to IR semantics.
4526 // In SelectionDAG, we may prefer to do arithmetic in a wider bitwidth
4527 // (and fix up the result later).
4528 unsigned IdxSize = DAG.getDataLayout().getIndexSizeInBits(AS);
4529 MVT IdxTy = MVT::getIntegerVT(IdxSize);
4530 TypeSize ElementSize =
4531 GTI.getSequentialElementStride(DAG.getDataLayout());
4532 // We intentionally mask away the high bits here; ElementSize may not
4533 // fit in IdxTy.
4534 APInt ElementMul(IdxSize, ElementSize.getKnownMinValue(),
4535 /*isSigned=*/false, /*implicitTrunc=*/true);
4536 bool ElementScalable = ElementSize.isScalable();
4537
4538 // If this is a scalar constant or a splat vector of constants,
4539 // handle it quickly.
4540 const auto *C = dyn_cast<Constant>(Idx);
4541 if (C && isa<VectorType>(C->getType()))
4542 C = C->getSplatValue();
4543
4544 const auto *CI = dyn_cast_or_null<ConstantInt>(C);
4545 if (CI && CI->isZero())
4546 continue;
4547 if (CI && !ElementScalable) {
4548 APInt Offs = ElementMul * CI->getValue().sextOrTrunc(IdxSize);
4549 LLVMContext &Context = *DAG.getContext();
4550 SDValue OffsVal;
4551 if (N.getValueType().isVector())
4552 OffsVal = DAG.getConstant(
4553 Offs, dl, EVT::getVectorVT(Context, IdxTy, VectorElementCount));
4554 else
4555 OffsVal = DAG.getConstant(Offs, dl, IdxTy);
4556
4557 // In an inbounds GEP with an offset that is nonnegative even when
4558 // interpreted as signed, assume there is no unsigned overflow.
4559 SDNodeFlags Flags;
4560 if (NW.hasNoUnsignedWrap() ||
4561 (Offs.isNonNegative() && NW.hasNoUnsignedSignedWrap()))
4562 Flags.setNoUnsignedWrap(true);
4563 Flags.setInBounds(NW.isInBounds());
4564
4565 OffsVal = DAG.getSExtOrTrunc(OffsVal, dl, N.getValueType());
4566
4567 N = DAG.getMemBasePlusOffset(N, OffsVal, dl, Flags);
4568 continue;
4569 }
4570
4571 // N = N + Idx * ElementMul;
4572 SDValue IdxN = getValue(Idx);
4573
4574 if (IdxN.getValueType().isVector() != N.getValueType().isVector()) {
4575 if (N.getValueType().isVector()) {
4576 EVT VT = EVT::getVectorVT(*Context, IdxN.getValueType(),
4577 VectorElementCount);
4578 IdxN = DAG.getSplat(VT, dl, IdxN);
4579 } else {
4580 EVT VT =
4581 EVT::getVectorVT(*Context, N.getValueType(), VectorElementCount);
4582 N = DAG.getSplat(VT, dl, N);
4583 }
4584 }
4585
4586 // If the index is smaller or larger than intptr_t, truncate or extend
4587 // it.
4588 IdxN = DAG.getSExtOrTrunc(IdxN, dl, N.getValueType());
4589
4590 SDNodeFlags ScaleFlags;
4591 // The multiplication of an index by the type size does not wrap the
4592 // pointer index type in a signed sense (mul nsw).
4594
4595 // The multiplication of an index by the type size does not wrap the
4596 // pointer index type in an unsigned sense (mul nuw).
4597 ScaleFlags.setNoUnsignedWrap(NW.hasNoUnsignedWrap());
4598
4599 if (ElementScalable) {
4600 EVT VScaleTy = N.getValueType().getScalarType();
4601 SDValue VScale = DAG.getNode(
4602 ISD::VSCALE, dl, VScaleTy,
4603 DAG.getConstant(ElementMul.getZExtValue(), dl, VScaleTy));
4604 if (N.getValueType().isVector())
4605 VScale = DAG.getSplatVector(N.getValueType(), dl, VScale);
4606 IdxN = DAG.getNode(ISD::MUL, dl, N.getValueType(), IdxN, VScale,
4607 ScaleFlags);
4608 } else {
4609 // If this is a multiply by a power of two, turn it into a shl
4610 // immediately. This is a very common case.
4611 if (ElementMul != 1) {
4612 if (ElementMul.isPowerOf2()) {
4613 unsigned Amt = ElementMul.logBase2();
4614 IdxN = DAG.getNode(
4615 ISD::SHL, dl, N.getValueType(), IdxN,
4616 DAG.getShiftAmountConstant(Amt, N.getValueType(), dl),
4617 ScaleFlags);
4618 } else {
4619 SDValue Scale = DAG.getConstant(ElementMul.getZExtValue(), dl,
4620 IdxN.getValueType());
4621 IdxN = DAG.getNode(ISD::MUL, dl, N.getValueType(), IdxN, Scale,
4622 ScaleFlags);
4623 }
4624 }
4625 }
4626
4627 // The successive addition of the current address, truncated to the
4628 // pointer index type and interpreted as an unsigned number, and each
4629 // offset, also interpreted as an unsigned number, does not wrap the
4630 // pointer index type (add nuw).
4631 SDNodeFlags AddFlags;
4632 AddFlags.setNoUnsignedWrap(NW.hasNoUnsignedWrap());
4633 AddFlags.setInBounds(NW.isInBounds());
4634
4635 N = DAG.getMemBasePlusOffset(N, IdxN, dl, AddFlags);
4636 }
4637 }
4638
4639 if (IsVectorGEP && !N.getValueType().isVector()) {
4640 EVT VT = EVT::getVectorVT(*Context, N.getValueType(), VectorElementCount);
4641 N = DAG.getSplat(VT, dl, N);
4642 }
4643
4644 MVT PtrTy = TLI.getPointerTy(DAG.getDataLayout(), AS);
4645 MVT PtrMemTy = TLI.getPointerMemTy(DAG.getDataLayout(), AS);
4646 if (IsVectorGEP) {
4647 PtrTy = MVT::getVectorVT(PtrTy, VectorElementCount);
4648 PtrMemTy = MVT::getVectorVT(PtrMemTy, VectorElementCount);
4649 }
4650
4651 if (PtrMemTy != PtrTy && !cast<GEPOperator>(I).isInBounds())
4652 N = DAG.getPtrExtendInReg(N, dl, PtrMemTy);
4653
4654 setValue(&I, N);
4655}
4656
4657void SelectionDAGBuilder::visitAlloca(const AllocaInst &I) {
4658 // If this is a fixed sized alloca in the entry block of the function,
4659 // allocate it statically on the stack.
4660 if (FuncInfo.StaticAllocaMap.count(&I))
4661 return; // getValue will auto-populate this.
4662
4663 SDLoc dl = getCurSDLoc();
4664 Type *Ty = I.getAllocatedType();
4665 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4666 auto &DL = DAG.getDataLayout();
4667 TypeSize TySize = DL.getTypeAllocSize(Ty);
4668 MaybeAlign Alignment = I.getAlign();
4669
4670 SDValue AllocSize = getValue(I.getArraySize());
4671
4672 EVT IntPtr = TLI.getPointerTy(DL, I.getAddressSpace());
4673 if (AllocSize.getValueType() != IntPtr)
4674 AllocSize = DAG.getZExtOrTrunc(AllocSize, dl, IntPtr);
4675
4676 AllocSize = DAG.getNode(
4677 ISD::MUL, dl, IntPtr, AllocSize,
4678 DAG.getZExtOrTrunc(DAG.getTypeSize(dl, MVT::i64, TySize), dl, IntPtr));
4679
4680 // Handle alignment. If the requested alignment is less than or equal to
4681 // the stack alignment, ignore it. If the size is greater than or equal to
4682 // the stack alignment, we note this in the DYNAMIC_STACKALLOC node.
4683 Align StackAlign = DAG.getSubtarget().getFrameLowering()->getStackAlign();
4684 if (*Alignment <= StackAlign)
4685 Alignment = std::nullopt;
4686
4687 const uint64_t StackAlignMask = StackAlign.value() - 1U;
4688 // Round the size of the allocation up to the stack alignment size
4689 // by add SA-1 to the size. This doesn't overflow because we're computing
4690 // an address inside an alloca.
4691 AllocSize = DAG.getNode(ISD::ADD, dl, AllocSize.getValueType(), AllocSize,
4692 DAG.getConstant(StackAlignMask, dl, IntPtr),
4694
4695 // Mask out the low bits for alignment purposes.
4696 AllocSize = DAG.getNode(ISD::AND, dl, AllocSize.getValueType(), AllocSize,
4697 DAG.getSignedConstant(~StackAlignMask, dl, IntPtr));
4698
4699 SDValue Ops[] = {
4700 getRoot(), AllocSize,
4701 DAG.getConstant(Alignment ? Alignment->value() : 0, dl, IntPtr)};
4702 SDVTList VTs = DAG.getVTList(AllocSize.getValueType(), MVT::Other);
4703 SDValue DSA = DAG.getNode(ISD::DYNAMIC_STACKALLOC, dl, VTs, Ops);
4704 setValue(&I, DSA);
4705 DAG.setRoot(DSA.getValue(1));
4706
4707 assert(FuncInfo.MF->getFrameInfo().hasVarSizedObjects());
4708}
4709
4710static const MDNode *getRangeMetadata(const Instruction &I) {
4711 return I.getMetadata(LLVMContext::MD_range);
4712}
4713
4714static std::optional<ConstantRange> getRange(const Instruction &I) {
4715 if (const auto *CB = dyn_cast<CallBase>(&I))
4716 if (std::optional<ConstantRange> CR = CB->getRange())
4717 return CR;
4718 if (const MDNode *Range = getRangeMetadata(I))
4720 return std::nullopt;
4721}
4722
4724 if (const auto *CB = dyn_cast<CallBase>(&I))
4725 return CB->getRetNoFPClass();
4726 return fcNone;
4727}
4728
4729void SelectionDAGBuilder::visitLoad(const LoadInst &I) {
4730 if (I.isAtomic())
4731 return visitAtomicLoad(I);
4732
4733 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4734 const Value *SV = I.getOperand(0);
4735 if (TLI.supportSwiftError()) {
4736 // Swifterror values can come from either a function parameter with
4737 // swifterror attribute or an alloca with swifterror attribute.
4738 if (const Argument *Arg = dyn_cast<Argument>(SV)) {
4739 if (Arg->hasSwiftErrorAttr())
4740 return visitLoadFromSwiftError(I);
4741 }
4742
4743 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(SV)) {
4744 if (Alloca->isSwiftError())
4745 return visitLoadFromSwiftError(I);
4746 }
4747 }
4748
4749 SDValue Ptr = getValue(SV);
4750
4751 Type *Ty = I.getType();
4752 SmallVector<EVT, 4> ValueVTs, MemVTs;
4754 ComputeValueVTs(TLI, DAG.getDataLayout(), Ty, ValueVTs, &MemVTs, &Offsets);
4755 unsigned NumValues = ValueVTs.size();
4756 if (NumValues == 0)
4757 return;
4758
4759 Align Alignment = I.getAlign();
4760 AAMDNodes AAInfo = I.getAAMetadata();
4761 const MDNode *Ranges = getRangeMetadata(I);
4762 bool isVolatile = I.isVolatile();
4763 MachineMemOperand::Flags MMOFlags =
4764 TLI.getLoadMemOperandFlags(I, DAG.getDataLayout(), AC, LibInfo);
4765
4766 SDValue Root;
4767 bool ConstantMemory = false;
4768 if (isVolatile)
4769 // Serialize volatile loads with other side effects.
4770 Root = getRoot();
4771 else if (NumValues > MaxParallelChains)
4772 Root = getMemoryRoot();
4773 else if (BatchAA &&
4774 BatchAA->pointsToConstantMemory(MemoryLocation(
4775 SV,
4776 LocationSize::precise(DAG.getDataLayout().getTypeStoreSize(Ty)),
4777 AAInfo))) {
4778 // Do not serialize (non-volatile) loads of constant memory with anything.
4779 Root = DAG.getEntryNode();
4780 ConstantMemory = true;
4782 } else {
4783 // Do not serialize non-volatile loads against each other.
4784 Root = DAG.getRoot();
4785 }
4786
4787 SDLoc dl = getCurSDLoc();
4788
4789 if (isVolatile)
4790 Root = TLI.prepareVolatileOrAtomicLoad(Root, dl, DAG);
4791
4793 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4794
4795 unsigned ChainI = 0;
4796 for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
4797 // Serializing loads here may result in excessive register pressure, and
4798 // TokenFactor places arbitrary choke points on the scheduler. SD scheduling
4799 // could recover a bit by hoisting nodes upward in the chain by recognizing
4800 // they are side-effect free or do not alias. The optimizer should really
4801 // avoid this case by converting large object/array copies to llvm.memcpy
4802 // (MaxParallelChains should always remain as failsafe).
4803 if (ChainI == MaxParallelChains) {
4804 assert(PendingLoads.empty() && "PendingLoads must be serialized first");
4805 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4806 ArrayRef(Chains.data(), ChainI));
4807 Root = Chain;
4808 ChainI = 0;
4809 }
4810
4811 // TODO: MachinePointerInfo only supports a fixed length offset.
4812 MachinePointerInfo PtrInfo =
4813 !Offsets[i].isScalable() || Offsets[i].isZero()
4814 ? MachinePointerInfo(SV, Offsets[i].getKnownMinValue())
4815 : MachinePointerInfo();
4816
4817 SDValue A = DAG.getObjectPtrOffset(dl, Ptr, Offsets[i]);
4818 SDValue L = DAG.getLoad(MemVTs[i], dl, Root, A, PtrInfo, Alignment,
4819 MMOFlags, AAInfo, Ranges);
4820 Chains[ChainI] = L.getValue(1);
4821
4822 if (MemVTs[i] != ValueVTs[i])
4823 L = DAG.getPtrExtOrTrunc(L, dl, ValueVTs[i]);
4824
4825 if (MDNode *NoFPClassMD = I.getMetadata(LLVMContext::MD_nofpclass)) {
4826 uint64_t FPTestInt =
4827 cast<ConstantInt>(
4828 cast<ConstantAsMetadata>(NoFPClassMD->getOperand(0))->getValue())
4829 ->getZExtValue();
4830 if (FPTestInt != fcNone) {
4831 SDValue FPTestConst =
4832 DAG.getTargetConstant(FPTestInt, SDLoc(), MVT::i32);
4833 L = DAG.getNode(ISD::AssertNoFPClass, dl, L.getValueType(), L,
4834 FPTestConst);
4835 }
4836 }
4837 Values[i] = L;
4838 }
4839
4840 if (!ConstantMemory) {
4841 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4842 ArrayRef(Chains.data(), ChainI));
4843 if (isVolatile)
4844 DAG.setRoot(Chain);
4845 else
4846 PendingLoads.push_back(Chain);
4847 }
4848
4849 setValue(&I, DAG.getNode(ISD::MERGE_VALUES, dl,
4850 DAG.getVTList(ValueVTs), Values));
4851}
4852
4853void SelectionDAGBuilder::visitStoreToSwiftError(const StoreInst &I) {
4854 assert(DAG.getTargetLoweringInfo().supportSwiftError() &&
4855 "call visitStoreToSwiftError when backend supports swifterror");
4856
4857 SmallVector<EVT, 4> ValueVTs;
4858 SmallVector<uint64_t, 4> Offsets;
4859 const Value *SrcV = I.getOperand(0);
4860 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(),
4861 SrcV->getType(), ValueVTs, /*MemVTs=*/nullptr, &Offsets, 0);
4862 assert(ValueVTs.size() == 1 && Offsets[0] == 0 &&
4863 "expect a single EVT for swifterror");
4864
4865 SDValue Src = getValue(SrcV);
4866 // Create a virtual register, then update the virtual register.
4867 Register VReg =
4868 SwiftError.getOrCreateVRegDefAt(&I, FuncInfo.MBB, I.getPointerOperand());
4869 // Chain, DL, Reg, N or Chain, DL, Reg, N, Glue
4870 // Chain can be getRoot or getControlRoot.
4871 SDValue CopyNode = DAG.getCopyToReg(getRoot(), getCurSDLoc(), VReg,
4872 SDValue(Src.getNode(), Src.getResNo()));
4873 DAG.setRoot(CopyNode);
4874}
4875
4876void SelectionDAGBuilder::visitLoadFromSwiftError(const LoadInst &I) {
4877 assert(DAG.getTargetLoweringInfo().supportSwiftError() &&
4878 "call visitLoadFromSwiftError when backend supports swifterror");
4879
4880 assert(!I.isVolatile() &&
4881 !I.hasMetadata(LLVMContext::MD_nontemporal) &&
4882 !I.hasMetadata(LLVMContext::MD_invariant_load) &&
4883 "Support volatile, non temporal, invariant for load_from_swift_error");
4884
4885 const Value *SV = I.getOperand(0);
4886 Type *Ty = I.getType();
4887 assert(
4888 (!BatchAA ||
4889 !BatchAA->pointsToConstantMemory(MemoryLocation(
4890 SV, LocationSize::precise(DAG.getDataLayout().getTypeStoreSize(Ty)),
4891 I.getAAMetadata()))) &&
4892 "load_from_swift_error should not be constant memory");
4893
4894 SmallVector<EVT, 4> ValueVTs;
4895 SmallVector<uint64_t, 4> Offsets;
4896 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), Ty,
4897 ValueVTs, /*MemVTs=*/nullptr, &Offsets, 0);
4898 assert(ValueVTs.size() == 1 && Offsets[0] == 0 &&
4899 "expect a single EVT for swifterror");
4900
4901 // Chain, DL, Reg, VT, Glue or Chain, DL, Reg, VT
4902 SDValue L = DAG.getCopyFromReg(
4903 getRoot(), getCurSDLoc(),
4904 SwiftError.getOrCreateVRegUseAt(&I, FuncInfo.MBB, SV), ValueVTs[0]);
4905
4906 setValue(&I, L);
4907}
4908
4909void SelectionDAGBuilder::visitStore(const StoreInst &I) {
4910 if (I.isAtomic())
4911 return visitAtomicStore(I);
4912
4913 const Value *SrcV = I.getOperand(0);
4914 const Value *PtrV = I.getOperand(1);
4915
4916 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4917 if (TLI.supportSwiftError()) {
4918 // Swifterror values can come from either a function parameter with
4919 // swifterror attribute or an alloca with swifterror attribute.
4920 if (const Argument *Arg = dyn_cast<Argument>(PtrV)) {
4921 if (Arg->hasSwiftErrorAttr())
4922 return visitStoreToSwiftError(I);
4923 }
4924
4925 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(PtrV)) {
4926 if (Alloca->isSwiftError())
4927 return visitStoreToSwiftError(I);
4928 }
4929 }
4930
4931 SmallVector<EVT, 4> ValueVTs, MemVTs;
4933 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(),
4934 SrcV->getType(), ValueVTs, &MemVTs, &Offsets);
4935 unsigned NumValues = ValueVTs.size();
4936 if (NumValues == 0)
4937 return;
4938
4939 // Get the lowered operands. Note that we do this after
4940 // checking if NumResults is zero, because with zero results
4941 // the operands won't have values in the map.
4942 SDValue Src = getValue(SrcV);
4943 SDValue Ptr = getValue(PtrV);
4944
4945 SDValue Root = I.isVolatile() ? getRoot() : getMemoryRoot();
4946 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4947 SDLoc dl = getCurSDLoc();
4948 Align Alignment = I.getAlign();
4949 AAMDNodes AAInfo = I.getAAMetadata();
4950
4951 auto MMOFlags = TLI.getStoreMemOperandFlags(I, DAG.getDataLayout());
4952
4953 unsigned ChainI = 0;
4954 for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
4955 // See visitLoad comments.
4956 if (ChainI == MaxParallelChains) {
4957 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4958 ArrayRef(Chains.data(), ChainI));
4959 Root = Chain;
4960 ChainI = 0;
4961 }
4962
4963 // TODO: MachinePointerInfo only supports a fixed length offset.
4964 MachinePointerInfo PtrInfo =
4965 !Offsets[i].isScalable() || Offsets[i].isZero()
4966 ? MachinePointerInfo(PtrV, Offsets[i].getKnownMinValue())
4967 : MachinePointerInfo();
4968
4969 SDValue Add = DAG.getObjectPtrOffset(dl, Ptr, Offsets[i]);
4970 SDValue Val = SDValue(Src.getNode(), Src.getResNo() + i);
4971 if (MemVTs[i] != ValueVTs[i])
4972 Val = DAG.getPtrExtOrTrunc(Val, dl, MemVTs[i]);
4973 SDValue St =
4974 DAG.getStore(Root, dl, Val, Add, PtrInfo, Alignment, MMOFlags, AAInfo);
4975 Chains[ChainI] = St;
4976 }
4977
4978 SDValue StoreNode = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4979 ArrayRef(Chains.data(), ChainI));
4980 setValue(&I, StoreNode);
4981 DAG.setRoot(StoreNode);
4982}
4983
4984void SelectionDAGBuilder::visitMaskedStore(const CallInst &I,
4985 bool IsCompressing) {
4986 SDLoc sdl = getCurSDLoc();
4987
4988 Value *Src0Operand = I.getArgOperand(0);
4989 Value *PtrOperand = I.getArgOperand(1);
4990 Value *MaskOperand = I.getArgOperand(2);
4991 Align Alignment = I.getParamAlign(1).valueOrOne();
4992
4993 SDValue Ptr = getValue(PtrOperand);
4994 SDValue Src0 = getValue(Src0Operand);
4995 SDValue Mask = getValue(MaskOperand);
4996 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
4997
4998 EVT VT = Src0.getValueType();
4999
5000 auto MMOFlags = MachineMemOperand::MOStore;
5001 if (I.hasMetadata(LLVMContext::MD_nontemporal))
5003
5004 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5005 MachinePointerInfo(PtrOperand), MMOFlags,
5006 LocationSize::upperBound(VT.getStoreSize()), Alignment,
5007 I.getAAMetadata());
5008
5009 const auto &TLI = DAG.getTargetLoweringInfo();
5010
5011 SDValue StoreNode =
5012 !IsCompressing && TTI->hasConditionalLoadStoreForType(
5013 I.getArgOperand(0)->getType(), /*IsStore=*/true)
5014 ? TLI.visitMaskedStore(DAG, sdl, getMemoryRoot(), MMO, Ptr, Src0,
5015 Mask)
5016 : DAG.getMaskedStore(getMemoryRoot(), sdl, Src0, Ptr, Offset, Mask,
5017 VT, MMO, ISD::UNINDEXED, /*Truncating=*/false,
5018 IsCompressing);
5019 DAG.setRoot(StoreNode);
5020 setValue(&I, StoreNode);
5021}
5022
5023// Get a uniform base for the Gather/Scatter intrinsic.
5024// The first argument of the Gather/Scatter intrinsic is a vector of pointers.
5025// We try to represent it as a base pointer + vector of indices.
5026// Usually, the vector of pointers comes from a 'getelementptr' instruction.
5027// The first operand of the GEP may be a single pointer or a vector of pointers
5028// Example:
5029// %gep.ptr = getelementptr i32, <8 x i32*> %vptr, <8 x i32> %ind
5030// or
5031// %gep.ptr = getelementptr i32, i32* %ptr, <8 x i32> %ind
5032// %res = call <8 x i32> @llvm.masked.gather.v8i32(<8 x i32*> %gep.ptr, ..
5033//
5034// When the first GEP operand is a single pointer - it is the uniform base we
5035// are looking for. If first operand of the GEP is a splat vector - we
5036// extract the splat value and use it as a uniform base.
5037// In all other cases the function returns 'false'.
5038static bool getUniformBase(const Value *Ptr, SDValue &Base, SDValue &Index,
5039 SDValue &Scale, SelectionDAGBuilder *SDB,
5040 const BasicBlock *CurBB, uint64_t ElemSize) {
5041 SelectionDAG& DAG = SDB->DAG;
5042 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5043 const DataLayout &DL = DAG.getDataLayout();
5044
5045 assert(Ptr->getType()->isVectorTy() && "Unexpected pointer type");
5046
5047 // Handle splat constant pointer.
5048 if (auto *C = dyn_cast<Constant>(Ptr)) {
5049 C = C->getSplatValue();
5050 if (!C)
5051 return false;
5052
5053 Base = SDB->getValue(C);
5054
5055 ElementCount NumElts = cast<VectorType>(Ptr->getType())->getElementCount();
5056 EVT VT = EVT::getVectorVT(*DAG.getContext(), TLI.getPointerTy(DL), NumElts);
5057 Index = DAG.getConstant(0, SDB->getCurSDLoc(), VT);
5058 Scale = DAG.getTargetConstant(1, SDB->getCurSDLoc(), TLI.getPointerTy(DL));
5059 return true;
5060 }
5061
5063 if (!GEP || GEP->getParent() != CurBB)
5064 return false;
5065
5066 if (GEP->getNumOperands() != 2)
5067 return false;
5068
5069 const Value *BasePtr = GEP->getPointerOperand();
5070 const Value *IndexVal = GEP->getOperand(GEP->getNumOperands() - 1);
5071
5072 // Make sure the base is scalar and the index is a vector.
5073 if (BasePtr->getType()->isVectorTy() || !IndexVal->getType()->isVectorTy())
5074 return false;
5075
5076 TypeSize ScaleVal = DL.getTypeAllocSize(GEP->getResultElementType());
5077 if (ScaleVal.isScalable())
5078 return false;
5079
5080 // Target may not support the required addressing mode.
5081 if (ScaleVal != 1 &&
5082 !TLI.isLegalScaleForGatherScatter(ScaleVal.getFixedValue(), ElemSize))
5083 return false;
5084
5085 Base = SDB->getValue(BasePtr);
5086 Index = SDB->getValue(IndexVal);
5087
5088 Scale =
5089 DAG.getTargetConstant(ScaleVal, SDB->getCurSDLoc(), TLI.getPointerTy(DL));
5090 return true;
5091}
5092
5093void SelectionDAGBuilder::visitMaskedScatter(const CallInst &I) {
5094 SDLoc sdl = getCurSDLoc();
5095
5096 // llvm.masked.scatter.*(Src0, Ptrs, Mask)
5097 const Value *Ptr = I.getArgOperand(1);
5098 SDValue Src0 = getValue(I.getArgOperand(0));
5099 SDValue Mask = getValue(I.getArgOperand(2));
5100 EVT VT = Src0.getValueType();
5101 Align Alignment = I.getParamAlign(1).valueOrOne();
5102 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5103
5104 SDValue Base;
5105 SDValue Index;
5106 SDValue Scale;
5107 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
5108 I.getParent(), VT.getScalarStoreSize());
5109
5110 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
5111 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5112 MachinePointerInfo(AS), MachineMemOperand::MOStore,
5113 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata());
5114 if (!UniformBase) {
5115 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5116 Index = getValue(Ptr);
5117 Scale =
5118 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5119 }
5120
5121 EVT IdxVT = Index.getValueType();
5122 EVT EltTy = IdxVT.getVectorElementType();
5123 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
5124 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
5125 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
5126 }
5127
5128 SDValue Ops[] = { getMemoryRoot(), Src0, Mask, Base, Index, Scale };
5129 SDValue Scatter = DAG.getMaskedScatter(DAG.getVTList(MVT::Other), VT, sdl,
5130 Ops, MMO, ISD::SIGNED_SCALED, false);
5131 DAG.setRoot(Scatter);
5132 setValue(&I, Scatter);
5133}
5134
5135void SelectionDAGBuilder::visitMaskedLoad(const CallInst &I, bool IsExpanding) {
5136 SDLoc sdl = getCurSDLoc();
5137
5138 Value *PtrOperand = I.getArgOperand(0);
5139 Value *MaskOperand = I.getArgOperand(1);
5140 Value *Src0Operand = I.getArgOperand(2);
5141 Align Alignment = I.getParamAlign(0).valueOrOne();
5142
5143 SDValue Ptr = getValue(PtrOperand);
5144 SDValue Src0 = getValue(Src0Operand);
5145 SDValue Mask = getValue(MaskOperand);
5146 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
5147
5148 EVT VT = Src0.getValueType();
5149 AAMDNodes AAInfo = I.getAAMetadata();
5150 const MDNode *Ranges = getRangeMetadata(I);
5151
5152 // Do not serialize masked loads of constant memory with anything.
5153 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
5154 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
5155
5156 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
5157
5158 auto MMOFlags = MachineMemOperand::MOLoad;
5159 if (I.hasMetadata(LLVMContext::MD_nontemporal))
5161 if (I.hasMetadata(LLVMContext::MD_invariant_load))
5163
5164 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5165 MachinePointerInfo(PtrOperand), MMOFlags,
5166 LocationSize::upperBound(VT.getStoreSize()), Alignment, AAInfo, Ranges);
5167
5168 const auto &TLI = DAG.getTargetLoweringInfo();
5169
5170 // The Load/Res may point to different values and both of them are output
5171 // variables.
5172 SDValue Load;
5173 SDValue Res;
5174 if (!IsExpanding &&
5175 TTI->hasConditionalLoadStoreForType(Src0Operand->getType(),
5176 /*IsStore=*/false))
5177 Res = TLI.visitMaskedLoad(DAG, sdl, InChain, MMO, Load, Ptr, Src0, Mask);
5178 else
5179 Res = Load =
5180 DAG.getMaskedLoad(VT, sdl, InChain, Ptr, Offset, Mask, Src0, VT, MMO,
5181 ISD::UNINDEXED, ISD::NON_EXTLOAD, IsExpanding);
5182 if (AddToChain)
5183 PendingLoads.push_back(Load.getValue(1));
5184 setValue(&I, Res);
5185}
5186
5187void SelectionDAGBuilder::visitMaskedGather(const CallInst &I) {
5188 SDLoc sdl = getCurSDLoc();
5189
5190 // @llvm.masked.gather.*(Ptrs, Mask, Src0)
5191 const Value *Ptr = I.getArgOperand(0);
5192 SDValue Src0 = getValue(I.getArgOperand(2));
5193 SDValue Mask = getValue(I.getArgOperand(1));
5194
5195 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5196 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
5197 Align Alignment = I.getParamAlign(0).valueOrOne();
5198
5199 const MDNode *Ranges = getRangeMetadata(I);
5200
5201 SDValue Root = DAG.getRoot();
5202 SDValue Base;
5203 SDValue Index;
5204 SDValue Scale;
5205 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
5206 I.getParent(), VT.getScalarStoreSize());
5207 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
5208 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5209 MachinePointerInfo(AS), MachineMemOperand::MOLoad,
5210 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata(),
5211 Ranges);
5212
5213 if (!UniformBase) {
5214 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5215 Index = getValue(Ptr);
5216 Scale =
5217 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5218 }
5219
5220 EVT IdxVT = Index.getValueType();
5221 EVT EltTy = IdxVT.getVectorElementType();
5222 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
5223 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
5224 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
5225 }
5226
5227 SDValue Ops[] = { Root, Src0, Mask, Base, Index, Scale };
5228 SDValue Gather =
5229 DAG.getMaskedGather(DAG.getVTList(VT, MVT::Other), VT, sdl, Ops, MMO,
5231
5232 PendingLoads.push_back(Gather.getValue(1));
5233 setValue(&I, Gather);
5234}
5235
5236void SelectionDAGBuilder::visitAtomicCmpXchg(const AtomicCmpXchgInst &I) {
5237 SDLoc dl = getCurSDLoc();
5238 AtomicOrdering SuccessOrdering = I.getSuccessOrdering();
5239 AtomicOrdering FailureOrdering = I.getFailureOrdering();
5240 SyncScope::ID SSID = I.getSyncScopeID();
5241
5242 SDValue InChain = getRoot();
5243
5244 MVT MemVT = getValue(I.getCompareOperand()).getSimpleValueType();
5245 SDVTList VTs = DAG.getVTList(MemVT, MVT::i1, MVT::Other);
5246
5247 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5248 auto Flags = TLI.getAtomicMemOperandFlags(I, DAG.getDataLayout());
5249
5250 MachineFunction &MF = DAG.getMachineFunction();
5251 MachineMemOperand *MMO =
5252 MF.getMachineMemOperand(MachinePointerInfo(I.getPointerOperand()), Flags,
5253 MemVT.getStoreSize(), I.getAlign(), AAMDNodes(),
5254 nullptr, SSID, SuccessOrdering, FailureOrdering);
5255
5257 dl, MemVT, VTs, InChain,
5258 getValue(I.getPointerOperand()),
5259 getValue(I.getCompareOperand()),
5260 getValue(I.getNewValOperand()), MMO);
5261
5262 SDValue OutChain = L.getValue(2);
5263
5264 setValue(&I, L);
5265 DAG.setRoot(OutChain);
5266}
5267
5268void SelectionDAGBuilder::visitAtomicRMW(const AtomicRMWInst &I) {
5269 SDLoc dl = getCurSDLoc();
5271 switch (I.getOperation()) {
5272 default: llvm_unreachable("Unknown atomicrmw operation");
5290 break;
5293 break;
5296 break;
5299 break;
5302 break;
5305 break;
5308 break;
5311 break;
5312 }
5313 AtomicOrdering Ordering = I.getOrdering();
5314 SyncScope::ID SSID = I.getSyncScopeID();
5315
5316 SDValue InChain = getRoot();
5317
5318 auto MemVT = getValue(I.getValOperand()).getSimpleValueType();
5319 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5320 auto Flags = TLI.getAtomicMemOperandFlags(I, DAG.getDataLayout());
5321
5322 MachineFunction &MF = DAG.getMachineFunction();
5323 MachineMemOperand *MMO = MF.getMachineMemOperand(
5324 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5325 I.getAlign(), AAMDNodes(), nullptr, SSID, Ordering);
5326
5327 SDValue L =
5328 DAG.getAtomic(NT, dl, MemVT, InChain,
5329 getValue(I.getPointerOperand()), getValue(I.getValOperand()),
5330 MMO);
5331
5332 SDValue OutChain = L.getValue(1);
5333
5334 setValue(&I, L);
5335 DAG.setRoot(OutChain);
5336}
5337
5338void SelectionDAGBuilder::visitFence(const FenceInst &I) {
5339 SDLoc dl = getCurSDLoc();
5340 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5341 SDValue Ops[3];
5342 Ops[0] = getRoot();
5343 Ops[1] = DAG.getTargetConstant((unsigned)I.getOrdering(), dl,
5344 TLI.getFenceOperandTy(DAG.getDataLayout()));
5345 Ops[2] = DAG.getTargetConstant(I.getSyncScopeID(), dl,
5346 TLI.getFenceOperandTy(DAG.getDataLayout()));
5347 SDValue N = DAG.getNode(ISD::ATOMIC_FENCE, dl, MVT::Other, Ops);
5348 setValue(&I, N);
5349 DAG.setRoot(N);
5350}
5351
5352void SelectionDAGBuilder::visitAtomicLoad(const LoadInst &I) {
5353 SDLoc dl = getCurSDLoc();
5354 AtomicOrdering Order = I.getOrdering();
5355 SyncScope::ID SSID = I.getSyncScopeID();
5356
5357 SDValue InChain = getRoot();
5358
5359 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5360 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
5361 EVT MemVT = TLI.getMemValueType(DAG.getDataLayout(), I.getType());
5362
5363 if (!TLI.supportsUnalignedAtomics() &&
5364 I.getAlign().value() < MemVT.getSizeInBits() / 8)
5365 report_fatal_error("Cannot generate unaligned atomic load");
5366
5367 auto Flags = TLI.getLoadMemOperandFlags(I, DAG.getDataLayout(), AC, LibInfo);
5368
5369 const MDNode *Ranges = getRangeMetadata(I);
5370 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5371 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5372 I.getAlign(), AAMDNodes(), Ranges, SSID, Order);
5373
5374 InChain = TLI.prepareVolatileOrAtomicLoad(InChain, dl, DAG);
5375
5376 SDValue Ptr = getValue(I.getPointerOperand());
5377 SDValue L =
5378 DAG.getAtomicLoad(ISD::NON_EXTLOAD, dl, MemVT, MemVT, InChain, Ptr, MMO);
5379
5380 SDValue OutChain = L.getValue(1);
5381 if (MemVT != VT)
5382 L = DAG.getPtrExtOrTrunc(L, dl, VT);
5383
5384 setValue(&I, L);
5385 DAG.setRoot(OutChain);
5386}
5387
5388void SelectionDAGBuilder::visitAtomicStore(const StoreInst &I) {
5389 SDLoc dl = getCurSDLoc();
5390
5391 AtomicOrdering Ordering = I.getOrdering();
5392 SyncScope::ID SSID = I.getSyncScopeID();
5393
5394 SDValue InChain = getRoot();
5395
5396 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5397 EVT MemVT =
5398 TLI.getMemValueType(DAG.getDataLayout(), I.getValueOperand()->getType());
5399
5400 if (!TLI.supportsUnalignedAtomics() &&
5401 I.getAlign().value() < MemVT.getSizeInBits() / 8)
5402 report_fatal_error("Cannot generate unaligned atomic store");
5403
5404 auto Flags = TLI.getStoreMemOperandFlags(I, DAG.getDataLayout());
5405
5406 MachineFunction &MF = DAG.getMachineFunction();
5407 MachineMemOperand *MMO = MF.getMachineMemOperand(
5408 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5409 I.getAlign(), AAMDNodes(), nullptr, SSID, Ordering);
5410
5411 SDValue Val = getValue(I.getValueOperand());
5412 if (Val.getValueType() != MemVT)
5413 Val = DAG.getPtrExtOrTrunc(Val, dl, MemVT);
5414 SDValue Ptr = getValue(I.getPointerOperand());
5415
5416 SDValue OutChain =
5417 DAG.getAtomic(ISD::ATOMIC_STORE, dl, MemVT, InChain, Val, Ptr, MMO);
5418
5419 setValue(&I, OutChain);
5420 DAG.setRoot(OutChain);
5421}
5422
5423/// Check if this intrinsic call depends on the chain (1st return value)
5424/// and if it only *loads* memory.
5425/// Ignore the callsite's attributes. A specific call site may be marked with
5426/// readnone, but the lowering code will expect the chain based on the
5427/// definition.
5428std::pair<bool, bool>
5429SelectionDAGBuilder::getTargetIntrinsicCallProperties(const CallBase &I) {
5430 const Function *F = I.getCalledFunction();
5431 bool HasChain = !F->doesNotAccessMemory();
5432 bool OnlyLoad =
5433 HasChain && F->onlyReadsMemory() && F->willReturn() && F->doesNotThrow();
5434
5435 return {HasChain, OnlyLoad};
5436}
5437
5438SmallVector<SDValue, 8> SelectionDAGBuilder::getTargetIntrinsicOperands(
5439 const CallBase &I, bool HasChain, bool OnlyLoad,
5440 TargetLowering::IntrinsicInfo *TgtMemIntrinsicInfo) {
5441 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5442
5443 // Build the operand list.
5445 if (HasChain) { // If this intrinsic has side-effects, chainify it.
5446 if (OnlyLoad) {
5447 // We don't need to serialize loads against other loads.
5448 Ops.push_back(DAG.getRoot());
5449 } else {
5450 Ops.push_back(getRoot());
5451 }
5452 }
5453
5454 // Add the intrinsic ID as an integer operand if it's not a target intrinsic.
5455 if (!TgtMemIntrinsicInfo || TgtMemIntrinsicInfo->opc == ISD::INTRINSIC_VOID ||
5456 TgtMemIntrinsicInfo->opc == ISD::INTRINSIC_W_CHAIN)
5457 Ops.push_back(DAG.getTargetConstant(I.getIntrinsicID(), getCurSDLoc(),
5458 TLI.getPointerTy(DAG.getDataLayout())));
5459
5460 // Add all operands of the call to the operand list.
5461 for (unsigned i = 0, e = I.arg_size(); i != e; ++i) {
5462 const Value *Arg = I.getArgOperand(i);
5463 if (!I.paramHasAttr(i, Attribute::ImmArg)) {
5464 Ops.push_back(getValue(Arg));
5465 continue;
5466 }
5467
5468 // Use TargetConstant instead of a regular constant for immarg.
5469 EVT VT = TLI.getValueType(DAG.getDataLayout(), Arg->getType(), true);
5470 if (const ConstantInt *CI = dyn_cast<ConstantInt>(Arg)) {
5471 assert(CI->getBitWidth() <= 64 &&
5472 "large intrinsic immediates not handled");
5473 Ops.push_back(DAG.getTargetConstant(*CI, SDLoc(), VT));
5474 } else {
5475 Ops.push_back(
5476 DAG.getTargetConstantFP(*cast<ConstantFP>(Arg), SDLoc(), VT));
5477 }
5478 }
5479
5480 if (std::optional<OperandBundleUse> Bundle =
5481 I.getOperandBundle(LLVMContext::OB_deactivation_symbol)) {
5482 auto *Sym = Bundle->Inputs[0].get();
5483 SDValue SDSym = getValue(Sym);
5484 SDSym = DAG.getDeactivationSymbol(cast<GlobalValue>(Sym));
5485 Ops.push_back(SDSym);
5486 }
5487
5488 if (std::optional<OperandBundleUse> Bundle =
5489 I.getOperandBundle(LLVMContext::OB_convergencectrl)) {
5490 Value *Token = Bundle->Inputs[0].get();
5491 SDValue ConvControlToken = getValue(Token);
5492 assert(Ops.back().getValueType() != MVT::Glue &&
5493 "Did not expect another glue node here.");
5494 ConvControlToken =
5495 DAG.getNode(ISD::CONVERGENCECTRL_GLUE, {}, MVT::Glue, ConvControlToken);
5496 Ops.push_back(ConvControlToken);
5497 }
5498
5499 return Ops;
5500}
5501
5502SDVTList SelectionDAGBuilder::getTargetIntrinsicVTList(const CallBase &I,
5503 bool HasChain) {
5504 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5505
5506 SmallVector<EVT, 4> ValueVTs;
5507 ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);
5508
5509 if (HasChain)
5510 ValueVTs.push_back(MVT::Other);
5511
5512 return DAG.getVTList(ValueVTs);
5513}
5514
5515/// Get an INTRINSIC node for a target intrinsic which does not touch memory.
5516SDValue SelectionDAGBuilder::getTargetNonMemIntrinsicNode(
5517 const Type &IntrinsicVT, bool HasChain, ArrayRef<SDValue> Ops,
5518 const SDVTList &VTs) {
5519 if (!HasChain)
5520 return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, getCurSDLoc(), VTs, Ops);
5521 if (!IntrinsicVT.isVoidTy())
5522 return DAG.getNode(ISD::INTRINSIC_W_CHAIN, getCurSDLoc(), VTs, Ops);
5523 return DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops);
5524}
5525
5526/// Set root, convert return type if necessary and check alignment.
5527SDValue SelectionDAGBuilder::handleTargetIntrinsicRet(const CallBase &I,
5528 bool HasChain,
5529 bool OnlyLoad,
5530 SDValue Result) {
5531 if (HasChain) {
5532 SDValue Chain = Result.getValue(Result.getNode()->getNumValues() - 1);
5533 if (OnlyLoad)
5534 PendingLoads.push_back(Chain);
5535 else
5536 DAG.setRoot(Chain);
5537 }
5538
5539 if (I.getType()->isVoidTy())
5540 return Result;
5541
5542 if (MaybeAlign Alignment = I.getRetAlign(); InsertAssertAlign && Alignment) {
5543 // Insert `assertalign` node if there's an alignment.
5544 Result = DAG.getAssertAlign(getCurSDLoc(), Result, Alignment.valueOrOne());
5545 } else if (!isa<VectorType>(I.getType())) {
5546 Result = lowerRangeToAssertZExt(DAG, I, Result);
5547 }
5548
5549 return Result;
5550}
5551
5552/// visitTargetIntrinsic - Lower a call of a target intrinsic to an INTRINSIC
5553/// node.
5554void SelectionDAGBuilder::visitTargetIntrinsic(const CallInst &I,
5555 unsigned Intrinsic) {
5556 auto [HasChain, OnlyLoad] = getTargetIntrinsicCallProperties(I);
5557 Intrinsic::ID IntrinsicID = static_cast<Intrinsic::ID>(Intrinsic);
5558
5559 if (!DAG.getMachineFunction().getSubtarget().isIntrinsicSupported(
5560 Intrinsic)) {
5561 SDLoc DL = getCurSDLoc();
5562 DAG.getContext()->diagnose(DiagnosticInfoUnsupportedTargetIntrinsic(
5563 *I.getFunction(), IntrinsicID, DL.getDebugLoc()));
5564
5565 // The intrinsic is not available on this subtarget. Preserve the chain for
5566 // side-effecting intrinsics and lower any result to poison so that
5567 // compilation can continue and collect further diagnostics.
5568 if (HasChain && !OnlyLoad)
5569 DAG.setRoot(getRoot());
5570
5572 return;
5573 }
5574
5575 // Infos is set by getTgtMemIntrinsic.
5577 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5578 TLI.getTgtMemIntrinsic(Infos, I, DAG.getMachineFunction(), Intrinsic);
5579 // Use the first (primary) info determines the node opcode.
5580 TargetLowering::IntrinsicInfo *Info = !Infos.empty() ? &Infos[0] : nullptr;
5581
5583 getTargetIntrinsicOperands(I, HasChain, OnlyLoad, Info);
5584 SDVTList VTs = getTargetIntrinsicVTList(I, HasChain);
5585
5586 // Propagate fast-math-flags from IR to node(s).
5587 SDNodeFlags Flags;
5588 if (auto *FPMO = dyn_cast<FPMathOperator>(&I))
5589 Flags.copyFMF(*FPMO);
5590 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
5591
5592 // Create the node.
5594
5595 // In some cases, custom collection of operands from CallInst I may be needed.
5597 if (!Infos.empty()) {
5598 // This is target intrinsic that touches memory
5599 // Create MachineMemOperands for each memory access described by the target.
5600 MachineFunction &MF = DAG.getMachineFunction();
5602 for (const auto &Info : Infos) {
5603 // TODO: We currently just fallback to address space 0 if
5604 // getTgtMemIntrinsic didn't yield anything useful.
5605 MachinePointerInfo MPI;
5606 if (Info.ptrVal)
5607 MPI = MachinePointerInfo(Info.ptrVal, Info.offset);
5608 else if (Info.fallbackAddressSpace)
5609 MPI = MachinePointerInfo(*Info.fallbackAddressSpace);
5610 EVT MemVT = Info.memVT;
5611 LocationSize Size = LocationSize::precise(Info.size);
5612 if (Size.hasValue() && !Size.getValue())
5614 Align Alignment = Info.align.value_or(DAG.getEVTAlign(MemVT));
5615 MachineMemOperand *MMO = MF.getMachineMemOperand(
5616 MPI, Info.flags, Size, Alignment, I.getAAMetadata(),
5617 /*Ranges=*/nullptr, Info.ssid, Info.order, Info.failureOrder);
5618 MMOs.push_back(MMO);
5619 }
5620
5621 Result = DAG.getMemIntrinsicNode(Info->opc, getCurSDLoc(), VTs, Ops,
5622 Info->memVT, MMOs);
5623 } else {
5624 Result = getTargetNonMemIntrinsicNode(*I.getType(), HasChain, Ops, VTs);
5625 }
5626
5627 Result = handleTargetIntrinsicRet(I, HasChain, OnlyLoad, Result);
5628
5629 setValue(&I, Result);
5630}
5631
5632/// GetSignificand - Get the significand and build it into a floating-point
5633/// number with exponent of 1:
5634///
5635/// Op = (Op & 0x007fffff) | 0x3f800000;
5636///
5637/// where Op is the hexadecimal representation of floating point value.
5639 SDValue t1 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
5640 DAG.getConstant(0x007fffff, dl, MVT::i32));
5641 SDValue t2 = DAG.getNode(ISD::OR, dl, MVT::i32, t1,
5642 DAG.getConstant(0x3f800000, dl, MVT::i32));
5643 return DAG.getNode(ISD::BITCAST, dl, MVT::f32, t2);
5644}
5645
5646/// GetExponent - Get the exponent:
5647///
5648/// (float)(int)(((Op & 0x7f800000) >> 23) - 127);
5649///
5650/// where Op is the hexadecimal representation of floating point value.
5652 const TargetLowering &TLI, const SDLoc &dl) {
5653 SDValue t0 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
5654 DAG.getConstant(0x7f800000, dl, MVT::i32));
5655 SDValue t1 = DAG.getNode(ISD::SRL, dl, MVT::i32, t0,
5656 DAG.getShiftAmountConstant(23, MVT::i32, dl));
5657 SDValue t2 = DAG.getNode(ISD::SUB, dl, MVT::i32, t1,
5658 DAG.getConstant(127, dl, MVT::i32));
5659 return DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, t2);
5660}
5661
5662/// getF32Constant - Get 32-bit floating point constant.
5663static SDValue getF32Constant(SelectionDAG &DAG, unsigned Flt,
5664 const SDLoc &dl) {
5665 return DAG.getConstantFP(APFloat(APFloat::IEEEsingle(), APInt(32, Flt)), dl,
5666 MVT::f32);
5667}
5668
5670 SelectionDAG &DAG) {
5671 // TODO: What fast-math-flags should be set on the floating-point nodes?
5672
5673 // IntegerPartOfX = ((int32_t)(t0);
5674 SDValue IntegerPartOfX = DAG.getNode(ISD::FP_TO_SINT, dl, MVT::i32, t0);
5675
5676 // FractionalPartOfX = t0 - (float)IntegerPartOfX;
5677 SDValue t1 = DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, IntegerPartOfX);
5678 SDValue X = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0, t1);
5679
5680 // IntegerPartOfX <<= 23;
5681 IntegerPartOfX = DAG.getNode(ISD::SHL, dl, MVT::i32, IntegerPartOfX,
5682 DAG.getShiftAmountConstant(23, MVT::i32, dl));
5683
5684 SDValue TwoToFractionalPartOfX;
5685 if (LimitFloatPrecision <= 6) {
5686 // For floating-point precision of 6:
5687 //
5688 // TwoToFractionalPartOfX =
5689 // 0.997535578f +
5690 // (0.735607626f + 0.252464424f * x) * x;
5691 //
5692 // error 0.0144103317, which is 6 bits
5693 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5694 getF32Constant(DAG, 0x3e814304, dl));
5695 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5696 getF32Constant(DAG, 0x3f3c50c8, dl));
5697 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5698 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5699 getF32Constant(DAG, 0x3f7f5e7e, dl));
5700 } else if (LimitFloatPrecision <= 12) {
5701 // For floating-point precision of 12:
5702 //
5703 // TwoToFractionalPartOfX =
5704 // 0.999892986f +
5705 // (0.696457318f +
5706 // (0.224338339f + 0.792043434e-1f * x) * x) * x;
5707 //
5708 // error 0.000107046256, which is 13 to 14 bits
5709 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5710 getF32Constant(DAG, 0x3da235e3, dl));
5711 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5712 getF32Constant(DAG, 0x3e65b8f3, dl));
5713 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5714 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5715 getF32Constant(DAG, 0x3f324b07, dl));
5716 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5717 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5718 getF32Constant(DAG, 0x3f7ff8fd, dl));
5719 } else { // LimitFloatPrecision <= 18
5720 // For floating-point precision of 18:
5721 //
5722 // TwoToFractionalPartOfX =
5723 // 0.999999982f +
5724 // (0.693148872f +
5725 // (0.240227044f +
5726 // (0.554906021e-1f +
5727 // (0.961591928e-2f +
5728 // (0.136028312e-2f + 0.157059148e-3f *x)*x)*x)*x)*x)*x;
5729 // error 2.47208000*10^(-7), which is better than 18 bits
5730 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5731 getF32Constant(DAG, 0x3924b03e, dl));
5732 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5733 getF32Constant(DAG, 0x3ab24b87, dl));
5734 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5735 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5736 getF32Constant(DAG, 0x3c1d8c17, dl));
5737 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5738 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5739 getF32Constant(DAG, 0x3d634a1d, dl));
5740 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5741 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5742 getF32Constant(DAG, 0x3e75fe14, dl));
5743 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5744 SDValue t11 = DAG.getNode(ISD::FADD, dl, MVT::f32, t10,
5745 getF32Constant(DAG, 0x3f317234, dl));
5746 SDValue t12 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t11, X);
5747 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t12,
5748 getF32Constant(DAG, 0x3f800000, dl));
5749 }
5750
5751 // Add the exponent into the result in integer domain.
5752 SDValue t13 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, TwoToFractionalPartOfX);
5753 return DAG.getNode(ISD::BITCAST, dl, MVT::f32,
5754 DAG.getNode(ISD::ADD, dl, MVT::i32, t13, IntegerPartOfX));
5755}
5756
5757/// expandExp - Lower an exp intrinsic. Handles the special sequences for
5758/// limited-precision mode.
5760 const TargetLowering &TLI, SDNodeFlags Flags) {
5761 if (Op.getValueType() == MVT::f32 &&
5763
5764 // Put the exponent in the right bit position for later addition to the
5765 // final result:
5766 //
5767 // t0 = Op * log2(e)
5768
5769 // TODO: What fast-math-flags should be set here?
5770 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, Op,
5771 DAG.getConstantFP(numbers::log2ef, dl, MVT::f32));
5772 return getLimitedPrecisionExp2(t0, dl, DAG);
5773 }
5774
5775 // No special expansion.
5776 return DAG.getNode(ISD::FEXP, dl, Op.getValueType(), Op, Flags);
5777}
5778
5779/// expandLog - Lower a log intrinsic. Handles the special sequences for
5780/// limited-precision mode.
5782 const TargetLowering &TLI, SDNodeFlags Flags) {
5783 // TODO: What fast-math-flags should be set on the floating-point nodes?
5784
5785 if (Op.getValueType() == MVT::f32 &&
5787 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5788
5789 // Scale the exponent by log(2).
5790 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5791 SDValue LogOfExponent =
5792 DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5793 DAG.getConstantFP(numbers::ln2f, dl, MVT::f32));
5794
5795 // Get the significand and build it into a floating-point number with
5796 // exponent of 1.
5797 SDValue X = GetSignificand(DAG, Op1, dl);
5798
5799 SDValue LogOfMantissa;
5800 if (LimitFloatPrecision <= 6) {
5801 // For floating-point precision of 6:
5802 //
5803 // LogofMantissa =
5804 // -1.1609546f +
5805 // (1.4034025f - 0.23903021f * x) * x;
5806 //
5807 // error 0.0034276066, which is better than 8 bits
5808 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5809 getF32Constant(DAG, 0xbe74c456, dl));
5810 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5811 getF32Constant(DAG, 0x3fb3a2b1, dl));
5812 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5813 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5814 getF32Constant(DAG, 0x3f949a29, dl));
5815 } else if (LimitFloatPrecision <= 12) {
5816 // For floating-point precision of 12:
5817 //
5818 // LogOfMantissa =
5819 // -1.7417939f +
5820 // (2.8212026f +
5821 // (-1.4699568f +
5822 // (0.44717955f - 0.56570851e-1f * x) * x) * x) * x;
5823 //
5824 // error 0.000061011436, which is 14 bits
5825 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5826 getF32Constant(DAG, 0xbd67b6d6, dl));
5827 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5828 getF32Constant(DAG, 0x3ee4f4b8, dl));
5829 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5830 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5831 getF32Constant(DAG, 0x3fbc278b, dl));
5832 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5833 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5834 getF32Constant(DAG, 0x40348e95, dl));
5835 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5836 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5837 getF32Constant(DAG, 0x3fdef31a, dl));
5838 } else { // LimitFloatPrecision <= 18
5839 // For floating-point precision of 18:
5840 //
5841 // LogOfMantissa =
5842 // -2.1072184f +
5843 // (4.2372794f +
5844 // (-3.7029485f +
5845 // (2.2781945f +
5846 // (-0.87823314f +
5847 // (0.19073739f - 0.17809712e-1f * x) * x) * x) * x) * x)*x;
5848 //
5849 // error 0.0000023660568, which is better than 18 bits
5850 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5851 getF32Constant(DAG, 0xbc91e5ac, dl));
5852 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5853 getF32Constant(DAG, 0x3e4350aa, dl));
5854 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5855 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5856 getF32Constant(DAG, 0x3f60d3e3, dl));
5857 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5858 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5859 getF32Constant(DAG, 0x4011cdf0, dl));
5860 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5861 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5862 getF32Constant(DAG, 0x406cfd1c, dl));
5863 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5864 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5865 getF32Constant(DAG, 0x408797cb, dl));
5866 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5867 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t10,
5868 getF32Constant(DAG, 0x4006dcab, dl));
5869 }
5870
5871 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, LogOfMantissa);
5872 }
5873
5874 // No special expansion.
5875 return DAG.getNode(ISD::FLOG, dl, Op.getValueType(), Op, Flags);
5876}
5877
5878/// expandLog2 - Lower a log2 intrinsic. Handles the special sequences for
5879/// limited-precision mode.
5881 const TargetLowering &TLI, SDNodeFlags Flags) {
5882 // TODO: What fast-math-flags should be set on the floating-point nodes?
5883
5884 if (Op.getValueType() == MVT::f32 &&
5886 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5887
5888 // Get the exponent.
5889 SDValue LogOfExponent = GetExponent(DAG, Op1, TLI, dl);
5890
5891 // Get the significand and build it into a floating-point number with
5892 // exponent of 1.
5893 SDValue X = GetSignificand(DAG, Op1, dl);
5894
5895 // Different possible minimax approximations of significand in
5896 // floating-point for various degrees of accuracy over [1,2].
5897 SDValue Log2ofMantissa;
5898 if (LimitFloatPrecision <= 6) {
5899 // For floating-point precision of 6:
5900 //
5901 // Log2ofMantissa = -1.6749035f + (2.0246817f - .34484768f * x) * x;
5902 //
5903 // error 0.0049451742, which is more than 7 bits
5904 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5905 getF32Constant(DAG, 0xbeb08fe0, dl));
5906 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5907 getF32Constant(DAG, 0x40019463, dl));
5908 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5909 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5910 getF32Constant(DAG, 0x3fd6633d, dl));
5911 } else if (LimitFloatPrecision <= 12) {
5912 // For floating-point precision of 12:
5913 //
5914 // Log2ofMantissa =
5915 // -2.51285454f +
5916 // (4.07009056f +
5917 // (-2.12067489f +
5918 // (.645142248f - 0.816157886e-1f * x) * x) * x) * x;
5919 //
5920 // error 0.0000876136000, which is better than 13 bits
5921 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5922 getF32Constant(DAG, 0xbda7262e, dl));
5923 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5924 getF32Constant(DAG, 0x3f25280b, dl));
5925 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5926 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5927 getF32Constant(DAG, 0x4007b923, dl));
5928 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5929 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5930 getF32Constant(DAG, 0x40823e2f, dl));
5931 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5932 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5933 getF32Constant(DAG, 0x4020d29c, dl));
5934 } else { // LimitFloatPrecision <= 18
5935 // For floating-point precision of 18:
5936 //
5937 // Log2ofMantissa =
5938 // -3.0400495f +
5939 // (6.1129976f +
5940 // (-5.3420409f +
5941 // (3.2865683f +
5942 // (-1.2669343f +
5943 // (0.27515199f -
5944 // 0.25691327e-1f * x) * x) * x) * x) * x) * x;
5945 //
5946 // error 0.0000018516, which is better than 18 bits
5947 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5948 getF32Constant(DAG, 0xbcd2769e, dl));
5949 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5950 getF32Constant(DAG, 0x3e8ce0b9, dl));
5951 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5952 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5953 getF32Constant(DAG, 0x3fa22ae7, dl));
5954 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5955 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5956 getF32Constant(DAG, 0x40525723, dl));
5957 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5958 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5959 getF32Constant(DAG, 0x40aaf200, dl));
5960 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5961 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5962 getF32Constant(DAG, 0x40c39dad, dl));
5963 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5964 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t10,
5965 getF32Constant(DAG, 0x4042902c, dl));
5966 }
5967
5968 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, Log2ofMantissa);
5969 }
5970
5971 // No special expansion.
5972 return DAG.getNode(ISD::FLOG2, dl, Op.getValueType(), Op, Flags);
5973}
5974
5975/// expandLog10 - Lower a log10 intrinsic. Handles the special sequences for
5976/// limited-precision mode.
5978 const TargetLowering &TLI, SDNodeFlags Flags) {
5979 // TODO: What fast-math-flags should be set on the floating-point nodes?
5980
5981 if (Op.getValueType() == MVT::f32 &&
5983 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5984
5985 // Scale the exponent by log10(2) [0.30102999f].
5986 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5987 SDValue LogOfExponent = DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5988 getF32Constant(DAG, 0x3e9a209a, dl));
5989
5990 // Get the significand and build it into a floating-point number with
5991 // exponent of 1.
5992 SDValue X = GetSignificand(DAG, Op1, dl);
5993
5994 SDValue Log10ofMantissa;
5995 if (LimitFloatPrecision <= 6) {
5996 // For floating-point precision of 6:
5997 //
5998 // Log10ofMantissa =
5999 // -0.50419619f +
6000 // (0.60948995f - 0.10380950f * x) * x;
6001 //
6002 // error 0.0014886165, which is 6 bits
6003 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
6004 getF32Constant(DAG, 0xbdd49a13, dl));
6005 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
6006 getF32Constant(DAG, 0x3f1c0789, dl));
6007 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
6008 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
6009 getF32Constant(DAG, 0x3f011300, dl));
6010 } else if (LimitFloatPrecision <= 12) {
6011 // For floating-point precision of 12:
6012 //
6013 // Log10ofMantissa =
6014 // -0.64831180f +
6015 // (0.91751397f +
6016 // (-0.31664806f + 0.47637168e-1f * x) * x) * x;
6017 //
6018 // error 0.00019228036, which is better than 12 bits
6019 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
6020 getF32Constant(DAG, 0x3d431f31, dl));
6021 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
6022 getF32Constant(DAG, 0x3ea21fb2, dl));
6023 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
6024 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
6025 getF32Constant(DAG, 0x3f6ae232, dl));
6026 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
6027 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
6028 getF32Constant(DAG, 0x3f25f7c3, dl));
6029 } else { // LimitFloatPrecision <= 18
6030 // For floating-point precision of 18:
6031 //
6032 // Log10ofMantissa =
6033 // -0.84299375f +
6034 // (1.5327582f +
6035 // (-1.0688956f +
6036 // (0.49102474f +
6037 // (-0.12539807f + 0.13508273e-1f * x) * x) * x) * x) * x;
6038 //
6039 // error 0.0000037995730, which is better than 18 bits
6040 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
6041 getF32Constant(DAG, 0x3c5d51ce, dl));
6042 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
6043 getF32Constant(DAG, 0x3e00685a, dl));
6044 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
6045 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
6046 getF32Constant(DAG, 0x3efb6798, dl));
6047 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
6048 SDValue t5 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
6049 getF32Constant(DAG, 0x3f88d192, dl));
6050 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
6051 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
6052 getF32Constant(DAG, 0x3fc4316c, dl));
6053 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
6054 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t8,
6055 getF32Constant(DAG, 0x3f57ce70, dl));
6056 }
6057
6058 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, Log10ofMantissa);
6059 }
6060
6061 // No special expansion.
6062 return DAG.getNode(ISD::FLOG10, dl, Op.getValueType(), Op, Flags);
6063}
6064
6065/// expandExp2 - Lower an exp2 intrinsic. Handles the special sequences for
6066/// limited-precision mode.
6068 const TargetLowering &TLI, SDNodeFlags Flags) {
6069 if (Op.getValueType() == MVT::f32 &&
6071 return getLimitedPrecisionExp2(Op, dl, DAG);
6072
6073 // No special expansion.
6074 return DAG.getNode(ISD::FEXP2, dl, Op.getValueType(), Op, Flags);
6075}
6076
6077/// visitPow - Lower a pow intrinsic. Handles the special sequences for
6078/// limited-precision mode with x == 10.0f.
6080 SelectionDAG &DAG, const TargetLowering &TLI,
6081 SDNodeFlags Flags) {
6082 bool IsExp10 = false;
6083 if (LHS.getValueType() == MVT::f32 && RHS.getValueType() == MVT::f32 &&
6086 APFloat Ten(10.0f);
6087 IsExp10 = LHSC->isExactlyValue(Ten);
6088 }
6089 }
6090
6091 // TODO: What fast-math-flags should be set on the FMUL node?
6092 if (IsExp10) {
6093 // Put the exponent in the right bit position for later addition to the
6094 // final result:
6095 //
6096 // #define LOG2OF10 3.3219281f
6097 // t0 = Op * LOG2OF10;
6098 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, RHS,
6099 getF32Constant(DAG, 0x40549a78, dl));
6100 return getLimitedPrecisionExp2(t0, dl, DAG);
6101 }
6102
6103 // No special expansion.
6104 return DAG.getNode(ISD::FPOW, dl, LHS.getValueType(), LHS, RHS, Flags);
6105}
6106
6107/// ExpandPowI - Expand a llvm.powi intrinsic.
6109 SelectionDAG &DAG) {
6110 // If RHS is a constant, we can expand this out to a multiplication tree if
6111 // it's beneficial on the target, otherwise we end up lowering to a call to
6112 // __powidf2 (for example).
6114 unsigned Val = RHSC->getSExtValue();
6115
6116 // powi(x, 0) -> 1.0
6117 if (Val == 0)
6118 return DAG.getConstantFP(1.0, DL, LHS.getValueType());
6119
6121 Val, DAG.shouldOptForSize())) {
6122 // Get the exponent as a positive value.
6123 if ((int)Val < 0)
6124 Val = -Val;
6125 // We use the simple binary decomposition method to generate the multiply
6126 // sequence. There are more optimal ways to do this (for example,
6127 // powi(x,15) generates one more multiply than it should), but this has
6128 // the benefit of being both really simple and much better than a libcall.
6129 SDValue Res; // Logically starts equal to 1.0
6130 SDValue CurSquare = LHS;
6131 // TODO: Intrinsics should have fast-math-flags that propagate to these
6132 // nodes.
6133 while (Val) {
6134 if (Val & 1) {
6135 if (Res.getNode())
6136 Res =
6137 DAG.getNode(ISD::FMUL, DL, Res.getValueType(), Res, CurSquare);
6138 else
6139 Res = CurSquare; // 1.0*CurSquare.
6140 }
6141
6142 CurSquare = DAG.getNode(ISD::FMUL, DL, CurSquare.getValueType(),
6143 CurSquare, CurSquare);
6144 Val >>= 1;
6145 }
6146
6147 // If the original was negative, invert the result, producing 1/(x*x*x).
6148 if (RHSC->getSExtValue() < 0)
6149 Res = DAG.getNode(ISD::FDIV, DL, LHS.getValueType(),
6150 DAG.getConstantFP(1.0, DL, LHS.getValueType()), Res);
6151 return Res;
6152 }
6153 }
6154
6155 // Otherwise, expand to a libcall.
6156 return DAG.getNode(ISD::FPOWI, DL, LHS.getValueType(), LHS, RHS);
6157}
6158
6159static SDValue expandDivFix(unsigned Opcode, const SDLoc &DL,
6160 SDValue LHS, SDValue RHS, SDValue Scale,
6161 SelectionDAG &DAG, const TargetLowering &TLI) {
6162 EVT VT = LHS.getValueType();
6163 bool Signed = Opcode == ISD::SDIVFIX || Opcode == ISD::SDIVFIXSAT;
6164 bool Saturating = Opcode == ISD::SDIVFIXSAT || Opcode == ISD::UDIVFIXSAT;
6165 LLVMContext &Ctx = *DAG.getContext();
6166
6167 // If the type is legal but the operation isn't, this node might survive all
6168 // the way to operation legalization. If we end up there and we do not have
6169 // the ability to widen the type (if VT*2 is not legal), we cannot expand the
6170 // node.
6171
6172 // Coax the legalizer into expanding the node during type legalization instead
6173 // by bumping the size by one bit. This will force it to Promote, enabling the
6174 // early expansion and avoiding the need to expand later.
6175
6176 // We don't have to do this if Scale is 0; that can always be expanded, unless
6177 // it's a saturating signed operation. Those can experience true integer
6178 // division overflow, a case which we must avoid.
6179
6180 // FIXME: We wouldn't have to do this (or any of the early
6181 // expansion/promotion) if it was possible to expand a libcall of an
6182 // illegal type during operation legalization. But it's not, so things
6183 // get a bit hacky.
6184 unsigned ScaleInt = Scale->getAsZExtVal();
6185 if ((ScaleInt > 0 || (Saturating && Signed)) &&
6186 (TLI.isTypeLegal(VT) ||
6187 (VT.isVector() && TLI.isTypeLegal(VT.getVectorElementType())))) {
6189 Opcode, VT, ScaleInt);
6190 if (Action != TargetLowering::Legal && Action != TargetLowering::Custom) {
6191 EVT PromVT;
6192 if (VT.isScalarInteger())
6193 PromVT = EVT::getIntegerVT(Ctx, VT.getSizeInBits() + 1);
6194 else if (VT.isVector()) {
6195 PromVT = VT.getVectorElementType();
6196 PromVT = EVT::getIntegerVT(Ctx, PromVT.getSizeInBits() + 1);
6197 PromVT = EVT::getVectorVT(Ctx, PromVT, VT.getVectorElementCount());
6198 } else
6199 llvm_unreachable("Wrong VT for DIVFIX?");
6200 LHS = DAG.getExtOrTrunc(Signed, LHS, DL, PromVT);
6201 RHS = DAG.getExtOrTrunc(Signed, RHS, DL, PromVT);
6202 EVT ShiftTy = TLI.getShiftAmountTy(PromVT, DAG.getDataLayout());
6203 // For saturating operations, we need to shift up the LHS to get the
6204 // proper saturation width, and then shift down again afterwards.
6205 if (Saturating)
6206 LHS = DAG.getNode(ISD::SHL, DL, PromVT, LHS,
6207 DAG.getConstant(1, DL, ShiftTy));
6208 SDValue Res = DAG.getNode(Opcode, DL, PromVT, LHS, RHS, Scale);
6209 if (Saturating)
6210 Res = DAG.getNode(Signed ? ISD::SRA : ISD::SRL, DL, PromVT, Res,
6211 DAG.getConstant(1, DL, ShiftTy));
6212 return DAG.getZExtOrTrunc(Res, DL, VT);
6213 }
6214 }
6215
6216 return DAG.getNode(Opcode, DL, VT, LHS, RHS, Scale);
6217}
6218
6219// getUnderlyingArgRegs - Find underlying registers used for a truncated,
6220// bitcasted, or split argument. Returns a list of <Register, size in bits>
6221static void
6222getUnderlyingArgRegs(SmallVectorImpl<std::pair<Register, TypeSize>> &Regs,
6223 const SDValue &N) {
6224 switch (N.getOpcode()) {
6225 case ISD::CopyFromReg: {
6226 SDValue Op = N.getOperand(1);
6227 Regs.emplace_back(cast<RegisterSDNode>(Op)->getReg(),
6228 Op.getValueType().getSizeInBits());
6229 return;
6230 }
6231 case ISD::BITCAST:
6232 case ISD::AssertZext:
6233 case ISD::AssertSext:
6234 case ISD::TRUNCATE:
6235 getUnderlyingArgRegs(Regs, N.getOperand(0));
6236 return;
6237 case ISD::BUILD_PAIR:
6238 case ISD::BUILD_VECTOR:
6240 for (SDValue Op : N->op_values())
6241 getUnderlyingArgRegs(Regs, Op);
6242 return;
6243 default:
6244 return;
6245 }
6246}
6247
6248/// If the DbgValueInst is a dbg_value of a function argument, create the
6249/// corresponding DBG_VALUE machine instruction for it now. At the end of
6250/// instruction selection, they will be inserted to the entry BB.
6251/// We don't currently support this for variadic dbg_values, as they shouldn't
6252/// appear for function arguments or in the prologue.
6253bool SelectionDAGBuilder::EmitFuncArgumentDbgValue(
6254 const Value *V, DILocalVariable *Variable, DIExpression *Expr,
6255 DILocation *DL, FuncArgumentDbgValueKind Kind, const SDValue &N) {
6256 const Argument *Arg = dyn_cast<Argument>(V);
6257 if (!Arg)
6258 return false;
6259
6260 MachineFunction &MF = DAG.getMachineFunction();
6261 const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo();
6262
6263 // Helper to create DBG_INSTR_REFs or DBG_VALUEs, depending on what kind
6264 // we've been asked to pursue.
6265 auto MakeVRegDbgValue = [&](Register Reg, DIExpression *FragExpr,
6266 bool Indirect) {
6267 if (Reg.isVirtual() && MF.useDebugInstrRef()) {
6268 // For VRegs, in instruction referencing mode, create a DBG_INSTR_REF
6269 // pointing at the VReg, which will be patched up later.
6270 auto &Inst = TII->get(TargetOpcode::DBG_INSTR_REF);
6272 /* Reg */ Reg, /* isDef */ false, /* isImp */ false,
6273 /* isKill */ false, /* isDead */ false,
6274 /* isUndef */ false, /* isEarlyClobber */ false,
6275 /* SubReg */ 0, /* isDebug */ true)});
6276
6277 auto *NewDIExpr = FragExpr;
6278 // We don't have an "Indirect" field in DBG_INSTR_REF, fold that into
6279 // the DIExpression.
6280 if (Indirect)
6281 NewDIExpr = DIExpression::prepend(FragExpr, DIExpression::DerefBefore);
6283 NewDIExpr = DIExpression::prependOpcodes(NewDIExpr, Ops);
6284 return BuildMI(MF, DL, Inst, false, MOs, Variable, NewDIExpr);
6285 } else {
6286 // Create a completely standard DBG_VALUE.
6287 auto &Inst = TII->get(TargetOpcode::DBG_VALUE);
6288 return BuildMI(MF, DL, Inst, Indirect, Reg, Variable, FragExpr);
6289 }
6290 };
6291
6292 if (Kind == FuncArgumentDbgValueKind::Value) {
6293 // ArgDbgValues are hoisted to the beginning of the entry block. So we
6294 // should only emit as ArgDbgValue if the dbg.value intrinsic is found in
6295 // the entry block.
6296 bool IsInEntryBlock = FuncInfo.MBB == &FuncInfo.MF->front();
6297 if (!IsInEntryBlock)
6298 return false;
6299
6300 // ArgDbgValues are hoisted to the beginning of the entry block. So we
6301 // should only emit as ArgDbgValue if the dbg.value intrinsic describes a
6302 // variable that also is a param.
6303 //
6304 // Although, if we are at the top of the entry block already, we can still
6305 // emit using ArgDbgValue. This might catch some situations when the
6306 // dbg.value refers to an argument that isn't used in the entry block, so
6307 // any CopyToReg node would be optimized out and the only way to express
6308 // this DBG_VALUE is by using the physical reg (or FI) as done in this
6309 // method. ArgDbgValues are hoisted to the beginning of the entry block. So
6310 // we should only emit as ArgDbgValue if the Variable is an argument to the
6311 // current function, and the dbg.value intrinsic is found in the entry
6312 // block.
6313 bool VariableIsFunctionInputArg = Variable->isParameter() &&
6314 !DL->getInlinedAt();
6315 bool IsInPrologue = SDNodeOrder == LowestSDNodeOrder;
6316 if (!IsInPrologue && !VariableIsFunctionInputArg)
6317 return false;
6318
6319 // Here we assume that a function argument on IR level only can be used to
6320 // describe one input parameter on source level. If we for example have
6321 // source code like this
6322 //
6323 // struct A { long x, y; };
6324 // void foo(struct A a, long b) {
6325 // ...
6326 // b = a.x;
6327 // ...
6328 // }
6329 //
6330 // and IR like this
6331 //
6332 // define void @foo(i32 %a1, i32 %a2, i32 %b) {
6333 // entry:
6334 // call void @llvm.dbg.value(metadata i32 %a1, "a", DW_OP_LLVM_fragment
6335 // call void @llvm.dbg.value(metadata i32 %a2, "a", DW_OP_LLVM_fragment
6336 // call void @llvm.dbg.value(metadata i32 %b, "b",
6337 // ...
6338 // call void @llvm.dbg.value(metadata i32 %a1, "b"
6339 // ...
6340 //
6341 // then the last dbg.value is describing a parameter "b" using a value that
6342 // is an argument. But since we already has used %a1 to describe a parameter
6343 // we should not handle that last dbg.value here (that would result in an
6344 // incorrect hoisting of the DBG_VALUE to the function entry).
6345 // Notice that we allow one dbg.value per IR level argument, to accommodate
6346 // for the situation with fragments above.
6347 // If there is no node for the value being handled, we return true to skip
6348 // the normal generation of debug info, as it would kill existing debug
6349 // info for the parameter in case of duplicates.
6350 if (VariableIsFunctionInputArg) {
6351 unsigned ArgNo = Arg->getArgNo();
6352 if (ArgNo >= FuncInfo.DescribedArgs.size())
6353 FuncInfo.DescribedArgs.resize(ArgNo + 1, false);
6354 else if (!IsInPrologue && FuncInfo.DescribedArgs.test(ArgNo))
6355 return !NodeMap[V].getNode();
6356 FuncInfo.DescribedArgs.set(ArgNo);
6357 }
6358 }
6359
6360 bool IsIndirect = false;
6361 std::optional<MachineOperand> Op;
6362 // Some arguments' frame index is recorded during argument lowering.
6363 int FI = FuncInfo.getArgumentFrameIndex(Arg);
6364 if (FI != std::numeric_limits<int>::max())
6366
6368 if (!Op && N.getNode()) {
6369 getUnderlyingArgRegs(ArgRegsAndSizes, N);
6370 Register Reg;
6371 if (ArgRegsAndSizes.size() == 1)
6372 Reg = ArgRegsAndSizes.front().first;
6373
6374 if (Reg && Reg.isVirtual()) {
6375 MachineRegisterInfo &RegInfo = MF.getRegInfo();
6376 Register PR = RegInfo.getLiveInPhysReg(Reg);
6377 if (PR)
6378 Reg = PR;
6379 }
6380 if (Reg) {
6382 IsIndirect = Kind != FuncArgumentDbgValueKind::Value;
6383 }
6384 }
6385
6386 if (!Op && N.getNode()) {
6387 // Check if frame index is available.
6388 SDValue LCandidate = peekThroughBitcasts(N);
6389 if (LoadSDNode *LNode = dyn_cast<LoadSDNode>(LCandidate.getNode()))
6390 if (FrameIndexSDNode *FINode =
6391 dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
6392 Op = MachineOperand::CreateFI(FINode->getIndex());
6393 }
6394
6395 if (!Op) {
6396 // Create a DBG_VALUE for each decomposed value in ArgRegs to cover Reg
6397 auto splitMultiRegDbgValue =
6398 [&](ArrayRef<std::pair<Register, TypeSize>> SplitRegs) -> bool {
6399 unsigned Offset = 0;
6400 for (const auto &[Reg, RegSizeInBits] : SplitRegs) {
6401 // FIXME: Scalable sizes are not supported in fragment expressions.
6402 if (RegSizeInBits.isScalable())
6403 return false;
6404
6405 // If the expression is already a fragment, the current register
6406 // offset+size might extend beyond the fragment. In this case, only
6407 // the register bits that are inside the fragment are relevant.
6408 int RegFragmentSizeInBits = RegSizeInBits.getFixedValue();
6409 if (auto ExprFragmentInfo = Expr->getFragmentInfo()) {
6410 uint64_t ExprFragmentSizeInBits = ExprFragmentInfo->SizeInBits;
6411 // The register is entirely outside the expression fragment,
6412 // so is irrelevant for debug info.
6413 if (Offset >= ExprFragmentSizeInBits)
6414 break;
6415 // The register is partially outside the expression fragment, only
6416 // the low bits within the fragment are relevant for debug info.
6417 if (Offset + RegFragmentSizeInBits > ExprFragmentSizeInBits) {
6418 RegFragmentSizeInBits = ExprFragmentSizeInBits - Offset;
6419 }
6420 }
6421
6422 auto FragmentExpr = DIExpression::createFragmentExpression(
6423 Expr, Offset, RegFragmentSizeInBits);
6424 Offset += RegSizeInBits.getFixedValue();
6425 // If a valid fragment expression cannot be created, the variable's
6426 // correct value cannot be determined and so it is set as poison.
6427 if (!FragmentExpr) {
6428 SDDbgValue *SDV = DAG.getConstantDbgValue(
6429 Variable, Expr, PoisonValue::get(V->getType()), DL, SDNodeOrder);
6430 DAG.AddDbgValue(SDV, false);
6431 continue;
6432 }
6433 MachineInstr *NewMI = MakeVRegDbgValue(
6434 Reg, *FragmentExpr, Kind != FuncArgumentDbgValueKind::Value);
6435 FuncInfo.ArgDbgValues.push_back(NewMI);
6436 }
6437
6438 return true;
6439 };
6440
6441 // Check if ValueMap has reg number.
6443 VMI = FuncInfo.ValueMap.find(V);
6444 if (VMI != FuncInfo.ValueMap.end()) {
6445 const auto &TLI = DAG.getTargetLoweringInfo();
6446 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), VMI->second,
6447 V->getType(), std::nullopt);
6448 if (RFV.occupiesMultipleRegs())
6449 return splitMultiRegDbgValue(RFV.getRegsAndSizes());
6450
6451 Op = MachineOperand::CreateReg(VMI->second, false);
6452 IsIndirect = Kind != FuncArgumentDbgValueKind::Value;
6453 } else if (ArgRegsAndSizes.size() > 1) {
6454 // This was split due to the calling convention, and no virtual register
6455 // mapping exists for the value.
6456 return splitMultiRegDbgValue(ArgRegsAndSizes);
6457 }
6458 }
6459
6460 if (!Op)
6461 return false;
6462
6463 assert(Variable->isValidLocationForIntrinsic(DL) &&
6464 "Expected inlined-at fields to agree");
6465 MachineInstr *NewMI = nullptr;
6466
6467 if (Op->isReg())
6468 NewMI = MakeVRegDbgValue(Op->getReg(), Expr, IsIndirect);
6469 else
6470 NewMI = BuildMI(MF, DL, TII->get(TargetOpcode::DBG_VALUE), true, *Op,
6471 Variable, Expr);
6472
6473 // Otherwise, use ArgDbgValues.
6474 FuncInfo.ArgDbgValues.push_back(NewMI);
6475 return true;
6476}
6477
6478/// Return the appropriate SDDbgValue based on N.
6479SDDbgValue *SelectionDAGBuilder::getDbgValue(SDValue N,
6480 DILocalVariable *Variable,
6481 DIExpression *Expr,
6482 const DebugLoc &dl,
6483 unsigned DbgSDNodeOrder) {
6484 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(N.getNode())) {
6485 // Construct a FrameIndexDbgValue for FrameIndexSDNodes so we can describe
6486 // stack slot locations.
6487 //
6488 // Consider "int x = 0; int *px = &x;". There are two kinds of interesting
6489 // debug values here after optimization:
6490 //
6491 // dbg.value(i32* %px, !"int *px", !DIExpression()), and
6492 // dbg.value(i32* %px, !"int x", !DIExpression(DW_OP_deref))
6493 //
6494 // Both describe the direct values of their associated variables.
6495 return DAG.getFrameIndexDbgValue(Variable, Expr, FISDN->getIndex(),
6496 /*IsIndirect*/ false, dl, DbgSDNodeOrder);
6497 }
6498 return DAG.getDbgValue(Variable, Expr, N.getNode(), N.getResNo(),
6499 /*IsIndirect*/ false, dl, DbgSDNodeOrder);
6500}
6501
6502static unsigned FixedPointIntrinsicToOpcode(unsigned Intrinsic) {
6503 switch (Intrinsic) {
6504 case Intrinsic::smul_fix:
6505 return ISD::SMULFIX;
6506 case Intrinsic::umul_fix:
6507 return ISD::UMULFIX;
6508 case Intrinsic::smul_fix_sat:
6509 return ISD::SMULFIXSAT;
6510 case Intrinsic::umul_fix_sat:
6511 return ISD::UMULFIXSAT;
6512 case Intrinsic::sdiv_fix:
6513 return ISD::SDIVFIX;
6514 case Intrinsic::udiv_fix:
6515 return ISD::UDIVFIX;
6516 case Intrinsic::sdiv_fix_sat:
6517 return ISD::SDIVFIXSAT;
6518 case Intrinsic::udiv_fix_sat:
6519 return ISD::UDIVFIXSAT;
6520 default:
6521 llvm_unreachable("Unhandled fixed point intrinsic");
6522 }
6523}
6524
6525/// Given a @llvm.call.preallocated.setup, return the corresponding
6526/// preallocated call.
6527static const CallBase *FindPreallocatedCall(const Value *PreallocatedSetup) {
6528 assert(cast<CallBase>(PreallocatedSetup)
6530 ->getIntrinsicID() == Intrinsic::call_preallocated_setup &&
6531 "expected call_preallocated_setup Value");
6532 for (const auto *U : PreallocatedSetup->users()) {
6533 auto *UseCall = cast<CallBase>(U);
6534 const Function *Fn = UseCall->getCalledFunction();
6535 if (!Fn || Fn->getIntrinsicID() != Intrinsic::call_preallocated_arg) {
6536 return UseCall;
6537 }
6538 }
6539 llvm_unreachable("expected corresponding call to preallocated setup/arg");
6540}
6541
6542/// If DI is a debug value with an EntryValue expression, lower it using the
6543/// corresponding physical register of the associated Argument value
6544/// (guaranteed to exist by the verifier).
6545bool SelectionDAGBuilder::visitEntryValueDbgValue(
6547 DIExpression *Expr, DebugLoc DbgLoc) {
6548 if (!Expr->isEntryValue() || !hasSingleElement(Values))
6549 return false;
6550
6551 // These properties are guaranteed by the verifier.
6552 const Argument *Arg = cast<Argument>(Values[0]);
6553 assert(Arg->hasAttribute(Attribute::AttrKind::SwiftAsync));
6554
6555 auto ArgIt = FuncInfo.ValueMap.find(Arg);
6556 if (ArgIt == FuncInfo.ValueMap.end()) {
6557 LLVM_DEBUG(
6558 dbgs() << "Dropping dbg.value: expression is entry_value but "
6559 "couldn't find an associated register for the Argument\n");
6560 return true;
6561 }
6562 Register ArgVReg = ArgIt->getSecond();
6563
6564 for (auto [PhysReg, VirtReg] : FuncInfo.RegInfo->liveins())
6565 if (ArgVReg == VirtReg || ArgVReg == PhysReg) {
6566 SDDbgValue *SDV = DAG.getVRegDbgValue(
6567 Variable, Expr, PhysReg, false /*IsIndidrect*/, DbgLoc, SDNodeOrder);
6568 DAG.AddDbgValue(SDV, false /*treat as dbg.declare byval parameter*/);
6569 return true;
6570 }
6571 LLVM_DEBUG(dbgs() << "Dropping dbg.value: expression is entry_value but "
6572 "couldn't find a physical register\n");
6573 return true;
6574}
6575
6576/// Lower the call to the specified intrinsic function.
6577void SelectionDAGBuilder::visitConvergenceControl(const CallInst &I,
6578 unsigned Intrinsic) {
6579 SDLoc sdl = getCurSDLoc();
6580 switch (Intrinsic) {
6581 case Intrinsic::experimental_convergence_anchor:
6582 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_ANCHOR, sdl, MVT::Untyped));
6583 break;
6584 case Intrinsic::experimental_convergence_entry:
6585 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_ENTRY, sdl, MVT::Untyped));
6586 break;
6587 case Intrinsic::experimental_convergence_loop: {
6588 auto Bundle = I.getOperandBundle(LLVMContext::OB_convergencectrl);
6589 auto *Token = Bundle->Inputs[0].get();
6590 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_LOOP, sdl, MVT::Untyped,
6591 getValue(Token)));
6592 break;
6593 }
6594 }
6595}
6596
6597void SelectionDAGBuilder::visitVectorHistogram(const CallInst &I,
6598 unsigned IntrinsicID) {
6599 // For now, we're only lowering an 'add' histogram.
6600 // We can add others later, e.g. saturating adds, min/max.
6601 assert(IntrinsicID == Intrinsic::experimental_vector_histogram_add &&
6602 "Tried to lower unsupported histogram type");
6603 SDLoc sdl = getCurSDLoc();
6604 Value *Ptr = I.getOperand(0);
6605 SDValue Inc = getValue(I.getOperand(1));
6606 SDValue Mask = getValue(I.getOperand(2));
6607
6608 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6609 DataLayout TargetDL = DAG.getDataLayout();
6610 EVT VT = Inc.getValueType();
6611 Align Alignment = DAG.getEVTAlign(VT);
6612
6613 const MDNode *Ranges = getRangeMetadata(I);
6614
6615 SDValue Root = DAG.getRoot();
6616 SDValue Base;
6617 SDValue Index;
6618 SDValue Scale;
6619 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
6620 I.getParent(), VT.getScalarStoreSize());
6621
6622 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
6623
6624 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
6625 MachinePointerInfo(AS),
6627 MemoryLocation::UnknownSize, Alignment, I.getAAMetadata(), Ranges);
6628
6629 if (!UniformBase) {
6630 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
6631 Index = getValue(Ptr);
6632 Scale =
6633 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
6634 }
6635
6636 EVT IdxVT = Index.getValueType();
6637
6638 // Avoid using e.g. i32 as index type when the increment must be performed
6639 // on i64's.
6640 bool MustExtendIndex = VT.getScalarSizeInBits() > IdxVT.getScalarSizeInBits();
6641 EVT EltTy = MustExtendIndex ? VT : IdxVT.getVectorElementType();
6642 if (MustExtendIndex || TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
6643 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
6644 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
6645 }
6646
6647 SDValue ID = DAG.getTargetConstant(IntrinsicID, sdl, MVT::i32);
6648
6649 SDValue Ops[] = {Root, Inc, Mask, Base, Index, Scale, ID};
6650 SDValue Histogram = DAG.getMaskedHistogram(DAG.getVTList(MVT::Other), VT, sdl,
6651 Ops, MMO, ISD::SIGNED_SCALED);
6652
6653 setValue(&I, Histogram);
6654 DAG.setRoot(Histogram);
6655}
6656
6657void SelectionDAGBuilder::visitVectorExtractLastActive(const CallInst &I,
6658 unsigned Intrinsic) {
6659 assert(Intrinsic == Intrinsic::experimental_vector_extract_last_active &&
6660 "Tried lowering invalid vector extract last");
6661 SDLoc sdl = getCurSDLoc();
6662 const DataLayout &Layout = DAG.getDataLayout();
6663 SDValue Data = getValue(I.getOperand(0));
6664 SDValue Mask = getValue(I.getOperand(1));
6665
6666 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6667 EVT ResVT = TLI.getValueType(Layout, I.getType());
6668
6669 EVT ExtVT = TLI.getVectorIdxTy(Layout);
6670 SDValue Idx = DAG.getNode(ISD::VECTOR_FIND_LAST_ACTIVE, sdl, ExtVT, Mask);
6671 SDValue Result = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, sdl, ResVT, Data, Idx);
6672
6673 Value *Default = I.getOperand(2);
6675 SDValue PassThru = getValue(Default);
6676 EVT BoolVT = Mask.getValueType().getScalarType();
6677 SDValue AnyActive = DAG.getNode(ISD::VECREDUCE_OR, sdl, BoolVT, Mask);
6678 Result = DAG.getSelect(sdl, ResVT, AnyActive, Result, PassThru);
6679 }
6680
6681 setValue(&I, Result);
6682}
6683
6684/// Lower the call to the specified intrinsic function.
6685void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
6686 unsigned Intrinsic) {
6687 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6688 SDLoc sdl = getCurSDLoc();
6689 DebugLoc dl = getCurDebugLoc();
6690 SDValue Res;
6691
6692 SDNodeFlags Flags;
6693 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
6694 Flags.copyFMF(*FPOp);
6695
6696 switch (Intrinsic) {
6697 default:
6698 // By default, turn this into a target intrinsic node.
6699 visitTargetIntrinsic(I, Intrinsic);
6700 return;
6701 case Intrinsic::vscale: {
6702 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6703 setValue(&I, DAG.getVScale(sdl, VT, APInt(VT.getSizeInBits(), 1)));
6704 return;
6705 }
6706 case Intrinsic::vastart: visitVAStart(I); return;
6707 case Intrinsic::vaend: visitVAEnd(I); return;
6708 case Intrinsic::vacopy: visitVACopy(I); return;
6709 case Intrinsic::returnaddress:
6710 setValue(&I, DAG.getNode(ISD::RETURNADDR, sdl,
6711 TLI.getValueType(DAG.getDataLayout(), I.getType()),
6712 getValue(I.getArgOperand(0))));
6713 return;
6714 case Intrinsic::addressofreturnaddress:
6715 setValue(&I,
6716 DAG.getNode(ISD::ADDROFRETURNADDR, sdl,
6717 TLI.getValueType(DAG.getDataLayout(), I.getType())));
6718 return;
6719 case Intrinsic::sponentry:
6720 setValue(&I,
6721 DAG.getNode(ISD::SPONENTRY, sdl,
6722 TLI.getValueType(DAG.getDataLayout(), I.getType())));
6723 return;
6724 case Intrinsic::frameaddress:
6725 setValue(&I, DAG.getNode(ISD::FRAMEADDR, sdl,
6726 TLI.getFrameIndexTy(DAG.getDataLayout()),
6727 getValue(I.getArgOperand(0))));
6728 return;
6729 case Intrinsic::read_volatile_register:
6730 case Intrinsic::read_register: {
6731 Value *Reg = I.getArgOperand(0);
6732 SDValue Chain = getRoot();
6734 DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
6735 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6736 Res = DAG.getNode(ISD::READ_REGISTER, sdl,
6737 DAG.getVTList(VT, MVT::Other), Chain, RegName);
6738 setValue(&I, Res);
6739 DAG.setRoot(Res.getValue(1));
6740 return;
6741 }
6742 case Intrinsic::write_register: {
6743 Value *Reg = I.getArgOperand(0);
6744 Value *RegValue = I.getArgOperand(1);
6745 SDValue Chain = getRoot();
6747 DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
6748 DAG.setRoot(DAG.getNode(ISD::WRITE_REGISTER, sdl, MVT::Other, Chain,
6749 RegName, getValue(RegValue)));
6750 return;
6751 }
6752 case Intrinsic::write_volatile_register: {
6753 Value *Reg = I.getArgOperand(0);
6754 Value *RegValue = I.getArgOperand(1);
6755 SDValue Chain = getRoot();
6756 const MDNode *MD = cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata());
6757 SDValue RegName = DAG.getMDNode(MD);
6758 EVT VT = TLI.getValueType(DAG.getDataLayout(), RegValue->getType());
6759 SDValue WriteChain = DAG.getNode(ISD::WRITE_REGISTER, sdl, MVT::Other,
6760 Chain, RegName, getValue(RegValue));
6761 // FAKE_USE of the physical register marks it live after the WRITE_REGISTER,
6762 // preventing the backend from dead-eliminating the write. This is
6763 // preferred over READ_REGISTER, which would emit extra register copies
6764 // (e.g. fmov xN, dN for FP/SIMD registers).
6765 const MDString *RegStr = cast<MDString>(MD->getOperand(0));
6766 LLT Ty = VT.isSimple() ? getLLTForMVT(VT.getSimpleVT()) : LLT();
6767 const MachineFunction &MF = DAG.getMachineFunction();
6768 Register PhysReg =
6769 TLI.getRegisterByName(RegStr->getString().data(), Ty, MF);
6770 if (PhysReg.isValid()) {
6771 const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
6772 const TargetRegisterClass *RC = TRI->getMinimalPhysRegClass(PhysReg);
6773 MVT RegVT = *TRI->legalclasstypes_begin(*RC);
6774 DAG.setRoot(DAG.getNode(ISD::FAKE_USE, sdl, MVT::Other,
6775 {WriteChain, DAG.getRegister(PhysReg, RegVT)}));
6776 } else {
6777 DAG.setRoot(WriteChain);
6778 }
6779 return;
6780 }
6781 case Intrinsic::memcpy:
6782 case Intrinsic::memcpy_inline: {
6783 const auto &MCI = cast<MemCpyInst>(I);
6784 SDValue Dst = getValue(I.getArgOperand(0));
6785 SDValue Src = getValue(I.getArgOperand(1));
6786 SDValue Size = getValue(I.getArgOperand(2));
6787 assert((!MCI.isForceInlined() || isa<ConstantSDNode>(Size)) &&
6788 "memcpy_inline needs constant size");
6789 // @llvm.memcpy.inline defines 0 and 1 to both mean no alignment.
6790 Align DstAlign = MCI.getDestAlign().valueOrOne();
6791 Align SrcAlign = MCI.getSourceAlign().valueOrOne();
6792 bool isVol = MCI.isVolatile();
6793 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6794 SDValue MC = DAG.getMemcpy(Root, sdl, Dst, Src, Size, DstAlign, SrcAlign,
6795 isVol, MCI.isForceInlined(), &I, std::nullopt,
6796 MachinePointerInfo(I.getArgOperand(0)),
6797 MachinePointerInfo(I.getArgOperand(1)),
6798 I.getAAMetadata(), BatchAA);
6799 updateDAGForMaybeTailCall(MC);
6800 return;
6801 }
6802 case Intrinsic::memset:
6803 case Intrinsic::memset_inline: {
6804 const auto &MSII = cast<MemSetInst>(I);
6805 SDValue Dst = getValue(I.getArgOperand(0));
6806 SDValue Value = getValue(I.getArgOperand(1));
6807 SDValue Size = getValue(I.getArgOperand(2));
6808 assert((!MSII.isForceInlined() || isa<ConstantSDNode>(Size)) &&
6809 "memset_inline needs constant size");
6810 // @llvm.memset defines 0 and 1 to both mean no alignment.
6811 Align DstAlign = MSII.getDestAlign().valueOrOne();
6812 bool isVol = MSII.isVolatile();
6813 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6814 SDValue MC = DAG.getMemset(
6815 Root, sdl, Dst, Value, Size, DstAlign, isVol, MSII.isForceInlined(),
6816 &I, MachinePointerInfo(I.getArgOperand(0)), I.getAAMetadata());
6817 updateDAGForMaybeTailCall(MC);
6818 return;
6819 }
6820 case Intrinsic::memmove: {
6821 const auto &MMI = cast<MemMoveInst>(I);
6822 SDValue Op1 = getValue(I.getArgOperand(0));
6823 SDValue Op2 = getValue(I.getArgOperand(1));
6824 SDValue Op3 = getValue(I.getArgOperand(2));
6825 // @llvm.memmove defines 0 and 1 to both mean no alignment.
6826 Align DstAlign = MMI.getDestAlign().valueOrOne();
6827 Align SrcAlign = MMI.getSourceAlign().valueOrOne();
6828 bool isVol = MMI.isVolatile();
6829 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6830 SDValue MM = DAG.getMemmove(
6831 Root, sdl, Op1, Op2, Op3, DstAlign, SrcAlign, isVol, &I,
6832 /* OverrideTailCall */ std::nullopt,
6833 MachinePointerInfo(I.getArgOperand(0)),
6834 MachinePointerInfo(I.getArgOperand(1)), I.getAAMetadata(), BatchAA);
6835 updateDAGForMaybeTailCall(MM);
6836 return;
6837 }
6838 case Intrinsic::memcpy_element_unordered_atomic: {
6839 auto &MI = cast<AnyMemCpyInst>(I);
6840 SDValue Dst = getValue(MI.getRawDest());
6841 SDValue Src = getValue(MI.getRawSource());
6842 SDValue Length = getValue(MI.getLength());
6843
6844 Type *LengthTy = MI.getLength()->getType();
6845 unsigned ElemSz = MI.getElementSizeInBytes();
6846 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6847 SDValue MC =
6848 DAG.getAtomicMemcpy(getRoot(), sdl, Dst, Src, Length, LengthTy, ElemSz,
6849 isTC, MachinePointerInfo(MI.getRawDest()),
6850 MachinePointerInfo(MI.getRawSource()));
6851 updateDAGForMaybeTailCall(MC);
6852 return;
6853 }
6854 case Intrinsic::memmove_element_unordered_atomic: {
6855 auto &MI = cast<AnyMemMoveInst>(I);
6856 SDValue Dst = getValue(MI.getRawDest());
6857 SDValue Src = getValue(MI.getRawSource());
6858 SDValue Length = getValue(MI.getLength());
6859
6860 Type *LengthTy = MI.getLength()->getType();
6861 unsigned ElemSz = MI.getElementSizeInBytes();
6862 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6863 SDValue MC =
6864 DAG.getAtomicMemmove(getRoot(), sdl, Dst, Src, Length, LengthTy, ElemSz,
6865 isTC, MachinePointerInfo(MI.getRawDest()),
6866 MachinePointerInfo(MI.getRawSource()));
6867 updateDAGForMaybeTailCall(MC);
6868 return;
6869 }
6870 case Intrinsic::memset_element_unordered_atomic: {
6871 auto &MI = cast<AnyMemSetInst>(I);
6872 SDValue Dst = getValue(MI.getRawDest());
6873 SDValue Val = getValue(MI.getValue());
6874 SDValue Length = getValue(MI.getLength());
6875
6876 Type *LengthTy = MI.getLength()->getType();
6877 unsigned ElemSz = MI.getElementSizeInBytes();
6878 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6879 SDValue MC =
6880 DAG.getAtomicMemset(getRoot(), sdl, Dst, Val, Length, LengthTy, ElemSz,
6881 isTC, MachinePointerInfo(MI.getRawDest()));
6882 updateDAGForMaybeTailCall(MC);
6883 return;
6884 }
6885 case Intrinsic::call_preallocated_setup: {
6886 const CallBase *PreallocatedCall = FindPreallocatedCall(&I);
6887 SDValue SrcValue = DAG.getSrcValue(PreallocatedCall);
6888 SDValue Res = DAG.getNode(ISD::PREALLOCATED_SETUP, sdl, MVT::Other,
6889 getRoot(), SrcValue);
6890 setValue(&I, Res);
6891 DAG.setRoot(Res);
6892 return;
6893 }
6894 case Intrinsic::call_preallocated_arg: {
6895 const CallBase *PreallocatedCall = FindPreallocatedCall(I.getOperand(0));
6896 SDValue SrcValue = DAG.getSrcValue(PreallocatedCall);
6897 SDValue Ops[3];
6898 Ops[0] = getRoot();
6899 Ops[1] = SrcValue;
6900 Ops[2] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(1)), sdl,
6901 MVT::i32); // arg index
6902 SDValue Res = DAG.getNode(
6904 DAG.getVTList(TLI.getPointerTy(DAG.getDataLayout()), MVT::Other), Ops);
6905 setValue(&I, Res);
6906 DAG.setRoot(Res.getValue(1));
6907 return;
6908 }
6909
6910 case Intrinsic::eh_typeid_for: {
6911 // Find the type id for the given typeinfo.
6912 GlobalValue *GV = ExtractTypeInfo(I.getArgOperand(0));
6913 unsigned TypeID = DAG.getMachineFunction().getTypeIDFor(GV);
6914 Res = DAG.getConstant(TypeID, sdl, MVT::i32);
6915 setValue(&I, Res);
6916 return;
6917 }
6918
6919 case Intrinsic::eh_return_i32:
6920 case Intrinsic::eh_return_i64:
6921 DAG.getMachineFunction().setCallsEHReturn(true);
6922 DAG.setRoot(DAG.getNode(ISD::EH_RETURN, sdl,
6923 MVT::Other,
6925 getValue(I.getArgOperand(0)),
6926 getValue(I.getArgOperand(1))));
6927 return;
6928 case Intrinsic::eh_unwind_init:
6929 DAG.getMachineFunction().setCallsUnwindInit(true);
6930 return;
6931 case Intrinsic::eh_dwarf_cfa:
6932 setValue(&I, DAG.getNode(ISD::EH_DWARF_CFA, sdl,
6933 TLI.getPointerTy(DAG.getDataLayout()),
6934 getValue(I.getArgOperand(0))));
6935 return;
6936 case Intrinsic::eh_sjlj_callsite: {
6937 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(0));
6938 assert(FuncInfo.getCurrentCallSite() == 0 && "Overlapping call sites!");
6939
6940 FuncInfo.setCurrentCallSite(CI->getZExtValue());
6941 return;
6942 }
6943 case Intrinsic::eh_sjlj_functioncontext: {
6944 // Get and store the index of the function context.
6945 MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo();
6946 AllocaInst *FnCtx =
6947 cast<AllocaInst>(I.getArgOperand(0)->stripPointerCasts());
6948 int FI = FuncInfo.StaticAllocaMap[FnCtx];
6950 return;
6951 }
6952 case Intrinsic::eh_sjlj_setjmp: {
6953 SDValue Ops[2];
6954 Ops[0] = getRoot();
6955 Ops[1] = getValue(I.getArgOperand(0));
6956 SDValue Op = DAG.getNode(ISD::EH_SJLJ_SETJMP, sdl,
6957 DAG.getVTList(MVT::i32, MVT::Other), Ops);
6958 setValue(&I, Op.getValue(0));
6959 DAG.setRoot(Op.getValue(1));
6960 return;
6961 }
6962 case Intrinsic::eh_sjlj_longjmp:
6963 DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_LONGJMP, sdl, MVT::Other,
6964 getRoot(), getValue(I.getArgOperand(0))));
6965 return;
6966 case Intrinsic::eh_sjlj_setup_dispatch:
6967 DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_SETUP_DISPATCH, sdl, MVT::Other,
6968 getRoot()));
6969 return;
6970 case Intrinsic::masked_gather:
6971 visitMaskedGather(I);
6972 return;
6973 case Intrinsic::masked_load:
6974 visitMaskedLoad(I);
6975 return;
6976 case Intrinsic::masked_scatter:
6977 visitMaskedScatter(I);
6978 return;
6979 case Intrinsic::masked_store:
6980 visitMaskedStore(I);
6981 return;
6982 case Intrinsic::masked_expandload:
6983 visitMaskedLoad(I, true /* IsExpanding */);
6984 return;
6985 case Intrinsic::masked_compressstore:
6986 visitMaskedStore(I, true /* IsCompressing */);
6987 return;
6988 case Intrinsic::powi:
6989 setValue(&I, ExpandPowI(sdl, getValue(I.getArgOperand(0)),
6990 getValue(I.getArgOperand(1)), DAG));
6991 return;
6992 case Intrinsic::log:
6993 setValue(&I, expandLog(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6994 return;
6995 case Intrinsic::log2:
6996 setValue(&I,
6997 expandLog2(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6998 return;
6999 case Intrinsic::log10:
7000 setValue(&I,
7001 expandLog10(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
7002 return;
7003 case Intrinsic::exp:
7004 setValue(&I, expandExp(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
7005 return;
7006 case Intrinsic::exp2:
7007 setValue(&I,
7008 expandExp2(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
7009 return;
7010 case Intrinsic::pow:
7011 setValue(&I, expandPow(sdl, getValue(I.getArgOperand(0)),
7012 getValue(I.getArgOperand(1)), DAG, TLI, Flags));
7013 return;
7014 case Intrinsic::sqrt:
7015 case Intrinsic::fabs:
7016 case Intrinsic::sin:
7017 case Intrinsic::cos:
7018 case Intrinsic::tan:
7019 case Intrinsic::asin:
7020 case Intrinsic::acos:
7021 case Intrinsic::atan:
7022 case Intrinsic::sinh:
7023 case Intrinsic::cosh:
7024 case Intrinsic::tanh:
7025 case Intrinsic::exp10:
7026 case Intrinsic::floor:
7027 case Intrinsic::ceil:
7028 case Intrinsic::trunc:
7029 case Intrinsic::rint:
7030 case Intrinsic::nearbyint:
7031 case Intrinsic::round:
7032 case Intrinsic::roundeven:
7033 case Intrinsic::canonicalize: {
7034 unsigned Opcode;
7035 // clang-format off
7036 switch (Intrinsic) {
7037 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
7038 case Intrinsic::sqrt: Opcode = ISD::FSQRT; break;
7039 case Intrinsic::fabs: Opcode = ISD::FABS; break;
7040 case Intrinsic::sin: Opcode = ISD::FSIN; break;
7041 case Intrinsic::cos: Opcode = ISD::FCOS; break;
7042 case Intrinsic::tan: Opcode = ISD::FTAN; break;
7043 case Intrinsic::asin: Opcode = ISD::FASIN; break;
7044 case Intrinsic::acos: Opcode = ISD::FACOS; break;
7045 case Intrinsic::atan: Opcode = ISD::FATAN; break;
7046 case Intrinsic::sinh: Opcode = ISD::FSINH; break;
7047 case Intrinsic::cosh: Opcode = ISD::FCOSH; break;
7048 case Intrinsic::tanh: Opcode = ISD::FTANH; break;
7049 case Intrinsic::exp10: Opcode = ISD::FEXP10; break;
7050 case Intrinsic::floor: Opcode = ISD::FFLOOR; break;
7051 case Intrinsic::ceil: Opcode = ISD::FCEIL; break;
7052 case Intrinsic::trunc: Opcode = ISD::FTRUNC; break;
7053 case Intrinsic::rint: Opcode = ISD::FRINT; break;
7054 case Intrinsic::nearbyint: Opcode = ISD::FNEARBYINT; break;
7055 case Intrinsic::round: Opcode = ISD::FROUND; break;
7056 case Intrinsic::roundeven: Opcode = ISD::FROUNDEVEN; break;
7057 case Intrinsic::canonicalize: Opcode = ISD::FCANONICALIZE; break;
7058 }
7059 // clang-format on
7060
7061 setValue(&I, DAG.getNode(Opcode, sdl,
7062 getValue(I.getArgOperand(0)).getValueType(),
7063 getValue(I.getArgOperand(0)), Flags));
7064 return;
7065 }
7066 case Intrinsic::atan2:
7067 setValue(&I, DAG.getNode(ISD::FATAN2, sdl,
7068 getValue(I.getArgOperand(0)).getValueType(),
7069 getValue(I.getArgOperand(0)),
7070 getValue(I.getArgOperand(1)), Flags));
7071 return;
7072 case Intrinsic::lround:
7073 case Intrinsic::llround:
7074 case Intrinsic::lrint:
7075 case Intrinsic::llrint: {
7076 unsigned Opcode;
7077 // clang-format off
7078 switch (Intrinsic) {
7079 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
7080 case Intrinsic::lround: Opcode = ISD::LROUND; break;
7081 case Intrinsic::llround: Opcode = ISD::LLROUND; break;
7082 case Intrinsic::lrint: Opcode = ISD::LRINT; break;
7083 case Intrinsic::llrint: Opcode = ISD::LLRINT; break;
7084 }
7085 // clang-format on
7086
7087 EVT RetVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7088 setValue(&I, DAG.getNode(Opcode, sdl, RetVT,
7089 getValue(I.getArgOperand(0))));
7090 return;
7091 }
7092 case Intrinsic::minnum:
7093 setValue(&I, DAG.getNode(ISD::FMINNUM, sdl,
7094 getValue(I.getArgOperand(0)).getValueType(),
7095 getValue(I.getArgOperand(0)),
7096 getValue(I.getArgOperand(1)), Flags));
7097 return;
7098 case Intrinsic::maxnum:
7099 setValue(&I, DAG.getNode(ISD::FMAXNUM, sdl,
7100 getValue(I.getArgOperand(0)).getValueType(),
7101 getValue(I.getArgOperand(0)),
7102 getValue(I.getArgOperand(1)), Flags));
7103 return;
7104 case Intrinsic::minimum:
7105 setValue(&I, DAG.getNode(ISD::FMINIMUM, sdl,
7106 getValue(I.getArgOperand(0)).getValueType(),
7107 getValue(I.getArgOperand(0)),
7108 getValue(I.getArgOperand(1)), Flags));
7109 return;
7110 case Intrinsic::maximum:
7111 setValue(&I, DAG.getNode(ISD::FMAXIMUM, sdl,
7112 getValue(I.getArgOperand(0)).getValueType(),
7113 getValue(I.getArgOperand(0)),
7114 getValue(I.getArgOperand(1)), Flags));
7115 return;
7116 case Intrinsic::minimumnum:
7117 setValue(&I, DAG.getNode(ISD::FMINIMUMNUM, sdl,
7118 getValue(I.getArgOperand(0)).getValueType(),
7119 getValue(I.getArgOperand(0)),
7120 getValue(I.getArgOperand(1)), Flags));
7121 return;
7122 case Intrinsic::maximumnum:
7123 setValue(&I, DAG.getNode(ISD::FMAXIMUMNUM, sdl,
7124 getValue(I.getArgOperand(0)).getValueType(),
7125 getValue(I.getArgOperand(0)),
7126 getValue(I.getArgOperand(1)), Flags));
7127 return;
7128 case Intrinsic::copysign:
7129 setValue(&I, DAG.getNode(ISD::FCOPYSIGN, sdl,
7130 getValue(I.getArgOperand(0)).getValueType(),
7131 getValue(I.getArgOperand(0)),
7132 getValue(I.getArgOperand(1)), Flags));
7133 return;
7134 case Intrinsic::ldexp:
7135 setValue(&I, DAG.getNode(ISD::FLDEXP, sdl,
7136 getValue(I.getArgOperand(0)).getValueType(),
7137 getValue(I.getArgOperand(0)),
7138 getValue(I.getArgOperand(1)), Flags));
7139 return;
7140 case Intrinsic::modf:
7141 case Intrinsic::sincos:
7142 case Intrinsic::sincospi:
7143 case Intrinsic::frexp: {
7144 unsigned Opcode;
7145 switch (Intrinsic) {
7146 default:
7147 llvm_unreachable("unexpected intrinsic");
7148 case Intrinsic::sincos:
7149 Opcode = ISD::FSINCOS;
7150 break;
7151 case Intrinsic::sincospi:
7152 Opcode = ISD::FSINCOSPI;
7153 break;
7154 case Intrinsic::modf:
7155 Opcode = ISD::FMODF;
7156 break;
7157 case Intrinsic::frexp:
7158 Opcode = ISD::FFREXP;
7159 break;
7160 }
7161 SmallVector<EVT, 2> ValueVTs;
7162 ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);
7163 SDVTList VTs = DAG.getVTList(ValueVTs);
7164 setValue(
7165 &I, DAG.getNode(Opcode, sdl, VTs, getValue(I.getArgOperand(0)), Flags));
7166 return;
7167 }
7168 case Intrinsic::arithmetic_fence: {
7169 setValue(&I, DAG.getNode(ISD::ARITH_FENCE, sdl,
7170 getValue(I.getArgOperand(0)).getValueType(),
7171 getValue(I.getArgOperand(0)), Flags));
7172 return;
7173 }
7174 case Intrinsic::fma:
7175 setValue(&I, DAG.getNode(
7176 ISD::FMA, sdl, getValue(I.getArgOperand(0)).getValueType(),
7177 getValue(I.getArgOperand(0)), getValue(I.getArgOperand(1)),
7178 getValue(I.getArgOperand(2)), Flags));
7179 return;
7180#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
7181 case Intrinsic::INTRINSIC:
7182#include "llvm/IR/ConstrainedOps.def"
7183 visitConstrainedFPIntrinsic(cast<ConstrainedFPIntrinsic>(I));
7184 return;
7185#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID:
7186#include "llvm/IR/VPIntrinsics.def"
7187 visitVectorPredicationIntrinsic(cast<VPIntrinsic>(I));
7188 return;
7189 case Intrinsic::fptrunc_round: {
7190 // Get the last argument, the metadata and convert it to an integer in the
7191 // call
7192 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(1))->getMetadata();
7193 std::optional<RoundingMode> RoundMode =
7194 convertStrToRoundingMode(cast<MDString>(MD)->getString());
7195
7196 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7197
7198 // Propagate fast-math-flags from IR to node(s).
7199 SDNodeFlags Flags;
7200 Flags.copyFMF(*cast<FPMathOperator>(&I));
7201 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
7202
7204 Result = DAG.getNode(
7205 ISD::FPTRUNC_ROUND, sdl, VT, getValue(I.getArgOperand(0)),
7206 DAG.getTargetConstant((int)*RoundMode, sdl, MVT::i32));
7207 setValue(&I, Result);
7208
7209 return;
7210 }
7211 case Intrinsic::fmuladd: {
7212 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7213 if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
7214 TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), VT)) {
7215 setValue(&I, DAG.getNode(ISD::FMA, sdl,
7216 getValue(I.getArgOperand(0)).getValueType(),
7217 getValue(I.getArgOperand(0)),
7218 getValue(I.getArgOperand(1)),
7219 getValue(I.getArgOperand(2)), Flags));
7220 } else if (TLI.isOperationLegalOrCustom(ISD::FMULADD, VT)) {
7221 // TODO: Support splitting the vector.
7222 setValue(&I, DAG.getNode(ISD::FMULADD, sdl,
7223 getValue(I.getArgOperand(0)).getValueType(),
7224 getValue(I.getArgOperand(0)),
7225 getValue(I.getArgOperand(1)),
7226 getValue(I.getArgOperand(2)), Flags));
7227 } else {
7228 // TODO: Intrinsic calls should have fast-math-flags.
7229 SDValue Mul = DAG.getNode(
7230 ISD::FMUL, sdl, getValue(I.getArgOperand(0)).getValueType(),
7231 getValue(I.getArgOperand(0)), getValue(I.getArgOperand(1)), Flags);
7232 SDValue Add = DAG.getNode(ISD::FADD, sdl,
7233 getValue(I.getArgOperand(0)).getValueType(),
7234 Mul, getValue(I.getArgOperand(2)), Flags);
7235 setValue(&I, Add);
7236 }
7237 return;
7238 }
7239 case Intrinsic::fptosi_sat: {
7240 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7241 setValue(&I, DAG.getNode(ISD::FP_TO_SINT_SAT, sdl, VT,
7242 getValue(I.getArgOperand(0)),
7243 DAG.getValueType(VT.getScalarType())));
7244 return;
7245 }
7246 case Intrinsic::fptoui_sat: {
7247 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7248 setValue(&I, DAG.getNode(ISD::FP_TO_UINT_SAT, sdl, VT,
7249 getValue(I.getArgOperand(0)),
7250 DAG.getValueType(VT.getScalarType())));
7251 return;
7252 }
7253 case Intrinsic::convert_from_arbitrary_fp: {
7254 // Extract format metadata and convert to semantics enum.
7255 EVT DstVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7256 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(1))->getMetadata();
7257 StringRef FormatStr = cast<MDString>(MD)->getString();
7258 const fltSemantics *SrcSem =
7260 if (!SrcSem) {
7261 DAG.getContext()->emitError(
7262 "convert_from_arbitrary_fp: not implemented format '" + FormatStr +
7263 "'");
7264 setValue(&I, DAG.getPOISON(DstVT));
7265 return;
7266 }
7268
7269 SDValue IntVal = getValue(I.getArgOperand(0));
7270
7271 // Emit ISD::CONVERT_FROM_ARBITRARY_FP node.
7272 SDValue SemConst =
7273 DAG.getTargetConstant(static_cast<int>(SemEnum), sdl, MVT::i32);
7274 setValue(&I, DAG.getNode(ISD::CONVERT_FROM_ARBITRARY_FP, sdl, DstVT, IntVal,
7275 SemConst));
7276 return;
7277 }
7278 case Intrinsic::convert_to_arbitrary_fp: {
7279 // Extract format metadata and convert to semantics enum.
7280 EVT DstVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7281 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(1))->getMetadata();
7282 StringRef FormatStr = cast<MDString>(MD)->getString();
7283 const fltSemantics *DstSem =
7285 if (!DstSem) {
7286 DAG.getContext()->emitError(
7287 "convert_to_arbitrary_fp: not implemented format '" + FormatStr +
7288 "'");
7289 setValue(&I, DAG.getPOISON(DstVT));
7290 return;
7291 }
7293
7294 Metadata *RoundMD =
7295 cast<MetadataAsValue>(I.getArgOperand(2))->getMetadata();
7296 StringRef RoundStr = cast<MDString>(RoundMD)->getString();
7297 std::optional<RoundingMode> RoundMode = convertStrToRoundingMode(RoundStr);
7298 assert(RoundMode && *RoundMode != RoundingMode::Dynamic &&
7299 "Dynamic rounding mode should have been rejected by the verifier");
7300
7301 uint64_t Saturate =
7302 cast<ConstantInt>(I.getArgOperand(3))->getZExtValue() ? 1 : 0;
7303
7304 SDValue FloatVal = getValue(I.getArgOperand(0));
7305
7306 SDValue SemConst =
7307 DAG.getTargetConstant(static_cast<int>(SemEnum), sdl, MVT::i32);
7308 SDValue RoundConst =
7309 DAG.getTargetConstant(static_cast<int>(*RoundMode), sdl, MVT::i32);
7310 SDValue SatConst = DAG.getTargetConstant(Saturate, sdl, MVT::i32);
7311 setValue(&I, DAG.getNode(ISD::CONVERT_TO_ARBITRARY_FP, sdl, DstVT, FloatVal,
7312 SemConst, RoundConst, SatConst));
7313 return;
7314 }
7315 case Intrinsic::set_rounding:
7316 Res = DAG.getNode(ISD::SET_ROUNDING, sdl, MVT::Other,
7317 {getRoot(), getValue(I.getArgOperand(0))});
7318 setValue(&I, Res);
7319 DAG.setRoot(Res.getValue(0));
7320 return;
7321 case Intrinsic::is_fpclass: {
7322 const DataLayout DLayout = DAG.getDataLayout();
7323 EVT DestVT = TLI.getValueType(DLayout, I.getType());
7324 EVT ArgVT = TLI.getValueType(DLayout, I.getArgOperand(0)->getType());
7325 FPClassTest Test = static_cast<FPClassTest>(
7326 cast<ConstantInt>(I.getArgOperand(1))->getZExtValue());
7327 MachineFunction &MF = DAG.getMachineFunction();
7328 const Function &F = MF.getFunction();
7329 SDValue Op = getValue(I.getArgOperand(0));
7330 SDNodeFlags Flags;
7331 Flags.setNoFPExcept(
7332 !F.getAttributes().hasFnAttr(llvm::Attribute::StrictFP));
7333 // If ISD::IS_FPCLASS should be expanded, do it right now, because the
7334 // expansion can use illegal types. Making expansion early allows
7335 // legalizing these types prior to selection.
7336 if (!TLI.isOperationLegal(ISD::IS_FPCLASS, ArgVT) &&
7337 !TLI.isOperationCustom(ISD::IS_FPCLASS, ArgVT)) {
7338 SDValue Result = TLI.expandIS_FPCLASS(DestVT, Op, Test, Flags, sdl, DAG);
7339 setValue(&I, Result);
7340 return;
7341 }
7342
7343 SDValue Check = DAG.getTargetConstant(Test, sdl, MVT::i32);
7344 SDValue V = DAG.getNode(ISD::IS_FPCLASS, sdl, DestVT, {Op, Check}, Flags);
7345 setValue(&I, V);
7346 return;
7347 }
7348 case Intrinsic::get_fpenv: {
7349 const DataLayout DLayout = DAG.getDataLayout();
7350 EVT EnvVT = TLI.getValueType(DLayout, I.getType());
7351 Align TempAlign = DAG.getEVTAlign(EnvVT);
7352 SDValue Chain = getRoot();
7353 // Use GET_FPENV if it is legal or custom. Otherwise use memory-based node
7354 // and temporary storage in stack.
7355 if (TLI.isOperationLegalOrCustom(ISD::GET_FPENV, EnvVT)) {
7356 Res = DAG.getNode(
7357 ISD::GET_FPENV, sdl,
7358 DAG.getVTList(TLI.getValueType(DAG.getDataLayout(), I.getType()),
7359 MVT::Other),
7360 Chain);
7361 } else {
7362 SDValue Temp = DAG.CreateStackTemporary(EnvVT, TempAlign.value());
7363 int SPFI = cast<FrameIndexSDNode>(Temp.getNode())->getIndex();
7364 auto MPI =
7365 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI);
7366 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
7368 TempAlign);
7369 Chain = DAG.getGetFPEnv(Chain, sdl, Temp, EnvVT, MMO);
7370 Res = DAG.getLoad(EnvVT, sdl, Chain, Temp, MPI);
7371 }
7372 setValue(&I, Res);
7373 DAG.setRoot(Res.getValue(1));
7374 return;
7375 }
7376 case Intrinsic::set_fpenv: {
7377 const DataLayout DLayout = DAG.getDataLayout();
7378 SDValue Env = getValue(I.getArgOperand(0));
7379 EVT EnvVT = Env.getValueType();
7380 Align TempAlign = DAG.getEVTAlign(EnvVT);
7381 SDValue Chain = getRoot();
7382 // If SET_FPENV is custom or legal, use it. Otherwise use loading
7383 // environment from memory.
7384 if (TLI.isOperationLegalOrCustom(ISD::SET_FPENV, EnvVT)) {
7385 Chain = DAG.getNode(ISD::SET_FPENV, sdl, MVT::Other, Chain, Env);
7386 } else {
7387 // Allocate space in stack, copy environment bits into it and use this
7388 // memory in SET_FPENV_MEM.
7389 SDValue Temp = DAG.CreateStackTemporary(EnvVT, TempAlign.value());
7390 int SPFI = cast<FrameIndexSDNode>(Temp.getNode())->getIndex();
7391 auto MPI =
7392 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI);
7393 Chain = DAG.getStore(Chain, sdl, Env, Temp, MPI, TempAlign,
7395 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
7397 TempAlign);
7398 Chain = DAG.getSetFPEnv(Chain, sdl, Temp, EnvVT, MMO);
7399 }
7400 DAG.setRoot(Chain);
7401 return;
7402 }
7403 case Intrinsic::reset_fpenv:
7404 DAG.setRoot(DAG.getNode(ISD::RESET_FPENV, sdl, MVT::Other, getRoot()));
7405 return;
7406 case Intrinsic::get_fpmode:
7407 Res = DAG.getNode(
7408 ISD::GET_FPMODE, sdl,
7409 DAG.getVTList(TLI.getValueType(DAG.getDataLayout(), I.getType()),
7410 MVT::Other),
7411 DAG.getRoot());
7412 setValue(&I, Res);
7413 DAG.setRoot(Res.getValue(1));
7414 return;
7415 case Intrinsic::set_fpmode:
7416 Res = DAG.getNode(ISD::SET_FPMODE, sdl, MVT::Other, {DAG.getRoot()},
7417 getValue(I.getArgOperand(0)));
7418 DAG.setRoot(Res);
7419 return;
7420 case Intrinsic::reset_fpmode: {
7421 Res = DAG.getNode(ISD::RESET_FPMODE, sdl, MVT::Other, getRoot());
7422 DAG.setRoot(Res);
7423 return;
7424 }
7425 case Intrinsic::pcmarker: {
7426 SDValue Tmp = getValue(I.getArgOperand(0));
7427 DAG.setRoot(DAG.getNode(ISD::PCMARKER, sdl, MVT::Other, getRoot(), Tmp));
7428 return;
7429 }
7430 case Intrinsic::readcyclecounter: {
7431 SDValue Op = getRoot();
7432 Res = DAG.getNode(ISD::READCYCLECOUNTER, sdl,
7433 DAG.getVTList(MVT::i64, MVT::Other), Op);
7434 setValue(&I, Res);
7435 DAG.setRoot(Res.getValue(1));
7436 return;
7437 }
7438 case Intrinsic::readsteadycounter: {
7439 SDValue Op = getRoot();
7440 Res = DAG.getNode(ISD::READSTEADYCOUNTER, sdl,
7441 DAG.getVTList(MVT::i64, MVT::Other), Op);
7442 setValue(&I, Res);
7443 DAG.setRoot(Res.getValue(1));
7444 return;
7445 }
7446 case Intrinsic::bitreverse:
7447 setValue(&I, DAG.getNode(ISD::BITREVERSE, sdl,
7448 getValue(I.getArgOperand(0)).getValueType(),
7449 getValue(I.getArgOperand(0))));
7450 return;
7451 case Intrinsic::bswap:
7452 setValue(&I, DAG.getNode(ISD::BSWAP, sdl,
7453 getValue(I.getArgOperand(0)).getValueType(),
7454 getValue(I.getArgOperand(0))));
7455 return;
7456 case Intrinsic::cttz: {
7457 SDValue Arg = getValue(I.getArgOperand(0));
7458 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
7459 EVT Ty = Arg.getValueType();
7460 setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTTZ : ISD::CTTZ_ZERO_POISON,
7461 sdl, Ty, Arg));
7462 return;
7463 }
7464 case Intrinsic::ctlz: {
7465 SDValue Arg = getValue(I.getArgOperand(0));
7466 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
7467 EVT Ty = Arg.getValueType();
7468 setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTLZ : ISD::CTLZ_ZERO_POISON,
7469 sdl, Ty, Arg));
7470 return;
7471 }
7472 case Intrinsic::ctpop: {
7473 SDValue Arg = getValue(I.getArgOperand(0));
7474 EVT Ty = Arg.getValueType();
7475 setValue(&I, DAG.getNode(ISD::CTPOP, sdl, Ty, Arg));
7476 return;
7477 }
7478 case Intrinsic::fshl:
7479 case Intrinsic::fshr: {
7480 bool IsFSHL = Intrinsic == Intrinsic::fshl;
7481 SDValue X = getValue(I.getArgOperand(0));
7482 SDValue Y = getValue(I.getArgOperand(1));
7483 SDValue Z = getValue(I.getArgOperand(2));
7484 EVT VT = X.getValueType();
7485
7486 if (X == Y) {
7487 auto RotateOpcode = IsFSHL ? ISD::ROTL : ISD::ROTR;
7488 setValue(&I, DAG.getNode(RotateOpcode, sdl, VT, X, Z));
7489 } else {
7490 auto FunnelOpcode = IsFSHL ? ISD::FSHL : ISD::FSHR;
7491 setValue(&I, DAG.getNode(FunnelOpcode, sdl, VT, X, Y, Z));
7492 }
7493 return;
7494 }
7495 case Intrinsic::clmul: {
7496 SDValue X = getValue(I.getArgOperand(0));
7497 SDValue Y = getValue(I.getArgOperand(1));
7498 setValue(&I, DAG.getNode(ISD::CLMUL, sdl, X.getValueType(), X, Y));
7499 return;
7500 }
7501 case Intrinsic::pext: {
7502 SDValue X = getValue(I.getArgOperand(0));
7503 SDValue Y = getValue(I.getArgOperand(1));
7504 setValue(&I, DAG.getNode(ISD::PEXT, sdl, X.getValueType(), X, Y));
7505 return;
7506 }
7507 case Intrinsic::pdep: {
7508 SDValue X = getValue(I.getArgOperand(0));
7509 SDValue Y = getValue(I.getArgOperand(1));
7510 setValue(&I, DAG.getNode(ISD::PDEP, sdl, X.getValueType(), X, Y));
7511 return;
7512 }
7513 case Intrinsic::sadd_sat: {
7514 SDValue Op1 = getValue(I.getArgOperand(0));
7515 SDValue Op2 = getValue(I.getArgOperand(1));
7516 setValue(&I, DAG.getNode(ISD::SADDSAT, sdl, Op1.getValueType(), Op1, Op2));
7517 return;
7518 }
7519 case Intrinsic::uadd_sat: {
7520 SDValue Op1 = getValue(I.getArgOperand(0));
7521 SDValue Op2 = getValue(I.getArgOperand(1));
7522 setValue(&I, DAG.getNode(ISD::UADDSAT, sdl, Op1.getValueType(), Op1, Op2));
7523 return;
7524 }
7525 case Intrinsic::ssub_sat: {
7526 SDValue Op1 = getValue(I.getArgOperand(0));
7527 SDValue Op2 = getValue(I.getArgOperand(1));
7528 setValue(&I, DAG.getNode(ISD::SSUBSAT, sdl, Op1.getValueType(), Op1, Op2));
7529 return;
7530 }
7531 case Intrinsic::usub_sat: {
7532 SDValue Op1 = getValue(I.getArgOperand(0));
7533 SDValue Op2 = getValue(I.getArgOperand(1));
7534 setValue(&I, DAG.getNode(ISD::USUBSAT, sdl, Op1.getValueType(), Op1, Op2));
7535 return;
7536 }
7537 case Intrinsic::sshl_sat:
7538 case Intrinsic::ushl_sat: {
7539 SDValue Op1 = getValue(I.getArgOperand(0));
7540 SDValue Op2 = getValue(I.getArgOperand(1));
7541
7542 EVT ShiftTy = DAG.getTargetLoweringInfo().getShiftAmountTy(
7543 Op1.getValueType(), DAG.getDataLayout());
7544
7545 // Coerce the shift amount to the right type if we can. This exposes the
7546 // truncate or zext to optimization early.
7547 if (!I.getType()->isVectorTy() && Op2.getValueType() != ShiftTy) {
7548 assert(ShiftTy.getSizeInBits() >=
7550 "Unexpected shift type");
7551 Op2 = DAG.getZExtOrTrunc(Op2, getCurSDLoc(), ShiftTy);
7552 }
7553
7554 unsigned Opc =
7555 Intrinsic == Intrinsic::sshl_sat ? ISD::SSHLSAT : ISD::USHLSAT;
7556 setValue(&I, DAG.getNode(Opc, sdl, Op1.getValueType(), Op1, Op2));
7557 return;
7558 }
7559 case Intrinsic::smul_fix:
7560 case Intrinsic::umul_fix:
7561 case Intrinsic::smul_fix_sat:
7562 case Intrinsic::umul_fix_sat: {
7563 SDValue Op1 = getValue(I.getArgOperand(0));
7564 SDValue Op2 = getValue(I.getArgOperand(1));
7565 SDValue Op3 = getValue(I.getArgOperand(2));
7566 setValue(&I, DAG.getNode(FixedPointIntrinsicToOpcode(Intrinsic), sdl,
7567 Op1.getValueType(), Op1, Op2, Op3));
7568 return;
7569 }
7570 case Intrinsic::sdiv_fix:
7571 case Intrinsic::udiv_fix:
7572 case Intrinsic::sdiv_fix_sat:
7573 case Intrinsic::udiv_fix_sat: {
7574 SDValue Op1 = getValue(I.getArgOperand(0));
7575 SDValue Op2 = getValue(I.getArgOperand(1));
7576 SDValue Op3 = getValue(I.getArgOperand(2));
7578 Op1, Op2, Op3, DAG, TLI));
7579 return;
7580 }
7581 case Intrinsic::smax: {
7582 SDValue Op1 = getValue(I.getArgOperand(0));
7583 SDValue Op2 = getValue(I.getArgOperand(1));
7584 setValue(&I, DAG.getNode(ISD::SMAX, sdl, Op1.getValueType(), Op1, Op2));
7585 return;
7586 }
7587 case Intrinsic::smin: {
7588 SDValue Op1 = getValue(I.getArgOperand(0));
7589 SDValue Op2 = getValue(I.getArgOperand(1));
7590 setValue(&I, DAG.getNode(ISD::SMIN, sdl, Op1.getValueType(), Op1, Op2));
7591 return;
7592 }
7593 case Intrinsic::umax: {
7594 SDValue Op1 = getValue(I.getArgOperand(0));
7595 SDValue Op2 = getValue(I.getArgOperand(1));
7596 setValue(&I, DAG.getNode(ISD::UMAX, sdl, Op1.getValueType(), Op1, Op2));
7597 return;
7598 }
7599 case Intrinsic::umin: {
7600 SDValue Op1 = getValue(I.getArgOperand(0));
7601 SDValue Op2 = getValue(I.getArgOperand(1));
7602 setValue(&I, DAG.getNode(ISD::UMIN, sdl, Op1.getValueType(), Op1, Op2));
7603 return;
7604 }
7605 case Intrinsic::abs: {
7606 SDValue Op1 = getValue(I.getArgOperand(0));
7607 bool IntMinIsPoison = cast<ConstantInt>(I.getArgOperand(1))->isOne();
7608 unsigned Opc = IntMinIsPoison ? ISD::ABS_MIN_POISON : ISD::ABS;
7609 setValue(&I, DAG.getNode(Opc, sdl, Op1.getValueType(), Op1));
7610 return;
7611 }
7612 case Intrinsic::scmp: {
7613 SDValue Op1 = getValue(I.getArgOperand(0));
7614 SDValue Op2 = getValue(I.getArgOperand(1));
7615 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7616 setValue(&I, DAG.getNode(ISD::SCMP, sdl, DestVT, Op1, Op2));
7617 break;
7618 }
7619 case Intrinsic::ucmp: {
7620 SDValue Op1 = getValue(I.getArgOperand(0));
7621 SDValue Op2 = getValue(I.getArgOperand(1));
7622 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7623 setValue(&I, DAG.getNode(ISD::UCMP, sdl, DestVT, Op1, Op2));
7624 break;
7625 }
7626 case Intrinsic::stackaddress:
7627 case Intrinsic::stacksave: {
7628 unsigned SDOpcode = Intrinsic == Intrinsic::stackaddress ? ISD::STACKADDRESS
7630 SDValue Op = getRoot();
7631 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7632 Res = DAG.getNode(SDOpcode, sdl, DAG.getVTList(VT, MVT::Other), Op);
7633 setValue(&I, Res);
7634 DAG.setRoot(Res.getValue(1));
7635 return;
7636 }
7637 case Intrinsic::stackrestore:
7638 Res = getValue(I.getArgOperand(0));
7639 DAG.setRoot(DAG.getNode(ISD::STACKRESTORE, sdl, MVT::Other, getRoot(), Res));
7640 return;
7641 case Intrinsic::get_dynamic_area_offset: {
7642 SDValue Op = getRoot();
7643 EVT ResTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
7644 Res = DAG.getNode(ISD::GET_DYNAMIC_AREA_OFFSET, sdl, DAG.getVTList(ResTy),
7645 Op);
7646 DAG.setRoot(Op);
7647 setValue(&I, Res);
7648 return;
7649 }
7650 case Intrinsic::stackguard: {
7651 MachineFunction &MF = DAG.getMachineFunction();
7652 const Module &M = *MF.getFunction().getParent();
7653 EVT PtrTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
7654 SDValue Chain = getRoot();
7655 if (TLI.useLoadStackGuardNode(M)) {
7656 Res = getLoadStackGuard(DAG, sdl, Chain);
7657 Res = DAG.getPtrExtOrTrunc(Res, sdl, PtrTy);
7658 } else {
7659 const Value *Global = TLI.getSDagStackGuard(M, DAG.getLibcalls());
7660 if (!Global) {
7661 LLVMContext &Ctx = *DAG.getContext();
7662 Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
7663 setValue(&I, DAG.getPOISON(PtrTy));
7664 return;
7665 }
7666
7667 Align Align = DAG.getDataLayout().getPrefTypeAlign(Global->getType());
7668 Res = DAG.getLoad(PtrTy, sdl, Chain, getValue(Global),
7669 MachinePointerInfo(Global, 0), Align,
7671 }
7672 // Mix the cookie with FP if enabled. Skip if using LOAD_STACK_GUARD
7673 // with post-RA mixing (AArch64 MSVCRT), as the mixing will be done during
7674 // post-RA expansion of LOAD_STACK_GUARD.
7675 if (TLI.useStackGuardMixFP() && !TLI.useLoadStackGuardNode(M))
7676 Res = TLI.emitStackGuardMixFP(DAG, Res, sdl);
7677 DAG.setRoot(Chain);
7678 setValue(&I, Res);
7679 return;
7680 }
7681 case Intrinsic::stackprotector: {
7682 // Emit code into the DAG to store the stack guard onto the stack.
7683 MachineFunction &MF = DAG.getMachineFunction();
7684 MachineFrameInfo &MFI = MF.getFrameInfo();
7685 const Module &M = *MF.getFunction().getParent();
7686 SDValue Src, Chain = getRoot();
7687
7688 if (TLI.useLoadStackGuardNode(M))
7689 Src = getLoadStackGuard(DAG, sdl, Chain);
7690 else
7691 Src = getValue(I.getArgOperand(0)); // The guard's value.
7692
7693 AllocaInst *Slot = cast<AllocaInst>(I.getArgOperand(1));
7694
7695 int FI = FuncInfo.StaticAllocaMap[Slot];
7696 MFI.setStackProtectorIndex(FI);
7697 EVT PtrTy = TLI.getFrameIndexTy(DAG.getDataLayout());
7698
7699 SDValue FIN = DAG.getFrameIndex(FI, PtrTy);
7700
7701 // Store the stack protector onto the stack.
7702 Res = DAG.getStore(
7703 Chain, sdl, Src, FIN,
7704 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI),
7705 MaybeAlign(), MachineMemOperand::MOVolatile);
7706 setValue(&I, Res);
7707 DAG.setRoot(Res);
7708 return;
7709 }
7710 case Intrinsic::objectsize:
7711 llvm_unreachable("llvm.objectsize.* should have been lowered already");
7712
7713 case Intrinsic::is_constant:
7714 llvm_unreachable("llvm.is.constant.* should have been lowered already");
7715
7716 case Intrinsic::annotation:
7717 case Intrinsic::ptr_annotation:
7718 case Intrinsic::launder_invariant_group:
7719 case Intrinsic::strip_invariant_group:
7720 // Drop the intrinsic, but forward the value
7721 setValue(&I, getValue(I.getOperand(0)));
7722 return;
7723
7724 case Intrinsic::type_test:
7725 case Intrinsic::public_type_test:
7726 case Intrinsic::type_checked_load:
7727 case Intrinsic::type_checked_load_relative: {
7728 // These intrinsics are expected to be lowered by the LowerTypeTests pass
7729 // before code generation. Surviving until here usually indicates a
7730 // misconfiguration, for instance when devirtualization is enabled but LTO
7731 // does not actually run.
7732 DAG.getContext()->diagnose(DiagnosticInfoUnsupported(
7733 *I.getFunction(),
7734 Intrinsic::getBaseName(Intrinsic) +
7735 " intrinsic must be lowered by the LowerTypeTests pass "
7736 "before code generation",
7737 sdl.getDebugLoc()));
7738
7739 // Lower the result to poison so that compilation can continue and collect
7740 // any further diagnostics.
7741 setValueToPoison(&I, sdl);
7742 return;
7743 }
7744
7745 case Intrinsic::assume:
7746 case Intrinsic::experimental_noalias_scope_decl:
7747 case Intrinsic::var_annotation:
7748 case Intrinsic::sideeffect:
7749 // Discard annotate attributes, noalias scope declarations, assumptions, and
7750 // artificial side-effects.
7751 return;
7752
7753 case Intrinsic::codeview_annotation: {
7754 // Emit a label associated with this metadata.
7755 MachineFunction &MF = DAG.getMachineFunction();
7756 MCSymbol *Label = MF.getContext().createTempSymbol("annotation", true);
7757 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(0))->getMetadata();
7758 MF.addCodeViewAnnotation(Label, cast<MDNode>(MD));
7759 Res = DAG.getLabelNode(ISD::ANNOTATION_LABEL, sdl, getRoot(), Label);
7760 DAG.setRoot(Res);
7761 return;
7762 }
7763
7764 case Intrinsic::init_trampoline: {
7765 const Function *F = cast<Function>(I.getArgOperand(1)->stripPointerCasts());
7766
7767 SDValue Ops[6];
7768 Ops[0] = getRoot();
7769 Ops[1] = getValue(I.getArgOperand(0));
7770 Ops[2] = getValue(I.getArgOperand(1));
7771 Ops[3] = getValue(I.getArgOperand(2));
7772 Ops[4] = DAG.getSrcValue(I.getArgOperand(0));
7773 Ops[5] = DAG.getSrcValue(F);
7774
7775 Res = DAG.getNode(ISD::INIT_TRAMPOLINE, sdl, MVT::Other, Ops);
7776
7777 DAG.setRoot(Res);
7778 return;
7779 }
7780 case Intrinsic::adjust_trampoline:
7781 setValue(&I, DAG.getNode(ISD::ADJUST_TRAMPOLINE, sdl,
7782 TLI.getPointerTy(DAG.getDataLayout()),
7783 getValue(I.getArgOperand(0))));
7784 return;
7785 case Intrinsic::gcroot: {
7786 assert(DAG.getMachineFunction().getFunction().hasGC() &&
7787 "only valid in functions with gc specified, enforced by Verifier");
7788 assert(GFI && "implied by previous");
7789 const Value *Alloca = I.getArgOperand(0)->stripPointerCasts();
7790 const Constant *TypeMap = cast<Constant>(I.getArgOperand(1));
7791
7792 FrameIndexSDNode *FI = cast<FrameIndexSDNode>(getValue(Alloca).getNode());
7793 GFI->addStackRoot(FI->getIndex(), TypeMap);
7794 return;
7795 }
7796 case Intrinsic::gcread:
7797 case Intrinsic::gcwrite:
7798 llvm_unreachable("GC failed to lower gcread/gcwrite intrinsics!");
7799 case Intrinsic::get_rounding:
7800 Res = DAG.getNode(ISD::GET_ROUNDING, sdl, {MVT::i32, MVT::Other}, getRoot());
7801 setValue(&I, Res);
7802 DAG.setRoot(Res.getValue(1));
7803 return;
7804
7805 case Intrinsic::expect:
7806 case Intrinsic::expect_with_probability:
7807 // Just replace __builtin_expect(exp, c) and
7808 // __builtin_expect_with_probability(exp, c, p) with EXP.
7809 setValue(&I, getValue(I.getArgOperand(0)));
7810 return;
7811
7812 case Intrinsic::ubsantrap:
7813 case Intrinsic::debugtrap:
7814 case Intrinsic::trap: {
7815 StringRef TrapFuncName =
7816 I.getAttributes().getFnAttr("trap-func-name").getValueAsString();
7817 if (TrapFuncName.empty()) {
7818 switch (Intrinsic) {
7819 case Intrinsic::trap:
7820 DAG.setRoot(DAG.getNode(ISD::TRAP, sdl, MVT::Other, getRoot()));
7821 break;
7822 case Intrinsic::debugtrap:
7823 DAG.setRoot(DAG.getNode(ISD::DEBUGTRAP, sdl, MVT::Other, getRoot()));
7824 break;
7825 case Intrinsic::ubsantrap:
7826 DAG.setRoot(DAG.getNode(
7827 ISD::UBSANTRAP, sdl, MVT::Other, getRoot(),
7828 DAG.getTargetConstant(
7829 cast<ConstantInt>(I.getArgOperand(0))->getZExtValue(), sdl,
7830 MVT::i32)));
7831 break;
7832 default: llvm_unreachable("unknown trap intrinsic");
7833 }
7834 DAG.addNoMergeSiteInfo(DAG.getRoot().getNode(),
7835 I.hasFnAttr(Attribute::NoMerge));
7836 return;
7837 }
7839 if (Intrinsic == Intrinsic::ubsantrap) {
7840 Value *Arg = I.getArgOperand(0);
7841 Args.emplace_back(Arg, getValue(Arg));
7842 }
7843
7844 TargetLowering::CallLoweringInfo CLI(DAG);
7845 CLI.setDebugLoc(sdl).setChain(getRoot()).setLibCallee(
7846 CallingConv::C, I.getType(),
7847 DAG.getExternalSymbol(TrapFuncName.data(),
7848 TLI.getPointerTy(DAG.getDataLayout())),
7849 std::move(Args));
7850 CLI.NoMerge = I.hasFnAttr(Attribute::NoMerge);
7851 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
7852 DAG.setRoot(Result.second);
7853 return;
7854 }
7855
7856 case Intrinsic::allow_runtime_check:
7857 case Intrinsic::allow_ubsan_check:
7858 setValue(&I, getValue(ConstantInt::getTrue(I.getType())));
7859 return;
7860
7861 case Intrinsic::uadd_with_overflow:
7862 case Intrinsic::sadd_with_overflow:
7863 case Intrinsic::usub_with_overflow:
7864 case Intrinsic::ssub_with_overflow:
7865 case Intrinsic::umul_with_overflow:
7866 case Intrinsic::smul_with_overflow: {
7868 switch (Intrinsic) {
7869 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
7870 case Intrinsic::uadd_with_overflow: Op = ISD::UADDO; break;
7871 case Intrinsic::sadd_with_overflow: Op = ISD::SADDO; break;
7872 case Intrinsic::usub_with_overflow: Op = ISD::USUBO; break;
7873 case Intrinsic::ssub_with_overflow: Op = ISD::SSUBO; break;
7874 case Intrinsic::umul_with_overflow: Op = ISD::UMULO; break;
7875 case Intrinsic::smul_with_overflow: Op = ISD::SMULO; break;
7876 }
7877 SDValue Op1 = getValue(I.getArgOperand(0));
7878 SDValue Op2 = getValue(I.getArgOperand(1));
7879
7880 EVT ResultVT = Op1.getValueType();
7881 EVT OverflowVT = ResultVT.changeElementType(*Context, MVT::i1);
7882
7883 SDVTList VTs = DAG.getVTList(ResultVT, OverflowVT);
7884 setValue(&I, DAG.getNode(Op, sdl, VTs, Op1, Op2));
7885 return;
7886 }
7887 case Intrinsic::prefetch: {
7888 SDValue Ops[5];
7889 unsigned rw = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
7891 Ops[0] = DAG.getRoot();
7892 Ops[1] = getValue(I.getArgOperand(0));
7893 Ops[2] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(1)), sdl,
7894 MVT::i32);
7895 Ops[3] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(2)), sdl,
7896 MVT::i32);
7897 Ops[4] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(3)), sdl,
7898 MVT::i32);
7899 SDValue Result = DAG.getMemIntrinsicNode(
7900 ISD::PREFETCH, sdl, DAG.getVTList(MVT::Other), Ops,
7901 EVT::getIntegerVT(*Context, 8), MachinePointerInfo(I.getArgOperand(0)),
7902 /* align */ std::nullopt, Flags);
7903
7904 // Chain the prefetch in parallel with any pending loads, to stay out of
7905 // the way of later optimizations.
7906 PendingLoads.push_back(Result);
7907 Result = getRoot();
7908 DAG.setRoot(Result);
7909 return;
7910 }
7911 case Intrinsic::lifetime_start:
7912 case Intrinsic::lifetime_end: {
7913 bool IsStart = (Intrinsic == Intrinsic::lifetime_start);
7914 // Stack coloring is not enabled in O0, discard region information.
7915 if (TM.getOptLevel() == CodeGenOptLevel::None)
7916 return;
7917
7918 const AllocaInst *LifetimeObject = dyn_cast<AllocaInst>(I.getArgOperand(0));
7919 if (!LifetimeObject)
7920 return;
7921
7922 // First check that the Alloca is static, otherwise it won't have a
7923 // valid frame index.
7924 auto SI = FuncInfo.StaticAllocaMap.find(LifetimeObject);
7925 if (SI == FuncInfo.StaticAllocaMap.end())
7926 return;
7927
7928 const int FrameIndex = SI->second;
7929 Res = DAG.getLifetimeNode(IsStart, sdl, getRoot(), FrameIndex);
7930 DAG.setRoot(Res);
7931 return;
7932 }
7933 case Intrinsic::pseudoprobe: {
7934 auto Guid = cast<ConstantInt>(I.getArgOperand(0))->getZExtValue();
7935 auto Index = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
7936 auto Attr = cast<ConstantInt>(I.getArgOperand(2))->getZExtValue();
7937 Res = DAG.getPseudoProbeNode(sdl, getRoot(), Guid, Index, Attr);
7938 DAG.setRoot(Res);
7939 return;
7940 }
7941 case Intrinsic::invariant_start:
7942 // Discard region information.
7943 setValue(&I,
7944 DAG.getUNDEF(TLI.getValueType(DAG.getDataLayout(), I.getType())));
7945 return;
7946 case Intrinsic::invariant_end:
7947 // Discard region information.
7948 return;
7949 case Intrinsic::clear_cache: {
7950 SDValue InputChain = DAG.getRoot();
7951 SDValue StartVal = getValue(I.getArgOperand(0));
7952 SDValue EndVal = getValue(I.getArgOperand(1));
7953 Res = DAG.getNode(ISD::CLEAR_CACHE, sdl, DAG.getVTList(MVT::Other),
7954 {InputChain, StartVal, EndVal});
7955 setValue(&I, Res);
7956 DAG.setRoot(Res);
7957 return;
7958 }
7959 case Intrinsic::donothing:
7960 case Intrinsic::seh_try_begin:
7961 case Intrinsic::seh_scope_begin:
7962 case Intrinsic::seh_try_end:
7963 case Intrinsic::seh_scope_end:
7964 // ignore
7965 return;
7966 case Intrinsic::experimental_stackmap:
7967 visitStackmap(I);
7968 return;
7969 case Intrinsic::experimental_patchpoint_void:
7970 case Intrinsic::experimental_patchpoint:
7971 visitPatchpoint(I);
7972 return;
7973 case Intrinsic::experimental_gc_statepoint:
7975 return;
7976 case Intrinsic::experimental_gc_result:
7977 visitGCResult(cast<GCResultInst>(I));
7978 return;
7979 case Intrinsic::experimental_gc_relocate:
7980 visitGCRelocate(cast<GCRelocateInst>(I));
7981 return;
7982 case Intrinsic::instrprof_cover:
7983 llvm_unreachable("instrprof failed to lower a cover");
7984 case Intrinsic::instrprof_increment:
7985 llvm_unreachable("instrprof failed to lower an increment");
7986 case Intrinsic::instrprof_timestamp:
7987 llvm_unreachable("instrprof failed to lower a timestamp");
7988 case Intrinsic::instrprof_value_profile:
7989 llvm_unreachable("instrprof failed to lower a value profiling call");
7990 case Intrinsic::instrprof_mcdc_parameters:
7991 llvm_unreachable("instrprof failed to lower mcdc parameters");
7992 case Intrinsic::instrprof_mcdc_tvbitmap_update:
7993 llvm_unreachable("instrprof failed to lower an mcdc tvbitmap update");
7994 case Intrinsic::localescape: {
7995 MachineFunction &MF = DAG.getMachineFunction();
7996 const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo();
7997
7998 // Directly emit some LOCAL_ESCAPE machine instrs. Label assignment emission
7999 // is the same on all targets.
8000 for (unsigned Idx = 0, E = I.arg_size(); Idx < E; ++Idx) {
8001 Value *Arg = I.getArgOperand(Idx)->stripPointerCasts();
8002 if (isa<ConstantPointerNull>(Arg))
8003 continue; // Skip null pointers. They represent a hole in index space.
8004 AllocaInst *Slot = cast<AllocaInst>(Arg);
8005 assert(FuncInfo.StaticAllocaMap.count(Slot) &&
8006 "can only escape static allocas");
8007 int FI = FuncInfo.StaticAllocaMap[Slot];
8008 MCSymbol *FrameAllocSym = MF.getContext().getOrCreateFrameAllocSymbol(
8010 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, dl,
8011 TII->get(TargetOpcode::LOCAL_ESCAPE))
8012 .addSym(FrameAllocSym)
8013 .addFrameIndex(FI);
8014 }
8015
8016 return;
8017 }
8018
8019 case Intrinsic::localrecover: {
8020 // i8* @llvm.localrecover(i8* %fn, i8* %fp, i32 %idx)
8021 MachineFunction &MF = DAG.getMachineFunction();
8022
8023 // Get the symbol that defines the frame offset.
8024 auto *Fn = cast<Function>(I.getArgOperand(0)->stripPointerCasts());
8025 auto *Idx = cast<ConstantInt>(I.getArgOperand(2));
8026 unsigned IdxVal =
8027 unsigned(Idx->getLimitedValue(std::numeric_limits<int>::max()));
8028 MCSymbol *FrameAllocSym = MF.getContext().getOrCreateFrameAllocSymbol(
8030
8031 Value *FP = I.getArgOperand(1);
8032 SDValue FPVal = getValue(FP);
8033 EVT PtrVT = FPVal.getValueType();
8034
8035 // Create a MCSymbol for the label to avoid any target lowering
8036 // that would make this PC relative.
8037 SDValue OffsetSym = DAG.getMCSymbol(FrameAllocSym, PtrVT);
8038 SDValue OffsetVal =
8039 DAG.getNode(ISD::LOCAL_RECOVER, sdl, PtrVT, OffsetSym);
8040
8041 // Add the offset to the FP.
8042 SDValue Add = DAG.getMemBasePlusOffset(FPVal, OffsetVal, sdl);
8043 setValue(&I, Add);
8044
8045 return;
8046 }
8047
8048 case Intrinsic::fake_use: {
8049 Value *V = I.getArgOperand(0);
8050 SDValue Ops[2];
8051 // For Values not declared or previously used in this basic block, the
8052 // NodeMap will not have an entry, and `getValue` will assert if V has no
8053 // valid register value.
8054 auto FakeUseValue = [&]() -> SDValue {
8055 SDValue &N = NodeMap[V];
8056 if (N.getNode())
8057 return N;
8058
8059 // If there's a virtual register allocated and initialized for this
8060 // value, use it.
8061 if (SDValue copyFromReg = getCopyFromRegs(V, V->getType()))
8062 return copyFromReg;
8063 // FIXME: Do we want to preserve constants? It seems pointless.
8064 if (isa<Constant>(V))
8065 return getValue(V);
8066 return SDValue();
8067 }();
8068 if (!FakeUseValue || FakeUseValue.isUndef())
8069 return;
8070 Ops[0] = getRoot();
8071 Ops[1] = FakeUseValue;
8072 // Also, do not translate a fake use with an undef operand, or any other
8073 // empty SDValues.
8074 if (!Ops[1] || Ops[1].isUndef())
8075 return;
8076 DAG.setRoot(DAG.getNode(ISD::FAKE_USE, sdl, MVT::Other, Ops));
8077 return;
8078 }
8079
8080 case Intrinsic::reloc_none: {
8081 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(0))->getMetadata();
8082 StringRef SymbolName = cast<MDString>(MD)->getString();
8083 SDValue Ops[2] = {
8084 getRoot(),
8085 DAG.getTargetExternalSymbol(
8086 SymbolName.data(), TLI.getProgramPointerTy(DAG.getDataLayout()))};
8087 DAG.setRoot(DAG.getNode(ISD::RELOC_NONE, sdl, MVT::Other, Ops));
8088 return;
8089 }
8090
8091 case Intrinsic::cond_loop: {
8092 SDValue InputChain = DAG.getRoot();
8093 SDValue P = getValue(I.getArgOperand(0));
8094 Res = DAG.getNode(ISD::COND_LOOP, sdl, DAG.getVTList(MVT::Other),
8095 {InputChain, P});
8096 setValue(&I, Res);
8097 DAG.setRoot(Res);
8098 return;
8099 }
8100
8101 case Intrinsic::eh_exceptionpointer:
8102 case Intrinsic::eh_exceptioncode: {
8103 // Get the exception pointer vreg, copy from it, and resize it to fit.
8104 const auto *CPI = cast<CatchPadInst>(I.getArgOperand(0));
8105 MVT PtrVT = TLI.getPointerTy(DAG.getDataLayout());
8106 const TargetRegisterClass *PtrRC = TLI.getRegClassFor(PtrVT);
8107 Register VReg = FuncInfo.getCatchPadExceptionPointerVReg(CPI, PtrRC);
8108 SDValue N = DAG.getCopyFromReg(DAG.getEntryNode(), sdl, VReg, PtrVT);
8109 if (Intrinsic == Intrinsic::eh_exceptioncode)
8110 N = DAG.getZExtOrTrunc(N, sdl, MVT::i32);
8111 setValue(&I, N);
8112 return;
8113 }
8114 case Intrinsic::xray_customevent: {
8115 // Here we want to make sure that the intrinsic behaves as if it has a
8116 // specific calling convention.
8117 const auto &Triple = DAG.getTarget().getTargetTriple();
8118 if (!Triple.isAArch64(64) && Triple.getArch() != Triple::x86_64 &&
8119 Triple.getArch() != Triple::hexagon)
8120 return;
8121
8123
8124 // We want to say that we always want the arguments in registers.
8125 SDValue LogEntryVal = getValue(I.getArgOperand(0));
8126 SDValue StrSizeVal = getValue(I.getArgOperand(1));
8127 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
8128 SDValue Chain = getRoot();
8129 Ops.push_back(LogEntryVal);
8130 Ops.push_back(StrSizeVal);
8131 Ops.push_back(Chain);
8132
8133 // We need to enforce the calling convention for the callsite, so that
8134 // argument ordering is enforced correctly, and that register allocation can
8135 // see that some registers may be assumed clobbered and have to preserve
8136 // them across calls to the intrinsic.
8137 MachineSDNode *MN = DAG.getMachineNode(TargetOpcode::PATCHABLE_EVENT_CALL,
8138 sdl, NodeTys, Ops);
8139 SDValue patchableNode = SDValue(MN, 0);
8140 DAG.setRoot(patchableNode);
8141 setValue(&I, patchableNode);
8142 return;
8143 }
8144 case Intrinsic::xray_typedevent: {
8145 // Here we want to make sure that the intrinsic behaves as if it has a
8146 // specific calling convention.
8147 const auto &Triple = DAG.getTarget().getTargetTriple();
8148 if (!Triple.isAArch64(64) && Triple.getArch() != Triple::x86_64 &&
8149 Triple.getArch() != Triple::hexagon)
8150 return;
8151
8153
8154 // We want to say that we always want the arguments in registers.
8155 // It's unclear to me how manipulating the selection DAG here forces callers
8156 // to provide arguments in registers instead of on the stack.
8157 SDValue LogTypeId = getValue(I.getArgOperand(0));
8158 SDValue LogEntryVal = getValue(I.getArgOperand(1));
8159 SDValue StrSizeVal = getValue(I.getArgOperand(2));
8160 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
8161 SDValue Chain = getRoot();
8162 Ops.push_back(LogTypeId);
8163 Ops.push_back(LogEntryVal);
8164 Ops.push_back(StrSizeVal);
8165 Ops.push_back(Chain);
8166
8167 // We need to enforce the calling convention for the callsite, so that
8168 // argument ordering is enforced correctly, and that register allocation can
8169 // see that some registers may be assumed clobbered and have to preserve
8170 // them across calls to the intrinsic.
8171 MachineSDNode *MN = DAG.getMachineNode(
8172 TargetOpcode::PATCHABLE_TYPED_EVENT_CALL, sdl, NodeTys, Ops);
8173 SDValue patchableNode = SDValue(MN, 0);
8174 DAG.setRoot(patchableNode);
8175 setValue(&I, patchableNode);
8176 return;
8177 }
8178 case Intrinsic::experimental_deoptimize:
8180 return;
8181 case Intrinsic::stepvector:
8182 visitStepVector(I);
8183 return;
8184 case Intrinsic::vector_reduce_fadd:
8185 case Intrinsic::vector_reduce_fmul:
8186 case Intrinsic::vector_reduce_add:
8187 case Intrinsic::vector_reduce_mul:
8188 case Intrinsic::vector_reduce_and:
8189 case Intrinsic::vector_reduce_or:
8190 case Intrinsic::vector_reduce_xor:
8191 case Intrinsic::vector_reduce_smax:
8192 case Intrinsic::vector_reduce_smin:
8193 case Intrinsic::vector_reduce_umax:
8194 case Intrinsic::vector_reduce_umin:
8195 case Intrinsic::vector_reduce_fmax:
8196 case Intrinsic::vector_reduce_fmin:
8197 case Intrinsic::vector_reduce_fmaximum:
8198 case Intrinsic::vector_reduce_fminimum:
8199 visitVectorReduce(I, Intrinsic);
8200 return;
8201
8202 case Intrinsic::icall_branch_funnel: {
8204 Ops.push_back(getValue(I.getArgOperand(0)));
8205
8206 int64_t Offset;
8208 I.getArgOperand(1), Offset, DAG.getDataLayout()));
8209 if (!Base)
8211 "llvm.icall.branch.funnel operand must be a GlobalValue");
8212 Ops.push_back(DAG.getTargetGlobalAddress(Base, sdl, MVT::i64, 0));
8213
8214 struct BranchFunnelTarget {
8215 int64_t Offset;
8217 };
8219
8220 for (unsigned Op = 1, N = I.arg_size(); Op != N; Op += 2) {
8222 I.getArgOperand(Op), Offset, DAG.getDataLayout()));
8223 if (ElemBase != Base)
8224 report_fatal_error("all llvm.icall.branch.funnel operands must refer "
8225 "to the same GlobalValue");
8226
8227 SDValue Val = getValue(I.getArgOperand(Op + 1));
8228 auto *GA = dyn_cast<GlobalAddressSDNode>(Val);
8229 if (!GA)
8231 "llvm.icall.branch.funnel operand must be a GlobalValue");
8232 Targets.push_back({Offset, DAG.getTargetGlobalAddress(
8233 GA->getGlobal(), sdl, Val.getValueType(),
8234 GA->getOffset())});
8235 }
8236 llvm::sort(Targets,
8237 [](const BranchFunnelTarget &T1, const BranchFunnelTarget &T2) {
8238 return T1.Offset < T2.Offset;
8239 });
8240
8241 for (auto &T : Targets) {
8242 Ops.push_back(DAG.getTargetConstant(T.Offset, sdl, MVT::i32));
8243 Ops.push_back(T.Target);
8244 }
8245
8246 Ops.push_back(DAG.getRoot()); // Chain
8247 SDValue N(DAG.getMachineNode(TargetOpcode::ICALL_BRANCH_FUNNEL, sdl,
8248 MVT::Other, Ops),
8249 0);
8250 DAG.setRoot(N);
8251 setValue(&I, N);
8252 HasTailCall = true;
8253 return;
8254 }
8255
8256 case Intrinsic::wasm_landingpad_index:
8257 // Information this intrinsic contained has been transferred to
8258 // MachineFunction in SelectionDAGISel::PrepareEHLandingPad. We can safely
8259 // delete it now.
8260 return;
8261
8262 case Intrinsic::aarch64_settag:
8263 case Intrinsic::aarch64_settag_zero: {
8264 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
8265 bool ZeroMemory = Intrinsic == Intrinsic::aarch64_settag_zero;
8267 DAG, sdl, getRoot(), getValue(I.getArgOperand(0)),
8268 getValue(I.getArgOperand(1)), MachinePointerInfo(I.getArgOperand(0)),
8269 ZeroMemory);
8270 DAG.setRoot(Val);
8271 setValue(&I, Val);
8272 return;
8273 }
8274 case Intrinsic::amdgcn_cs_chain: {
8275 // At this point we don't care if it's amdgpu_cs_chain or
8276 // amdgpu_cs_chain_preserve.
8278
8279 Type *RetTy = I.getType();
8280 assert(RetTy->isVoidTy() && "Should not return");
8281
8282 SDValue Callee = getValue(I.getOperand(0));
8283
8284 // We only have 2 actual args: one for the SGPRs and one for the VGPRs.
8285 // We'll also tack the value of the EXEC mask at the end.
8287 Args.reserve(3);
8288
8289 for (unsigned Idx : {2, 3, 1}) {
8290 TargetLowering::ArgListEntry Arg(getValue(I.getOperand(Idx)),
8291 I.getOperand(Idx)->getType());
8292 Arg.setAttributes(&I, Idx);
8293 Args.push_back(Arg);
8294 }
8295
8296 assert(Args[0].IsInReg && "SGPR args should be marked inreg");
8297 assert(!Args[1].IsInReg && "VGPR args should not be marked inreg");
8298 Args[2].IsInReg = true; // EXEC should be inreg
8299
8300 // Forward the flags and any additional arguments.
8301 for (unsigned Idx = 4; Idx < I.arg_size(); ++Idx) {
8302 TargetLowering::ArgListEntry Arg(getValue(I.getOperand(Idx)),
8303 I.getOperand(Idx)->getType());
8304 Arg.setAttributes(&I, Idx);
8305 Args.push_back(Arg);
8306 }
8307
8308 TargetLowering::CallLoweringInfo CLI(DAG);
8309 CLI.setDebugLoc(getCurSDLoc())
8310 .setChain(getRoot())
8311 .setCallee(CC, RetTy, Callee, std::move(Args))
8312 .setNoReturn(true)
8313 .setTailCall(true)
8314 .setConvergent(I.isConvergent());
8315 CLI.CB = &I;
8316 std::pair<SDValue, SDValue> Result =
8317 lowerInvokable(CLI, /*EHPadBB*/ nullptr);
8318 (void)Result;
8319 assert(!Result.first.getNode() && !Result.second.getNode() &&
8320 "Should've lowered as tail call");
8321
8322 HasTailCall = true;
8323 return;
8324 }
8325 case Intrinsic::amdgcn_call_whole_wave: {
8327 bool isTailCall = I.isTailCall();
8328
8329 // The first argument is the callee. Skip it when assembling the call args.
8330 for (unsigned Idx = 1; Idx < I.arg_size(); ++Idx) {
8331 TargetLowering::ArgListEntry Arg(getValue(I.getArgOperand(Idx)),
8332 I.getArgOperand(Idx)->getType());
8333 Arg.setAttributes(&I, Idx);
8334
8335 // If we have an explicit sret argument that is an Instruction, (i.e., it
8336 // might point to function-local memory), we can't meaningfully tail-call.
8337 if (Arg.IsSRet && isa<Instruction>(I.getArgOperand(Idx)))
8338 isTailCall = false;
8339
8340 Args.push_back(Arg);
8341 }
8342
8343 SDValue ConvControlToken;
8344 if (auto Bundle = I.getOperandBundle(LLVMContext::OB_convergencectrl)) {
8345 auto *Token = Bundle->Inputs[0].get();
8346 ConvControlToken = getValue(Token);
8347 }
8348
8349 TargetLowering::CallLoweringInfo CLI(DAG);
8350 CLI.setDebugLoc(getCurSDLoc())
8351 .setChain(getRoot())
8352 .setCallee(CallingConv::AMDGPU_Gfx_WholeWave, I.getType(),
8353 getValue(I.getArgOperand(0)), std::move(Args))
8354 .setTailCall(isTailCall && canTailCall(I))
8355 .setIsPreallocated(
8356 I.countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0)
8357 .setConvergent(I.isConvergent())
8358 .setConvergenceControlToken(ConvControlToken);
8359 CLI.CB = &I;
8360
8361 std::pair<SDValue, SDValue> Result =
8362 lowerInvokable(CLI, /*EHPadBB=*/nullptr);
8363
8364 if (Result.first.getNode())
8365 setValue(&I, Result.first);
8366 return;
8367 }
8368 case Intrinsic::ptrmask: {
8369 SDValue Ptr = getValue(I.getOperand(0));
8370 SDValue Mask = getValue(I.getOperand(1));
8371
8372 // On arm64_32, pointers are 32 bits when stored in memory, but
8373 // zero-extended to 64 bits when in registers. Thus the mask is 32 bits to
8374 // match the index type, but the pointer is 64 bits, so the mask must be
8375 // zero-extended up to 64 bits to match the pointer.
8376 EVT PtrVT =
8377 TLI.getValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
8378 EVT MemVT =
8379 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
8380 assert(PtrVT == Ptr.getValueType());
8381 if (Mask.getValueType().getFixedSizeInBits() < MemVT.getFixedSizeInBits()) {
8382 // For AMDGPU buffer descriptors the mask is 48 bits, but the pointer is
8383 // 128-bit, so we have to pad the mask with ones for unused bits.
8384 auto HighOnes = DAG.getNode(
8385 ISD::SHL, sdl, PtrVT, DAG.getAllOnesConstant(sdl, PtrVT),
8386 DAG.getShiftAmountConstant(Mask.getValueType().getFixedSizeInBits(),
8387 PtrVT, sdl));
8388 Mask = DAG.getNode(ISD::OR, sdl, PtrVT,
8389 DAG.getZExtOrTrunc(Mask, sdl, PtrVT), HighOnes);
8390 } else if (Mask.getValueType() != PtrVT)
8391 Mask = DAG.getPtrExtOrTrunc(Mask, sdl, PtrVT);
8392
8393 assert(Mask.getValueType() == PtrVT);
8394 setValue(&I, DAG.getNode(ISD::AND, sdl, PtrVT, Ptr, Mask));
8395 return;
8396 }
8397 case Intrinsic::threadlocal_address: {
8398 setValue(&I, getValue(I.getOperand(0)));
8399 return;
8400 }
8401 case Intrinsic::get_active_lane_mask: {
8402 EVT CCVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8403 SDValue Index = getValue(I.getOperand(0));
8404 SDValue TripCount = getValue(I.getOperand(1));
8405 EVT ElementVT = Index.getValueType();
8406
8407 if (!TLI.shouldExpandGetActiveLaneMask(CCVT, ElementVT)) {
8408 setValue(&I, DAG.getNode(ISD::GET_ACTIVE_LANE_MASK, sdl, CCVT, Index,
8409 TripCount));
8410 return;
8411 }
8412
8413 EVT VecTy = EVT::getVectorVT(*DAG.getContext(), ElementVT,
8414 CCVT.getVectorElementCount());
8415
8416 SDValue VectorIndex = DAG.getSplat(VecTy, sdl, Index);
8417 SDValue VectorTripCount = DAG.getSplat(VecTy, sdl, TripCount);
8418 SDValue VectorStep = DAG.getStepVector(sdl, VecTy);
8419 SDValue VectorInduction = DAG.getNode(
8420 ISD::UADDSAT, sdl, VecTy, VectorIndex, VectorStep);
8421 SDValue SetCC = DAG.getSetCC(sdl, CCVT, VectorInduction,
8422 VectorTripCount, ISD::CondCode::SETULT);
8423 setValue(&I, SetCC);
8424 return;
8425 }
8426 case Intrinsic::experimental_get_vector_length: {
8427 assert(cast<ConstantInt>(I.getOperand(1))->getSExtValue() > 0 &&
8428 "Expected positive VF");
8429 unsigned VF = cast<ConstantInt>(I.getOperand(1))->getZExtValue();
8430 bool IsScalable = cast<ConstantInt>(I.getOperand(2))->isOne();
8431
8432 SDValue Count = getValue(I.getOperand(0));
8433 EVT CountVT = Count.getValueType();
8434
8435 if (!TLI.shouldExpandGetVectorLength(CountVT, VF, IsScalable)) {
8436 visitTargetIntrinsic(I, Intrinsic);
8437 return;
8438 }
8439
8440 // Expand to a umin between the trip count and the maximum elements the type
8441 // can hold.
8442 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8443
8444 // Extend the trip count to at least the result VT.
8445 if (CountVT.bitsLT(VT)) {
8446 Count = DAG.getNode(ISD::ZERO_EXTEND, sdl, VT, Count);
8447 CountVT = VT;
8448 }
8449
8450 SDValue MaxEVL = DAG.getElementCount(sdl, CountVT,
8451 ElementCount::get(VF, IsScalable));
8452
8453 SDValue UMin = DAG.getNode(ISD::UMIN, sdl, CountVT, Count, MaxEVL);
8454 // Clip to the result type if needed.
8455 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, sdl, VT, UMin);
8456
8457 setValue(&I, Trunc);
8458 return;
8459 }
8460 case Intrinsic::vector_partial_reduce_add: {
8461 SDValue Acc = getValue(I.getOperand(0));
8462 SDValue Input = getValue(I.getOperand(1));
8463 setValue(&I,
8464 DAG.getNode(ISD::PARTIAL_REDUCE_UMLA, sdl, Acc.getValueType(), Acc,
8465 Input, DAG.getConstant(1, sdl, Input.getValueType())));
8466 return;
8467 }
8468 case Intrinsic::vector_partial_reduce_fadd: {
8469 SDValue Acc = getValue(I.getOperand(0));
8470 SDValue Input = getValue(I.getOperand(1));
8471 setValue(&I, DAG.getNode(
8472 ISD::PARTIAL_REDUCE_FMLA, sdl, Acc.getValueType(), Acc,
8473 Input, DAG.getConstantFP(1.0, sdl, Input.getValueType())));
8474 return;
8475 }
8476 case Intrinsic::experimental_cttz_elts: {
8477 SDValue Op = getValue(I.getOperand(0));
8478 EVT OpVT = Op.getValueType();
8479 EVT RetTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
8480 bool ZeroIsPoison =
8481 !cast<ConstantSDNode>(getValue(I.getOperand(1)))->isZero();
8482 if (OpVT.getVectorElementType() != MVT::i1) {
8483 // Compare the input vector elements to zero & use to count trailing
8484 // zeros.
8485 SDValue AllZero = DAG.getConstant(0, sdl, OpVT);
8486 EVT I1OpVT = OpVT.changeVectorElementType(*DAG.getContext(), MVT::i1);
8487 Op = DAG.getSetCC(sdl, I1OpVT, Op, AllZero, ISD::SETNE);
8488 }
8489 setValue(&I, DAG.getNode(ZeroIsPoison ? ISD::CTTZ_ELTS_ZERO_POISON
8491 sdl, RetTy, Op));
8492 return;
8493 }
8494 case Intrinsic::vector_insert: {
8495 SDValue Vec = getValue(I.getOperand(0));
8496 SDValue SubVec = getValue(I.getOperand(1));
8497 SDValue Index = getValue(I.getOperand(2));
8498
8499 // The intrinsic's index type is i64, but the SDNode requires an index type
8500 // suitable for the target. Convert the index as required.
8501 MVT VectorIdxTy = TLI.getVectorIdxTy(DAG.getDataLayout());
8502 if (Index.getValueType() != VectorIdxTy)
8503 Index = DAG.getVectorIdxConstant(Index->getAsZExtVal(), sdl);
8504
8505 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8506 setValue(&I, DAG.getNode(ISD::INSERT_SUBVECTOR, sdl, ResultVT, Vec, SubVec,
8507 Index));
8508 return;
8509 }
8510 case Intrinsic::vector_extract: {
8511 SDValue Vec = getValue(I.getOperand(0));
8512 SDValue Index = getValue(I.getOperand(1));
8513 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8514
8515 // The intrinsic's index type is i64, but the SDNode requires an index type
8516 // suitable for the target. Convert the index as required.
8517 MVT VectorIdxTy = TLI.getVectorIdxTy(DAG.getDataLayout());
8518 if (Index.getValueType() != VectorIdxTy)
8519 Index = DAG.getVectorIdxConstant(Index->getAsZExtVal(), sdl);
8520
8521 setValue(&I,
8522 DAG.getNode(ISD::EXTRACT_SUBVECTOR, sdl, ResultVT, Vec, Index));
8523 return;
8524 }
8525 case Intrinsic::experimental_vector_match: {
8526 SDValue Op1 = getValue(I.getOperand(0));
8527 SDValue Op2 = getValue(I.getOperand(1));
8528 SDValue Mask = getValue(I.getOperand(2));
8529 EVT Op1VT = Op1.getValueType();
8530 EVT Op2VT = Op2.getValueType();
8531 EVT ResVT = Mask.getValueType();
8532 unsigned SearchSize = Op2VT.getVectorNumElements();
8533
8534 // If the target has native support for this vector match operation, lower
8535 // the intrinsic untouched; otherwise, expand it below.
8536 if (!TLI.shouldExpandVectorMatch(Op1VT, SearchSize)) {
8537 visitTargetIntrinsic(I, Intrinsic);
8538 return;
8539 }
8540
8541 SDValue Ret = DAG.getConstant(0, sdl, ResVT);
8542
8543 for (unsigned i = 0; i < SearchSize; ++i) {
8544 SDValue Op2Elem = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, sdl,
8545 Op2VT.getVectorElementType(), Op2,
8546 DAG.getVectorIdxConstant(i, sdl));
8547 SDValue Splat = DAG.getNode(ISD::SPLAT_VECTOR, sdl, Op1VT, Op2Elem);
8548 SDValue Cmp = DAG.getSetCC(sdl, ResVT, Op1, Splat, ISD::SETEQ);
8549 Ret = DAG.getNode(ISD::OR, sdl, ResVT, Ret, Cmp);
8550 }
8551
8552 setValue(&I, DAG.getNode(ISD::AND, sdl, ResVT, Ret, Mask));
8553 return;
8554 }
8555 case Intrinsic::vector_reverse:
8556 visitVectorReverse(I);
8557 return;
8558 case Intrinsic::vector_splice_left:
8559 case Intrinsic::vector_splice_right:
8560 visitVectorSplice(I);
8561 return;
8562 case Intrinsic::callbr_landingpad:
8563 visitCallBrLandingPad(I);
8564 return;
8565 case Intrinsic::vector_interleave2:
8566 visitVectorInterleave(I, 2);
8567 return;
8568 case Intrinsic::vector_interleave3:
8569 visitVectorInterleave(I, 3);
8570 return;
8571 case Intrinsic::vector_interleave4:
8572 visitVectorInterleave(I, 4);
8573 return;
8574 case Intrinsic::vector_interleave5:
8575 visitVectorInterleave(I, 5);
8576 return;
8577 case Intrinsic::vector_interleave6:
8578 visitVectorInterleave(I, 6);
8579 return;
8580 case Intrinsic::vector_interleave7:
8581 visitVectorInterleave(I, 7);
8582 return;
8583 case Intrinsic::vector_interleave8:
8584 visitVectorInterleave(I, 8);
8585 return;
8586 case Intrinsic::vector_deinterleave2:
8587 visitVectorDeinterleave(I, 2);
8588 return;
8589 case Intrinsic::vector_deinterleave3:
8590 visitVectorDeinterleave(I, 3);
8591 return;
8592 case Intrinsic::vector_deinterleave4:
8593 visitVectorDeinterleave(I, 4);
8594 return;
8595 case Intrinsic::vector_deinterleave5:
8596 visitVectorDeinterleave(I, 5);
8597 return;
8598 case Intrinsic::vector_deinterleave6:
8599 visitVectorDeinterleave(I, 6);
8600 return;
8601 case Intrinsic::vector_deinterleave7:
8602 visitVectorDeinterleave(I, 7);
8603 return;
8604 case Intrinsic::vector_deinterleave8:
8605 visitVectorDeinterleave(I, 8);
8606 return;
8607 case Intrinsic::experimental_vector_compress:
8608 setValue(&I, DAG.getNode(ISD::VECTOR_COMPRESS, sdl,
8609 getValue(I.getArgOperand(0)).getValueType(),
8610 getValue(I.getArgOperand(0)),
8611 getValue(I.getArgOperand(1)),
8612 getValue(I.getArgOperand(2)), Flags));
8613 return;
8614 case Intrinsic::experimental_convergence_anchor:
8615 case Intrinsic::experimental_convergence_entry:
8616 case Intrinsic::experimental_convergence_loop:
8617 visitConvergenceControl(I, Intrinsic);
8618 return;
8619 case Intrinsic::experimental_vector_histogram_add: {
8620 visitVectorHistogram(I, Intrinsic);
8621 return;
8622 }
8623 case Intrinsic::experimental_vector_extract_last_active: {
8624 visitVectorExtractLastActive(I, Intrinsic);
8625 return;
8626 }
8627 case Intrinsic::loop_dependence_war_mask:
8628 setValue(&I,
8630 EVT::getEVT(I.getType()), getValue(I.getOperand(0)),
8631 getValue(I.getOperand(1)), getValue(I.getOperand(2)),
8632 DAG.getConstant(0, sdl, MVT::i64)));
8633 return;
8634 case Intrinsic::loop_dependence_raw_mask:
8635 setValue(&I,
8637 EVT::getEVT(I.getType()), getValue(I.getOperand(0)),
8638 getValue(I.getOperand(1)), getValue(I.getOperand(2)),
8639 DAG.getConstant(0, sdl, MVT::i64)));
8640 return;
8641 case Intrinsic::masked_udiv:
8642 setValue(&I,
8643 DAG.getNode(ISD::MASKED_UDIV, 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_sdiv:
8648 setValue(&I,
8649 DAG.getNode(ISD::MASKED_SDIV, sdl, EVT::getEVT(I.getType()),
8650 getValue(I.getOperand(0)), getValue(I.getOperand(1)),
8651 getValue(I.getOperand(2))));
8652 return;
8653 case Intrinsic::masked_urem:
8654 setValue(&I,
8655 DAG.getNode(ISD::MASKED_UREM, sdl, EVT::getEVT(I.getType()),
8656 getValue(I.getOperand(0)), getValue(I.getOperand(1)),
8657 getValue(I.getOperand(2))));
8658 return;
8659 case Intrinsic::masked_srem:
8660 setValue(&I,
8661 DAG.getNode(ISD::MASKED_SREM, sdl, EVT::getEVT(I.getType()),
8662 getValue(I.getOperand(0)), getValue(I.getOperand(1)),
8663 getValue(I.getOperand(2))));
8664 return;
8665 }
8666}
8667
8668void SelectionDAGBuilder::pushFPOpOutChain(SDValue Result,
8670 assert(Result.getNode()->getNumValues() == 2);
8671 SDValue OutChain = Result.getValue(1);
8672 assert(OutChain.getValueType() == MVT::Other);
8673
8674 // Instead of updating the root immediately, push the produced chain to the
8675 // appropriate list, deferring the update until the root is requested. In this
8676 // case, the nodes from the lists are chained using TokenFactor, indicating
8677 // that the operations are independent.
8678 //
8679 // In particular, the root is updated before any call that might access the
8680 // floating-point environment, except for constrained intrinsics.
8681 switch (EB) {
8684 PendingConstrainedFP.push_back(OutChain);
8685 break;
8687 PendingConstrainedFPStrict.push_back(OutChain);
8688 break;
8689 }
8690}
8691
8692void SelectionDAGBuilder::visitConstrainedFPIntrinsic(
8693 const ConstrainedFPIntrinsic &FPI) {
8694 SDLoc sdl = getCurSDLoc();
8695
8696 // We do not need to serialize constrained FP intrinsics against
8697 // each other or against (nonvolatile) loads, so they can be
8698 // chained like loads.
8700 SDValue Chain = getFPOperationRoot(EB);
8702 Opers.push_back(Chain);
8703 for (unsigned I = 0, E = FPI.getNonMetadataArgCount(); I != E; ++I)
8704 Opers.push_back(getValue(FPI.getArgOperand(I)));
8705
8706 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8707 EVT VT = TLI.getValueType(DAG.getDataLayout(), FPI.getType());
8708 SDVTList VTs = DAG.getVTList(VT, MVT::Other);
8709
8710 SDNodeFlags Flags;
8712 Flags.setNoFPExcept(true);
8713
8714 if (auto *FPOp = dyn_cast<FPMathOperator>(&FPI))
8715 Flags.copyFMF(*FPOp);
8716
8717 unsigned Opcode;
8718 switch (FPI.getIntrinsicID()) {
8719 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
8720#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
8721 case Intrinsic::INTRINSIC: \
8722 Opcode = ISD::STRICT_##DAGN; \
8723 break;
8724#include "llvm/IR/ConstrainedOps.def"
8725 case Intrinsic::experimental_constrained_fmuladd: {
8726 Opcode = ISD::STRICT_FMA;
8727 // Break fmuladd into fmul and fadd.
8728 if (TM.Options.AllowFPOpFusion == FPOpFusion::Strict ||
8729 !TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), VT)) {
8730 Opers.pop_back();
8731 SDValue Mul = DAG.getNode(ISD::STRICT_FMUL, sdl, VTs, Opers, Flags);
8732 pushFPOpOutChain(Mul, EB);
8733 Opcode = ISD::STRICT_FADD;
8734 Opers.clear();
8735 Opers.push_back(Mul.getValue(1));
8736 Opers.push_back(Mul.getValue(0));
8737 Opers.push_back(getValue(FPI.getArgOperand(2)));
8738 }
8739 break;
8740 }
8741 }
8742
8743 // A few strict DAG nodes carry additional operands that are not
8744 // set up by the default code above.
8745 switch (Opcode) {
8746 default: break;
8748 Opers.push_back(
8749 DAG.getTargetConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout())));
8750 break;
8751 case ISD::STRICT_FSETCC:
8752 case ISD::STRICT_FSETCCS: {
8753 auto *FPCmp = dyn_cast<ConstrainedFPCmpIntrinsic>(&FPI);
8754 ISD::CondCode Condition = getFCmpCondCode(FPCmp->getPredicate());
8755 if (DAG.isKnownNeverNaN(Opers[1]) && DAG.isKnownNeverNaN(Opers[2]))
8756 Condition = getFCmpCodeWithoutNaN(Condition);
8757 Opers.push_back(DAG.getCondCode(Condition));
8758 break;
8759 }
8760 }
8761
8762 SDValue Result = DAG.getNode(Opcode, sdl, VTs, Opers, Flags);
8763 pushFPOpOutChain(Result, EB);
8764
8765 SDValue FPResult = Result.getValue(0);
8766 setValue(&FPI, FPResult);
8767}
8768
8769static unsigned getISDForVPIntrinsic(const VPIntrinsic &VPIntrin) {
8770 std::optional<unsigned> ResOPC;
8771 switch (VPIntrin.getIntrinsicID()) {
8772 case Intrinsic::vp_ctlz: {
8773 bool IsZeroUndef = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8774 ResOPC = IsZeroUndef ? ISD::VP_CTLZ_ZERO_POISON : ISD::VP_CTLZ;
8775 break;
8776 }
8777 case Intrinsic::vp_cttz: {
8778 bool IsZeroUndef = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8779 ResOPC = IsZeroUndef ? ISD::VP_CTTZ_ZERO_POISON : ISD::VP_CTTZ;
8780 break;
8781 }
8782 case Intrinsic::vp_cttz_elts: {
8783 bool IsZeroPoison = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8784 ResOPC = IsZeroPoison ? ISD::VP_CTTZ_ELTS_ZERO_POISON : ISD::VP_CTTZ_ELTS;
8785 break;
8786 }
8787#define HELPER_MAP_VPID_TO_VPSD(VPID, VPSD) \
8788 case Intrinsic::VPID: \
8789 ResOPC = ISD::VPSD; \
8790 break;
8791#include "llvm/IR/VPIntrinsics.def"
8792 }
8793
8794 if (!ResOPC)
8796 "Inconsistency: no SDNode available for this VPIntrinsic!");
8797
8798 if (*ResOPC == ISD::VP_REDUCE_SEQ_FADD ||
8799 *ResOPC == ISD::VP_REDUCE_SEQ_FMUL) {
8800 if (VPIntrin.getFastMathFlags().allowReassoc())
8801 return *ResOPC == ISD::VP_REDUCE_SEQ_FADD ? ISD::VP_REDUCE_FADD
8802 : ISD::VP_REDUCE_FMUL;
8803 }
8804
8805 return *ResOPC;
8806}
8807
8808void SelectionDAGBuilder::visitVPLoad(
8809 const VPIntrinsic &VPIntrin, EVT VT,
8810 const SmallVectorImpl<SDValue> &OpValues) {
8811 SDLoc DL = getCurSDLoc();
8812 Value *PtrOperand = VPIntrin.getArgOperand(0);
8813 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8814 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8815 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8816 SDValue LD;
8817 // Do not serialize variable-length loads of constant memory with
8818 // anything.
8819 if (!Alignment)
8820 Alignment = DAG.getEVTAlign(VT);
8821 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8822 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8823 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8824 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8825 MachineMemOperand::Flags MMOFlags =
8826 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8827 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8828 MachinePointerInfo(PtrOperand), MMOFlags,
8829 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo, Ranges);
8830 LD = DAG.getLoadVP(VT, DL, InChain, OpValues[0], OpValues[1], OpValues[2],
8831 MMO, false /*IsExpanding */);
8832 if (AddToChain)
8833 PendingLoads.push_back(LD.getValue(1));
8834 setValue(&VPIntrin, LD);
8835}
8836
8837void SelectionDAGBuilder::visitVPLoadFF(
8838 const VPIntrinsic &VPIntrin, EVT VT, EVT EVLVT,
8839 const SmallVectorImpl<SDValue> &OpValues) {
8840 assert(OpValues.size() == 3 && "Unexpected number of operands");
8841 SDLoc DL = getCurSDLoc();
8842 Value *PtrOperand = VPIntrin.getArgOperand(0);
8843 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8844 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8845 const MDNode *Ranges = VPIntrin.getMetadata(LLVMContext::MD_range);
8846 SDValue LD;
8847 // Do not serialize variable-length loads of constant memory with
8848 // anything.
8849 if (!Alignment)
8850 Alignment = DAG.getEVTAlign(VT);
8851 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8852 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8853 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8854 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8855 MachinePointerInfo(PtrOperand), MachineMemOperand::MOLoad,
8856 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo, Ranges);
8857 LD = DAG.getLoadFFVP(VT, DL, InChain, OpValues[0], OpValues[1], OpValues[2],
8858 MMO);
8859 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, EVLVT, LD.getValue(1));
8860 if (AddToChain)
8861 PendingLoads.push_back(LD.getValue(2));
8862 setValue(&VPIntrin, DAG.getMergeValues({LD.getValue(0), Trunc}, DL));
8863}
8864
8865void SelectionDAGBuilder::visitVPGather(
8866 const VPIntrinsic &VPIntrin, EVT VT,
8867 const SmallVectorImpl<SDValue> &OpValues) {
8868 SDLoc DL = getCurSDLoc();
8869 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8870 Value *PtrOperand = VPIntrin.getArgOperand(0);
8871 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8872 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8873 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8874 SDValue LD;
8875 if (!Alignment)
8876 Alignment = DAG.getEVTAlign(VT.getScalarType());
8877 unsigned AS =
8878 PtrOperand->getType()->getScalarType()->getPointerAddressSpace();
8879 MachineMemOperand::Flags MMOFlags =
8880 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8881 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8882 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8883 *Alignment, AAInfo, Ranges);
8884 SDValue Base, Index, Scale;
8885 bool UniformBase =
8886 getUniformBase(PtrOperand, Base, Index, Scale, this, VPIntrin.getParent(),
8887 VT.getScalarStoreSize());
8888 if (!UniformBase) {
8889 Base = DAG.getConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout()));
8890 Index = getValue(PtrOperand);
8891 Scale = DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout()));
8892 }
8893 EVT IdxVT = Index.getValueType();
8894 EVT EltTy = IdxVT.getVectorElementType();
8895 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
8896 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
8897 Index = DAG.getNode(ISD::SIGN_EXTEND, DL, NewIdxVT, Index);
8898 }
8899 LD = DAG.getGatherVP(
8900 DAG.getVTList(VT, MVT::Other), VT, DL,
8901 {DAG.getRoot(), Base, Index, Scale, OpValues[1], OpValues[2]}, MMO,
8903 PendingLoads.push_back(LD.getValue(1));
8904 setValue(&VPIntrin, LD);
8905}
8906
8907void SelectionDAGBuilder::visitVPStore(
8908 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8909 SDLoc DL = getCurSDLoc();
8910 Value *PtrOperand = VPIntrin.getArgOperand(1);
8911 EVT VT = OpValues[0].getValueType();
8912 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8913 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8914 SDValue ST;
8915 if (!Alignment)
8916 Alignment = DAG.getEVTAlign(VT);
8917 SDValue Ptr = OpValues[1];
8918 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
8919 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8920 MachineMemOperand::Flags MMOFlags =
8921 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8922 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8923 MachinePointerInfo(PtrOperand), MMOFlags,
8924 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo);
8925 ST = DAG.getStoreVP(getMemoryRoot(), DL, OpValues[0], Ptr, Offset,
8926 OpValues[2], OpValues[3], VT, MMO, ISD::UNINDEXED,
8927 /* IsTruncating */ false, /*IsCompressing*/ false);
8928 DAG.setRoot(ST);
8929 setValue(&VPIntrin, ST);
8930}
8931
8932void SelectionDAGBuilder::visitVPScatter(
8933 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8934 SDLoc DL = getCurSDLoc();
8935 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8936 Value *PtrOperand = VPIntrin.getArgOperand(1);
8937 EVT VT = OpValues[0].getValueType();
8938 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8939 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8940 SDValue ST;
8941 if (!Alignment)
8942 Alignment = DAG.getEVTAlign(VT.getScalarType());
8943 unsigned AS =
8944 PtrOperand->getType()->getScalarType()->getPointerAddressSpace();
8945 MachineMemOperand::Flags MMOFlags =
8946 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8947 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8948 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8949 *Alignment, AAInfo);
8950 SDValue Base, Index, Scale;
8951 bool UniformBase =
8952 getUniformBase(PtrOperand, Base, Index, Scale, this, VPIntrin.getParent(),
8953 VT.getScalarStoreSize());
8954 if (!UniformBase) {
8955 Base = DAG.getConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout()));
8956 Index = getValue(PtrOperand);
8957 Scale = DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout()));
8958 }
8959 EVT IdxVT = Index.getValueType();
8960 EVT EltTy = IdxVT.getVectorElementType();
8961 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
8962 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
8963 Index = DAG.getNode(ISD::SIGN_EXTEND, DL, NewIdxVT, Index);
8964 }
8965 ST = DAG.getScatterVP(DAG.getVTList(MVT::Other), VT, DL,
8966 {getMemoryRoot(), OpValues[0], Base, Index, Scale,
8967 OpValues[2], OpValues[3]},
8968 MMO, ISD::SIGNED_SCALED);
8969 DAG.setRoot(ST);
8970 setValue(&VPIntrin, ST);
8971}
8972
8973void SelectionDAGBuilder::visitVPStridedLoad(
8974 const VPIntrinsic &VPIntrin, EVT VT,
8975 const SmallVectorImpl<SDValue> &OpValues) {
8976 SDLoc DL = getCurSDLoc();
8977 Value *PtrOperand = VPIntrin.getArgOperand(0);
8978 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8979 if (!Alignment)
8980 Alignment = DAG.getEVTAlign(VT.getScalarType());
8981 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8982 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8983 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8984 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8985 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8986 unsigned AS = PtrOperand->getType()->getPointerAddressSpace();
8987 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8988 MachineMemOperand::Flags MMOFlags =
8989 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8990 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8991 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8992 *Alignment, AAInfo, Ranges);
8993
8994 SDValue LD = DAG.getStridedLoadVP(VT, DL, InChain, OpValues[0], OpValues[1],
8995 OpValues[2], OpValues[3], MMO,
8996 false /*IsExpanding*/);
8997
8998 if (AddToChain)
8999 PendingLoads.push_back(LD.getValue(1));
9000 setValue(&VPIntrin, LD);
9001}
9002
9003void SelectionDAGBuilder::visitVPStridedStore(
9004 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
9005 SDLoc DL = getCurSDLoc();
9006 Value *PtrOperand = VPIntrin.getArgOperand(1);
9007 EVT VT = OpValues[0].getValueType();
9008 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
9009 if (!Alignment)
9010 Alignment = DAG.getEVTAlign(VT.getScalarType());
9011 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
9012 unsigned AS = PtrOperand->getType()->getPointerAddressSpace();
9013 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9014 MachineMemOperand::Flags MMOFlags =
9015 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
9016 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
9017 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
9018 *Alignment, AAInfo);
9019
9020 SDValue ST = DAG.getStridedStoreVP(
9021 getMemoryRoot(), DL, OpValues[0], OpValues[1],
9022 DAG.getUNDEF(OpValues[1].getValueType()), OpValues[2], OpValues[3],
9023 OpValues[4], VT, MMO, ISD::UNINDEXED, /*IsTruncating*/ false,
9024 /*IsCompressing*/ false);
9025
9026 DAG.setRoot(ST);
9027 setValue(&VPIntrin, ST);
9028}
9029
9030void SelectionDAGBuilder::visitVPCmp(const VPCmpIntrinsic &VPIntrin) {
9031 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9032 SDLoc DL = getCurSDLoc();
9033
9034 ISD::CondCode Condition;
9036
9037 Value *Op1 = VPIntrin.getOperand(0);
9038 Value *Op2 = VPIntrin.getOperand(1);
9039 // #2 is the condition code
9040 SDValue MaskOp = getValue(VPIntrin.getOperand(3));
9041 SDValue EVL = getValue(VPIntrin.getOperand(4));
9042 MVT EVLParamVT = TLI.getVPExplicitVectorLengthTy();
9043 assert(EVLParamVT.isScalarInteger() && EVLParamVT.bitsGE(MVT::i32) &&
9044 "Unexpected target EVL type");
9045 EVL = DAG.getNode(ISD::ZERO_EXTEND, DL, EVLParamVT, EVL);
9046
9047 if (VPIntrin.getOperand(0)->getType()->isFPOrFPVectorTy()) {
9048 Condition = getFCmpCondCode(CondCode);
9049 SimplifyQuery SQ(DAG.getDataLayout(), &VPIntrin);
9050 if (isKnownNeverNaN(Op2, SQ) && isKnownNeverNaN(Op1, SQ))
9051 Condition = getFCmpCodeWithoutNaN(Condition);
9052 } else {
9053 Condition = getICmpCondCode(CondCode);
9054 }
9055
9056 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9057 VPIntrin.getType());
9058 setValue(&VPIntrin, DAG.getSetCCVP(DL, DestVT, getValue(Op1), getValue(Op2),
9059 Condition, MaskOp, EVL));
9060}
9061
9062void SelectionDAGBuilder::visitVectorPredicationIntrinsic(
9063 const VPIntrinsic &VPIntrin) {
9064 SDLoc DL = getCurSDLoc();
9065 unsigned Opcode = getISDForVPIntrinsic(VPIntrin);
9066
9067 auto IID = VPIntrin.getIntrinsicID();
9068
9069 if (const auto *CmpI = dyn_cast<VPCmpIntrinsic>(&VPIntrin))
9070 return visitVPCmp(*CmpI);
9071
9072 SmallVector<EVT, 4> ValueVTs;
9073 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9074 ComputeValueVTs(TLI, DAG.getDataLayout(), VPIntrin.getType(), ValueVTs);
9075 SDVTList VTs = DAG.getVTList(ValueVTs);
9076
9077 auto EVLParamPos = VPIntrinsic::getVectorLengthParamPos(IID);
9078
9079 MVT EVLParamVT = TLI.getVPExplicitVectorLengthTy();
9080 assert(EVLParamVT.isScalarInteger() && EVLParamVT.bitsGE(MVT::i32) &&
9081 "Unexpected target EVL type");
9082
9083 // Request operands.
9084 SmallVector<SDValue, 7> OpValues;
9085 for (unsigned I = 0; I < VPIntrin.arg_size(); ++I) {
9086 auto Op = getValue(VPIntrin.getArgOperand(I));
9087 if (I == EVLParamPos)
9088 Op = DAG.getNode(ISD::ZERO_EXTEND, DL, EVLParamVT, Op);
9089 OpValues.push_back(Op);
9090 }
9091
9092 switch (Opcode) {
9093 default: {
9094 SDNodeFlags SDFlags;
9095 if (auto *FPMO = dyn_cast<FPMathOperator>(&VPIntrin))
9096 SDFlags.copyFMF(*FPMO);
9097 SDValue Result = DAG.getNode(Opcode, DL, VTs, OpValues, SDFlags);
9098 setValue(&VPIntrin, Result);
9099 break;
9100 }
9101 case ISD::VP_LOAD:
9102 visitVPLoad(VPIntrin, ValueVTs[0], OpValues);
9103 break;
9104 case ISD::VP_LOAD_FF:
9105 visitVPLoadFF(VPIntrin, ValueVTs[0], ValueVTs[1], OpValues);
9106 break;
9107 case ISD::VP_GATHER:
9108 visitVPGather(VPIntrin, ValueVTs[0], OpValues);
9109 break;
9110 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
9111 visitVPStridedLoad(VPIntrin, ValueVTs[0], OpValues);
9112 break;
9113 case ISD::VP_STORE:
9114 visitVPStore(VPIntrin, OpValues);
9115 break;
9116 case ISD::VP_SCATTER:
9117 visitVPScatter(VPIntrin, OpValues);
9118 break;
9119 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
9120 visitVPStridedStore(VPIntrin, OpValues);
9121 break;
9122 case ISD::VP_FMULADD: {
9123 assert(OpValues.size() == 5 && "Unexpected number of operands");
9124 SDNodeFlags SDFlags;
9125 if (auto *FPMO = dyn_cast<FPMathOperator>(&VPIntrin))
9126 SDFlags.copyFMF(*FPMO);
9127 if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
9128 TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), ValueVTs[0])) {
9129 setValue(&VPIntrin, DAG.getNode(ISD::VP_FMA, DL, VTs, OpValues, SDFlags));
9130 } else {
9131 SDValue Mul = DAG.getNode(
9132 ISD::VP_FMUL, DL, VTs,
9133 {OpValues[0], OpValues[1], OpValues[3], OpValues[4]}, SDFlags);
9134 SDValue Add =
9135 DAG.getNode(ISD::VP_FADD, DL, VTs,
9136 {Mul, OpValues[2], OpValues[3], OpValues[4]}, SDFlags);
9137 setValue(&VPIntrin, Add);
9138 }
9139 break;
9140 }
9141 case ISD::VP_IS_FPCLASS: {
9142 const DataLayout DLayout = DAG.getDataLayout();
9143 EVT DestVT = TLI.getValueType(DLayout, VPIntrin.getType());
9144 auto Constant = OpValues[1]->getAsZExtVal();
9145 SDValue Check = DAG.getTargetConstant(Constant, DL, MVT::i32);
9146 SDValue V = DAG.getNode(ISD::VP_IS_FPCLASS, DL, DestVT,
9147 {OpValues[0], Check, OpValues[2], OpValues[3]});
9148 setValue(&VPIntrin, V);
9149 return;
9150 }
9151 case ISD::VP_INTTOPTR: {
9152 SDValue N = OpValues[0];
9153 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), VPIntrin.getType());
9154 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(), VPIntrin.getType());
9155 N = DAG.getVPPtrExtOrTrunc(getCurSDLoc(), DestVT, N, OpValues[1],
9156 OpValues[2]);
9157 N = DAG.getVPZExtOrTrunc(getCurSDLoc(), PtrMemVT, N, OpValues[1],
9158 OpValues[2]);
9159 setValue(&VPIntrin, N);
9160 break;
9161 }
9162 case ISD::VP_PTRTOINT: {
9163 SDValue N = OpValues[0];
9164 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9165 VPIntrin.getType());
9166 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(),
9167 VPIntrin.getOperand(0)->getType());
9168 N = DAG.getVPPtrExtOrTrunc(getCurSDLoc(), PtrMemVT, N, OpValues[1],
9169 OpValues[2]);
9170 N = DAG.getVPZExtOrTrunc(getCurSDLoc(), DestVT, N, OpValues[1],
9171 OpValues[2]);
9172 setValue(&VPIntrin, N);
9173 break;
9174 }
9175 case ISD::VP_ABS:
9176 case ISD::VP_CTLZ:
9177 case ISD::VP_CTLZ_ZERO_POISON:
9178 case ISD::VP_CTTZ:
9179 case ISD::VP_CTTZ_ZERO_POISON:
9180 case ISD::VP_CTTZ_ELTS_ZERO_POISON:
9181 case ISD::VP_CTTZ_ELTS: {
9182 SDValue Result =
9183 DAG.getNode(Opcode, DL, VTs, {OpValues[0], OpValues[2], OpValues[3]});
9184 setValue(&VPIntrin, Result);
9185 break;
9186 }
9187 }
9188}
9189
9191 const BasicBlock *EHPadBB,
9192 MCSymbol *&BeginLabel) {
9193 MachineFunction &MF = DAG.getMachineFunction();
9194
9195 // Insert a label before the invoke call to mark the try range. This can be
9196 // used to detect deletion of the invoke via the MachineModuleInfo.
9197 BeginLabel = MF.getContext().createTempSymbol();
9198
9199 // For SjLj, keep track of which landing pads go with which invokes
9200 // so as to maintain the ordering of pads in the LSDA.
9201 unsigned CallSiteIndex = FuncInfo.getCurrentCallSite();
9202 if (CallSiteIndex) {
9203 MF.setCallSiteBeginLabel(BeginLabel, CallSiteIndex);
9204 LPadToCallSiteMap[FuncInfo.getMBB(EHPadBB)].push_back(CallSiteIndex);
9205
9206 // Now that the call site is handled, stop tracking it.
9207 FuncInfo.setCurrentCallSite(0);
9208 }
9209
9210 return DAG.getEHLabel(getCurSDLoc(), Chain, BeginLabel);
9211}
9212
9213SDValue SelectionDAGBuilder::lowerEndEH(SDValue Chain, const InvokeInst *II,
9214 const BasicBlock *EHPadBB,
9215 MCSymbol *BeginLabel) {
9216 assert(BeginLabel && "BeginLabel should've been set");
9217
9219
9220 // Insert a label at the end of the invoke call to mark the try range. This
9221 // can be used to detect deletion of the invoke via the MachineModuleInfo.
9222 MCSymbol *EndLabel = MF.getContext().createTempSymbol();
9223 Chain = DAG.getEHLabel(getCurSDLoc(), Chain, EndLabel);
9224
9225 // Inform MachineModuleInfo of range.
9227 // There is a platform (e.g. wasm) that uses funclet style IR but does not
9228 // actually use outlined funclets and their LSDA info style.
9229 if (MF.hasEHFunclets() && isFuncletEHPersonality(Pers)) {
9230 assert(II && "II should've been set");
9231 WinEHFuncInfo *EHInfo = MF.getWinEHFuncInfo();
9232 EHInfo->addIPToStateRange(II, BeginLabel, EndLabel);
9233 } else if (!isScopedEHPersonality(Pers)) {
9234 assert(EHPadBB);
9235 MF.addInvoke(FuncInfo.getMBB(EHPadBB), BeginLabel, EndLabel);
9236 }
9237
9238 return Chain;
9239}
9240
9241std::pair<SDValue, SDValue>
9243 const BasicBlock *EHPadBB) {
9244 MCSymbol *BeginLabel = nullptr;
9245
9246 if (EHPadBB) {
9247 // Both PendingLoads and PendingExports must be flushed here;
9248 // this call might not return.
9249 (void)getRoot();
9250 DAG.setRoot(lowerStartEH(getControlRoot(), EHPadBB, BeginLabel));
9251 CLI.setChain(getRoot());
9252 }
9253
9254 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9255 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
9256
9257 assert((CLI.IsTailCall || Result.second.getNode()) &&
9258 "Non-null chain expected with non-tail call!");
9259 assert((Result.second.getNode() || !Result.first.getNode()) &&
9260 "Null value expected with tail call!");
9261
9262 if (!Result.second.getNode()) {
9263 // As a special case, a null chain means that a tail call has been emitted
9264 // and the DAG root is already updated.
9265 HasTailCall = true;
9266
9267 // Since there's no actual continuation from this block, nothing can be
9268 // relying on us setting vregs for them.
9269 PendingExports.clear();
9270 } else {
9271 DAG.setRoot(Result.second);
9272 }
9273
9274 if (EHPadBB) {
9275 DAG.setRoot(lowerEndEH(getRoot(), cast_or_null<InvokeInst>(CLI.CB), EHPadBB,
9276 BeginLabel));
9277 Result.second = getRoot();
9278 }
9279
9280 return Result;
9281}
9282
9284 bool isMustTailCall = CB.isMustTailCall();
9285
9286 // Avoid emitting tail calls in functions with the disable-tail-calls
9287 // attribute.
9288 const Function *Caller = CB.getParent()->getParent();
9289 if (!isMustTailCall &&
9290 Caller->getFnAttribute("disable-tail-calls").getValueAsBool())
9291 return false;
9292
9293 // We can't tail call inside a function with a swifterror argument. Lowering
9294 // does not support this yet. It would have to move into the swifterror
9295 // register before the call.
9296 if (DAG.getTargetLoweringInfo().supportSwiftError() &&
9297 Caller->getAttributes().hasAttrSomewhere(Attribute::SwiftError))
9298 return false;
9299
9300 // Check if target-independent constraints permit a tail call here.
9301 // Target-dependent constraints are checked within TLI->LowerCallTo.
9302 return isInTailCallPosition(CB, DAG.getTarget());
9303}
9304
9306 bool isTailCall, bool isMustTailCall,
9307 const BasicBlock *EHPadBB,
9308 const TargetLowering::PtrAuthInfo *PAI) {
9309 auto &DL = DAG.getDataLayout();
9310 FunctionType *FTy = CB.getFunctionType();
9311 Type *RetTy = CB.getType();
9312
9314 Args.reserve(CB.arg_size());
9315
9316 const Value *SwiftErrorVal = nullptr;
9317 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9318
9319 if (isTailCall)
9320 isTailCall = canTailCall(CB);
9321
9322 for (auto I = CB.arg_begin(), E = CB.arg_end(); I != E; ++I) {
9323 const Value *V = *I;
9324
9325 // Skip empty types
9326 if (V->getType()->isEmptyTy())
9327 continue;
9328
9329 SDValue ArgNode = getValue(V);
9330 TargetLowering::ArgListEntry Entry(ArgNode, V->getType());
9331 Entry.setAttributes(&CB, I - CB.arg_begin());
9332
9333 // Use swifterror virtual register as input to the call.
9334 if (Entry.IsSwiftError && TLI.supportSwiftError()) {
9335 SwiftErrorVal = V;
9336 // We find the virtual register for the actual swifterror argument.
9337 // Instead of using the Value, we use the virtual register instead.
9338 Entry.Node =
9339 DAG.getRegister(SwiftError.getOrCreateVRegUseAt(&CB, FuncInfo.MBB, V),
9340 EVT(TLI.getPointerTy(DL)));
9341 }
9342
9343 Args.push_back(Entry);
9344
9345 // If we have an explicit sret argument that is an Instruction, (i.e., it
9346 // might point to function-local memory), we can't meaningfully tail-call.
9347 if (Entry.IsSRet && isa<Instruction>(V))
9348 isTailCall = false;
9349 }
9350
9351 // If call site has a cfguardtarget operand bundle, create and add an
9352 // additional ArgListEntry.
9353 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_cfguardtarget)) {
9354 Value *V = Bundle->Inputs[0];
9356 Entry.IsCFGuardTarget = true;
9357 Args.push_back(Entry);
9358 }
9359
9360 // Disable tail calls if there is an swifterror argument. Targets have not
9361 // been updated to support tail calls.
9362 if (TLI.supportSwiftError() && SwiftErrorVal)
9363 isTailCall = false;
9364
9365 ConstantInt *CFIType = nullptr;
9366 if (CB.isIndirectCall()) {
9367 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_kcfi)) {
9368 if (!TLI.supportKCFIBundles())
9370 "Target doesn't support calls with kcfi operand bundles.");
9371 CFIType = cast<ConstantInt>(Bundle->Inputs[0]);
9372 assert(CFIType->getType()->isIntegerTy(32) && "Invalid CFI type");
9373 }
9374 }
9375
9376 SDValue ConvControlToken;
9377 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_convergencectrl)) {
9378 auto *Token = Bundle->Inputs[0].get();
9379 ConvControlToken = getValue(Token);
9380 }
9381
9382 GlobalValue *DeactivationSymbol = nullptr;
9384 DeactivationSymbol = cast<GlobalValue>(Bundle->Inputs[0].get());
9385 }
9386
9389 .setChain(getRoot())
9390 .setCallee(RetTy, FTy, Callee, std::move(Args), CB)
9391 .setTailCall(isTailCall)
9395 .setCFIType(CFIType)
9396 .setConvergenceControlToken(ConvControlToken)
9397 .setDeactivationSymbol(DeactivationSymbol);
9398
9399 // Set the pointer authentication info if we have it.
9400 if (PAI) {
9401 if (!TLI.supportPtrAuthBundles())
9403 "This target doesn't support calls with ptrauth operand bundles.");
9404 CLI.setPtrAuth(*PAI);
9405 }
9406
9407 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
9408
9409 if (Result.first.getNode()) {
9410 Result.first = lowerRangeToAssertZExt(DAG, CB, Result.first);
9411 Result.first = lowerNoFPClassToAssertNoFPClass(DAG, CB, Result.first);
9412 setValue(&CB, Result.first);
9413 }
9414
9415 // The last element of CLI.InVals has the SDValue for swifterror return.
9416 // Here we copy it to a virtual register and update SwiftErrorMap for
9417 // book-keeping.
9418 if (SwiftErrorVal && TLI.supportSwiftError()) {
9419 // Get the last element of InVals.
9420 SDValue Src = CLI.InVals.back();
9421 Register VReg =
9422 SwiftError.getOrCreateVRegDefAt(&CB, FuncInfo.MBB, SwiftErrorVal);
9423 SDValue CopyNode = CLI.DAG.getCopyToReg(Result.second, CLI.DL, VReg, Src);
9424 DAG.setRoot(CopyNode);
9425 }
9426}
9427
9428static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT,
9429 SelectionDAGBuilder &Builder) {
9430 // Check to see if this load can be trivially constant folded, e.g. if the
9431 // input is from a string literal.
9432 if (const Constant *LoadInput = dyn_cast<Constant>(PtrVal)) {
9433 // Cast pointer to the type we really want to load.
9434 Type *LoadTy =
9435 Type::getIntNTy(PtrVal->getContext(), LoadVT.getScalarSizeInBits());
9436 if (LoadVT.isVector())
9437 LoadTy = FixedVectorType::get(LoadTy, LoadVT.getVectorNumElements());
9438 if (const Constant *LoadCst =
9439 ConstantFoldLoadFromConstPtr(const_cast<Constant *>(LoadInput),
9440 LoadTy, Builder.DAG.getDataLayout()))
9441 return Builder.getValue(LoadCst);
9442 }
9443
9444 // Otherwise, we have to emit the load. If the pointer is to unfoldable but
9445 // still constant memory, the input chain can be the entry node.
9446 SDValue Root;
9447 bool ConstantMemory = false;
9448
9449 // Do not serialize (non-volatile) loads of constant memory with anything.
9450 if (Builder.BatchAA && Builder.BatchAA->pointsToConstantMemory(PtrVal)) {
9451 Root = Builder.DAG.getEntryNode();
9452 ConstantMemory = true;
9453 } else {
9454 // Do not serialize non-volatile loads against each other.
9455 Root = Builder.DAG.getRoot();
9456 }
9457
9458 SDValue Ptr = Builder.getValue(PtrVal);
9459 SDValue LoadVal =
9460 Builder.DAG.getLoad(LoadVT, Builder.getCurSDLoc(), Root, Ptr,
9461 MachinePointerInfo(PtrVal), Align(1));
9462
9463 if (!ConstantMemory)
9464 Builder.PendingLoads.push_back(LoadVal.getValue(1));
9465 return LoadVal;
9466}
9467
9468/// Record the value for an instruction that produces an integer result,
9469/// converting the type where necessary.
9470void SelectionDAGBuilder::processIntegerCallValue(const Instruction &I,
9471 SDValue Value,
9472 bool IsSigned) {
9473 EVT VT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9474 I.getType(), true);
9475 Value = DAG.getExtOrTrunc(IsSigned, Value, getCurSDLoc(), VT);
9476 setValue(&I, Value);
9477}
9478
9479/// See if we can lower a memcmp/bcmp call into an optimized form. If so, return
9480/// true and lower it. Otherwise return false, and it will be lowered like a
9481/// normal call.
9482/// The caller already checked that \p I calls the appropriate LibFunc with a
9483/// correct prototype.
9484bool SelectionDAGBuilder::visitMemCmpBCmpCall(const CallInst &I) {
9485 const Value *LHS = I.getArgOperand(0), *RHS = I.getArgOperand(1);
9486 const Value *Size = I.getArgOperand(2);
9487 const ConstantSDNode *CSize = dyn_cast<ConstantSDNode>(getValue(Size));
9488 if (CSize && CSize->getZExtValue() == 0) {
9489 EVT CallVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9490 I.getType(), true);
9491 setValue(&I, DAG.getConstant(0, getCurSDLoc(), CallVT));
9492 return true;
9493 }
9494
9495 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9496 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForMemcmp(
9497 DAG, getCurSDLoc(), DAG.getRoot(), getValue(LHS), getValue(RHS),
9498 getValue(Size), &I);
9499 if (Res.first.getNode()) {
9500 processIntegerCallValue(I, Res.first, true);
9501 PendingLoads.push_back(Res.second);
9502 return true;
9503 }
9504
9505 // memcmp(S1,S2,2) != 0 -> (*(short*)LHS != *(short*)RHS) != 0
9506 // memcmp(S1,S2,4) != 0 -> (*(int*)LHS != *(int*)RHS) != 0
9507 if (!CSize || !isOnlyUsedInZeroEqualityComparison(&I))
9508 return false;
9509
9510 // If the target has a fast compare for the given size, it will return a
9511 // preferred load type for that size. Require that the load VT is legal and
9512 // that the target supports unaligned loads of that type. Otherwise, return
9513 // INVALID.
9514 auto hasFastLoadsAndCompare = [&](unsigned NumBits) {
9515 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9516 MVT LVT = TLI.hasFastEqualityCompare(NumBits);
9517 if (LVT != MVT::INVALID_SIMPLE_VALUE_TYPE) {
9518 // TODO: Handle 5 byte compare as 4-byte + 1 byte.
9519 // TODO: Handle 8 byte compare on x86-32 as two 32-bit loads.
9520 // TODO: Check alignment of src and dest ptrs.
9521 unsigned DstAS = LHS->getType()->getPointerAddressSpace();
9522 unsigned SrcAS = RHS->getType()->getPointerAddressSpace();
9523 if (!TLI.isTypeLegal(LVT) ||
9524 !TLI.allowsMisalignedMemoryAccesses(LVT, SrcAS) ||
9525 !TLI.allowsMisalignedMemoryAccesses(LVT, DstAS))
9527 }
9528
9529 return LVT;
9530 };
9531
9532 // This turns into unaligned loads. We only do this if the target natively
9533 // supports the MVT we'll be loading or if it is small enough (<= 4) that
9534 // we'll only produce a small number of byte loads.
9535 MVT LoadVT;
9536 unsigned NumBitsToCompare = CSize->getZExtValue() * 8;
9537 switch (NumBitsToCompare) {
9538 default:
9539 return false;
9540 case 16:
9541 LoadVT = MVT::i16;
9542 break;
9543 case 32:
9544 LoadVT = MVT::i32;
9545 break;
9546 case 64:
9547 case 128:
9548 case 256:
9549 LoadVT = hasFastLoadsAndCompare(NumBitsToCompare);
9550 break;
9551 }
9552
9553 if (LoadVT == MVT::INVALID_SIMPLE_VALUE_TYPE)
9554 return false;
9555
9556 SDValue LoadL = getMemCmpLoad(LHS, LoadVT, *this);
9557 SDValue LoadR = getMemCmpLoad(RHS, LoadVT, *this);
9558
9559 // Bitcast to a wide integer type if the loads are vectors.
9560 if (LoadVT.isVector()) {
9561 EVT CmpVT = EVT::getIntegerVT(LHS->getContext(), LoadVT.getSizeInBits());
9562 LoadL = DAG.getBitcast(CmpVT, LoadL);
9563 LoadR = DAG.getBitcast(CmpVT, LoadR);
9564 }
9565
9566 SDValue Cmp = DAG.getSetCC(getCurSDLoc(), MVT::i1, LoadL, LoadR, ISD::SETNE);
9567 processIntegerCallValue(I, Cmp, false);
9568 return true;
9569}
9570
9571/// See if we can lower a memchr call into an optimized form. If so, return
9572/// true and lower it. Otherwise return false, and it will be lowered like a
9573/// normal call.
9574/// The caller already checked that \p I calls the appropriate LibFunc with a
9575/// correct prototype.
9576bool SelectionDAGBuilder::visitMemChrCall(const CallInst &I) {
9577 const Value *Src = I.getArgOperand(0);
9578 const Value *Char = I.getArgOperand(1);
9579 const Value *Length = I.getArgOperand(2);
9580
9581 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9582 std::pair<SDValue, SDValue> Res =
9583 TSI.EmitTargetCodeForMemchr(DAG, getCurSDLoc(), DAG.getRoot(),
9584 getValue(Src), getValue(Char), getValue(Length),
9585 MachinePointerInfo(Src));
9586 if (Res.first.getNode()) {
9587 setValue(&I, Res.first);
9588 PendingLoads.push_back(Res.second);
9589 return true;
9590 }
9591
9592 return false;
9593}
9594
9595/// See if we can lower a memccpy call into an optimized form. If so, return
9596/// true and lower it, otherwise return false and it will be lowered like a
9597/// normal call.
9598/// The caller already checked that \p I calls the appropriate LibFunc with a
9599/// correct prototype.
9600bool SelectionDAGBuilder::visitMemCCpyCall(const CallInst &I) {
9601 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9602 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForMemccpy(
9603 DAG, getCurSDLoc(), DAG.getRoot(), getValue(I.getArgOperand(0)),
9604 getValue(I.getArgOperand(1)), getValue(I.getArgOperand(2)),
9605 getValue(I.getArgOperand(3)), &I);
9606
9607 if (Res.first) {
9608 processIntegerCallValue(I, Res.first, true);
9609 PendingLoads.push_back(Res.second);
9610 return true;
9611 }
9612 return false;
9613}
9614
9615/// See if we can lower a mempcpy call into an optimized form. If so, return
9616/// true and lower it. Otherwise return false, and it will be lowered like a
9617/// normal call.
9618/// The caller already checked that \p I calls the appropriate LibFunc with a
9619/// correct prototype.
9620bool SelectionDAGBuilder::visitMemPCpyCall(const CallInst &I) {
9621 SDValue Dst = getValue(I.getArgOperand(0));
9622 SDValue Src = getValue(I.getArgOperand(1));
9623 SDValue Size = getValue(I.getArgOperand(2));
9624
9625 Align DstAlign = DAG.InferPtrAlign(Dst).valueOrOne();
9626 Align SrcAlign = DAG.InferPtrAlign(Src).valueOrOne();
9627
9628 SDLoc sdl = getCurSDLoc();
9629
9630 // In the mempcpy context we need to pass in a false value for isTailCall
9631 // because the return pointer needs to be adjusted by the size of
9632 // the copied memory.
9633 SDValue Root = getMemoryRoot();
9634 SDValue MC = DAG.getMemcpy(
9635 Root, sdl, Dst, Src, Size, DstAlign, SrcAlign, false, false,
9636 /*CI=*/nullptr, std::nullopt, MachinePointerInfo(I.getArgOperand(0)),
9637 MachinePointerInfo(I.getArgOperand(1)), I.getAAMetadata());
9638 assert(MC.getNode() != nullptr &&
9639 "** memcpy should not be lowered as TailCall in mempcpy context **");
9640 DAG.setRoot(MC);
9641
9642 // Check if Size needs to be truncated or extended.
9643 Size = DAG.getSExtOrTrunc(Size, sdl, Dst.getValueType());
9644
9645 // Adjust return pointer to point just past the last dst byte.
9646 SDValue DstPlusSize = DAG.getMemBasePlusOffset(Dst, Size, sdl);
9647 setValue(&I, DstPlusSize);
9648 return true;
9649}
9650
9651/// See if we can lower a strcpy call into an optimized form. If so, return
9652/// true and lower it, otherwise return false and it will be lowered like a
9653/// normal call.
9654/// The caller already checked that \p I calls the appropriate LibFunc with a
9655/// correct prototype.
9656bool SelectionDAGBuilder::visitStrCpyCall(const CallInst &I, bool isStpcpy) {
9657 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9658
9659 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9660 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrcpy(
9661 DAG, getCurSDLoc(), getRoot(), getValue(Arg0), getValue(Arg1),
9662 MachinePointerInfo(Arg0), MachinePointerInfo(Arg1), isStpcpy, &I);
9663 if (Res.first.getNode()) {
9664 setValue(&I, Res.first);
9665 DAG.setRoot(Res.second);
9666 return true;
9667 }
9668
9669 return false;
9670}
9671
9672/// See if we can lower a strcmp call into an optimized form. If so, return
9673/// true and lower it, otherwise return false and it will be lowered like a
9674/// normal call.
9675/// The caller already checked that \p I calls the appropriate LibFunc with a
9676/// correct prototype.
9677bool SelectionDAGBuilder::visitStrCmpCall(const CallInst &I) {
9678 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9679
9680 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9681 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrcmp(
9682 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), getValue(Arg1),
9683 MachinePointerInfo(Arg0), MachinePointerInfo(Arg1), &I);
9684 if (Res.first.getNode()) {
9685 processIntegerCallValue(I, Res.first, true);
9686 PendingLoads.push_back(Res.second);
9687 return true;
9688 }
9689
9690 return false;
9691}
9692
9693/// See if we can lower a strlen call into an optimized form. If so, return
9694/// true and lower it, otherwise return false and it will be lowered like a
9695/// normal call.
9696/// The caller already checked that \p I calls the appropriate LibFunc with a
9697/// correct prototype.
9698bool SelectionDAGBuilder::visitStrLenCall(const CallInst &I) {
9699 const Value *Arg0 = I.getArgOperand(0);
9700
9701 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9702 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrlen(
9703 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), &I);
9704 if (Res.first.getNode()) {
9705 processIntegerCallValue(I, Res.first, false);
9706 PendingLoads.push_back(Res.second);
9707 return true;
9708 }
9709
9710 return false;
9711}
9712
9713/// See if we can lower a strnlen call into an optimized form. If so, return
9714/// true and lower it, otherwise return false and it will be lowered like a
9715/// normal call.
9716/// The caller already checked that \p I calls the appropriate LibFunc with a
9717/// correct prototype.
9718bool SelectionDAGBuilder::visitStrNLenCall(const CallInst &I) {
9719 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9720
9721 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9722 std::pair<SDValue, SDValue> Res =
9723 TSI.EmitTargetCodeForStrnlen(DAG, getCurSDLoc(), DAG.getRoot(),
9724 getValue(Arg0), getValue(Arg1),
9725 MachinePointerInfo(Arg0));
9726 if (Res.first.getNode()) {
9727 processIntegerCallValue(I, Res.first, false);
9728 PendingLoads.push_back(Res.second);
9729 return true;
9730 }
9731
9732 return false;
9733}
9734
9735/// See if we can lower a Strstr call into an optimized form. If so, return
9736/// true and lower it, otherwise return false and it will be lowered like a
9737/// normal call.
9738/// The caller already checked that \p I calls the appropriate LibFunc with a
9739/// correct prototype.
9740bool SelectionDAGBuilder::visitStrstrCall(const CallInst &I) {
9741 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9742 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9743 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrstr(
9744 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), getValue(Arg1), &I);
9745 if (Res.first) {
9746 processIntegerCallValue(I, Res.first, false);
9747 PendingLoads.push_back(Res.second);
9748 return true;
9749 }
9750 return false;
9751}
9752
9753/// See if we can lower a unary floating-point operation into an SDNode with
9754/// the specified Opcode. If so, return true and lower it, otherwise return
9755/// false and it will be lowered like a normal call.
9756/// The caller already checked that \p I calls the appropriate LibFunc with a
9757/// correct prototype.
9758bool SelectionDAGBuilder::visitUnaryFloatCall(const CallInst &I,
9759 unsigned Opcode) {
9760 // We already checked this call's prototype; verify it doesn't modify errno.
9761 // Do not perform optimizations for call sites that require strict
9762 // floating-point semantics.
9763 if (!I.onlyReadsMemory() || I.isStrictFP())
9764 return false;
9765
9766 SDNodeFlags Flags;
9767 Flags.copyFMF(cast<FPMathOperator>(I));
9768
9769 SDValue Tmp = getValue(I.getArgOperand(0));
9770 setValue(&I,
9771 DAG.getNode(Opcode, getCurSDLoc(), Tmp.getValueType(), Tmp, Flags));
9772 return true;
9773}
9774
9775/// See if we can lower a binary floating-point operation into an SDNode with
9776/// the specified Opcode. If so, return true and lower it. Otherwise return
9777/// false, and it will be lowered like a normal call.
9778/// The caller already checked that \p I calls the appropriate LibFunc with a
9779/// correct prototype.
9780bool SelectionDAGBuilder::visitBinaryFloatCall(const CallInst &I,
9781 unsigned Opcode) {
9782 // We already checked this call's prototype; verify it doesn't modify errno.
9783 // Do not perform optimizations for call sites that require strict
9784 // floating-point semantics.
9785 if (!I.onlyReadsMemory() || I.isStrictFP())
9786 return false;
9787
9788 SDNodeFlags Flags;
9789 Flags.copyFMF(cast<FPMathOperator>(I));
9790
9791 SDValue Tmp0 = getValue(I.getArgOperand(0));
9792 SDValue Tmp1 = getValue(I.getArgOperand(1));
9793 EVT VT = Tmp0.getValueType();
9794 setValue(&I, DAG.getNode(Opcode, getCurSDLoc(), VT, Tmp0, Tmp1, Flags));
9795 return true;
9796}
9797
9798void SelectionDAGBuilder::visitCall(const CallInst &I) {
9799 // Handle inline assembly differently.
9800 if (I.isInlineAsm()) {
9801 visitInlineAsm(I);
9802 return;
9803 }
9804
9806
9807 if (Function *F = I.getCalledFunction()) {
9808 if (F->isDeclaration()) {
9809 // Is this an LLVM intrinsic?
9810 if (unsigned IID = F->getIntrinsicID()) {
9811 visitIntrinsicCall(I, IID);
9812 return;
9813 }
9814 }
9815
9816 // Check for well-known libc/libm calls. If the function is internal, it
9817 // can't be a library call. Don't do the check if marked as nobuiltin for
9818 // some reason.
9819 // This code should not handle libcalls that are already canonicalized to
9820 // intrinsics by the middle-end.
9821 LibFunc Func;
9822 if (!I.isNoBuiltin() && !F->hasLocalLinkage() && F->hasName() &&
9823 LibInfo->getLibFunc(*F, Func) && LibInfo->hasOptimizedCodeGen(Func)) {
9824 switch (Func) {
9825 default: break;
9826 case LibFunc_bcmp:
9827 if (visitMemCmpBCmpCall(I))
9828 return;
9829 break;
9830 case LibFunc_copysign:
9831 case LibFunc_copysignf:
9832 case LibFunc_copysignl:
9833 // We already checked this call's prototype; verify it doesn't modify
9834 // errno.
9835 if (I.onlyReadsMemory()) {
9836 SDValue LHS = getValue(I.getArgOperand(0));
9837 SDValue RHS = getValue(I.getArgOperand(1));
9839 LHS.getValueType(), LHS, RHS));
9840 return;
9841 }
9842 break;
9843 case LibFunc_sin:
9844 case LibFunc_sinf:
9845 case LibFunc_sinl:
9846 if (visitUnaryFloatCall(I, ISD::FSIN))
9847 return;
9848 break;
9849 case LibFunc_cos:
9850 case LibFunc_cosf:
9851 case LibFunc_cosl:
9852 if (visitUnaryFloatCall(I, ISD::FCOS))
9853 return;
9854 break;
9855 case LibFunc_tan:
9856 case LibFunc_tanf:
9857 case LibFunc_tanl:
9858 if (visitUnaryFloatCall(I, ISD::FTAN))
9859 return;
9860 break;
9861 case LibFunc_asin:
9862 case LibFunc_asinf:
9863 case LibFunc_asinl:
9864 if (visitUnaryFloatCall(I, ISD::FASIN))
9865 return;
9866 break;
9867 case LibFunc_acos:
9868 case LibFunc_acosf:
9869 case LibFunc_acosl:
9870 if (visitUnaryFloatCall(I, ISD::FACOS))
9871 return;
9872 break;
9873 case LibFunc_atan:
9874 case LibFunc_atanf:
9875 case LibFunc_atanl:
9876 if (visitUnaryFloatCall(I, ISD::FATAN))
9877 return;
9878 break;
9879 case LibFunc_atan2:
9880 case LibFunc_atan2f:
9881 case LibFunc_atan2l:
9882 if (visitBinaryFloatCall(I, ISD::FATAN2))
9883 return;
9884 break;
9885 case LibFunc_sinh:
9886 case LibFunc_sinhf:
9887 case LibFunc_sinhl:
9888 if (visitUnaryFloatCall(I, ISD::FSINH))
9889 return;
9890 break;
9891 case LibFunc_cosh:
9892 case LibFunc_coshf:
9893 case LibFunc_coshl:
9894 if (visitUnaryFloatCall(I, ISD::FCOSH))
9895 return;
9896 break;
9897 case LibFunc_tanh:
9898 case LibFunc_tanhf:
9899 case LibFunc_tanhl:
9900 if (visitUnaryFloatCall(I, ISD::FTANH))
9901 return;
9902 break;
9903 case LibFunc_sqrt:
9904 case LibFunc_sqrtf:
9905 case LibFunc_sqrtl:
9906 case LibFunc_sqrt_finite:
9907 case LibFunc_sqrtf_finite:
9908 case LibFunc_sqrtl_finite:
9909 if (visitUnaryFloatCall(I, ISD::FSQRT))
9910 return;
9911 break;
9912 case LibFunc_log2:
9913 case LibFunc_log2f:
9914 case LibFunc_log2l:
9915 if (visitUnaryFloatCall(I, ISD::FLOG2))
9916 return;
9917 break;
9918 case LibFunc_exp2:
9919 case LibFunc_exp2f:
9920 case LibFunc_exp2l:
9921 if (visitUnaryFloatCall(I, ISD::FEXP2))
9922 return;
9923 break;
9924 case LibFunc_exp10:
9925 case LibFunc_exp10f:
9926 case LibFunc_exp10l:
9927 if (visitUnaryFloatCall(I, ISD::FEXP10))
9928 return;
9929 break;
9930 case LibFunc_ldexp:
9931 case LibFunc_ldexpf:
9932 case LibFunc_ldexpl:
9933 if (visitBinaryFloatCall(I, ISD::FLDEXP))
9934 return;
9935 break;
9936 case LibFunc_strstr:
9937 if (visitStrstrCall(I))
9938 return;
9939 break;
9940 case LibFunc_memcmp:
9941 if (visitMemCmpBCmpCall(I))
9942 return;
9943 break;
9944 case LibFunc_memccpy:
9945 if (visitMemCCpyCall(I))
9946 return;
9947 break;
9948 case LibFunc_mempcpy:
9949 if (visitMemPCpyCall(I))
9950 return;
9951 break;
9952 case LibFunc_memchr:
9953 if (visitMemChrCall(I))
9954 return;
9955 break;
9956 case LibFunc_strcpy:
9957 if (visitStrCpyCall(I, false))
9958 return;
9959 break;
9960 case LibFunc_stpcpy:
9961 if (visitStrCpyCall(I, true))
9962 return;
9963 break;
9964 case LibFunc_strcmp:
9965 if (visitStrCmpCall(I))
9966 return;
9967 break;
9968 case LibFunc_strlen:
9969 if (visitStrLenCall(I))
9970 return;
9971 break;
9972 case LibFunc_strnlen:
9973 if (visitStrNLenCall(I))
9974 return;
9975 break;
9976 }
9977 }
9978 }
9979
9980 if (I.countOperandBundlesOfType(LLVMContext::OB_ptrauth)) {
9981 LowerCallSiteWithPtrAuthBundle(cast<CallBase>(I), /*EHPadBB=*/nullptr);
9982 return;
9983 }
9984
9985 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
9986 // have to do anything here to lower funclet bundles.
9987 // CFGuardTarget bundles are lowered in LowerCallTo.
9989 I, "calls",
9994
9995 SDValue Callee = getValue(I.getCalledOperand());
9996
9997 if (I.hasDeoptState())
9998 LowerCallSiteWithDeoptBundle(&I, Callee, nullptr);
9999 else
10000 // Check if we can potentially perform a tail call. More detailed checking
10001 // is be done within LowerCallTo, after more information about the call is
10002 // known.
10003 LowerCallTo(I, Callee, I.isTailCall(), I.isMustTailCall());
10004}
10005
10007 const CallBase &CB, const BasicBlock *EHPadBB) {
10008 auto PAB = CB.getOperandBundle("ptrauth");
10009 const Value *CalleeV = CB.getCalledOperand();
10010
10011 // Gather the call ptrauth data from the operand bundle:
10012 // [ i32 <key>, i64 <discriminator> ]
10013 const auto *Key = cast<ConstantInt>(PAB->Inputs[0]);
10014 const Value *Discriminator = PAB->Inputs[1];
10015
10016 assert(Key->getType()->isIntegerTy(32) && "Invalid ptrauth key");
10017 assert(Discriminator->getType()->isIntegerTy(64) &&
10018 "Invalid ptrauth discriminator");
10019
10020 // Look through ptrauth constants to find the raw callee.
10021 // Do a direct unauthenticated call if we found it and everything matches.
10022 if (const auto *CalleeCPA = dyn_cast<ConstantPtrAuth>(CalleeV))
10023 if (CalleeCPA->isKnownCompatibleWith(Key, Discriminator,
10024 DAG.getDataLayout()))
10025 return LowerCallTo(CB, getValue(CalleeCPA->getPointer()), CB.isTailCall(),
10026 CB.isMustTailCall(), EHPadBB);
10027
10028 // Functions should never be ptrauth-called directly.
10029 assert(!isa<Function>(CalleeV) && "invalid direct ptrauth call");
10030
10031 // Otherwise, do an authenticated indirect call.
10032 TargetLowering::PtrAuthInfo PAI = {Key->getZExtValue(),
10033 getValue(Discriminator)};
10034
10035 LowerCallTo(CB, getValue(CalleeV), CB.isTailCall(), CB.isMustTailCall(),
10036 EHPadBB, &PAI);
10037}
10038
10039namespace {
10040
10041/// AsmOperandInfo - This contains information for each constraint that we are
10042/// lowering.
10043class SDISelAsmOperandInfo : public TargetLowering::AsmOperandInfo {
10044public:
10045 /// CallOperand - If this is the result output operand or a clobber
10046 /// this is null, otherwise it is the incoming operand to the CallInst.
10047 /// This gets modified as the asm is processed.
10048 SDValue CallOperand;
10049
10050 /// AssignedRegs - If this is a register or register class operand, this
10051 /// contains the set of register corresponding to the operand.
10052 RegsForValue AssignedRegs;
10053
10054 explicit SDISelAsmOperandInfo(const TargetLowering::AsmOperandInfo &info)
10055 : TargetLowering::AsmOperandInfo(info), CallOperand(nullptr, 0) {
10056 }
10057
10058 /// Whether or not this operand accesses memory
10059 bool hasMemory(const TargetLowering &TLI) const {
10060 // Indirect operand accesses access memory.
10061 if (isIndirect)
10062 return true;
10063
10064 for (const auto &Code : Codes)
10066 return true;
10067
10068 return false;
10069 }
10070};
10071
10072
10073} // end anonymous namespace
10074
10075/// Make sure that the output operand \p OpInfo and its corresponding input
10076/// operand \p MatchingOpInfo have compatible constraint types (otherwise error
10077/// out).
10078static void patchMatchingInput(const SDISelAsmOperandInfo &OpInfo,
10079 SDISelAsmOperandInfo &MatchingOpInfo,
10080 SelectionDAG &DAG) {
10081 if (OpInfo.ConstraintVT == MatchingOpInfo.ConstraintVT)
10082 return;
10083
10085 const auto &TLI = DAG.getTargetLoweringInfo();
10086
10087 std::pair<unsigned, const TargetRegisterClass *> MatchRC =
10088 TLI.getRegForInlineAsmConstraint(TRI, OpInfo.ConstraintCode,
10089 OpInfo.ConstraintVT);
10090 std::pair<unsigned, const TargetRegisterClass *> InputRC =
10091 TLI.getRegForInlineAsmConstraint(TRI, MatchingOpInfo.ConstraintCode,
10092 MatchingOpInfo.ConstraintVT);
10093 const bool OutOpIsIntOrFP =
10094 OpInfo.ConstraintVT.isInteger() || OpInfo.ConstraintVT.isFloatingPoint();
10095 const bool InOpIsIntOrFP = MatchingOpInfo.ConstraintVT.isInteger() ||
10096 MatchingOpInfo.ConstraintVT.isFloatingPoint();
10097 if ((OutOpIsIntOrFP != InOpIsIntOrFP) || (MatchRC.second != InputRC.second)) {
10098 // FIXME: error out in a more elegant fashion
10099 report_fatal_error("Unsupported asm: input constraint"
10100 " with a matching output constraint of"
10101 " incompatible type!");
10102 }
10103 MatchingOpInfo.ConstraintVT = OpInfo.ConstraintVT;
10104}
10105
10106/// Get a direct memory input to behave well as an indirect operand.
10107/// This may introduce stores, hence the need for a \p Chain.
10108/// \return The (possibly updated) chain.
10109static SDValue getAddressForMemoryInput(SDValue Chain, const SDLoc &Location,
10110 SDISelAsmOperandInfo &OpInfo,
10111 SelectionDAG &DAG) {
10112 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10113
10114 // If we don't have an indirect input, put it in the constpool if we can,
10115 // otherwise spill it to a stack slot.
10116 // TODO: This isn't quite right. We need to handle these according to
10117 // the addressing mode that the constraint wants. Also, this may take
10118 // an additional register for the computation and we don't want that
10119 // either.
10120
10121 // If the operand is a float, integer, or vector constant, spill to a
10122 // constant pool entry to get its address.
10123 const Value *OpVal = OpInfo.CallOperandVal;
10124 if (isa<ConstantFP>(OpVal) || isa<ConstantInt>(OpVal) ||
10126 OpInfo.CallOperand = DAG.getConstantPool(
10127 cast<Constant>(OpVal), TLI.getPointerTy(DAG.getDataLayout()));
10128 return Chain;
10129 }
10130
10131 // Otherwise, create a stack slot and emit a store to it before the asm.
10132 Type *Ty = OpVal->getType();
10133 auto &DL = DAG.getDataLayout();
10134 TypeSize TySize = DL.getTypeAllocSize(Ty);
10137 int StackID = 0;
10138 if (TySize.isScalable())
10139 StackID = TFI->getStackIDForScalableVectors();
10140 int SSFI = MF.getFrameInfo().CreateStackObject(TySize.getKnownMinValue(),
10141 DL.getPrefTypeAlign(Ty), false,
10142 nullptr, StackID);
10143 SDValue StackSlot = DAG.getFrameIndex(SSFI, TLI.getFrameIndexTy(DL));
10144 Chain = DAG.getTruncStore(Chain, Location, OpInfo.CallOperand, StackSlot,
10146 TLI.getMemValueType(DL, Ty));
10147 OpInfo.CallOperand = StackSlot;
10148
10149 return Chain;
10150}
10151
10152/// GetRegistersForValue - Assign registers (virtual or physical) for the
10153/// specified operand. We prefer to assign virtual registers, to allow the
10154/// register allocator to handle the assignment process. However, if the asm
10155/// uses features that we can't model on machineinstrs, we have SDISel do the
10156/// allocation. This produces generally horrible, but correct, code.
10157///
10158/// OpInfo describes the operand
10159/// RefOpInfo describes the matching operand if any, the operand otherwise
10160static std::optional<unsigned>
10162 SDISelAsmOperandInfo &OpInfo,
10163 SDISelAsmOperandInfo &RefOpInfo) {
10164 LLVMContext &Context = *DAG.getContext();
10165 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10166
10170
10171 // No work to do for memory/address operands.
10172 if (OpInfo.ConstraintType == TargetLowering::C_Memory ||
10173 OpInfo.ConstraintType == TargetLowering::C_Address)
10174 return std::nullopt;
10175
10176 // If this is a constraint for a single physreg, or a constraint for a
10177 // register class, find it.
10178 unsigned AssignedReg;
10179 const TargetRegisterClass *RC;
10180 std::tie(AssignedReg, RC) = TLI.getRegForInlineAsmConstraint(
10181 &TRI, RefOpInfo.ConstraintCode, RefOpInfo.ConstraintVT);
10182 // RC is unset only on failure. Return immediately.
10183 if (!RC)
10184 return std::nullopt;
10185
10186 // Get the actual register value type. This is important, because the user
10187 // may have asked for (e.g.) the AX register in i32 type. We need to
10188 // remember that AX is actually i16 to get the right extension.
10189 const MVT RegVT = *TRI.legalclasstypes_begin(*RC);
10190
10191 if (OpInfo.ConstraintVT != MVT::Other && RegVT != MVT::Untyped) {
10192 // If this is an FP operand in an integer register (or visa versa), or more
10193 // generally if the operand value disagrees with the register class we plan
10194 // to stick it in, fix the operand type.
10195 //
10196 // If this is an input value, the bitcast to the new type is done now.
10197 // Bitcast for output value is done at the end of visitInlineAsm().
10198 if ((OpInfo.Type == InlineAsm::isOutput ||
10199 OpInfo.Type == InlineAsm::isInput) &&
10200 !TRI.isTypeLegalForClass(*RC, OpInfo.ConstraintVT)) {
10201 // Try to convert to the first EVT that the reg class contains. If the
10202 // types are identical size, use a bitcast to convert (e.g. two differing
10203 // vector types). Note: output bitcast is done at the end of
10204 // visitInlineAsm().
10205 if (RegVT.getSizeInBits() == OpInfo.ConstraintVT.getSizeInBits()) {
10206 // Exclude indirect inputs while they are unsupported because the code
10207 // to perform the load is missing and thus OpInfo.CallOperand still
10208 // refers to the input address rather than the pointed-to value.
10209 if (OpInfo.Type == InlineAsm::isInput && !OpInfo.isIndirect)
10210 OpInfo.CallOperand =
10211 DAG.getNode(ISD::BITCAST, DL, RegVT, OpInfo.CallOperand);
10212 OpInfo.ConstraintVT = RegVT;
10213 // If the operand is an FP value and we want it in integer registers,
10214 // use the corresponding integer type. This turns an f64 value into
10215 // i64, which can be passed with two i32 values on a 32-bit machine.
10216 } else if (RegVT.isInteger() && OpInfo.ConstraintVT.isFloatingPoint()) {
10217 MVT VT = MVT::getIntegerVT(OpInfo.ConstraintVT.getSizeInBits());
10218 if (OpInfo.Type == InlineAsm::isInput)
10219 OpInfo.CallOperand =
10220 DAG.getNode(ISD::BITCAST, DL, VT, OpInfo.CallOperand);
10221 OpInfo.ConstraintVT = VT;
10222 }
10223 }
10224 }
10225
10226 // No need to allocate a matching input constraint since the constraint it's
10227 // matching to has already been allocated.
10228 if (OpInfo.isMatchingInputConstraint())
10229 return std::nullopt;
10230
10231 EVT ValueVT = OpInfo.ConstraintVT;
10232 if (OpInfo.ConstraintVT == MVT::Other)
10233 ValueVT = RegVT;
10234
10235 // Initialize NumRegs.
10236 unsigned NumRegs = 1;
10237 if (OpInfo.ConstraintVT != MVT::Other)
10238 NumRegs = TLI.getNumRegisters(Context, OpInfo.ConstraintVT, RegVT);
10239
10240 // If this is a constraint for a specific physical register, like {r17},
10241 // assign it now.
10242
10243 // If this associated to a specific register, initialize iterator to correct
10244 // place. If virtual, make sure we have enough registers
10245
10246 // Initialize iterator if necessary
10249
10250 // Do not check for single registers.
10251 if (AssignedReg) {
10252 I = std::find(I, RC->end(), AssignedReg);
10253 if (I == RC->end()) {
10254 // RC does not contain the selected register, which indicates a
10255 // mismatch between the register and the required type/bitwidth.
10256 return {AssignedReg};
10257 }
10258 }
10259
10260 for (; NumRegs; --NumRegs, ++I) {
10261 assert(I != RC->end() && "Ran out of registers to allocate!");
10262 Register R = AssignedReg ? Register(*I) : RegInfo.createVirtualRegister(RC);
10263 Regs.push_back(R);
10264 }
10265
10266 OpInfo.AssignedRegs = RegsForValue(Regs, RegVT, ValueVT);
10267 return std::nullopt;
10268}
10269
10270static unsigned
10272 const std::vector<SDValue> &AsmNodeOperands) {
10273 // Scan until we find the definition we already emitted of this operand.
10274 unsigned CurOp = InlineAsm::Op_FirstOperand;
10275 for (; OperandNo; --OperandNo) {
10276 // Advance to the next operand.
10277 unsigned OpFlag = AsmNodeOperands[CurOp]->getAsZExtVal();
10278 const InlineAsm::Flag F(OpFlag);
10279 assert(
10280 (F.isRegDefKind() || F.isRegDefEarlyClobberKind() || F.isMemKind()) &&
10281 "Skipped past definitions?");
10282 CurOp += F.getNumOperandRegisters() + 1;
10283 }
10284 return CurOp;
10285}
10286
10287namespace {
10288
10289class ExtraFlags {
10290 unsigned Flags = 0;
10291
10292public:
10293 explicit ExtraFlags(const CallBase &Call) {
10294 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
10295 if (IA->hasSideEffects())
10297 if (IA->isAlignStack())
10299 if (IA->canThrow())
10301 if (Call.isConvergent())
10303 Flags |= IA->getDialect() * InlineAsm::Extra_AsmDialect;
10304 }
10305
10306 void update(const TargetLowering::AsmOperandInfo &OpInfo) {
10307 // Ideally, we would only check against memory constraints. However, the
10308 // meaning of an Other constraint can be target-specific and we can't easily
10309 // reason about it. Therefore, be conservative and set MayLoad/MayStore
10310 // for Other constraints as well.
10313 if (OpInfo.Type == InlineAsm::isInput)
10315 else if (OpInfo.Type == InlineAsm::isOutput)
10317 else if (OpInfo.Type == InlineAsm::isClobber)
10319 }
10320 }
10321
10322 unsigned get() const { return Flags; }
10323};
10324
10325} // end anonymous namespace
10326
10327static bool isFunction(SDValue Op) {
10328 if (Op && Op.getOpcode() == ISD::GlobalAddress) {
10329 if (auto *GA = dyn_cast<GlobalAddressSDNode>(Op)) {
10330 auto Fn = dyn_cast_or_null<Function>(GA->getGlobal());
10331
10332 // In normal "call dllimport func" instruction (non-inlineasm) it force
10333 // indirect access by specifing call opcode. And usually specially print
10334 // asm with indirect symbol (i.g: "*") according to opcode. Inline asm can
10335 // not do in this way now. (In fact, this is similar with "Data Access"
10336 // action). So here we ignore dllimport function.
10337 if (Fn && !Fn->hasDLLImportStorageClass())
10338 return true;
10339 }
10340 }
10341 return false;
10342}
10343
10344namespace {
10345
10346struct ConstraintDecisionInfo {
10347 SmallVector<SDISelAsmOperandInfo, 16> ConstraintOperands;
10348 std::vector<SDValue> AsmNodeOperands;
10349 SDValue Glue, Chain;
10350 bool HasSideEffect = false;
10351 MCSymbol *BeginLabel = nullptr;
10352
10353 SmallVector<char> Buffer;
10354 raw_svector_ostream ErrorMsg;
10355
10356 ConstraintDecisionInfo() : ErrorMsg(Buffer) {}
10357};
10358
10359} // end anonymous namespace
10360
10361/// Construct operand info objects.
10362static bool
10363constructOperandInfo(ConstraintDecisionInfo &Info,
10364 TargetLowering::AsmOperandInfoVector &TargetConstraints,
10365 SelectionDAGBuilder &Builder, const TargetLowering &TLI,
10366 ExtraFlags &ExtraInfo) {
10367 for (auto &T : TargetConstraints) {
10368 Info.ConstraintOperands.push_back(SDISelAsmOperandInfo(T));
10369 SDISelAsmOperandInfo &OpInfo = Info.ConstraintOperands.back();
10370
10371 if (OpInfo.CallOperandVal)
10372 OpInfo.CallOperand = Builder.getValue(OpInfo.CallOperandVal);
10373
10374 if (!Info.HasSideEffect)
10375 Info.HasSideEffect = OpInfo.hasMemory(TLI);
10376
10377 // Determine if this InlineAsm MayLoad or MayStore based on the constraints.
10378 // FIXME: Could we compute this on OpInfo rather than T?
10379
10380 // Compute the constraint code and ConstraintType to use.
10382
10383 if (T.ConstraintType == TargetLowering::C_Immediate && OpInfo.CallOperand &&
10384 !isa<ConstantSDNode>(OpInfo.CallOperand)) {
10385 // We've delayed emitting a diagnostic like the "n" constraint because
10386 // inlining could cause an integer showing up.
10387 Info.ErrorMsg << "constraint '" << T.ConstraintCode
10388 << "' expects an integer constant expression";
10389 return true;
10390 }
10391
10392 ExtraInfo.update(T);
10393 }
10394
10395 return false;
10396}
10397
10398/// Compute which constraint option to use for each operand.
10399static void
10400computeConstraintToUse(ConstraintDecisionInfo &Info, const CallBase &Call,
10401 TargetLowering::AsmOperandInfoVector &TargetConstraints,
10402 SelectionDAGBuilder &Builder, const TargetLowering &TLI,
10403 const TargetMachine &TM, SelectionDAG &DAG) {
10404 const auto *IA = cast<InlineAsm>(Call.getCalledOperand());
10406 IA->collectAsmStrs(AsmStrs);
10407
10408 int OpNo = -1;
10409 for (SDISelAsmOperandInfo &OpInfo : Info.ConstraintOperands) {
10410 if (OpInfo.hasArg() || OpInfo.Type == InlineAsm::isOutput)
10411 OpNo++;
10412
10413 // If this is an output operand with a matching input operand, look up the
10414 // matching input. If their types mismatch, e.g. one is an integer, the
10415 // other is floating point, or their sizes are different, flag it as an
10416 // error.
10417 if (OpInfo.hasMatchingInput()) {
10418 SDISelAsmOperandInfo &Input =
10419 Info.ConstraintOperands[OpInfo.MatchingInput];
10420 patchMatchingInput(OpInfo, Input, DAG);
10421 }
10422
10423 // Compute the constraint code and ConstraintType to use.
10424 TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
10425
10426 if ((OpInfo.ConstraintType == TargetLowering::C_Memory &&
10427 OpInfo.Type == InlineAsm::isClobber) ||
10428 OpInfo.ConstraintType == TargetLowering::C_Address)
10429 continue;
10430
10431 // In Linux PIC model, there are 4 cases about value/label addressing:
10432 //
10433 // 1: Function call or Label jmp inside the module.
10434 // 2: Data access (such as global variable, static variable) inside module.
10435 // 3: Function call or Label jmp outside the module.
10436 // 4: Data access (such as global variable) outside the module.
10437 //
10438 // Due to current llvm inline asm architecture designed to not "recognize"
10439 // the asm code, there are quite troubles for us to treat mem addressing
10440 // differently for same value/adress used in different instuctions.
10441 // For example, in pic model, call a func may in plt way or direclty
10442 // pc-related, but lea/mov a function adress may use got.
10443 //
10444 // Here we try to "recognize" function call for the case 1 and case 3 in
10445 // inline asm. And try to adjust the constraint for them.
10446 //
10447 // TODO: Due to current inline asm didn't encourage to jmp to the outsider
10448 // label, so here we don't handle jmp function label now, but we need to
10449 // enhance it (especilly in PIC model) if we meet meaningful requirements.
10450 if (OpInfo.isIndirect && isFunction(OpInfo.CallOperand) &&
10451 TLI.isInlineAsmTargetBranch(AsmStrs, OpNo) &&
10453 OpInfo.isIndirect = false;
10454 OpInfo.ConstraintType = TargetLowering::C_Address;
10455 }
10456
10457 // If this is a memory input, and if the operand is not indirect, do what we
10458 // need to provide an address for the memory input.
10459 if (OpInfo.ConstraintType == TargetLowering::C_Memory &&
10460 !OpInfo.isIndirect) {
10461 assert((OpInfo.isMultipleAlternative ||
10462 (OpInfo.Type == InlineAsm::isInput)) &&
10463 "Can only indirectify direct input operands!");
10464
10465 // Memory operands really want the address of the value.
10466 Info.Chain = getAddressForMemoryInput(Info.Chain, Builder.getCurSDLoc(),
10467 OpInfo, DAG);
10468
10469 // There is no longer a Value* corresponding to this operand.
10470 OpInfo.CallOperandVal = nullptr;
10471
10472 // It is now an indirect operand.
10473 OpInfo.isIndirect = true;
10474 }
10475 }
10476}
10477
10478/// Prepare DAG-level operands. As part of this, assign virtual and physical
10479/// registers for inputs and output.
10480static bool prepareDAGLevelOperands(ConstraintDecisionInfo &Info,
10481 const CallBase &Call,
10482 SelectionDAGBuilder &Builder,
10483 const TargetLowering &TLI,
10484 SelectionDAG &DAG) {
10485 SDLoc DL = Builder.getCurSDLoc();
10486 for (SDISelAsmOperandInfo &OpInfo : Info.ConstraintOperands) {
10487 // Assign Registers.
10488 SDISelAsmOperandInfo &RefOpInfo =
10489 OpInfo.isMatchingInputConstraint()
10490 ? Info.ConstraintOperands[OpInfo.getMatchedOperand()]
10491 : OpInfo;
10492 const auto RegError = getRegistersForValue(DAG, DL, OpInfo, RefOpInfo);
10493 if (RegError) {
10494 const MachineFunction &MF = DAG.getMachineFunction();
10496 const char *RegName = TRI.getName(*RegError);
10497 Info.ErrorMsg << "register '" << RegName << "' allocated for constraint '"
10498 << OpInfo.ConstraintCode
10499 << "' does not match required type";
10500 return true;
10501 }
10502
10503 auto DetectWriteToReservedRegister = [&]() {
10504 const MachineFunction &MF = DAG.getMachineFunction();
10506
10507 for (Register Reg : OpInfo.AssignedRegs.Regs) {
10508 if (Reg.isPhysical() && TRI.isInlineAsmReadOnlyReg(MF, Reg)) {
10509 Info.ErrorMsg << "write to reserved register '"
10510 << TRI.getRegAsmName(Reg) << "'";
10511 return true;
10512 }
10513 }
10514
10515 return false;
10516 };
10517 assert((OpInfo.ConstraintType != TargetLowering::C_Address ||
10518 (OpInfo.Type == InlineAsm::isInput &&
10519 !OpInfo.isMatchingInputConstraint())) &&
10520 "Only address as input operand is allowed.");
10521
10522 switch (OpInfo.Type) {
10524 if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
10525 const InlineAsm::ConstraintCode ConstraintID =
10526 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10528 "Failed to convert memory constraint code to constraint id.");
10529
10530 // Add information to the INLINEASM node to know about this output.
10532 OpFlags.setMemConstraint(ConstraintID);
10533 Info.AsmNodeOperands.push_back(
10534 DAG.getTargetConstant(OpFlags, DL, MVT::i32));
10535 Info.AsmNodeOperands.push_back(OpInfo.CallOperand);
10536 } else {
10537 // Otherwise, this outputs to a register (directly for C_Register /
10538 // C_RegisterClass, and a target-defined fashion for
10539 // C_Immediate/C_Other). Find a register that we can use.
10540 if (OpInfo.AssignedRegs.Regs.empty()) {
10541 Info.ErrorMsg << "could not allocate output register for "
10542 << "constraint '" << OpInfo.ConstraintCode << "'";
10543 return true;
10544 }
10545
10546 if (DetectWriteToReservedRegister())
10547 return true;
10548
10549 // Add information to the INLINEASM node to know that this register is
10550 // set.
10551 OpInfo.AssignedRegs.AddInlineAsmOperands(
10552 OpInfo.isEarlyClobber ? InlineAsm::Kind::RegDefEarlyClobber
10554 false, 0, DL, DAG, Info.AsmNodeOperands);
10555 }
10556 break;
10557
10558 case InlineAsm::isInput:
10559 case InlineAsm::isLabel: {
10560 SDValue InOperandVal = OpInfo.CallOperand;
10561
10562 if (OpInfo.isMatchingInputConstraint()) {
10563 // If this is required to match an output register we have already set,
10564 // just use its register.
10565 auto CurOp = findMatchingInlineAsmOperand(OpInfo.getMatchedOperand(),
10566 Info.AsmNodeOperands);
10567 InlineAsm::Flag Flag(Info.AsmNodeOperands[CurOp]->getAsZExtVal());
10568 if (Flag.isRegDefKind() || Flag.isRegDefEarlyClobberKind()) {
10569 if (OpInfo.isIndirect) {
10570 // This happens on gcc/testsuite/gcc.dg/pr8788-1.c
10571 Info.ErrorMsg << "inline asm not supported yet: cannot handle "
10572 << "tied indirect register inputs";
10573 return true;
10574 }
10575
10578 MachineRegisterInfo &MRI = MF.getRegInfo();
10580 auto *R = cast<RegisterSDNode>(Info.AsmNodeOperands[CurOp + 1]);
10581 Register TiedReg = R->getReg();
10582 MVT RegVT = R->getSimpleValueType(0);
10583 const TargetRegisterClass *RC =
10584 TiedReg.isVirtual() ? MRI.getRegClass(TiedReg)
10585 : RegVT != MVT::Untyped ? TLI.getRegClassFor(RegVT)
10586 : TRI.getMinimalPhysRegClass(TiedReg);
10587 for (unsigned I = 0, E = Flag.getNumOperandRegisters(); I != E; ++I)
10588 Regs.push_back(MRI.createVirtualRegister(RC));
10589
10590 RegsForValue MatchedRegs(Regs, RegVT, InOperandVal.getValueType());
10591
10592 // Use the produced MatchedRegs object to
10593 MatchedRegs.getCopyToRegs(InOperandVal, DAG, DL, Info.Chain,
10594 &Info.Glue, &Call);
10596 OpInfo.getMatchedOperand(), DL, DAG,
10597 Info.AsmNodeOperands);
10598 break;
10599 }
10600
10601 assert(Flag.isMemKind() && "Unknown matching constraint!");
10602 assert(Flag.getNumOperandRegisters() == 1 &&
10603 "Unexpected number of operands");
10604
10605 // Add information to the INLINEASM node to know about this input.
10606 // See InlineAsm.h isUseOperandTiedToDef.
10607 Flag.clearMemConstraint();
10608 Flag.setMatchingOp(OpInfo.getMatchedOperand());
10609 Info.AsmNodeOperands.push_back(DAG.getTargetConstant(
10610 Flag, DL, TLI.getPointerTy(DAG.getDataLayout())));
10611 Info.AsmNodeOperands.push_back(Info.AsmNodeOperands[CurOp + 1]);
10612 break;
10613 }
10614
10615 // Treat indirect 'X' constraint as memory.
10616 if (OpInfo.ConstraintType == TargetLowering::C_Other &&
10617 OpInfo.isIndirect)
10618 OpInfo.ConstraintType = TargetLowering::C_Memory;
10619
10620 if (OpInfo.ConstraintType == TargetLowering::C_Immediate ||
10621 OpInfo.ConstraintType == TargetLowering::C_Other) {
10622 std::vector<SDValue> Ops;
10623 TLI.LowerAsmOperandForConstraint(InOperandVal, OpInfo.ConstraintCode,
10624 Ops, DAG);
10625 if (Ops.empty()) {
10626 if (OpInfo.ConstraintType == TargetLowering::C_Immediate)
10627 if (isa<ConstantSDNode>(InOperandVal)) {
10628 Info.ErrorMsg << "value out of range for constraint '"
10629 << OpInfo.ConstraintCode << "'";
10630 return true;
10631 }
10632
10633 Info.ErrorMsg << "invalid operand for inline asm constraint '"
10634 << OpInfo.ConstraintCode << "'";
10635 return true;
10636 }
10637
10638 // Add information to the INLINEASM node to know about this input.
10639 InlineAsm::Flag ResOpType(InlineAsm::Kind::Imm, Ops.size());
10640 Info.AsmNodeOperands.push_back(DAG.getTargetConstant(
10641 ResOpType, DL, TLI.getPointerTy(DAG.getDataLayout())));
10642 llvm::append_range(Info.AsmNodeOperands, Ops);
10643 break;
10644 }
10645
10646 if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
10647 assert((OpInfo.isIndirect ||
10648 OpInfo.ConstraintType != TargetLowering::C_Memory) &&
10649 "Operand must be indirect to be a mem!");
10650 assert(InOperandVal.getValueType() ==
10651 TLI.getPointerTy(DAG.getDataLayout()) &&
10652 "Memory operands expect pointer values");
10653
10654 const InlineAsm::ConstraintCode ConstraintID =
10655 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10657 "Failed to convert memory constraint code to constraint id.");
10658
10659 // Add information to the INLINEASM node to know about this input.
10661 ResOpType.setMemConstraint(ConstraintID);
10662 Info.AsmNodeOperands.push_back(
10663 DAG.getTargetConstant(ResOpType, DL, MVT::i32));
10664 Info.AsmNodeOperands.push_back(InOperandVal);
10665 break;
10666 }
10667
10668 if (OpInfo.ConstraintType == TargetLowering::C_Address) {
10669 const InlineAsm::ConstraintCode ConstraintID =
10670 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10672 "Failed to convert memory constraint code to constraint id.");
10673
10675
10676 SDValue AsmOp = InOperandVal;
10677 if (isFunction(InOperandVal)) {
10678 auto *GA = cast<GlobalAddressSDNode>(InOperandVal);
10679 ResOpType = InlineAsm::Flag(InlineAsm::Kind::Func, 1);
10680 AsmOp = DAG.getTargetGlobalAddress(GA->getGlobal(), DL,
10681 InOperandVal.getValueType(),
10682 GA->getOffset());
10683 }
10684
10685 // Add information to the INLINEASM node to know about this input.
10686 ResOpType.setMemConstraint(ConstraintID);
10687
10688 Info.AsmNodeOperands.push_back(
10689 DAG.getTargetConstant(ResOpType, DL, MVT::i32));
10690 Info.AsmNodeOperands.push_back(AsmOp);
10691 break;
10692 }
10693
10694 if (OpInfo.ConstraintType != TargetLowering::C_RegisterClass &&
10695 OpInfo.ConstraintType != TargetLowering::C_Register) {
10696 Info.ErrorMsg << "unknown asm constraint '" << OpInfo.ConstraintCode
10697 << "'";
10698 return true;
10699 }
10700
10701 // TODO: Support this.
10702 if (OpInfo.isIndirect) {
10703 Info.ErrorMsg << "cannot handle indirect register inputs yet for "
10704 << "constraint '" << OpInfo.ConstraintCode << "'";
10705 return true;
10706 }
10707
10708 // Copy the input into the appropriate registers.
10709 if (OpInfo.AssignedRegs.Regs.empty()) {
10710 Info.ErrorMsg << "could not allocate input reg for constraint '"
10711 << OpInfo.ConstraintCode << "'";
10712 return true;
10713 }
10714
10715 if (DetectWriteToReservedRegister())
10716 return true;
10717
10718 OpInfo.AssignedRegs.getCopyToRegs(InOperandVal, DAG, DL, Info.Chain,
10719 &Info.Glue, &Call);
10720 OpInfo.AssignedRegs.AddInlineAsmOperands(
10721 InlineAsm::Kind::RegUse, false, 0, DL, DAG, Info.AsmNodeOperands);
10722 break;
10723 }
10724
10726 // Add the clobbered value to the operand list, so that the register
10727 // allocator is aware that the physreg got clobbered.
10728 if (!OpInfo.AssignedRegs.Regs.empty())
10729 OpInfo.AssignedRegs.AddInlineAsmOperands(
10730 InlineAsm::Kind::Clobber, false, 0, DL, DAG, Info.AsmNodeOperands);
10731 break;
10732 }
10733 }
10734
10735 return false;
10736}
10737
10738/// DetermineConstraints - Find the constraints to use for inline asm operands.
10739static bool
10740determineConstraints(ConstraintDecisionInfo &Info,
10741 TargetLowering::AsmOperandInfoVector &TargetConstraints,
10742 const CallBase &Call, SelectionDAGBuilder &Builder,
10743 const TargetLowering &TLI, const TargetMachine &TM,
10744 SelectionDAG &DAG, const BasicBlock *EHPadBB) {
10745 const auto *IA = cast<InlineAsm>(Call.getCalledOperand());
10746 ExtraFlags ExtraInfo(Call);
10747
10748 // First pass: Construct operand info objects.
10749 Info.HasSideEffect = IA->hasSideEffects();
10750 if (constructOperandInfo(Info, TargetConstraints, Builder, TLI, ExtraInfo))
10751 return true;
10752
10753 // We won't need to flush pending loads if this asm doesn't touch
10754 // memory and is nonvolatile.
10755 Info.Chain = Info.HasSideEffect ? Builder.getRoot() : DAG.getRoot();
10756
10757 bool IsCallBr = isa<CallBrInst>(Call);
10758 bool EmitEHLabels = isa<InvokeInst>(Call);
10759 if (IsCallBr || EmitEHLabels)
10760 // If this is a callbr or invoke we need to flush pending exports since
10761 // inlineasm_br and invoke are terminators.
10762 // We need to do this before nodes are glued to the inlineasm_br node.
10763 Info.Chain = Builder.getControlRoot();
10764
10765 if (EmitEHLabels)
10766 Info.Chain = Builder.lowerStartEH(Info.Chain, EHPadBB, Info.BeginLabel);
10767
10768 // Second pass: Compute which constraint option to use.
10769 computeConstraintToUse(Info, Call, TargetConstraints, Builder, TLI, TM, DAG);
10770
10771 // AsmNodeOperands - The operands for the ISD::INLINEASM node.
10772 Info.AsmNodeOperands.push_back(SDValue()); // reserve space for input chain
10773 Info.AsmNodeOperands.push_back(DAG.getTargetExternalSymbol(
10774 IA->getAsmString().data(), TLI.getProgramPointerTy(DAG.getDataLayout())));
10775
10776 // If we have a !srcloc metadata node associated with it, we want to attach
10777 // this to the ultimately generated inline asm machineinstr. To do this, we
10778 // pass in the third operand as this (potentially null) inline asm MDNode.
10779 const MDNode *SrcLoc = Call.getMetadata("srcloc");
10780 Info.AsmNodeOperands.push_back(DAG.getMDNode(SrcLoc));
10781
10782 // Remember the HasSideEffect, AlignStack, AsmDialect, MayLoad and MayStore
10783 // bits as operand 3.
10784 Info.AsmNodeOperands.push_back(
10785 DAG.getTargetConstant(ExtraInfo.get(), Builder.getCurSDLoc(),
10786 TLI.getPointerTy(DAG.getDataLayout())));
10787
10788 // Third pass: Prepare DAG-level operands
10789 return prepareDAGLevelOperands(Info, Call, Builder, TLI, DAG);
10790}
10791
10792/// visitInlineAsm - Handle a call to an InlineAsm object.
10793void SelectionDAGBuilder::visitInlineAsm(const CallBase &Call,
10794 const BasicBlock *EHPadBB) {
10795 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10797 DAG.getDataLayout(), DAG.getSubtarget().getRegisterInfo(), Call);
10798
10799 assert((!isa<InvokeInst>(Call) || EHPadBB) &&
10800 "InvokeInst must have an EHPadBB");
10801
10802 ConstraintDecisionInfo Info;
10803 if (determineConstraints(Info, TargetConstraints, Call, *this, TLI, TM, DAG,
10804 EHPadBB))
10805 return emitInlineAsmError(Call, Info.ErrorMsg.str());
10806
10807 SDValue Glue = Info.Glue;
10808 SDValue Chain = Info.Chain;
10809
10810 // Finish up input operands. Set the input chain and add the flag last.
10811 Info.AsmNodeOperands[InlineAsm::Op_InputChain] = Chain;
10812 if (Glue.getNode())
10813 Info.AsmNodeOperands.push_back(Glue);
10814
10815 bool IsCallBr = isa<CallBrInst>(Call);
10816 unsigned ISDOpc = IsCallBr ? ISD::INLINEASM_BR : ISD::INLINEASM;
10817 Chain =
10818 DAG.getNode(ISDOpc, getCurSDLoc(), DAG.getVTList(MVT::Other, MVT::Glue),
10819 Info.AsmNodeOperands);
10820 Glue = Chain.getValue(1);
10821
10822 // Do additional work to generate outputs.
10823
10824 SmallVector<EVT, 1> ResultVTs;
10825 SmallVector<SDValue, 1> ResultValues;
10826 SmallVector<SDValue, 8> OutChains;
10827
10828 llvm::Type *CallResultType = Call.getType();
10829 ArrayRef<Type *> ResultTypes;
10830 if (StructType *StructResult = dyn_cast<StructType>(CallResultType))
10831 ResultTypes = StructResult->elements();
10832 else if (!CallResultType->isVoidTy())
10833 ResultTypes = ArrayRef(CallResultType);
10834
10835 auto CurResultType = ResultTypes.begin();
10836 auto handleRegAssign = [&](SDValue V) {
10837 assert(CurResultType != ResultTypes.end() && "Unexpected value");
10838 assert((*CurResultType)->isSized() && "Unexpected unsized type");
10839 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), *CurResultType);
10840 ++CurResultType;
10841 // If the type of the inline asm call site return value is different but has
10842 // same size as the type of the asm output bitcast it. One example of this
10843 // is for vectors with different width / number of elements. This can
10844 // happen for register classes that can contain multiple different value
10845 // types. The preg or vreg allocated may not have the same VT as was
10846 // expected.
10847 //
10848 // This can also happen for a return value that disagrees with the register
10849 // class it is put in, eg. a double in a general-purpose register on a
10850 // 32-bit machine.
10851 if (ResultVT != V.getValueType() &&
10852 ResultVT.getSizeInBits() == V.getValueSizeInBits())
10853 V = DAG.getNode(ISD::BITCAST, getCurSDLoc(), ResultVT, V);
10854 else if (ResultVT != V.getValueType() && ResultVT.isInteger() &&
10855 V.getValueType().isInteger()) {
10856 // If a result value was tied to an input value, the computed result
10857 // may have a wider width than the expected result. Extract the
10858 // relevant portion.
10859 V = DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), ResultVT, V);
10860 }
10861 assert(ResultVT == V.getValueType() && "Asm result value mismatch!");
10862 ResultVTs.push_back(ResultVT);
10863 ResultValues.push_back(V);
10864 };
10865
10866 // Deal with output operands.
10867 for (SDISelAsmOperandInfo &OpInfo : Info.ConstraintOperands) {
10868 if (OpInfo.Type == InlineAsm::isOutput) {
10869 SDValue Val;
10870 // Skip trivial output operands.
10871 if (OpInfo.AssignedRegs.Regs.empty())
10872 continue;
10873
10874 switch (OpInfo.ConstraintType) {
10877 Val = OpInfo.AssignedRegs.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(),
10878 Chain, &Glue, &Call);
10879 break;
10882 Val = TLI.LowerAsmOutputForConstraint(Chain, Glue, getCurSDLoc(),
10883 OpInfo, DAG);
10884 break;
10886 break; // Already handled.
10888 break; // Silence warning.
10890 assert(false && "Unexpected unknown constraint");
10891 }
10892
10893 // Indirect output manifest as stores. Record output chains.
10894 if (OpInfo.isIndirect) {
10895 const Value *Ptr = OpInfo.CallOperandVal;
10896 assert(Ptr && "Expected value CallOperandVal for indirect asm operand");
10897 SDValue Store = DAG.getStore(Chain, getCurSDLoc(), Val, getValue(Ptr),
10898 MachinePointerInfo(Ptr));
10899 OutChains.push_back(Store);
10900 } else {
10901 // generate CopyFromRegs to associated registers.
10902 assert(!Call.getType()->isVoidTy() && "Bad inline asm!");
10903 if (Val.getOpcode() == ISD::MERGE_VALUES) {
10904 for (const SDValue &V : Val->op_values())
10905 handleRegAssign(V);
10906 } else
10907 handleRegAssign(Val);
10908 }
10909 }
10910 }
10911
10912 // Set results.
10913 if (!ResultValues.empty()) {
10914 assert(CurResultType == ResultTypes.end() &&
10915 "Mismatch in number of ResultTypes");
10916 assert(ResultValues.size() == ResultTypes.size() &&
10917 "Mismatch in number of output operands in asm result");
10918
10920 DAG.getVTList(ResultVTs), ResultValues);
10921 setValue(&Call, V);
10922 }
10923
10924 // Collect store chains.
10925 if (!OutChains.empty())
10926 Chain = DAG.getNode(ISD::TokenFactor, getCurSDLoc(), MVT::Other, OutChains);
10927
10928 if (const auto *II = dyn_cast<InvokeInst>(&Call))
10929 Chain = lowerEndEH(Chain, II, EHPadBB, Info.BeginLabel);
10930
10931 // Only Update Root if inline assembly has a memory effect.
10932 if (ResultValues.empty() || Info.HasSideEffect || !OutChains.empty() ||
10933 IsCallBr || isa<InvokeInst>(Call))
10934 DAG.setRoot(Chain);
10935}
10936
10937void SelectionDAGBuilder::emitInlineAsmError(const CallBase &Call,
10938 const Twine &Message) {
10939 LLVMContext &Ctx = *DAG.getContext();
10940 Ctx.diagnose(DiagnosticInfoInlineAsm(Call, Message));
10941
10942 // Make sure we leave the DAG in a valid state
10943 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10944 SmallVector<EVT, 1> ValueVTs;
10945 ComputeValueVTs(TLI, DAG.getDataLayout(), Call.getType(), ValueVTs);
10946
10947 if (ValueVTs.empty())
10948 return;
10949
10951 for (const EVT &VT : ValueVTs)
10952 Ops.push_back(DAG.getUNDEF(VT));
10953
10954 setValue(&Call, DAG.getMergeValues(Ops, getCurSDLoc()));
10955}
10956
10957void SelectionDAGBuilder::visitVAStart(const CallInst &I) {
10958 DAG.setRoot(DAG.getNode(ISD::VASTART, getCurSDLoc(),
10959 MVT::Other, getRoot(),
10960 getValue(I.getArgOperand(0)),
10961 DAG.getSrcValue(I.getArgOperand(0))));
10962}
10963
10964void SelectionDAGBuilder::visitVAArg(const VAArgInst &I) {
10965 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10966 const DataLayout &DL = DAG.getDataLayout();
10967 SDValue V = DAG.getVAArg(
10968 TLI.getMemValueType(DAG.getDataLayout(), I.getType()), getCurSDLoc(),
10969 getRoot(), getValue(I.getOperand(0)), DAG.getSrcValue(I.getOperand(0)),
10970 DL.getABITypeAlign(I.getType()).value());
10971 DAG.setRoot(V.getValue(1));
10972
10973 if (I.getType()->isPointerTy())
10974 V = DAG.getPtrExtOrTrunc(
10975 V, getCurSDLoc(), TLI.getValueType(DAG.getDataLayout(), I.getType()));
10976 setValue(&I, V);
10977}
10978
10979void SelectionDAGBuilder::visitVAEnd(const CallInst &I) {
10980 DAG.setRoot(DAG.getNode(ISD::VAEND, getCurSDLoc(),
10981 MVT::Other, getRoot(),
10982 getValue(I.getArgOperand(0)),
10983 DAG.getSrcValue(I.getArgOperand(0))));
10984}
10985
10986void SelectionDAGBuilder::visitVACopy(const CallInst &I) {
10987 DAG.setRoot(DAG.getNode(ISD::VACOPY, getCurSDLoc(),
10988 MVT::Other, getRoot(),
10989 getValue(I.getArgOperand(0)),
10990 getValue(I.getArgOperand(1)),
10991 DAG.getSrcValue(I.getArgOperand(0)),
10992 DAG.getSrcValue(I.getArgOperand(1))));
10993}
10994
10996 const Instruction &I,
10997 SDValue Op) {
10998 std::optional<ConstantRange> CR = getRange(I);
10999
11000 if (!CR || CR->isFullSet() || CR->isEmptySet() || CR->isUpperWrapped())
11001 return Op;
11002
11003 APInt Hi = CR->getUnsignedMax();
11004 unsigned Bits = std::max(Hi.getActiveBits(),
11005 static_cast<unsigned>(IntegerType::MIN_INT_BITS));
11006
11007 EVT SmallVT = EVT::getIntegerVT(*DAG.getContext(), Bits);
11008
11009 SDLoc SL = getCurSDLoc();
11010
11011 SDValue ZExt = DAG.getNode(ISD::AssertZext, SL, Op.getValueType(), Op,
11012 DAG.getValueType(SmallVT));
11013 unsigned NumVals = Op.getNode()->getNumValues();
11014 if (NumVals == 1)
11015 return ZExt;
11016
11018
11019 Ops.push_back(ZExt);
11020 for (unsigned I = 1; I != NumVals; ++I)
11021 Ops.push_back(Op.getValue(I));
11022
11023 return DAG.getMergeValues(Ops, SL);
11024}
11025
11027 SelectionDAG &DAG, const Instruction &I, SDValue Op) {
11028 FPClassTest Classes = getNoFPClass(I);
11029 if (Classes == fcNone)
11030 return Op;
11031
11032 SDLoc SL = getCurSDLoc();
11033 SDValue TestConst = DAG.getTargetConstant(Classes, SDLoc(), MVT::i32);
11034
11035 if (Op.getOpcode() != ISD::MERGE_VALUES) {
11036 return DAG.getNode(ISD::AssertNoFPClass, SL, Op.getValueType(), Op,
11037 TestConst);
11038 }
11039
11040 SmallVector<SDValue, 8> Ops(Op.getNumOperands());
11041 for (unsigned I = 0, E = Ops.size(); I != E; ++I) {
11042 SDValue MergeOp = Op.getOperand(I);
11043 Ops[I] = DAG.getNode(ISD::AssertNoFPClass, SL, MergeOp.getValueType(),
11044 MergeOp, TestConst);
11045 }
11046
11047 return DAG.getMergeValues(Ops, SL);
11048}
11049
11050/// Populate a CallLowerinInfo (into \p CLI) based on the properties of
11051/// the call being lowered.
11052///
11053/// This is a helper for lowering intrinsics that follow a target calling
11054/// convention or require stack pointer adjustment. Only a subset of the
11055/// intrinsic's operands need to participate in the calling convention.
11058 unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy,
11059 AttributeSet RetAttrs, bool IsPatchPoint) {
11061 Args.reserve(NumArgs);
11062
11063 // Populate the argument list.
11064 // Attributes for args start at offset 1, after the return attribute.
11065 for (unsigned ArgI = ArgIdx, ArgE = ArgIdx + NumArgs;
11066 ArgI != ArgE; ++ArgI) {
11067 const Value *V = Call->getOperand(ArgI);
11068
11069 assert(!V->getType()->isEmptyTy() && "Empty type passed to intrinsic.");
11070
11071 TargetLowering::ArgListEntry Entry(getValue(V), V->getType());
11072 Entry.setAttributes(Call, ArgI);
11073 Args.push_back(Entry);
11074 }
11075
11077 .setChain(getRoot())
11078 .setCallee(Call->getCallingConv(), ReturnTy, Callee, std::move(Args),
11079 RetAttrs)
11080 .setDiscardResult(Call->use_empty())
11081 .setIsPatchPoint(IsPatchPoint)
11083 Call->countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0);
11084}
11085
11086/// Add a stack map intrinsic call's live variable operands to a stackmap
11087/// or patchpoint target node's operand list.
11088///
11089/// Constants are converted to TargetConstants purely as an optimization to
11090/// avoid constant materialization and register allocation.
11091///
11092/// FrameIndex operands are converted to TargetFrameIndex so that ISEL does not
11093/// generate addess computation nodes, and so FinalizeISel can convert the
11094/// TargetFrameIndex into a DirectMemRefOp StackMap location. This avoids
11095/// address materialization and register allocation, but may also be required
11096/// for correctness. If a StackMap (or PatchPoint) intrinsic directly uses an
11097/// alloca in the entry block, then the runtime may assume that the alloca's
11098/// StackMap location can be read immediately after compilation and that the
11099/// location is valid at any point during execution (this is similar to the
11100/// assumption made by the llvm.gcroot intrinsic). If the alloca's location were
11101/// only available in a register, then the runtime would need to trap when
11102/// execution reaches the StackMap in order to read the alloca's location.
11103static void addStackMapLiveVars(const CallBase &Call, unsigned StartIdx,
11105 SelectionDAGBuilder &Builder) {
11106 SelectionDAG &DAG = Builder.DAG;
11107 for (unsigned I = StartIdx; I < Call.arg_size(); I++) {
11108 SDValue Op = Builder.getValue(Call.getArgOperand(I));
11109
11110 // Things on the stack are pointer-typed, meaning that they are already
11111 // legal and can be emitted directly to target nodes.
11113 Ops.push_back(DAG.getTargetFrameIndex(FI->getIndex(), Op.getValueType()));
11114 } else {
11115 // Otherwise emit a target independent node to be legalised.
11116 Ops.push_back(Builder.getValue(Call.getArgOperand(I)));
11117 }
11118 }
11119}
11120
11121/// Lower llvm.experimental.stackmap.
11122void SelectionDAGBuilder::visitStackmap(const CallInst &CI) {
11123 // void @llvm.experimental.stackmap(i64 <id>, i32 <numShadowBytes>,
11124 // [live variables...])
11125
11126 assert(CI.getType()->isVoidTy() && "Stackmap cannot return a value.");
11127
11128 SDValue Chain, InGlue, Callee;
11130
11131 SDLoc DL = getCurSDLoc();
11133
11134 // The stackmap intrinsic only records the live variables (the arguments
11135 // passed to it) and emits NOPS (if requested). Unlike the patchpoint
11136 // intrinsic, this won't be lowered to a function call. This means we don't
11137 // have to worry about calling conventions and target specific lowering code.
11138 // Instead we perform the call lowering right here.
11139 //
11140 // chain, flag = CALLSEQ_START(chain, 0, 0)
11141 // chain, flag = STACKMAP(id, nbytes, ..., chain, flag)
11142 // chain, flag = CALLSEQ_END(chain, 0, 0, flag)
11143 //
11144 Chain = DAG.getCALLSEQ_START(getRoot(), 0, 0, DL);
11145 InGlue = Chain.getValue(1);
11146
11147 // Add the STACKMAP operands, starting with DAG house-keeping.
11148 Ops.push_back(Chain);
11149 Ops.push_back(InGlue);
11150
11151 // Add the <id>, <numShadowBytes> operands.
11152 //
11153 // These do not require legalisation, and can be emitted directly to target
11154 // constant nodes.
11156 assert(ID.getValueType() == MVT::i64);
11157 SDValue IDConst =
11158 DAG.getTargetConstant(ID->getAsZExtVal(), DL, ID.getValueType());
11159 Ops.push_back(IDConst);
11160
11161 SDValue Shad = getValue(CI.getArgOperand(1));
11162 assert(Shad.getValueType() == MVT::i32);
11163 SDValue ShadConst =
11164 DAG.getTargetConstant(Shad->getAsZExtVal(), DL, Shad.getValueType());
11165 Ops.push_back(ShadConst);
11166
11167 // Add the live variables.
11168 addStackMapLiveVars(CI, 2, DL, Ops, *this);
11169
11170 // Create the STACKMAP node.
11171 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
11172 Chain = DAG.getNode(ISD::STACKMAP, DL, NodeTys, Ops);
11173 InGlue = Chain.getValue(1);
11174
11175 Chain = DAG.getCALLSEQ_END(Chain, 0, 0, InGlue, DL);
11176
11177 // Stackmaps don't generate values, so nothing goes into the NodeMap.
11178
11179 // Set the root to the target-lowered call chain.
11180 DAG.setRoot(Chain);
11181
11182 // Inform the Frame Information that we have a stackmap in this function.
11183 FuncInfo.MF->getFrameInfo().setHasStackMap();
11184}
11185
11186/// Lower llvm.experimental.patchpoint directly to its target opcode.
11187void SelectionDAGBuilder::visitPatchpoint(const CallBase &CB,
11188 const BasicBlock *EHPadBB) {
11189 // <ty> @llvm.experimental.patchpoint.<ty>(i64 <id>,
11190 // i32 <numBytes>,
11191 // i8* <target>,
11192 // i32 <numArgs>,
11193 // [Args...],
11194 // [live variables...])
11195
11197 bool IsAnyRegCC = CC == CallingConv::AnyReg;
11198 bool HasDef = !CB.getType()->isVoidTy();
11199 SDLoc dl = getCurSDLoc();
11201
11202 // Handle immediate and symbolic callees.
11203 if (auto* ConstCallee = dyn_cast<ConstantSDNode>(Callee))
11204 Callee = DAG.getIntPtrConstant(ConstCallee->getZExtValue(), dl,
11205 /*isTarget=*/true);
11206 else if (auto* SymbolicCallee = dyn_cast<GlobalAddressSDNode>(Callee))
11207 Callee = DAG.getTargetGlobalAddress(SymbolicCallee->getGlobal(),
11208 SDLoc(SymbolicCallee),
11209 SymbolicCallee->getValueType(0));
11210
11211 // Get the real number of arguments participating in the call <numArgs>
11213 unsigned NumArgs = NArgVal->getAsZExtVal();
11214
11215 // Skip the four meta args: <id>, <numNopBytes>, <target>, <numArgs>
11216 // Intrinsics include all meta-operands up to but not including CC.
11217 unsigned NumMetaOpers = PatchPointOpers::CCPos;
11218 assert(CB.arg_size() >= NumMetaOpers + NumArgs &&
11219 "Not enough arguments provided to the patchpoint intrinsic");
11220
11221 // For AnyRegCC the arguments are lowered later on manually.
11222 unsigned NumCallArgs = IsAnyRegCC ? 0 : NumArgs;
11223 Type *ReturnTy =
11224 IsAnyRegCC ? Type::getVoidTy(*DAG.getContext()) : CB.getType();
11225
11226 TargetLowering::CallLoweringInfo CLI(DAG);
11227 populateCallLoweringInfo(CLI, &CB, NumMetaOpers, NumCallArgs, Callee,
11228 ReturnTy, CB.getAttributes().getRetAttrs(), true);
11229 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
11230
11231 SDNode *CallEnd = Result.second.getNode();
11232 if (CallEnd->getOpcode() == ISD::EH_LABEL)
11233 CallEnd = CallEnd->getOperand(0).getNode();
11234 if (HasDef && (CallEnd->getOpcode() == ISD::CopyFromReg))
11235 CallEnd = CallEnd->getOperand(0).getNode();
11236
11237 /// Get a call instruction from the call sequence chain.
11238 /// Tail calls are not allowed.
11239 assert(CallEnd->getOpcode() == ISD::CALLSEQ_END &&
11240 "Expected a callseq node.");
11241 SDNode *Call = CallEnd->getOperand(0).getNode();
11242 bool HasGlue = Call->getGluedNode();
11243
11244 // Replace the target specific call node with the patchable intrinsic.
11246
11247 // Push the chain.
11248 Ops.push_back(*(Call->op_begin()));
11249
11250 // Optionally, push the glue (if any).
11251 if (HasGlue)
11252 Ops.push_back(*(Call->op_end() - 1));
11253
11254 // Push the register mask info.
11255 if (HasGlue)
11256 Ops.push_back(*(Call->op_end() - 2));
11257 else
11258 Ops.push_back(*(Call->op_end() - 1));
11259
11260 // Add the <id> and <numBytes> constants.
11262 Ops.push_back(DAG.getTargetConstant(IDVal->getAsZExtVal(), dl, MVT::i64));
11264 Ops.push_back(DAG.getTargetConstant(NBytesVal->getAsZExtVal(), dl, MVT::i32));
11265
11266 // Add the callee.
11267 Ops.push_back(Callee);
11268
11269 // Adjust <numArgs> to account for any arguments that have been passed on the
11270 // stack instead.
11271 // Call Node: Chain, Target, {Args}, RegMask, [Glue]
11272 unsigned NumCallRegArgs = Call->getNumOperands() - (HasGlue ? 4 : 3);
11273 NumCallRegArgs = IsAnyRegCC ? NumArgs : NumCallRegArgs;
11274 Ops.push_back(DAG.getTargetConstant(NumCallRegArgs, dl, MVT::i32));
11275
11276 // Add the calling convention
11277 Ops.push_back(DAG.getTargetConstant((unsigned)CC, dl, MVT::i32));
11278
11279 // Add the arguments we omitted previously. The register allocator should
11280 // place these in any free register.
11281 if (IsAnyRegCC)
11282 for (unsigned i = NumMetaOpers, e = NumMetaOpers + NumArgs; i != e; ++i)
11283 Ops.push_back(getValue(CB.getArgOperand(i)));
11284
11285 // Push the arguments from the call instruction.
11286 SDNode::op_iterator e = HasGlue ? Call->op_end()-2 : Call->op_end()-1;
11287 Ops.append(Call->op_begin() + 2, e);
11288
11289 // Push live variables for the stack map.
11290 addStackMapLiveVars(CB, NumMetaOpers + NumArgs, dl, Ops, *this);
11291
11292 SDVTList NodeTys;
11293 if (IsAnyRegCC && HasDef) {
11294 // Create the return types based on the intrinsic definition
11295 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11296 SmallVector<EVT, 3> ValueVTs;
11297 ComputeValueVTs(TLI, DAG.getDataLayout(), CB.getType(), ValueVTs);
11298 assert(ValueVTs.size() == 1 && "Expected only one return value type.");
11299
11300 // There is always a chain and a glue type at the end
11301 ValueVTs.push_back(MVT::Other);
11302 ValueVTs.push_back(MVT::Glue);
11303 NodeTys = DAG.getVTList(ValueVTs);
11304 } else
11305 NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
11306
11307 // Replace the target specific call node with a PATCHPOINT node.
11308 SDValue PPV = DAG.getNode(ISD::PATCHPOINT, dl, NodeTys, Ops);
11309
11310 // Update the NodeMap.
11311 if (HasDef) {
11312 if (IsAnyRegCC)
11313 setValue(&CB, SDValue(PPV.getNode(), 0));
11314 else
11315 setValue(&CB, Result.first);
11316 }
11317
11318 // Fixup the consumers of the intrinsic. The chain and glue may be used in the
11319 // call sequence. Furthermore the location of the chain and glue can change
11320 // when the AnyReg calling convention is used and the intrinsic returns a
11321 // value.
11322 if (IsAnyRegCC && HasDef) {
11323 SDValue From[] = {SDValue(Call, 0), SDValue(Call, 1)};
11324 SDValue To[] = {PPV.getValue(1), PPV.getValue(2)};
11325 DAG.ReplaceAllUsesOfValuesWith(From, To, 2);
11326 } else
11327 DAG.ReplaceAllUsesWith(Call, PPV.getNode());
11328 DAG.DeleteNode(Call);
11329
11330 // Inform the Frame Information that we have a patchpoint in this function.
11331 FuncInfo.MF->getFrameInfo().setHasPatchPoint();
11332}
11333
11334void SelectionDAGBuilder::visitVectorReduce(const CallInst &I,
11335 unsigned Intrinsic) {
11336 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11337 SDValue Op1 = getValue(I.getArgOperand(0));
11338 SDValue Op2;
11339 if (I.arg_size() > 1)
11340 Op2 = getValue(I.getArgOperand(1));
11341 SDLoc dl = getCurSDLoc();
11342 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
11343 SDValue Res;
11344 SDNodeFlags SDFlags;
11345 if (auto *FPMO = dyn_cast<FPMathOperator>(&I))
11346 SDFlags.copyFMF(*FPMO);
11347
11348 switch (Intrinsic) {
11349 case Intrinsic::vector_reduce_fadd:
11350 if (SDFlags.hasAllowReassociation())
11351 Res = DAG.getNode(ISD::FADD, dl, VT, Op1,
11352 DAG.getNode(ISD::VECREDUCE_FADD, dl, VT, Op2, SDFlags),
11353 SDFlags);
11354 else
11355 Res = DAG.getNode(ISD::VECREDUCE_SEQ_FADD, dl, VT, Op1, Op2, SDFlags);
11356 break;
11357 case Intrinsic::vector_reduce_fmul:
11358 if (SDFlags.hasAllowReassociation())
11359 Res = DAG.getNode(ISD::FMUL, dl, VT, Op1,
11360 DAG.getNode(ISD::VECREDUCE_FMUL, dl, VT, Op2, SDFlags),
11361 SDFlags);
11362 else
11363 Res = DAG.getNode(ISD::VECREDUCE_SEQ_FMUL, dl, VT, Op1, Op2, SDFlags);
11364 break;
11365 case Intrinsic::vector_reduce_add:
11366 Res = DAG.getNode(ISD::VECREDUCE_ADD, dl, VT, Op1);
11367 break;
11368 case Intrinsic::vector_reduce_mul:
11369 Res = DAG.getNode(ISD::VECREDUCE_MUL, dl, VT, Op1);
11370 break;
11371 case Intrinsic::vector_reduce_and:
11372 Res = DAG.getNode(ISD::VECREDUCE_AND, dl, VT, Op1);
11373 break;
11374 case Intrinsic::vector_reduce_or:
11375 Res = DAG.getNode(ISD::VECREDUCE_OR, dl, VT, Op1);
11376 break;
11377 case Intrinsic::vector_reduce_xor:
11378 Res = DAG.getNode(ISD::VECREDUCE_XOR, dl, VT, Op1);
11379 break;
11380 case Intrinsic::vector_reduce_smax:
11381 Res = DAG.getNode(ISD::VECREDUCE_SMAX, dl, VT, Op1);
11382 break;
11383 case Intrinsic::vector_reduce_smin:
11384 Res = DAG.getNode(ISD::VECREDUCE_SMIN, dl, VT, Op1);
11385 break;
11386 case Intrinsic::vector_reduce_umax:
11387 Res = DAG.getNode(ISD::VECREDUCE_UMAX, dl, VT, Op1);
11388 break;
11389 case Intrinsic::vector_reduce_umin:
11390 Res = DAG.getNode(ISD::VECREDUCE_UMIN, dl, VT, Op1);
11391 break;
11392 case Intrinsic::vector_reduce_fmax:
11393 Res = DAG.getNode(ISD::VECREDUCE_FMAX, dl, VT, Op1, SDFlags);
11394 break;
11395 case Intrinsic::vector_reduce_fmin:
11396 Res = DAG.getNode(ISD::VECREDUCE_FMIN, dl, VT, Op1, SDFlags);
11397 break;
11398 case Intrinsic::vector_reduce_fmaximum:
11399 Res = DAG.getNode(ISD::VECREDUCE_FMAXIMUM, dl, VT, Op1, SDFlags);
11400 break;
11401 case Intrinsic::vector_reduce_fminimum:
11402 Res = DAG.getNode(ISD::VECREDUCE_FMINIMUM, dl, VT, Op1, SDFlags);
11403 break;
11404 default:
11405 llvm_unreachable("Unhandled vector reduce intrinsic");
11406 }
11407 setValue(&I, Res);
11408}
11409
11410/// Returns an AttributeList representing the attributes applied to the return
11411/// value of the given call.
11414 if (CLI.RetSExt)
11415 Attrs.push_back(Attribute::SExt);
11416 if (CLI.RetZExt)
11417 Attrs.push_back(Attribute::ZExt);
11418 if (CLI.IsInReg)
11419 Attrs.push_back(Attribute::InReg);
11420
11421 return AttributeList::get(CLI.RetTy->getContext(), AttributeList::ReturnIndex,
11422 Attrs);
11423}
11424
11425/// TargetLowering::LowerCallTo - This is the default LowerCallTo
11426/// implementation, which just calls LowerCall.
11427/// FIXME: When all targets are
11428/// migrated to using LowerCall, this hook should be integrated into SDISel.
11429std::pair<SDValue, SDValue>
11431 LLVMContext &Context = CLI.RetTy->getContext();
11432
11433 // Handle the incoming return values from the call.
11434 CLI.Ins.clear();
11435 SmallVector<Type *, 4> RetOrigTys;
11437 auto &DL = CLI.DAG.getDataLayout();
11438 ComputeValueTypes(DL, CLI.OrigRetTy, RetOrigTys, &Offsets);
11439
11440 SmallVector<EVT, 4> RetVTs;
11441 if (CLI.RetTy != CLI.OrigRetTy) {
11442 assert(RetOrigTys.size() == 1 &&
11443 "Only supported for non-aggregate returns");
11444 RetVTs.push_back(getValueType(DL, CLI.RetTy));
11445 } else {
11446 for (Type *Ty : RetOrigTys)
11447 RetVTs.push_back(getValueType(DL, Ty));
11448 }
11449
11450 if (CLI.IsPostTypeLegalization) {
11451 // If we are lowering a libcall after legalization, split the return type.
11452 SmallVector<Type *, 4> OldRetOrigTys;
11453 SmallVector<EVT, 4> OldRetVTs;
11454 SmallVector<TypeSize, 4> OldOffsets;
11455 RetOrigTys.swap(OldRetOrigTys);
11456 RetVTs.swap(OldRetVTs);
11457 Offsets.swap(OldOffsets);
11458
11459 for (size_t i = 0, e = OldRetVTs.size(); i != e; ++i) {
11460 EVT RetVT = OldRetVTs[i];
11461 uint64_t Offset = OldOffsets[i];
11462 MVT RegisterVT = getRegisterType(Context, RetVT);
11463 unsigned NumRegs = getNumRegisters(Context, RetVT);
11464 unsigned RegisterVTByteSZ = RegisterVT.getSizeInBits() / 8;
11465 RetOrigTys.append(NumRegs, OldRetOrigTys[i]);
11466 RetVTs.append(NumRegs, RegisterVT);
11467 for (unsigned j = 0; j != NumRegs; ++j)
11468 Offsets.push_back(TypeSize::getFixed(Offset + j * RegisterVTByteSZ));
11469 }
11470 }
11471
11473 GetReturnInfo(CLI.CallConv, CLI.RetTy, getReturnAttrs(CLI), Outs, *this, DL);
11474
11475 bool CanLowerReturn =
11477 CLI.IsVarArg, Outs, Context, CLI.RetTy);
11478
11479 SDValue DemoteStackSlot;
11480 int DemoteStackIdx = -100;
11481 if (!CanLowerReturn) {
11482 // FIXME: equivalent assert?
11483 // assert(!CS.hasInAllocaArgument() &&
11484 // "sret demotion is incompatible with inalloca");
11485 uint64_t TySize = DL.getTypeAllocSize(CLI.RetTy);
11486 Align Alignment = DL.getPrefTypeAlign(CLI.RetTy);
11488 DemoteStackIdx =
11489 MF.getFrameInfo().CreateStackObject(TySize, Alignment, false);
11490 Type *StackSlotPtrType = PointerType::get(Context, DL.getAllocaAddrSpace());
11491
11492 DemoteStackSlot = CLI.DAG.getFrameIndex(DemoteStackIdx, getFrameIndexTy(DL));
11493 ArgListEntry Entry(DemoteStackSlot, StackSlotPtrType);
11494 Entry.IsSRet = true;
11495 Entry.Alignment = Alignment;
11496 CLI.getArgs().insert(CLI.getArgs().begin(), Entry);
11497 CLI.NumFixedArgs += 1;
11498 CLI.getArgs()[0].IndirectType = CLI.RetTy;
11499 CLI.RetTy = CLI.OrigRetTy = Type::getVoidTy(Context);
11500
11501 // sret demotion isn't compatible with tail-calls, since the sret argument
11502 // points into the callers stack frame.
11503 CLI.IsTailCall = false;
11504 } else {
11505 bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
11506 CLI.RetTy, CLI.CallConv, CLI.IsVarArg, DL);
11507 for (unsigned I = 0, E = RetVTs.size(); I != E; ++I) {
11508 ISD::ArgFlagsTy Flags;
11509 if (NeedsRegBlock) {
11510 Flags.setInConsecutiveRegs();
11511 if (I == RetVTs.size() - 1)
11512 Flags.setInConsecutiveRegsLast();
11513 }
11514 EVT VT = RetVTs[I];
11515 MVT RegisterVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11516 unsigned NumRegs =
11517 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11518 for (unsigned i = 0; i != NumRegs; ++i) {
11519 ISD::InputArg Ret(Flags, RegisterVT, VT, RetOrigTys[I],
11521 if (CLI.RetTy->isPointerTy()) {
11522 Ret.Flags.setPointer();
11524 cast<PointerType>(CLI.RetTy)->getAddressSpace());
11525 }
11526 if (CLI.RetSExt)
11527 Ret.Flags.setSExt();
11528 if (CLI.RetZExt)
11529 Ret.Flags.setZExt();
11530 if (CLI.IsInReg)
11531 Ret.Flags.setInReg();
11532 CLI.Ins.push_back(Ret);
11533 }
11534 }
11535 }
11536
11537 // We push in swifterror return as the last element of CLI.Ins.
11538 ArgListTy &Args = CLI.getArgs();
11539 if (supportSwiftError()) {
11540 for (const ArgListEntry &Arg : Args) {
11541 if (Arg.IsSwiftError) {
11542 ISD::ArgFlagsTy Flags;
11543 Flags.setSwiftError();
11545 PointerType::getUnqual(Context),
11546 /*Used=*/true, ISD::InputArg::NoArgIndex, 0);
11547 CLI.Ins.push_back(Ret);
11548 }
11549 }
11550 }
11551
11552 // Handle all of the outgoing arguments.
11553 CLI.Outs.clear();
11554 CLI.OutVals.clear();
11555 for (unsigned i = 0, e = Args.size(); i != e; ++i) {
11556 SmallVector<Type *, 4> OrigArgTys;
11557 ComputeValueTypes(DL, Args[i].OrigTy, OrigArgTys);
11558 // FIXME: Split arguments if CLI.IsPostTypeLegalization
11559 Type *FinalType = Args[i].Ty;
11560 if (Args[i].IsByVal)
11561 FinalType = Args[i].IndirectType;
11562 bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
11563 FinalType, CLI.CallConv, CLI.IsVarArg, DL);
11564 for (unsigned Value = 0, NumValues = OrigArgTys.size(); Value != NumValues;
11565 ++Value) {
11566 Type *OrigArgTy = OrigArgTys[Value];
11567 Type *ArgTy = OrigArgTy;
11568 if (Args[i].Ty != Args[i].OrigTy) {
11569 assert(Value == 0 && "Only supported for non-aggregate arguments");
11570 ArgTy = Args[i].Ty;
11571 }
11572
11573 EVT VT = getValueType(DL, ArgTy);
11574 SDValue Op = SDValue(Args[i].Node.getNode(),
11575 Args[i].Node.getResNo() + Value);
11576 ISD::ArgFlagsTy Flags;
11577
11578 // Certain targets (such as MIPS), may have a different ABI alignment
11579 // for a type depending on the context. Give the target a chance to
11580 // specify the alignment it wants.
11581 const Align OriginalAlignment(getABIAlignmentForCallingConv(ArgTy, DL));
11582 Flags.setOrigAlign(OriginalAlignment);
11583
11584 if (i >= CLI.NumFixedArgs)
11585 Flags.setVarArg();
11586 if (ArgTy->isPointerTy()) {
11587 Flags.setPointer();
11588 Flags.setPointerAddrSpace(cast<PointerType>(ArgTy)->getAddressSpace());
11589 }
11590 if (Args[i].IsZExt)
11591 Flags.setZExt();
11592 if (Args[i].IsSExt)
11593 Flags.setSExt();
11594 if (Args[i].IsNoExt)
11595 Flags.setNoExt();
11596 if (Args[i].IsInReg) {
11597 // If we are using vectorcall calling convention, a structure that is
11598 // passed InReg - is surely an HVA
11600 isa<StructType>(FinalType)) {
11601 // The first value of a structure is marked
11602 if (0 == Value)
11603 Flags.setHvaStart();
11604 Flags.setHva();
11605 }
11606 // Set InReg Flag
11607 Flags.setInReg();
11608 }
11609 if (Args[i].IsSRet)
11610 Flags.setSRet();
11611 if (Args[i].IsSwiftSelf)
11612 Flags.setSwiftSelf();
11613 if (Args[i].IsSwiftAsync)
11614 Flags.setSwiftAsync();
11615 if (Args[i].IsSwiftError)
11616 Flags.setSwiftError();
11617 if (Args[i].IsCFGuardTarget)
11618 Flags.setCFGuardTarget();
11619 if (Args[i].IsByVal)
11620 Flags.setByVal();
11621 if (Args[i].IsByRef)
11622 Flags.setByRef();
11623 if (Args[i].IsPreallocated) {
11624 Flags.setPreallocated();
11625 // Set the byval flag for CCAssignFn callbacks that don't know about
11626 // preallocated. This way we can know how many bytes we should've
11627 // allocated and how many bytes a callee cleanup function will pop. If
11628 // we port preallocated to more targets, we'll have to add custom
11629 // preallocated handling in the various CC lowering callbacks.
11630 Flags.setByVal();
11631 }
11632 if (Args[i].IsInAlloca) {
11633 Flags.setInAlloca();
11634 // Set the byval flag for CCAssignFn callbacks that don't know about
11635 // inalloca. This way we can know how many bytes we should've allocated
11636 // and how many bytes a callee cleanup function will pop. If we port
11637 // inalloca to more targets, we'll have to add custom inalloca handling
11638 // in the various CC lowering callbacks.
11639 Flags.setByVal();
11640 }
11641 Align MemAlign;
11642 if (Args[i].IsByVal || Args[i].IsInAlloca || Args[i].IsPreallocated) {
11643 unsigned FrameSize = DL.getTypeAllocSize(Args[i].IndirectType);
11644 Flags.setByValSize(FrameSize);
11645
11646 // info is not there but there are cases it cannot get right.
11647 if (auto MA = Args[i].Alignment)
11648 MemAlign = *MA;
11649 else
11650 MemAlign = getByValTypeAlignment(Args[i].IndirectType, DL);
11651 } else if (auto MA = Args[i].Alignment) {
11652 MemAlign = *MA;
11653 } else {
11654 MemAlign = OriginalAlignment;
11655 }
11656 Flags.setMemAlign(MemAlign);
11657 if (Args[i].IsNest)
11658 Flags.setNest();
11659 if (NeedsRegBlock)
11660 Flags.setInConsecutiveRegs();
11661
11662 MVT PartVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11663 unsigned NumParts =
11664 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11665 SmallVector<SDValue, 4> Parts(NumParts);
11666 ISD::NodeType ExtendKind = ISD::ANY_EXTEND;
11667
11668 if (Args[i].IsSExt)
11669 ExtendKind = ISD::SIGN_EXTEND;
11670 else if (Args[i].IsZExt)
11671 ExtendKind = ISD::ZERO_EXTEND;
11672
11673 // Conservatively only handle 'returned' on non-vectors that can be lowered,
11674 // for now.
11675 if (Args[i].IsReturned && !Op.getValueType().isVector() &&
11677 assert((CLI.RetTy == Args[i].Ty ||
11678 (CLI.RetTy->isPointerTy() && Args[i].Ty->isPointerTy() &&
11680 Args[i].Ty->getPointerAddressSpace())) &&
11681 RetVTs.size() == NumValues && "unexpected use of 'returned'");
11682 // Before passing 'returned' to the target lowering code, ensure that
11683 // either the register MVT and the actual EVT are the same size or that
11684 // the return value and argument are extended in the same way; in these
11685 // cases it's safe to pass the argument register value unchanged as the
11686 // return register value (although it's at the target's option whether
11687 // to do so)
11688 // TODO: allow code generation to take advantage of partially preserved
11689 // registers rather than clobbering the entire register when the
11690 // parameter extension method is not compatible with the return
11691 // extension method
11692 if ((NumParts * PartVT.getSizeInBits() == VT.getSizeInBits()) ||
11693 (ExtendKind != ISD::ANY_EXTEND && CLI.RetSExt == Args[i].IsSExt &&
11694 CLI.RetZExt == Args[i].IsZExt))
11695 Flags.setReturned();
11696 }
11697
11698 getCopyToParts(CLI.DAG, CLI.DL, Op, &Parts[0], NumParts, PartVT, CLI.CB,
11699 CLI.CallConv, ExtendKind);
11700
11701 for (unsigned j = 0; j != NumParts; ++j) {
11702 // if it isn't first piece, alignment must be 1
11703 // For scalable vectors the scalable part is currently handled
11704 // by individual targets, so we just use the known minimum size here.
11705 ISD::OutputArg MyFlags(
11706 Flags, Parts[j].getValueType().getSimpleVT(), VT, OrigArgTy, i,
11707 j * Parts[j].getValueType().getStoreSize().getKnownMinValue());
11708 if (NumParts > 1 && j == 0)
11709 MyFlags.Flags.setSplit();
11710 else if (j != 0) {
11711 MyFlags.Flags.setOrigAlign(Align(1));
11712 if (j == NumParts - 1)
11713 MyFlags.Flags.setSplitEnd();
11714 }
11715
11716 CLI.Outs.push_back(MyFlags);
11717 CLI.OutVals.push_back(Parts[j]);
11718 }
11719
11720 if (NeedsRegBlock && Value == NumValues - 1)
11721 CLI.Outs[CLI.Outs.size() - 1].Flags.setInConsecutiveRegsLast();
11722 }
11723 }
11724
11726 CLI.Chain = LowerCall(CLI, InVals);
11727
11728 // Update CLI.InVals to use outside of this function.
11729 CLI.InVals = InVals;
11730
11731 // Verify that the target's LowerCall behaved as expected.
11732 assert(CLI.Chain.getNode() && CLI.Chain.getValueType() == MVT::Other &&
11733 "LowerCall didn't return a valid chain!");
11734 assert((!CLI.IsTailCall || InVals.empty()) &&
11735 "LowerCall emitted a return value for a tail call!");
11736 assert((CLI.IsTailCall || InVals.size() == CLI.Ins.size()) &&
11737 "LowerCall didn't emit the correct number of values!");
11738
11739 // For a tail call, the return value is merely live-out and there aren't
11740 // any nodes in the DAG representing it. Return a special value to
11741 // indicate that a tail call has been emitted and no more Instructions
11742 // should be processed in the current block.
11743 if (CLI.IsTailCall) {
11744 CLI.DAG.setRoot(CLI.Chain);
11745 return std::make_pair(SDValue(), SDValue());
11746 }
11747
11748#ifndef NDEBUG
11749 for (unsigned i = 0, e = CLI.Ins.size(); i != e; ++i) {
11750 assert(InVals[i].getNode() && "LowerCall emitted a null value!");
11751 assert(EVT(CLI.Ins[i].VT) == InVals[i].getValueType() &&
11752 "LowerCall emitted a value with the wrong type!");
11753 }
11754#endif
11755
11756 SmallVector<SDValue, 4> ReturnValues;
11757 if (!CanLowerReturn) {
11758 // The instruction result is the result of loading from the
11759 // hidden sret parameter.
11760 MVT PtrVT = getPointerTy(DL, DL.getAllocaAddrSpace());
11761
11762 unsigned NumValues = RetVTs.size();
11763 ReturnValues.resize(NumValues);
11764 SmallVector<SDValue, 4> Chains(NumValues);
11765
11766 // An aggregate return value cannot wrap around the address space, so
11767 // offsets to its parts don't wrap either.
11769 Align HiddenSRetAlign = MF.getFrameInfo().getObjectAlign(DemoteStackIdx);
11770 for (unsigned i = 0; i < NumValues; ++i) {
11772 DemoteStackSlot, CLI.DAG.getConstant(Offsets[i], CLI.DL, PtrVT),
11774 SDValue L = CLI.DAG.getLoad(
11775 RetVTs[i], CLI.DL, CLI.Chain, Add,
11777 DemoteStackIdx, Offsets[i]),
11778 HiddenSRetAlign);
11779 ReturnValues[i] = L;
11780 Chains[i] = L.getValue(1);
11781 }
11782
11783 CLI.Chain = CLI.DAG.getNode(ISD::TokenFactor, CLI.DL, MVT::Other, Chains);
11784 } else {
11785 // Collect the legal value parts into potentially illegal values
11786 // that correspond to the original function's return values.
11787 std::optional<ISD::NodeType> AssertOp;
11788 if (CLI.RetSExt)
11789 AssertOp = ISD::AssertSext;
11790 else if (CLI.RetZExt)
11791 AssertOp = ISD::AssertZext;
11792 unsigned CurReg = 0;
11793 for (EVT VT : RetVTs) {
11794 MVT RegisterVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11795 unsigned NumRegs =
11796 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11797
11798 ReturnValues.push_back(getCopyFromParts(
11799 CLI.DAG, CLI.DL, &InVals[CurReg], NumRegs, RegisterVT, VT, nullptr,
11800 CLI.Chain, CLI.CallConv, AssertOp));
11801 CurReg += NumRegs;
11802 }
11803
11804 // For a function returning void, there is no return value. We can't create
11805 // such a node, so we just return a null return value in that case. In
11806 // that case, nothing will actually look at the value.
11807 if (ReturnValues.empty())
11808 return std::make_pair(SDValue(), CLI.Chain);
11809 }
11810
11811 SDValue Res = CLI.DAG.getNode(ISD::MERGE_VALUES, CLI.DL,
11812 CLI.DAG.getVTList(RetVTs), ReturnValues);
11813 return std::make_pair(Res, CLI.Chain);
11814}
11815
11816/// Places new result values for the node in Results (their number
11817/// and types must exactly match those of the original return values of
11818/// the node), or leaves Results empty, which indicates that the node is not
11819/// to be custom lowered after all.
11822 SelectionDAG &DAG) const {
11823 SDValue Res = LowerOperation(SDValue(N, 0), DAG);
11824
11825 if (!Res.getNode())
11826 return;
11827
11828 // If the original node has one result, take the return value from
11829 // LowerOperation as is. It might not be result number 0.
11830 if (N->getNumValues() == 1) {
11831 Results.push_back(Res);
11832 return;
11833 }
11834
11835 // If the original node has multiple results, then the return node should
11836 // have the same number of results.
11837 assert((N->getNumValues() == Res->getNumValues()) &&
11838 "Lowering returned the wrong number of results!");
11839
11840 // Places new result values base on N result number.
11841 for (unsigned I = 0, E = N->getNumValues(); I != E; ++I)
11842 Results.push_back(Res.getValue(I));
11843}
11844
11846 llvm_unreachable("LowerOperation not implemented for this target!");
11847}
11848
11850 Register Reg,
11851 ISD::NodeType ExtendType) {
11853 assert((Op.getOpcode() != ISD::CopyFromReg ||
11854 cast<RegisterSDNode>(Op.getOperand(1))->getReg() != Reg) &&
11855 "Copy from a reg to the same reg!");
11856 assert(!Reg.isPhysical() && "Is a physreg");
11857
11858 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11859 // If this is an InlineAsm we have to match the registers required, not the
11860 // notional registers required by the type.
11861
11862 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), Reg, V->getType(),
11863 std::nullopt); // This is not an ABI copy.
11864 SDValue Chain = DAG.getEntryNode();
11865
11866 if (ExtendType == ISD::ANY_EXTEND) {
11867 auto PreferredExtendIt = FuncInfo.PreferredExtendType.find(V);
11868 if (PreferredExtendIt != FuncInfo.PreferredExtendType.end())
11869 ExtendType = PreferredExtendIt->second;
11870 }
11871 RFV.getCopyToRegs(Op, DAG, getCurSDLoc(), Chain, nullptr, V, ExtendType);
11872 PendingExports.push_back(Chain);
11873}
11874
11876
11877/// isOnlyUsedInEntryBlock - If the specified argument is only used in the
11878/// entry block, return true. This includes arguments used by switches, since
11879/// the switch may expand into multiple basic blocks.
11880static bool isOnlyUsedInEntryBlock(const Argument *A, bool FastISel) {
11881 // With FastISel active, we may be splitting blocks, so force creation
11882 // of virtual registers for all non-dead arguments.
11883 if (FastISel)
11884 return A->use_empty();
11885
11886 const BasicBlock &Entry = A->getParent()->front();
11887 for (const User *U : A->users())
11888 if (cast<Instruction>(U)->getParent() != &Entry || isa<SwitchInst>(U))
11889 return false; // Use not in entry block.
11890
11891 return true;
11892}
11893
11895 DenseMap<const Argument *,
11896 std::pair<const AllocaInst *, const StoreInst *>>;
11897
11898/// Scan the entry block of the function in FuncInfo for arguments that look
11899/// like copies into a local alloca. Record any copied arguments in
11900/// ArgCopyElisionCandidates.
11901static void
11903 FunctionLoweringInfo *FuncInfo,
11904 ArgCopyElisionMapTy &ArgCopyElisionCandidates) {
11905 // Record the state of every static alloca used in the entry block. Argument
11906 // allocas are all used in the entry block, so we need approximately as many
11907 // entries as we have arguments.
11908 enum StaticAllocaInfo { Unknown, Clobbered, Elidable };
11910 unsigned NumArgs = FuncInfo->Fn->arg_size();
11911 StaticAllocas.reserve(NumArgs * 2);
11912
11913 auto GetInfoIfStaticAlloca = [&](const Value *V) -> StaticAllocaInfo * {
11914 if (!V)
11915 return nullptr;
11916 V = V->stripPointerCasts();
11917 const auto *AI = dyn_cast<AllocaInst>(V);
11918 if (!AI || !AI->isStaticAlloca() || !FuncInfo->StaticAllocaMap.count(AI))
11919 return nullptr;
11920 auto Iter = StaticAllocas.insert({AI, Unknown});
11921 return &Iter.first->second;
11922 };
11923
11924 // Look for stores of arguments to static allocas. Look through bitcasts and
11925 // GEPs to handle type coercions, as long as the alloca is fully initialized
11926 // by the store. Any non-store use of an alloca escapes it and any subsequent
11927 // unanalyzed store might write it.
11928 // FIXME: Handle structs initialized with multiple stores.
11929 for (const Instruction &I : FuncInfo->Fn->getEntryBlock()) {
11930 // Look for stores, and handle non-store uses conservatively.
11931 const auto *SI = dyn_cast<StoreInst>(&I);
11932 if (!SI) {
11933 // We will look through cast uses, so ignore them completely.
11934 if (I.isCast())
11935 continue;
11936 // Ignore debug info and pseudo op intrinsics, they don't escape or store
11937 // to allocas.
11938 if (I.isDebugOrPseudoInst())
11939 continue;
11940 // This is an unknown instruction. Assume it escapes or writes to all
11941 // static alloca operands.
11942 for (const Use &U : I.operands()) {
11943 if (StaticAllocaInfo *Info = GetInfoIfStaticAlloca(U))
11944 *Info = StaticAllocaInfo::Clobbered;
11945 }
11946 continue;
11947 }
11948
11949 // If the stored value is a static alloca, mark it as escaped.
11950 if (StaticAllocaInfo *Info = GetInfoIfStaticAlloca(SI->getValueOperand()))
11951 *Info = StaticAllocaInfo::Clobbered;
11952
11953 // Check if the destination is a static alloca.
11954 const Value *Dst = SI->getPointerOperand()->stripPointerCasts();
11955 StaticAllocaInfo *Info = GetInfoIfStaticAlloca(Dst);
11956 if (!Info)
11957 continue;
11958 const AllocaInst *AI = cast<AllocaInst>(Dst);
11959
11960 // Skip allocas that have been initialized or clobbered.
11961 if (*Info != StaticAllocaInfo::Unknown)
11962 continue;
11963
11964 // Check if the stored value is an argument, and that this store fully
11965 // initializes the alloca.
11966 // If the argument type has padding bits we can't directly forward a pointer
11967 // as the upper bits may contain garbage.
11968 // Don't elide copies from the same argument twice.
11969 const Value *Val = SI->getValueOperand()->stripPointerCasts();
11970 const auto *Arg = dyn_cast<Argument>(Val);
11971 std::optional<TypeSize> AllocaSize = AI->getAllocationSize(DL);
11972 if (!Arg || Arg->hasPassPointeeByValueCopyAttr() ||
11973 Arg->getType()->isEmptyTy() || !AllocaSize ||
11974 DL.getTypeStoreSize(Arg->getType()) != *AllocaSize ||
11975 !DL.typeSizeEqualsStoreSize(Arg->getType()) ||
11976 ArgCopyElisionCandidates.count(Arg)) {
11977 *Info = StaticAllocaInfo::Clobbered;
11978 continue;
11979 }
11980
11981 LLVM_DEBUG(dbgs() << "Found argument copy elision candidate: " << *AI
11982 << '\n');
11983
11984 // Mark this alloca and store for argument copy elision.
11985 *Info = StaticAllocaInfo::Elidable;
11986 ArgCopyElisionCandidates.insert({Arg, {AI, SI}});
11987
11988 // Stop scanning if we've seen all arguments. This will happen early in -O0
11989 // builds, which is useful, because -O0 builds have large entry blocks and
11990 // many allocas.
11991 if (ArgCopyElisionCandidates.size() == NumArgs)
11992 break;
11993 }
11994}
11995
11996/// Try to elide argument copies from memory into a local alloca. Succeeds if
11997/// ArgVal is a load from a suitable fixed stack object.
12000 DenseMap<int, int> &ArgCopyElisionFrameIndexMap,
12001 SmallPtrSetImpl<const Instruction *> &ElidedArgCopyInstrs,
12002 ArgCopyElisionMapTy &ArgCopyElisionCandidates, const Argument &Arg,
12003 ArrayRef<SDValue> ArgVals, bool &ArgHasUses) {
12004 // Check if this is a load from a fixed stack object.
12005 auto *LNode = dyn_cast<LoadSDNode>(ArgVals[0]);
12006 if (!LNode)
12007 return;
12008 auto *FINode = dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode());
12009 if (!FINode)
12010 return;
12011
12012 // Check that the fixed stack object is the right size and alignment.
12013 // Look at the alignment that the user wrote on the alloca instead of looking
12014 // at the stack object.
12015 auto ArgCopyIter = ArgCopyElisionCandidates.find(&Arg);
12016 assert(ArgCopyIter != ArgCopyElisionCandidates.end());
12017 const AllocaInst *AI = ArgCopyIter->second.first;
12018 int FixedIndex = FINode->getIndex();
12019 int &AllocaIndex = FuncInfo.StaticAllocaMap[AI];
12020 int OldIndex = AllocaIndex;
12021 MachineFrameInfo &MFI = FuncInfo.MF->getFrameInfo();
12022 if (MFI.getObjectSize(FixedIndex) != MFI.getObjectSize(OldIndex)) {
12023 LLVM_DEBUG(
12024 dbgs() << " argument copy elision failed due to bad fixed stack "
12025 "object size\n");
12026 return;
12027 }
12028 Align RequiredAlignment = AI->getAlign();
12029 if (MFI.getObjectAlign(FixedIndex) < RequiredAlignment) {
12030 LLVM_DEBUG(dbgs() << " argument copy elision failed: alignment of alloca "
12031 "greater than stack argument alignment ("
12032 << DebugStr(RequiredAlignment) << " vs "
12033 << DebugStr(MFI.getObjectAlign(FixedIndex)) << ")\n");
12034 return;
12035 }
12036
12037 // Perform the elision. Delete the old stack object and replace its only use
12038 // in the variable info map. Mark the stack object as mutable and aliased.
12039 LLVM_DEBUG({
12040 dbgs() << "Eliding argument copy from " << Arg << " to " << *AI << '\n'
12041 << " Replacing frame index " << OldIndex << " with " << FixedIndex
12042 << '\n';
12043 });
12044 MFI.RemoveStackObject(OldIndex);
12045 MFI.setIsImmutableObjectIndex(FixedIndex, false);
12046 MFI.setIsAliasedObjectIndex(FixedIndex, true);
12047 AllocaIndex = FixedIndex;
12048 ArgCopyElisionFrameIndexMap.insert({OldIndex, FixedIndex});
12049 for (SDValue ArgVal : ArgVals)
12050 Chains.push_back(ArgVal.getValue(1));
12051
12052 // Avoid emitting code for the store implementing the copy.
12053 const StoreInst *SI = ArgCopyIter->second.second;
12054 ElidedArgCopyInstrs.insert(SI);
12055
12056 // Check for uses of the argument again so that we can avoid exporting ArgVal
12057 // if it is't used by anything other than the store.
12058 for (const Value *U : Arg.users()) {
12059 if (U != SI) {
12060 ArgHasUses = true;
12061 break;
12062 }
12063 }
12064}
12065
12066void SelectionDAGISel::LowerArguments(const Function &F) {
12067 SelectionDAG &DAG = SDB->DAG;
12068 SDLoc dl = SDB->getCurSDLoc();
12069 const DataLayout &DL = DAG.getDataLayout();
12071
12072 // In Naked functions we aren't going to save any registers.
12073 if (F.hasFnAttribute(Attribute::Naked))
12074 return;
12075
12076 if (!FuncInfo->CanLowerReturn) {
12077 // Put in an sret pointer parameter before all the other parameters.
12078 MVT ValueVT = TLI->getPointerTy(DL, DL.getAllocaAddrSpace());
12079
12080 ISD::ArgFlagsTy Flags;
12081 Flags.setSRet();
12082 MVT RegisterVT = TLI->getRegisterType(*DAG.getContext(), ValueVT);
12083 ISD::InputArg RetArg(Flags, RegisterVT, ValueVT, F.getReturnType(), true,
12085 Ins.push_back(RetArg);
12086 }
12087
12088 // Look for stores of arguments to static allocas. Mark such arguments with a
12089 // flag to ask the target to give us the memory location of that argument if
12090 // available.
12091 ArgCopyElisionMapTy ArgCopyElisionCandidates;
12093 ArgCopyElisionCandidates);
12094
12095 // Set up the incoming argument description vector.
12096 for (const Argument &Arg : F.args()) {
12097 unsigned ArgNo = Arg.getArgNo();
12099 ComputeValueTypes(DAG.getDataLayout(), Arg.getType(), Types);
12100 bool isArgValueUsed = !Arg.use_empty();
12101 Type *FinalType = Arg.getType();
12102 if (Arg.hasAttribute(Attribute::ByVal))
12103 FinalType = Arg.getParamByValType();
12104 bool NeedsRegBlock = TLI->functionArgumentNeedsConsecutiveRegisters(
12105 FinalType, F.getCallingConv(), F.isVarArg(), DL);
12106 for (unsigned Value = 0, NumValues = Types.size(); Value != NumValues;
12107 ++Value) {
12108 Type *ArgTy = Types[Value];
12109 EVT VT = TLI->getValueType(DL, ArgTy);
12110 ISD::ArgFlagsTy Flags;
12111
12112 if (ArgTy->isPointerTy()) {
12113 Flags.setPointer();
12114 Flags.setPointerAddrSpace(cast<PointerType>(ArgTy)->getAddressSpace());
12115 }
12116 if (Arg.hasAttribute(Attribute::ZExt))
12117 Flags.setZExt();
12118 if (Arg.hasAttribute(Attribute::SExt))
12119 Flags.setSExt();
12120 if (Arg.hasAttribute(Attribute::InReg)) {
12121 // If we are using vectorcall calling convention, a structure that is
12122 // passed InReg - is surely an HVA
12123 if (F.getCallingConv() == CallingConv::X86_VectorCall &&
12124 isa<StructType>(Arg.getType())) {
12125 // The first value of a structure is marked
12126 if (0 == Value)
12127 Flags.setHvaStart();
12128 Flags.setHva();
12129 }
12130 // Set InReg Flag
12131 Flags.setInReg();
12132 }
12133 if (Arg.hasAttribute(Attribute::StructRet))
12134 Flags.setSRet();
12135 if (Arg.hasAttribute(Attribute::SwiftSelf))
12136 Flags.setSwiftSelf();
12137 if (Arg.hasAttribute(Attribute::SwiftAsync))
12138 Flags.setSwiftAsync();
12139 if (Arg.hasAttribute(Attribute::SwiftError))
12140 Flags.setSwiftError();
12141 if (Arg.hasAttribute(Attribute::ByVal))
12142 Flags.setByVal();
12143 if (Arg.hasAttribute(Attribute::ByRef))
12144 Flags.setByRef();
12145 if (Arg.hasAttribute(Attribute::InAlloca)) {
12146 Flags.setInAlloca();
12147 // Set the byval flag for CCAssignFn callbacks that don't know about
12148 // inalloca. This way we can know how many bytes we should've allocated
12149 // and how many bytes a callee cleanup function will pop. If we port
12150 // inalloca to more targets, we'll have to add custom inalloca handling
12151 // in the various CC lowering callbacks.
12152 Flags.setByVal();
12153 }
12154 if (Arg.hasAttribute(Attribute::Preallocated)) {
12155 Flags.setPreallocated();
12156 // Set the byval flag for CCAssignFn callbacks that don't know about
12157 // preallocated. This way we can know how many bytes we should've
12158 // allocated and how many bytes a callee cleanup function will pop. If
12159 // we port preallocated to more targets, we'll have to add custom
12160 // preallocated handling in the various CC lowering callbacks.
12161 Flags.setByVal();
12162 }
12163
12164 // Certain targets (such as MIPS), may have a different ABI alignment
12165 // for a type depending on the context. Give the target a chance to
12166 // specify the alignment it wants.
12167 const Align OriginalAlignment(
12168 TLI->getABIAlignmentForCallingConv(ArgTy, DL));
12169 Flags.setOrigAlign(OriginalAlignment);
12170
12171 Align MemAlign;
12172 Type *ArgMemTy = nullptr;
12173 if (Flags.isByVal() || Flags.isInAlloca() || Flags.isPreallocated() ||
12174 Flags.isByRef()) {
12175 if (!ArgMemTy)
12176 ArgMemTy = Arg.getPointeeInMemoryValueType();
12177
12178 uint64_t MemSize = DL.getTypeAllocSize(ArgMemTy);
12179
12180 // For in-memory arguments, size and alignment should be passed from FE.
12181 // BE will guess if this info is not there but there are cases it cannot
12182 // get right.
12183 if (auto ParamAlign = Arg.getParamStackAlign())
12184 MemAlign = *ParamAlign;
12185 else if ((ParamAlign = Arg.getParamAlign()))
12186 MemAlign = *ParamAlign;
12187 else
12188 MemAlign = TLI->getByValTypeAlignment(ArgMemTy, DL);
12189 if (Flags.isByRef())
12190 Flags.setByRefSize(MemSize);
12191 else
12192 Flags.setByValSize(MemSize);
12193 } else if (auto ParamAlign = Arg.getParamStackAlign()) {
12194 MemAlign = *ParamAlign;
12195 } else {
12196 MemAlign = OriginalAlignment;
12197 }
12198 Flags.setMemAlign(MemAlign);
12199
12200 if (Arg.hasAttribute(Attribute::Nest))
12201 Flags.setNest();
12202 if (NeedsRegBlock)
12203 Flags.setInConsecutiveRegs();
12204 if (ArgCopyElisionCandidates.count(&Arg))
12205 Flags.setCopyElisionCandidate();
12206 if (Arg.hasAttribute(Attribute::Returned))
12207 Flags.setReturned();
12208
12209 MVT RegisterVT = TLI->getRegisterTypeForCallingConv(
12210 *CurDAG->getContext(), F.getCallingConv(), VT);
12211 unsigned NumRegs = TLI->getNumRegistersForCallingConv(
12212 *CurDAG->getContext(), F.getCallingConv(), VT);
12213 for (unsigned i = 0; i != NumRegs; ++i) {
12214 // For scalable vectors, use the minimum size; individual targets
12215 // are responsible for handling scalable vector arguments and
12216 // return values.
12217 ISD::InputArg MyFlags(
12218 Flags, RegisterVT, VT, ArgTy, isArgValueUsed, ArgNo,
12219 i * RegisterVT.getStoreSize().getKnownMinValue());
12220 if (NumRegs > 1 && i == 0)
12221 MyFlags.Flags.setSplit();
12222 // if it isn't first piece, alignment must be 1
12223 else if (i > 0) {
12224 MyFlags.Flags.setOrigAlign(Align(1));
12225 if (i == NumRegs - 1)
12226 MyFlags.Flags.setSplitEnd();
12227 }
12228 Ins.push_back(MyFlags);
12229 }
12230 if (NeedsRegBlock && Value == NumValues - 1)
12231 Ins[Ins.size() - 1].Flags.setInConsecutiveRegsLast();
12232 }
12233 }
12234
12235 // Call the target to set up the argument values.
12237 SDValue NewRoot = TLI->LowerFormalArguments(
12238 DAG.getRoot(), F.getCallingConv(), F.isVarArg(), Ins, dl, DAG, InVals);
12239
12240 // Verify that the target's LowerFormalArguments behaved as expected.
12241 assert(NewRoot.getNode() && NewRoot.getValueType() == MVT::Other &&
12242 "LowerFormalArguments didn't return a valid chain!");
12243 assert(InVals.size() == Ins.size() &&
12244 "LowerFormalArguments didn't emit the correct number of values!");
12245 assert(all_of(InVals, [](SDValue InVal) { return InVal.getNode(); }) &&
12246 "LowerFormalArguments emitted a null value!");
12247
12248 // Update the DAG with the new chain value resulting from argument lowering.
12249 DAG.setRoot(NewRoot);
12250
12251 // Set up the argument values.
12252 unsigned i = 0;
12253 if (!FuncInfo->CanLowerReturn) {
12254 // Create a virtual register for the sret pointer, and put in a copy
12255 // from the sret argument into it.
12256 MVT VT = TLI->getPointerTy(DL, DL.getAllocaAddrSpace());
12257 MVT RegVT = TLI->getRegisterType(*CurDAG->getContext(), VT);
12258 std::optional<ISD::NodeType> AssertOp;
12259 SDValue ArgValue =
12260 getCopyFromParts(DAG, dl, &InVals[0], 1, RegVT, VT, nullptr, NewRoot,
12261 F.getCallingConv(), AssertOp);
12262
12263 MachineFunction& MF = SDB->DAG.getMachineFunction();
12264 MachineRegisterInfo& RegInfo = MF.getRegInfo();
12265 Register SRetReg =
12266 RegInfo.createVirtualRegister(TLI->getRegClassFor(RegVT));
12267 FuncInfo->DemoteRegister = SRetReg;
12268 NewRoot =
12269 SDB->DAG.getCopyToReg(NewRoot, SDB->getCurSDLoc(), SRetReg, ArgValue);
12270 DAG.setRoot(NewRoot);
12271
12272 // i indexes lowered arguments. Bump it past the hidden sret argument.
12273 ++i;
12274 }
12275
12277 DenseMap<int, int> ArgCopyElisionFrameIndexMap;
12278 for (const Argument &Arg : F.args()) {
12279 SmallVector<SDValue, 4> ArgValues;
12280 SmallVector<EVT, 4> ValueVTs;
12281 ComputeValueVTs(*TLI, DAG.getDataLayout(), Arg.getType(), ValueVTs);
12282 unsigned NumValues = ValueVTs.size();
12283 if (NumValues == 0)
12284 continue;
12285
12286 bool ArgHasUses = !Arg.use_empty();
12287
12288 // Elide the copying store if the target loaded this argument from a
12289 // suitable fixed stack object.
12290 if (Ins[i].Flags.isCopyElisionCandidate()) {
12291 unsigned NumParts = 0;
12292 for (EVT VT : ValueVTs)
12293 NumParts += TLI->getNumRegistersForCallingConv(*CurDAG->getContext(),
12294 F.getCallingConv(), VT);
12295
12296 tryToElideArgumentCopy(*FuncInfo, Chains, ArgCopyElisionFrameIndexMap,
12297 ElidedArgCopyInstrs, ArgCopyElisionCandidates, Arg,
12298 ArrayRef(&InVals[i], NumParts), ArgHasUses);
12299 }
12300
12301 // If this argument is unused then remember its value. It is used to generate
12302 // debugging information.
12303 bool isSwiftErrorArg =
12304 TLI->supportSwiftError() &&
12305 Arg.hasAttribute(Attribute::SwiftError);
12306 if (!ArgHasUses && !isSwiftErrorArg) {
12307 SDB->setUnusedArgValue(&Arg, InVals[i]);
12308
12309 // Also remember any frame index for use in FastISel.
12310 if (FrameIndexSDNode *FI =
12312 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12313 }
12314
12315 for (unsigned Val = 0; Val != NumValues; ++Val) {
12316 EVT VT = ValueVTs[Val];
12317 MVT PartVT = TLI->getRegisterTypeForCallingConv(*CurDAG->getContext(),
12318 F.getCallingConv(), VT);
12319 unsigned NumParts = TLI->getNumRegistersForCallingConv(
12320 *CurDAG->getContext(), F.getCallingConv(), VT);
12321
12322 // Even an apparent 'unused' swifterror argument needs to be returned. So
12323 // we do generate a copy for it that can be used on return from the
12324 // function.
12325 if (ArgHasUses || isSwiftErrorArg) {
12326 std::optional<ISD::NodeType> AssertOp;
12327 if (Arg.hasAttribute(Attribute::SExt))
12328 AssertOp = ISD::AssertSext;
12329 else if (Arg.hasAttribute(Attribute::ZExt))
12330 AssertOp = ISD::AssertZext;
12331
12332 SDValue OutVal =
12333 getCopyFromParts(DAG, dl, &InVals[i], NumParts, PartVT, VT, nullptr,
12334 NewRoot, F.getCallingConv(), AssertOp);
12335
12336 FPClassTest NoFPClass = Arg.getNoFPClass();
12337 if (NoFPClass != fcNone) {
12338 SDValue SDNoFPClass = DAG.getTargetConstant(
12339 static_cast<uint64_t>(NoFPClass), dl, MVT::i32);
12340 OutVal = DAG.getNode(ISD::AssertNoFPClass, dl, OutVal.getValueType(),
12341 OutVal, SDNoFPClass);
12342 }
12343 ArgValues.push_back(OutVal);
12344 }
12345
12346 i += NumParts;
12347 }
12348
12349 // We don't need to do anything else for unused arguments.
12350 if (ArgValues.empty())
12351 continue;
12352
12353 // Note down frame index.
12354 if (FrameIndexSDNode *FI =
12355 dyn_cast<FrameIndexSDNode>(ArgValues[0].getNode()))
12356 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12357
12358 SDValue Res = DAG.getMergeValues(ArrayRef(ArgValues.data(), NumValues),
12359 SDB->getCurSDLoc());
12360
12361 SDB->setValue(&Arg, Res);
12362 if (!TM.Options.EnableFastISel && Res.getOpcode() == ISD::BUILD_PAIR) {
12363 // We want to associate the argument with the frame index, among
12364 // involved operands, that correspond to the lowest address. The
12365 // getCopyFromParts function, called earlier, is swapping the order of
12366 // the operands to BUILD_PAIR depending on endianness. The result of
12367 // that swapping is that the least significant bits of the argument will
12368 // be in the first operand of the BUILD_PAIR node, and the most
12369 // significant bits will be in the second operand.
12370 unsigned LowAddressOp = DAG.getDataLayout().isBigEndian() ? 1 : 0;
12371 if (LoadSDNode *LNode =
12372 dyn_cast<LoadSDNode>(Res.getOperand(LowAddressOp).getNode()))
12373 if (FrameIndexSDNode *FI =
12374 dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
12375 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12376 }
12377
12378 // Analyses past this point are naive and don't expect an assertion.
12379 if (Res.getOpcode() == ISD::AssertZext)
12380 Res = Res.getOperand(0);
12381
12382 // Update the SwiftErrorVRegDefMap.
12383 if (Res.getOpcode() == ISD::CopyFromReg && isSwiftErrorArg) {
12384 Register Reg = cast<RegisterSDNode>(Res.getOperand(1))->getReg();
12385 if (Reg.isVirtual())
12386 SwiftError->setCurrentVReg(FuncInfo->MBB, SwiftError->getFunctionArg(),
12387 Reg);
12388 }
12389
12390 // If this argument is live outside of the entry block, insert a copy from
12391 // wherever we got it to the vreg that other BB's will reference it as.
12392 if (Res.getOpcode() == ISD::CopyFromReg) {
12393 // If we can, though, try to skip creating an unnecessary vreg.
12394 // FIXME: This isn't very clean... it would be nice to make this more
12395 // general.
12396 Register Reg = cast<RegisterSDNode>(Res.getOperand(1))->getReg();
12397 if (Reg.isVirtual()) {
12398 FuncInfo->ValueMap[&Arg] = Reg;
12399 continue;
12400 }
12401 }
12402 if (!isOnlyUsedInEntryBlock(&Arg, TM.Options.EnableFastISel)) {
12403 FuncInfo->InitializeRegForValue(&Arg);
12404 SDB->CopyToExportRegsIfNeeded(&Arg);
12405 }
12406 }
12407
12408 if (!Chains.empty()) {
12409 Chains.push_back(NewRoot);
12410 NewRoot = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chains);
12411 }
12412
12413 DAG.setRoot(NewRoot);
12414
12415 assert(i == InVals.size() && "Argument register count mismatch!");
12416
12417 // If any argument copy elisions occurred and we have debug info, update the
12418 // stale frame indices used in the dbg.declare variable info table.
12419 if (!ArgCopyElisionFrameIndexMap.empty()) {
12420 for (MachineFunction::VariableDbgInfo &VI :
12421 MF->getInStackSlotVariableDbgInfo()) {
12422 auto I = ArgCopyElisionFrameIndexMap.find(VI.getStackSlot());
12423 if (I != ArgCopyElisionFrameIndexMap.end())
12424 VI.updateStackSlot(I->second);
12425 }
12426 }
12427
12428 // Finally, if the target has anything special to do, allow it to do so.
12430}
12431
12432/// Handle PHI nodes in successor blocks. Emit code into the SelectionDAG to
12433/// ensure constants are generated when needed. Remember the virtual registers
12434/// that need to be added to the Machine PHI nodes as input. We cannot just
12435/// directly add them, because expansion might result in multiple MBB's for one
12436/// BB. As such, the start of the BB might correspond to a different MBB than
12437/// the end.
12438void
12439SelectionDAGBuilder::HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) {
12440 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12441
12442 SmallPtrSet<MachineBasicBlock *, 4> SuccsHandled;
12443
12444 // Check PHI nodes in successors that expect a value to be available from this
12445 // block.
12446 for (const BasicBlock *SuccBB : successors(LLVMBB->getTerminator())) {
12447 if (!isa<PHINode>(SuccBB->begin())) continue;
12448 MachineBasicBlock *SuccMBB = FuncInfo.getMBB(SuccBB);
12449
12450 // If this terminator has multiple identical successors (common for
12451 // switches), only handle each succ once.
12452 if (!SuccsHandled.insert(SuccMBB).second)
12453 continue;
12454
12456
12457 // At this point we know that there is a 1-1 correspondence between LLVM PHI
12458 // nodes and Machine PHI nodes, but the incoming operands have not been
12459 // emitted yet.
12460 for (const PHINode &PN : SuccBB->phis()) {
12461 // Ignore dead phi's.
12462 if (PN.use_empty())
12463 continue;
12464
12465 // Skip empty types
12466 if (PN.getType()->isEmptyTy())
12467 continue;
12468
12469 Register Reg;
12470 const Value *PHIOp = PN.getIncomingValueForBlock(LLVMBB);
12471
12472 if (const auto *C = dyn_cast<Constant>(PHIOp)) {
12473 Register &RegOut = ConstantsOut[C];
12474 if (!RegOut) {
12475 RegOut = FuncInfo.CreateRegs(&PN);
12476 // We need to zero/sign extend ConstantInt phi operands to match
12477 // assumptions in FunctionLoweringInfo::ComputePHILiveOutRegInfo.
12478 ISD::NodeType ExtendType = ISD::ANY_EXTEND;
12479 if (auto *CI = dyn_cast<ConstantInt>(C))
12480 ExtendType = TLI.signExtendConstant(CI) ? ISD::SIGN_EXTEND
12482 CopyValueToVirtualRegister(C, RegOut, ExtendType);
12483 }
12484 Reg = RegOut;
12485 } else {
12486 auto I = FuncInfo.ValueMap.find(PHIOp);
12487 if (I != FuncInfo.ValueMap.end())
12488 Reg = I->second;
12489 else {
12490 assert(isa<AllocaInst>(PHIOp) &&
12491 FuncInfo.StaticAllocaMap.count(cast<AllocaInst>(PHIOp)) &&
12492 "Didn't codegen value into a register!??");
12493 Reg = FuncInfo.CreateRegs(&PN);
12495 }
12496 }
12497
12498 // Remember that this register needs to added to the machine PHI node as
12499 // the input for this MBB.
12500 SmallVector<EVT, 4> ValueVTs;
12501 ComputeValueVTs(TLI, DAG.getDataLayout(), PN.getType(), ValueVTs);
12502 for (EVT VT : ValueVTs) {
12503 const unsigned NumRegisters = TLI.getNumRegisters(*DAG.getContext(), VT);
12504 for (unsigned i = 0; i != NumRegisters; ++i)
12505 FuncInfo.PHINodesToUpdate.emplace_back(&*MBBI++, Reg + i);
12506 Reg += NumRegisters;
12507 }
12508 }
12509 }
12510
12511 ConstantsOut.clear();
12512}
12513
12514MachineBasicBlock *SelectionDAGBuilder::NextBlock(MachineBasicBlock *MBB) {
12516 if (++I == FuncInfo.MF->end())
12517 return nullptr;
12518 return &*I;
12519}
12520
12521/// During lowering new call nodes can be created (such as memset, etc.).
12522/// Those will become new roots of the current DAG, but complications arise
12523/// when they are tail calls. In such cases, the call lowering will update
12524/// the root, but the builder still needs to know that a tail call has been
12525/// lowered in order to avoid generating an additional return.
12526void SelectionDAGBuilder::updateDAGForMaybeTailCall(SDValue MaybeTC) {
12527 // If the node is null, we do have a tail call.
12528 if (MaybeTC.getNode() != nullptr)
12529 DAG.setRoot(MaybeTC);
12530 else
12531 HasTailCall = true;
12532}
12533
12534void SelectionDAGBuilder::lowerWorkItem(SwitchWorkListItem W, Value *Cond,
12535 MachineBasicBlock *SwitchMBB,
12536 MachineBasicBlock *DefaultMBB) {
12537 MachineFunction *CurMF = FuncInfo.MF;
12538 MachineBasicBlock *NextMBB = nullptr;
12540 if (++BBI != FuncInfo.MF->end())
12541 NextMBB = &*BBI;
12542
12543 unsigned Size = W.LastCluster - W.FirstCluster + 1;
12544
12545 BranchProbabilityInfo *BPI = FuncInfo.BPI;
12546
12547 if (Size == 2 && W.MBB == SwitchMBB) {
12548 // If any two of the cases has the same destination, and if one value
12549 // is the same as the other, but has one bit unset that the other has set,
12550 // use bit manipulation to do two compares at once. For example:
12551 // "if (X == 6 || X == 4)" -> "if ((X|2) == 6)"
12552 // TODO: This could be extended to merge any 2 cases in switches with 3
12553 // cases.
12554 // TODO: Handle cases where W.CaseBB != SwitchBB.
12555 CaseCluster &Small = *W.FirstCluster;
12556 CaseCluster &Big = *W.LastCluster;
12557
12558 if (Small.Low == Small.High && Big.Low == Big.High &&
12559 Small.MBB == Big.MBB) {
12560 const APInt &SmallValue = Small.Low->getValue();
12561 const APInt &BigValue = Big.Low->getValue();
12562
12563 // Check that there is only one bit different.
12564 APInt CommonBit = BigValue ^ SmallValue;
12565 if (CommonBit.isPowerOf2()) {
12566 SDValue CondLHS = getValue(Cond);
12567 EVT VT = CondLHS.getValueType();
12568 SDLoc DL = getCurSDLoc();
12569
12570 SDValue Or = DAG.getNode(ISD::OR, DL, VT, CondLHS,
12571 DAG.getConstant(CommonBit, DL, VT));
12572 SDValue Cond = DAG.getSetCC(
12573 DL, MVT::i1, Or, DAG.getConstant(BigValue | SmallValue, DL, VT),
12574 ISD::SETEQ);
12575
12576 // Update successor info.
12577 // Both Small and Big will jump to Small.BB, so we sum up the
12578 // probabilities.
12579 addSuccessorWithProb(SwitchMBB, Small.MBB, Small.Prob + Big.Prob);
12580 if (BPI)
12581 addSuccessorWithProb(
12582 SwitchMBB, DefaultMBB,
12583 // The default destination is the first successor in IR.
12584 BPI->getEdgeProbability(SwitchMBB->getBasicBlock(), (unsigned)0));
12585 else
12586 addSuccessorWithProb(SwitchMBB, DefaultMBB);
12587
12588 // Insert the true branch.
12589 SDValue BrCond =
12590 DAG.getNode(ISD::BRCOND, DL, MVT::Other, getControlRoot(), Cond,
12591 DAG.getBasicBlock(Small.MBB));
12592 // Insert the false branch.
12593 BrCond = DAG.getNode(ISD::BR, DL, MVT::Other, BrCond,
12594 DAG.getBasicBlock(DefaultMBB));
12595
12596 DAG.setRoot(BrCond);
12597 return;
12598 }
12599 }
12600 }
12601
12602 if (TM.getOptLevel() != CodeGenOptLevel::None) {
12603 // Here, we order cases by probability so the most likely case will be
12604 // checked first. However, two clusters can have the same probability in
12605 // which case their relative ordering is non-deterministic. So we use Low
12606 // as a tie-breaker as clusters are guaranteed to never overlap.
12607 llvm::sort(W.FirstCluster, W.LastCluster + 1,
12608 [](const CaseCluster &a, const CaseCluster &b) {
12609 return a.Prob != b.Prob ?
12610 a.Prob > b.Prob :
12611 a.Low->getValue().slt(b.Low->getValue());
12612 });
12613
12614 // Rearrange the case blocks so that the last one falls through if possible
12615 // without changing the order of probabilities.
12616 for (CaseClusterIt I = W.LastCluster; I > W.FirstCluster; ) {
12617 --I;
12618 if (I->Prob > W.LastCluster->Prob)
12619 break;
12620 if (I->Kind == CC_Range && I->MBB == NextMBB) {
12621 std::swap(*I, *W.LastCluster);
12622 break;
12623 }
12624 }
12625 }
12626
12627 // Compute total probability.
12628 BranchProbability DefaultProb = W.DefaultProb;
12629 BranchProbability UnhandledProbs = DefaultProb;
12630 for (CaseClusterIt I = W.FirstCluster; I <= W.LastCluster; ++I)
12631 UnhandledProbs += I->Prob;
12632
12633 MachineBasicBlock *CurMBB = W.MBB;
12634 for (CaseClusterIt I = W.FirstCluster, E = W.LastCluster; I <= E; ++I) {
12635 bool FallthroughUnreachable = false;
12636 MachineBasicBlock *Fallthrough;
12637 if (I == W.LastCluster) {
12638 // For the last cluster, fall through to the default destination.
12639 Fallthrough = DefaultMBB;
12640 FallthroughUnreachable = isa<UnreachableInst>(
12641 DefaultMBB->getBasicBlock()->getFirstNonPHIOrDbg());
12642 } else {
12643 Fallthrough = CurMF->CreateMachineBasicBlock(CurMBB->getBasicBlock());
12644 CurMF->insert(BBI, Fallthrough);
12645 // Put Cond in a virtual register to make it available from the new blocks.
12647 }
12648 UnhandledProbs -= I->Prob;
12649
12650 switch (I->Kind) {
12651 case CC_JumpTable: {
12652 // FIXME: Optimize away range check based on pivot comparisons.
12653 JumpTableHeader *JTH = &SL->JTCases[I->JTCasesIndex].first;
12654 SwitchCG::JumpTable *JT = &SL->JTCases[I->JTCasesIndex].second;
12655
12656 // The jump block hasn't been inserted yet; insert it here.
12657 MachineBasicBlock *JumpMBB = JT->MBB;
12658 CurMF->insert(BBI, JumpMBB);
12659
12660 auto JumpProb = I->Prob;
12661 auto FallthroughProb = UnhandledProbs;
12662
12663 // If the default statement is a target of the jump table, we evenly
12664 // distribute the default probability to successors of CurMBB. Also
12665 // update the probability on the edge from JumpMBB to Fallthrough.
12666 for (MachineBasicBlock::succ_iterator SI = JumpMBB->succ_begin(),
12667 SE = JumpMBB->succ_end();
12668 SI != SE; ++SI) {
12669 if (*SI == DefaultMBB) {
12670 JumpProb += DefaultProb / 2;
12671 FallthroughProb -= DefaultProb / 2;
12672 JumpMBB->setSuccProbability(SI, DefaultProb / 2);
12673 JumpMBB->normalizeSuccProbs();
12674 break;
12675 }
12676 }
12677
12678 // If the default clause is unreachable, propagate that knowledge into
12679 // JTH->FallthroughUnreachable which will use it to suppress the range
12680 // check.
12681 //
12682 // However, don't do this if we're doing branch target enforcement,
12683 // because a table branch _without_ a range check can be a tempting JOP
12684 // gadget - out-of-bounds inputs that are impossible in correct
12685 // execution become possible again if an attacker can influence the
12686 // control flow. So if an attacker doesn't already have a BTI bypass
12687 // available, we don't want them to be able to get one out of this
12688 // table branch.
12689 if (FallthroughUnreachable) {
12690 Function &CurFunc = CurMF->getFunction();
12691 if (!CurFunc.hasFnAttribute("branch-target-enforcement"))
12692 JTH->FallthroughUnreachable = true;
12693 }
12694
12695 if (!JTH->FallthroughUnreachable)
12696 addSuccessorWithProb(CurMBB, Fallthrough, FallthroughProb);
12697 addSuccessorWithProb(CurMBB, JumpMBB, JumpProb);
12698 CurMBB->normalizeSuccProbs();
12699
12700 // The jump table header will be inserted in our current block, do the
12701 // range check, and fall through to our fallthrough block.
12702 JTH->HeaderBB = CurMBB;
12703 JT->Default = Fallthrough; // FIXME: Move Default to JumpTableHeader.
12704
12705 // If we're in the right place, emit the jump table header right now.
12706 if (CurMBB == SwitchMBB) {
12707 visitJumpTableHeader(*JT, *JTH, SwitchMBB);
12708 JTH->Emitted = true;
12709 }
12710 break;
12711 }
12712 case CC_BitTests: {
12713 // FIXME: Optimize away range check based on pivot comparisons.
12714 BitTestBlock *BTB = &SL->BitTestCases[I->BTCasesIndex];
12715
12716 // The bit test blocks haven't been inserted yet; insert them here.
12717 for (BitTestCase &BTC : BTB->Cases)
12718 CurMF->insert(BBI, BTC.ThisBB);
12719
12720 // Fill in fields of the BitTestBlock.
12721 BTB->Parent = CurMBB;
12722 BTB->Default = Fallthrough;
12723
12724 BTB->DefaultProb = UnhandledProbs;
12725 // If the cases in bit test don't form a contiguous range, we evenly
12726 // distribute the probability on the edge to Fallthrough to two
12727 // successors of CurMBB.
12728 if (!BTB->ContiguousRange) {
12729 BTB->Prob += DefaultProb / 2;
12730 BTB->DefaultProb -= DefaultProb / 2;
12731 }
12732
12733 if (FallthroughUnreachable)
12734 BTB->FallthroughUnreachable = true;
12735
12736 // If we're in the right place, emit the bit test header right now.
12737 if (CurMBB == SwitchMBB) {
12738 visitBitTestHeader(*BTB, SwitchMBB);
12739 BTB->Emitted = true;
12740 }
12741 break;
12742 }
12743 case CC_Range: {
12744 const Value *RHS, *LHS, *MHS;
12745 ISD::CondCode CC;
12746 if (I->Low == I->High) {
12747 // Check Cond == I->Low.
12748 CC = ISD::SETEQ;
12749 LHS = Cond;
12750 RHS=I->Low;
12751 MHS = nullptr;
12752 } else {
12753 // Check I->Low <= Cond <= I->High.
12754 CC = ISD::SETLE;
12755 LHS = I->Low;
12756 MHS = Cond;
12757 RHS = I->High;
12758 }
12759
12760 // If Fallthrough is unreachable, fold away the comparison.
12761 if (FallthroughUnreachable)
12762 CC = ISD::SETTRUE;
12763
12764 // The false probability is the sum of all unhandled cases.
12765 CaseBlock CB(CC, LHS, RHS, MHS, I->MBB, Fallthrough, CurMBB,
12766 getCurSDLoc(), I->Prob, UnhandledProbs);
12767
12768 if (CurMBB == SwitchMBB)
12769 visitSwitchCase(CB, SwitchMBB);
12770 else
12771 SL->SwitchCases.push_back(CB);
12772
12773 break;
12774 }
12775 }
12776 CurMBB = Fallthrough;
12777 }
12778}
12779
12780void SelectionDAGBuilder::splitWorkItem(SwitchWorkList &WorkList,
12781 const SwitchWorkListItem &W,
12782 Value *Cond,
12783 MachineBasicBlock *SwitchMBB) {
12784 assert(W.FirstCluster->Low->getValue().slt(W.LastCluster->Low->getValue()) &&
12785 "Clusters not sorted?");
12786 assert(W.LastCluster - W.FirstCluster + 1 >= 2 && "Too small to split!");
12787
12788 auto [LastLeft, FirstRight, LeftProb, RightProb] =
12789 SL->computeSplitWorkItemInfo(W);
12790
12791 // Use the first element on the right as pivot since we will make less-than
12792 // comparisons against it.
12793 CaseClusterIt PivotCluster = FirstRight;
12794 assert(PivotCluster > W.FirstCluster);
12795 assert(PivotCluster <= W.LastCluster);
12796
12797 CaseClusterIt FirstLeft = W.FirstCluster;
12798 CaseClusterIt LastRight = W.LastCluster;
12799
12800 const ConstantInt *Pivot = PivotCluster->Low;
12801
12802 // New blocks will be inserted immediately after the current one.
12804 ++BBI;
12805
12806 // We will branch to the LHS if Value < Pivot. If LHS is a single cluster,
12807 // we can branch to its destination directly if it's squeezed exactly in
12808 // between the known lower bound and Pivot - 1.
12809 MachineBasicBlock *LeftMBB;
12810 if (FirstLeft == LastLeft && FirstLeft->Kind == CC_Range &&
12811 FirstLeft->Low == W.GE &&
12812 (FirstLeft->High->getValue() + 1LL) == Pivot->getValue()) {
12813 LeftMBB = FirstLeft->MBB;
12814 } else {
12815 LeftMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
12816 FuncInfo.MF->insert(BBI, LeftMBB);
12817 WorkList.push_back(
12818 {LeftMBB, FirstLeft, LastLeft, W.GE, Pivot, W.DefaultProb / 2});
12819 // Put Cond in a virtual register to make it available from the new blocks.
12821 }
12822
12823 // Similarly, we will branch to the RHS if Value >= Pivot. If RHS is a
12824 // single cluster, RHS.Low == Pivot, and we can branch to its destination
12825 // directly if RHS.High equals the current upper bound.
12826 MachineBasicBlock *RightMBB;
12827 if (FirstRight == LastRight && FirstRight->Kind == CC_Range &&
12828 W.LT && (FirstRight->High->getValue() + 1ULL) == W.LT->getValue()) {
12829 RightMBB = FirstRight->MBB;
12830 } else {
12831 RightMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
12832 FuncInfo.MF->insert(BBI, RightMBB);
12833 WorkList.push_back(
12834 {RightMBB, FirstRight, LastRight, Pivot, W.LT, W.DefaultProb / 2});
12835 // Put Cond in a virtual register to make it available from the new blocks.
12837 }
12838
12839 // Create the CaseBlock record that will be used to lower the branch.
12840 CaseBlock CB(ISD::SETLT, Cond, Pivot, nullptr, LeftMBB, RightMBB, W.MBB,
12841 getCurSDLoc(), LeftProb, RightProb);
12842
12843 if (W.MBB == SwitchMBB)
12844 visitSwitchCase(CB, SwitchMBB);
12845 else
12846 SL->SwitchCases.push_back(CB);
12847}
12848
12849// Scale CaseProb after peeling a case with the probablity of PeeledCaseProb
12850// from the swith statement.
12852 BranchProbability PeeledCaseProb) {
12853 if (PeeledCaseProb == BranchProbability::getOne())
12855 BranchProbability SwitchProb = PeeledCaseProb.getCompl();
12856
12857 uint32_t Numerator = CaseProb.getNumerator();
12858 uint32_t Denominator = SwitchProb.scale(CaseProb.getDenominator());
12859 return BranchProbability(Numerator, std::max(Numerator, Denominator));
12860}
12861
12862// Try to peel the top probability case if it exceeds the threshold.
12863// Return current MachineBasicBlock for the switch statement if the peeling
12864// does not occur.
12865// If the peeling is performed, return the newly created MachineBasicBlock
12866// for the peeled switch statement. Also update Clusters to remove the peeled
12867// case. PeeledCaseProb is the BranchProbability for the peeled case.
12868MachineBasicBlock *SelectionDAGBuilder::peelDominantCaseCluster(
12869 const SwitchInst &SI, CaseClusterVector &Clusters,
12870 BranchProbability &PeeledCaseProb) {
12871 MachineBasicBlock *SwitchMBB = FuncInfo.MBB;
12872 // Don't perform if there is only one cluster or optimizing for size.
12873 if (SwitchPeelThreshold > 100 || !FuncInfo.BPI || Clusters.size() < 2 ||
12874 TM.getOptLevel() == CodeGenOptLevel::None ||
12875 SwitchMBB->getParent()->getFunction().hasMinSize())
12876 return SwitchMBB;
12877
12878 BranchProbability TopCaseProb = BranchProbability(SwitchPeelThreshold, 100);
12879 unsigned PeeledCaseIndex = 0;
12880 bool SwitchPeeled = false;
12881 for (unsigned Index = 0; Index < Clusters.size(); ++Index) {
12882 CaseCluster &CC = Clusters[Index];
12883 if (CC.Prob < TopCaseProb)
12884 continue;
12885 TopCaseProb = CC.Prob;
12886 PeeledCaseIndex = Index;
12887 SwitchPeeled = true;
12888 }
12889 if (!SwitchPeeled)
12890 return SwitchMBB;
12891
12892 LLVM_DEBUG(dbgs() << "Peeled one top case in switch stmt, prob: "
12893 << TopCaseProb << "\n");
12894
12895 // Record the MBB for the peeled switch statement.
12896 MachineFunction::iterator BBI(SwitchMBB);
12897 ++BBI;
12898 MachineBasicBlock *PeeledSwitchMBB =
12899 FuncInfo.MF->CreateMachineBasicBlock(SwitchMBB->getBasicBlock());
12900 FuncInfo.MF->insert(BBI, PeeledSwitchMBB);
12901
12902 ExportFromCurrentBlock(SI.getCondition());
12903 auto PeeledCaseIt = Clusters.begin() + PeeledCaseIndex;
12904 SwitchWorkListItem W = {SwitchMBB, PeeledCaseIt, PeeledCaseIt,
12905 nullptr, nullptr, TopCaseProb.getCompl()};
12906 lowerWorkItem(W, SI.getCondition(), SwitchMBB, PeeledSwitchMBB);
12907
12908 Clusters.erase(PeeledCaseIt);
12909 for (CaseCluster &CC : Clusters) {
12910 LLVM_DEBUG(
12911 dbgs() << "Scale the probablity for one cluster, before scaling: "
12912 << CC.Prob << "\n");
12913 CC.Prob = scaleCaseProbality(CC.Prob, TopCaseProb);
12914 LLVM_DEBUG(dbgs() << "After scaling: " << CC.Prob << "\n");
12915 }
12916 PeeledCaseProb = TopCaseProb;
12917 return PeeledSwitchMBB;
12918}
12919
12920void SelectionDAGBuilder::visitSwitch(const SwitchInst &SI) {
12921 // Extract cases from the switch.
12922 BranchProbabilityInfo *BPI = FuncInfo.BPI;
12923 CaseClusterVector Clusters;
12924 Clusters.reserve(SI.getNumCases());
12925 for (auto I : SI.cases()) {
12926 MachineBasicBlock *Succ = FuncInfo.getMBB(I.getCaseSuccessor());
12927 const ConstantInt *CaseVal = I.getCaseValue();
12928 BranchProbability Prob =
12929 BPI ? BPI->getEdgeProbability(SI.getParent(), I.getSuccessorIndex())
12930 : BranchProbability(1, SI.getNumCases() + 1);
12931 Clusters.push_back(CaseCluster::range(CaseVal, CaseVal, Succ, Prob));
12932 }
12933
12934 MachineBasicBlock *DefaultMBB = FuncInfo.getMBB(SI.getDefaultDest());
12935
12936 // Cluster adjacent cases with the same destination. We do this at all
12937 // optimization levels because it's cheap to do and will make codegen faster
12938 // if there are many clusters.
12939 sortAndRangeify(Clusters);
12940
12941 // The branch probablity of the peeled case.
12942 BranchProbability PeeledCaseProb = BranchProbability::getZero();
12943 MachineBasicBlock *PeeledSwitchMBB =
12944 peelDominantCaseCluster(SI, Clusters, PeeledCaseProb);
12945
12946 // If there is only the default destination, jump there directly.
12947 MachineBasicBlock *SwitchMBB = FuncInfo.MBB;
12948 if (Clusters.empty()) {
12949 assert(PeeledSwitchMBB == SwitchMBB);
12950 SwitchMBB->addSuccessor(DefaultMBB);
12951 if (DefaultMBB != NextBlock(SwitchMBB)) {
12952 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
12953 getControlRoot(), DAG.getBasicBlock(DefaultMBB)));
12954 }
12955 return;
12956 }
12957
12958 SL->findJumpTables(Clusters, &SI, getCurSDLoc(), DefaultMBB, DAG.getPSI(),
12959 DAG.getBFI());
12960 SL->findBitTestClusters(Clusters, &SI);
12961
12962 LLVM_DEBUG({
12963 dbgs() << "Case clusters: ";
12964 for (const CaseCluster &C : Clusters) {
12965 if (C.Kind == CC_JumpTable)
12966 dbgs() << "JT:";
12967 if (C.Kind == CC_BitTests)
12968 dbgs() << "BT:";
12969
12970 C.Low->getValue().print(dbgs(), true);
12971 if (C.Low != C.High) {
12972 dbgs() << '-';
12973 C.High->getValue().print(dbgs(), true);
12974 }
12975 dbgs() << ' ';
12976 }
12977 dbgs() << '\n';
12978 });
12979
12980 assert(!Clusters.empty());
12981 SwitchWorkList WorkList;
12982 CaseClusterIt First = Clusters.begin();
12983 CaseClusterIt Last = Clusters.end() - 1;
12984 auto DefaultProb = getEdgeProbability(PeeledSwitchMBB, DefaultMBB);
12985 // Scale the branchprobability for DefaultMBB if the peel occurs and
12986 // DefaultMBB is not replaced.
12987 if (PeeledCaseProb != BranchProbability::getZero() &&
12988 DefaultMBB == FuncInfo.getMBB(SI.getDefaultDest()))
12989 DefaultProb = scaleCaseProbality(DefaultProb, PeeledCaseProb);
12990 WorkList.push_back(
12991 {PeeledSwitchMBB, First, Last, nullptr, nullptr, DefaultProb});
12992
12993 while (!WorkList.empty()) {
12994 SwitchWorkListItem W = WorkList.pop_back_val();
12995 unsigned NumClusters = W.LastCluster - W.FirstCluster + 1;
12996
12997 if (NumClusters > 3 && TM.getOptLevel() != CodeGenOptLevel::None &&
12998 !DefaultMBB->getParent()->getFunction().hasMinSize()) {
12999 // For optimized builds, lower large range as a balanced binary tree.
13000 splitWorkItem(WorkList, W, SI.getCondition(), SwitchMBB);
13001 continue;
13002 }
13003
13004 lowerWorkItem(W, SI.getCondition(), SwitchMBB, DefaultMBB);
13005 }
13006}
13007
13008void SelectionDAGBuilder::visitStepVector(const CallInst &I) {
13009 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
13010 auto DL = getCurSDLoc();
13011 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
13012 setValue(&I, DAG.getStepVector(DL, ResultVT));
13013}
13014
13015void SelectionDAGBuilder::visitVectorReverse(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 V = getValue(I.getOperand(0));
13021 assert(VT == V.getValueType() && "Malformed vector.reverse!");
13022
13023 if (VT.isScalableVector()) {
13024 setValue(&I, DAG.getNode(ISD::VECTOR_REVERSE, DL, VT, V));
13025 return;
13026 }
13027
13028 // Use VECTOR_SHUFFLE for the fixed-length vector
13029 // to maintain existing behavior.
13030 SmallVector<int, 8> Mask;
13031 unsigned NumElts = VT.getVectorMinNumElements();
13032 for (unsigned i = 0; i != NumElts; ++i)
13033 Mask.push_back(NumElts - 1 - i);
13034
13035 setValue(&I, DAG.getVectorShuffle(VT, DL, V, DAG.getUNDEF(VT), Mask));
13036}
13037
13038void SelectionDAGBuilder::visitVectorDeinterleave(const CallInst &I,
13039 unsigned Factor) {
13040 auto DL = getCurSDLoc();
13041 SDValue InVec = getValue(I.getOperand(0));
13042
13043 SmallVector<EVT, 4> ValueVTs;
13044 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
13045 ValueVTs);
13046
13047 EVT OutVT = ValueVTs[0];
13048 unsigned OutNumElts = OutVT.getVectorMinNumElements();
13049
13050 SmallVector<SDValue, 4> SubVecs(Factor);
13051 for (unsigned i = 0; i != Factor; ++i) {
13052 assert(ValueVTs[i] == OutVT && "Expected VTs to be the same");
13053 SubVecs[i] = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, OutVT, InVec,
13054 DAG.getVectorIdxConstant(OutNumElts * i, DL));
13055 }
13056
13057 // Use VECTOR_SHUFFLE for fixed-length vectors with factor of 2 to benefit
13058 // from existing legalisation and combines.
13059 if (OutVT.isFixedLengthVector() && Factor == 2) {
13060 SDValue Even = DAG.getVectorShuffle(OutVT, DL, SubVecs[0], SubVecs[1],
13061 createStrideMask(0, 2, OutNumElts));
13062 SDValue Odd = DAG.getVectorShuffle(OutVT, DL, SubVecs[0], SubVecs[1],
13063 createStrideMask(1, 2, OutNumElts));
13064 SDValue Res = DAG.getMergeValues({Even, Odd}, getCurSDLoc());
13065 setValue(&I, Res);
13066 return;
13067 }
13068
13069 SDValue Res = DAG.getNode(ISD::VECTOR_DEINTERLEAVE, DL,
13070 DAG.getVTList(ValueVTs), SubVecs);
13071 setValue(&I, Res);
13072}
13073
13074void SelectionDAGBuilder::visitVectorInterleave(const CallInst &I,
13075 unsigned Factor) {
13076 auto DL = getCurSDLoc();
13077 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
13078 EVT InVT = getValue(I.getOperand(0)).getValueType();
13079 EVT OutVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
13080
13081 SmallVector<SDValue, 8> InVecs(Factor);
13082 for (unsigned i = 0; i < Factor; ++i) {
13083 InVecs[i] = getValue(I.getOperand(i));
13084 assert(InVecs[i].getValueType() == InVecs[0].getValueType() &&
13085 "Expected VTs to be the same");
13086 }
13087
13088 // Use VECTOR_SHUFFLE for fixed-length vectors with factor of 2 to benefit
13089 // from existing legalisation and combines.
13090 if (OutVT.isFixedLengthVector() && Factor == 2) {
13091 unsigned NumElts = InVT.getVectorMinNumElements();
13092 SDValue V = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, InVecs);
13093 setValue(&I, DAG.getVectorShuffle(OutVT, DL, V, DAG.getUNDEF(OutVT),
13094 createInterleaveMask(NumElts, 2)));
13095 return;
13096 }
13097
13098 SmallVector<EVT, 8> ValueVTs(Factor, InVT);
13099 SDValue Res =
13100 DAG.getNode(ISD::VECTOR_INTERLEAVE, DL, DAG.getVTList(ValueVTs), InVecs);
13101
13103 for (unsigned i = 0; i < Factor; ++i)
13104 Results[i] = Res.getValue(i);
13105
13106 Res = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, Results);
13107 setValue(&I, Res);
13108}
13109
13110void SelectionDAGBuilder::visitFreeze(const FreezeInst &I) {
13111 SmallVector<EVT, 4> ValueVTs;
13112 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
13113 ValueVTs);
13114 unsigned NumValues = ValueVTs.size();
13115 if (NumValues == 0) return;
13116
13118 SDValue Op = getValue(I.getOperand(0));
13119
13120 for (unsigned i = 0; i != NumValues; ++i)
13121 Values[i] = DAG.getNode(ISD::FREEZE, getCurSDLoc(), ValueVTs[i],
13122 SDValue(Op.getNode(), Op.getResNo() + i));
13123
13125 DAG.getVTList(ValueVTs), Values));
13126}
13127
13128void SelectionDAGBuilder::visitVectorSplice(const CallInst &I) {
13129 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
13130 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
13131
13132 SDLoc DL = getCurSDLoc();
13133 SDValue V1 = getValue(I.getOperand(0));
13134 SDValue V2 = getValue(I.getOperand(1));
13135 const bool IsLeft = I.getIntrinsicID() == Intrinsic::vector_splice_left;
13136
13137 // VECTOR_SHUFFLE doesn't support a scalable or non-constant mask.
13138 if (VT.isScalableVector() || !isa<ConstantInt>(I.getOperand(2))) {
13139 SDValue Offset = DAG.getZExtOrTrunc(
13140 getValue(I.getOperand(2)), DL, TLI.getVectorIdxTy(DAG.getDataLayout()));
13141 setValue(&I, DAG.getNode(IsLeft ? ISD::VECTOR_SPLICE_LEFT
13143 DL, VT, V1, V2, Offset));
13144 return;
13145 }
13146 uint64_t Imm = cast<ConstantInt>(I.getOperand(2))->getZExtValue();
13147
13148 unsigned NumElts = VT.getVectorNumElements();
13149
13150 uint64_t Idx = IsLeft ? Imm : NumElts - Imm;
13151
13152 // Use VECTOR_SHUFFLE to maintain original behaviour for fixed-length vectors.
13153 SmallVector<int, 8> Mask;
13154 for (unsigned i = 0; i < NumElts; ++i)
13155 Mask.push_back(Idx + i);
13156 setValue(&I, DAG.getVectorShuffle(VT, DL, V1, V2, Mask));
13157}
13158
13159// Consider the following MIR after SelectionDAG, which produces output in
13160// phyregs in the first case or virtregs in the second case.
13161//
13162// INLINEASM_BR ..., implicit-def $ebx, ..., implicit-def $edx
13163// %5:gr32 = COPY $ebx
13164// %6:gr32 = COPY $edx
13165// %1:gr32 = COPY %6:gr32
13166// %0:gr32 = COPY %5:gr32
13167//
13168// INLINEASM_BR ..., def %5:gr32, ..., def %6:gr32
13169// %1:gr32 = COPY %6:gr32
13170// %0:gr32 = COPY %5:gr32
13171//
13172// Given %0, we'd like to return $ebx in the first case and %5 in the second.
13173// Given %1, we'd like to return $edx in the first case and %6 in the second.
13174//
13175// If a callbr has outputs, it will have a single mapping in FuncInfo.ValueMap
13176// to a single virtreg (such as %0). The remaining outputs monotonically
13177// increase in virtreg number from there. If a callbr has no outputs, then it
13178// should not have a corresponding callbr landingpad; in fact, the callbr
13179// landingpad would not even be able to refer to such a callbr.
13182 // There is definitely at least one copy.
13183 assert(MI->getOpcode() == TargetOpcode::COPY &&
13184 "start of copy chain MUST be COPY");
13185 Reg = MI->getOperand(1).getReg();
13186
13187 // If the copied register in the first copy must be virtual.
13188 assert(Reg.isVirtual() && "expected COPY of virtual register");
13189 MI = MRI.def_begin(Reg)->getParent();
13190
13191 // There may be an optional second copy.
13192 if (MI->getOpcode() == TargetOpcode::COPY) {
13193 assert(Reg.isVirtual() && "expected COPY of virtual register");
13194 Reg = MI->getOperand(1).getReg();
13195 assert(Reg.isPhysical() && "expected COPY of physical register");
13196 } else {
13197 // The start of the chain must be an INLINEASM_BR.
13198 assert(MI->getOpcode() == TargetOpcode::INLINEASM_BR &&
13199 "end of copy chain MUST be INLINEASM_BR");
13200 }
13201
13202 return Reg;
13203}
13204
13205// We must do this walk rather than the simpler
13206// setValue(&I, getCopyFromRegs(CBR, CBR->getType()));
13207// otherwise we will end up with copies of virtregs only valid along direct
13208// edges.
13209void SelectionDAGBuilder::visitCallBrLandingPad(const CallInst &I) {
13210 SmallVector<EVT, 8> ResultVTs;
13211 SmallVector<SDValue, 8> ResultValues;
13212 const auto *CBR =
13213 cast<CallBrInst>(I.getParent()->getUniquePredecessor()->getTerminator());
13214
13215 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
13216 const TargetRegisterInfo *TRI = DAG.getSubtarget().getRegisterInfo();
13217 MachineRegisterInfo &MRI = DAG.getMachineFunction().getRegInfo();
13218
13219 Register InitialDef = FuncInfo.ValueMap[CBR];
13220 SDValue Chain = DAG.getRoot();
13221
13222 // Re-parse the asm constraints string.
13223 TargetLowering::AsmOperandInfoVector TargetConstraints =
13224 TLI.ParseConstraints(DAG.getDataLayout(), TRI, *CBR);
13225 for (auto &T : TargetConstraints) {
13226 SDISelAsmOperandInfo OpInfo(T);
13227 if (OpInfo.Type != InlineAsm::isOutput)
13228 continue;
13229
13230 // Pencil in OpInfo.ConstraintType and OpInfo.ConstraintVT based on the
13231 // individual constraint.
13232 TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
13233
13234 switch (OpInfo.ConstraintType) {
13237 // Fill in OpInfo.AssignedRegs.Regs.
13238 getRegistersForValue(DAG, getCurSDLoc(), OpInfo, OpInfo);
13239
13240 // getRegistersForValue may produce 1 to many registers based on whether
13241 // the OpInfo.ConstraintVT is legal on the target or not.
13242 for (Register &Reg : OpInfo.AssignedRegs.Regs) {
13243 Register OriginalDef = FollowCopyChain(MRI, InitialDef++);
13244 if (OriginalDef.isPhysical())
13245 FuncInfo.MBB->addLiveIn(OriginalDef);
13246 // Update the assigned registers to use the original defs.
13247 Reg = OriginalDef;
13248 }
13249
13250 SDValue V = OpInfo.AssignedRegs.getCopyFromRegs(
13251 DAG, FuncInfo, getCurSDLoc(), Chain, nullptr, CBR);
13252 ResultValues.push_back(V);
13253 ResultVTs.push_back(OpInfo.ConstraintVT);
13254 break;
13255 }
13257 SDValue Flag;
13258 SDValue V = TLI.LowerAsmOutputForConstraint(Chain, Flag, getCurSDLoc(),
13259 OpInfo, DAG);
13260 ++InitialDef;
13261 ResultValues.push_back(V);
13262 ResultVTs.push_back(OpInfo.ConstraintVT);
13263 break;
13264 }
13265 default:
13266 break;
13267 }
13268 }
13270 DAG.getVTList(ResultVTs), ResultValues);
13271 setValue(&I, V);
13272}
return SDValue()
static unsigned getIntrinsicID(const SDNode *N)
unsigned RegSize
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static msgpack::DocNode getNode(msgpack::DocNode DN, msgpack::Type Type, MCValue Val)
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
Function Alias Analysis Results
Atomic ordering constants.
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
#define X(NUM, ENUM, NAME)
Definition ELF.h:856
This file implements the BitVector class.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
dxil translate DXIL Translate Metadata
static AttributeList getReturnAttrs(FastISel::CallLoweringInfo &CLI)
Returns an AttributeList representing the attributes applied to the return value of the given call.
Definition FastISel.cpp:942
#define Check(C,...)
static Value * getCondition(Instruction *I)
Hexagon Common GEP
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Module.h This file contains the declarations for the Module class.
static void getRegistersForValue(MachineFunction &MF, MachineIRBuilder &MIRBuilder, GISelAsmOperandInfo &OpInfo, GISelAsmOperandInfo &RefOpInfo)
Assign virtual/physical registers for the specified register operand.
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
Machine Check Debug Module
static bool isUndef(const MachineInstr &MI)
Register Reg
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
static const Function * getCalledFunction(const Value *V)
This file provides utility analysis objects describing memory locations.
This file provides utility for Memory Model Relaxation Annotations (MMRAs).
This file contains the declarations for metadata subclasses.
Type::TypeID TypeID
#define T
#define T1
static MCRegister getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
static unsigned getAddressSpace(const Value *V, unsigned MaxLookup)
MachineInstr unsigned OpIdx
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t High
uint64_t IntrinsicInst * II
OptimizedStructLayoutField Field
#define P(N)
if(PassOpts->AAPipeline)
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
static Type * getValueType(Value *V, 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:297
static LLVM_ABI Semantics SemanticsToEnum(const llvm::fltSemantics &Sem)
Definition APFloat.cpp:170
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:6040
Class for arbitrary precision integers.
Definition APInt.h:78
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:335
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:441
an instruction to allocate memory on the stack
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
LLVM_ABI std::optional< TypeSize > getAllocationSize(const DataLayout &DL) const
Get allocation size in bytes.
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
LLVM_ABI bool hasAttribute(Attribute::AttrKind Kind) const
Check if an argument has a given attribute.
Definition Function.cpp: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:786
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:688
bool hasParamAttribute(unsigned ArgNo, Attribute::AttrKind Kind) const
check if an attributes is in the list of attributes.
Definition Function.cpp:735
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:878
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:723
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:632
Machine Value Type.
@ INVALID_SIMPLE_VALUE_TYPE
uint64_t getScalarSizeInBits() const
unsigned getVectorNumElements() const
bool isVector() const
Return true if this is a vector value type.
bool isInteger() const
Return true if this is an integer or a vector integer type.
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
ElementCount getVectorElementCount() const
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
bool bitsGE(MVT VT) const
Return true if this has no less bits than VT.
bool isScalarInteger() const
Return true if this is an integer, not including vectors.
static MVT getVectorVT(MVT VT, unsigned NumElements)
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
static MVT getIntegerVT(unsigned BitWidth)
void normalizeSuccProbs()
Normalize probabilities of all successors so that the sum of them becomes one.
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
LLVM_ABI void setSuccProbability(succ_iterator I, BranchProbability Prob)
Set successor probability of a given iterator.
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
SmallVectorImpl< MachineBasicBlock * >::iterator succ_iterator
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
void setIsEHContTarget(bool V=true)
Indicates if this is a target of Windows EH Continuation Guard.
void setIsEHFuncletEntry(bool V=true)
Indicates if this is the entry block of an EH funclet.
MachineInstrBundleIterator< MachineInstr > iterator
void setIsEHScopeEntry(bool V=true)
Indicates if this is the entry block of an EH scope, i.e., the block that that used to have a catchpa...
void setMachineBlockAddressTaken()
Set this block to indicate that its address is used as something other than the target of a terminato...
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
void setIsImmutableObjectIndex(int ObjectIdx, bool IsImmutable)
Marks the immutability of an object.
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
bool hasOpaqueSPAdjustment() const
Returns true if the function contains opaque dynamic stack adjustments.
int getStackProtectorIndex() const
Return the index for the stack protector object.
void setIsAliasedObjectIndex(int ObjectIdx, bool IsAliased)
Set "maybe pointed to by an LLVM IR value" for an object.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
void RemoveStackObject(int ObjectIdx)
Remove or mark dead a statically sized stack object.
void setFunctionContextIndex(int I)
const WinEHFuncInfo * getWinEHFuncInfo() const
getWinEHFuncInfo - Return information about how the current function uses Windows exception handling.
bool useDebugInstrRef() const
Returns true if the function's variable locations are tracked with instruction referencing.
void setCallSiteBeginLabel(MCSymbol *BeginLabel, unsigned Site)
Map the begin label for a call site.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, Align base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MCContext & getContext() const
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
void addCodeViewAnnotation(MCSymbol *Label, MDNode *MD)
Record annotations associated with a particular label.
Function & getFunction()
Return the LLVM function that this machine code represents.
BasicBlockListType::iterator iterator
void setHasEHContTarget(bool V)
void addInvoke(MachineBasicBlock *LandingPad, MCSymbol *BeginLabel, MCSymbol *EndLabel)
Provide the begin and end labels of an invoke style call and associate it with a try landing pad bloc...
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineInstr - Allocate a new MachineInstr.
void insert(iterator MBBI, MachineBasicBlock *MBB)
const MachineInstrBuilder & addSym(MCSymbol *Sym, unsigned char TargetFlags=0) const
const MachineInstrBuilder & addFrameIndex(int Idx) const
Representation of each machine instruction.
A description of a memory reference used in the backend.
Flags
Flags values. These may be or'd together.
@ MOVolatile
The memory access is volatile.
@ MODereferenceable
The memory access is dereferenceable (i.e., doesn't trap).
@ MOLoad
The memory access reads data.
@ MONonTemporal
The memory access is non-temporal.
@ MOInvariant
The memory access always returns the same value (or traps).
@ MOStore
The memory access writes data.
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
static MachineOperand CreateReg(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false, bool isRenamable=false)
static MachineOperand CreateFI(int Idx)
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
def_iterator def_begin(Register RegNo) const
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
LLVM_ABI MCRegister getLiveInPhysReg(Register VReg) const
getLiveInPhysReg - If VReg is a live-in virtual register, return the corresponding live-in physical r...
An SDNode that represents everything that will be needed to construct a MachineInstr.
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(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
constexpr bool 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 SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr)
Loads are not normal binary operators: their result type is not determined by their operands,...
LLVM_ABI Align getEVTAlign(EVT MemoryVT) const
Compute the default alignment value for the given type.
LLVM_ABI bool shouldOptForSize() const
const TargetLowering & getTargetLoweringInfo() const
static constexpr unsigned MaxRecursionDepth
LLVM_ABI void AddDbgValue(SDDbgValue *DB, bool isParameter)
Add a dbg_value SDNode.
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Ops)
Return an ISD::BUILD_VECTOR node.
LLVM_ABI SDValue getBitcast(EVT VT, SDValue V)
Return a bitcast using the SDLoc of the value operand, and casting to the provided type.
LLVM_ABI SDDbgValue * getDbgValueList(DIVariable *Var, DIExpression *Expr, ArrayRef< SDDbgOperand > Locs, ArrayRef< SDNode * > Dependencies, bool IsIndirect, const DebugLoc &DL, unsigned O, bool IsVariadic)
Creates a SDDbgValue node from a list of locations.
SDValue getCopyFromReg(SDValue Chain, const SDLoc &dl, Register Reg, EVT VT)
LLVM_ABI void setNodeMemRefs(MachineSDNode *N, ArrayRef< MachineMemOperand * > NewMemRefs)
Mutate the specified machine node's memory references to the provided list.
const DataLayout & getDataLayout() const
SDValue getTargetFrameIndex(int FI, EVT VT)
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getMemBasePlusOffset(SDValue Base, TypeSize Offset, const SDLoc &DL, const SDNodeFlags Flags=SDNodeFlags())
Returns sum of the base pointer and offset.
LLVM_ABI SDValue getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
LLVM_ABI SDValue getMDNode(const MDNode *MD)
Return an MDNodeSDNode which holds an MDNode.
LLVM_ABI SDValue getBasicBlock(MachineBasicBlock *MBB)
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...
virtual unsigned getNumRegistersForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain targets require unusual breakdowns of certain types.
virtual bool isZExtFree(Type *FromTy, Type *ToTy) const
Return true if any actual instruction that defines a value of type FromTy implicitly zero-extends the...
virtual MVT getRegisterTypeForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain combinations of ABIs, Targets and features require that types are legal for some operations a...
virtual bool useStackGuardMixFP() const
If this function returns true, stack protection checks should mix the frame pointer (or whichever poi...
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 shouldExpandVectorMatch(EVT VT, unsigned SearchSize) const
Return true if the @llvm.experimental.vector.match intrinsic should be expanded for vector type ‘VT’ ...
virtual bool isProfitableToCombineMinNumMaxNum(EVT VT) const
virtual MVT getFenceOperandTy(const DataLayout &DL) const
Return the type for operands of fence.
virtual bool shouldExpandGetVectorLength(EVT CountVT, unsigned VF, bool IsScalable) const
bool isOperationLegalOrCustom(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal with custom lower...
virtual MVT hasFastEqualityCompare(unsigned NumBits) const
Return the preferred operand type if the target has a quick way to compare integer values of the give...
MachineMemOperand::Flags getStoreMemOperandFlags(const StoreInst &SI, const DataLayout &DL) const
virtual void getTgtMemIntrinsic(SmallVectorImpl< IntrinsicInfo > &Infos, const CallBase &I, MachineFunction &MF, unsigned Intrinsic) const
Given an intrinsic, checks if on the target the intrinsic will need to map to a MemIntrinsicNode (tou...
virtual bool signExtendConstant(const ConstantInt *C) const
Return true if this constant should be sign extended when promoting to a larger type.
virtual Value * getSDagStackGuard(const Module &M, const LibcallLoweringInfo &Libcalls) const
Return the variable that's previously inserted by insertSSPDeclarations, if any, otherwise return nul...
LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const
Return how we should legalize values of this type, either it is already legal (return 'Legal') or we ...
virtual Register getExceptionPointerRegister(const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception address on entry to an ...
bool supportsUnalignedAtomics() const
Whether the target supports unaligned atomic operations.
std::vector< ArgListEntry > ArgListTy
bool isBeneficialToExpandPowI(int64_t Exponent, bool OptForSize) const
Return true if it is beneficial to expand an @llvm.powi.
MVT getFrameIndexTy(const DataLayout &DL) const
Return the type for frame index, which is determined by the alloca address space specified through th...
virtual Register getExceptionSelectorRegister(const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception typeid on entry to a la...
virtual MVT getPointerMemTy(const DataLayout &DL, uint32_t AS=0) const
Return the in-memory pointer type for the given address space, defaults to the pointer type from the ...
MVT getRegisterType(MVT VT) const
Return the type of registers that this ValueType will eventually require.
unsigned getVectorTypeBreakdown(LLVMContext &Context, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const
Vector types are broken down into some number of legal first class types.
virtual MVT getVPExplicitVectorLengthTy() const
Returns the type to be used for the EVL/AVL operand of VP nodes: ISD::VP_ADD, ISD::VP_SUB,...
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
virtual bool supportKCFIBundles() const
Return true if the target supports kcfi operand bundles.
virtual bool supportPtrAuthBundles() const
Return true if the target supports ptrauth operand bundles.
virtual bool supportSwiftError() const
Return true if the target supports swifterror attribute.
virtual SDValue visitMaskedLoad(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, MachineMemOperand *MMO, SDValue &NewLoad, SDValue Ptr, SDValue PassThru, SDValue Mask) const
virtual 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.
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 isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Definition Type.h:227
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:141
Unconditional Branch instruction.
This function has undefined behavior.
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
op_iterator op_begin()
Definition User.h:259
Value * getOperand(unsigned i) const
Definition User.h:207
unsigned getNumOperands() const
Definition User.h:229
op_iterator op_end()
Definition User.h:261
This class represents the va_arg llvm instruction, which returns an argument of the specified type gi...
LLVM_ABI CmpInst::Predicate getPredicate() const
This is the common base class for vector predication intrinsics.
static LLVM_ABI std::optional< unsigned > getVectorLengthParamPos(Intrinsic::ID IntrinsicID)
LLVM_ABI MaybeAlign getPointerAlignment() const
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h: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_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:345
@ 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:547
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 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:2313
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)