LLVM 23.0.0git
SelectionDAGBuilder.cpp
Go to the documentation of this file.
1//===- SelectionDAGBuilder.cpp - Selection-DAG building -------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This implements routines for translating from LLVM IR into SelectionDAG IR.
10//
11//===----------------------------------------------------------------------===//
12
13#include "SelectionDAGBuilder.h"
14#include "SDNodeDbgValue.h"
15#include "llvm/ADT/APFloat.h"
16#include "llvm/ADT/APInt.h"
17#include "llvm/ADT/BitVector.h"
18#include "llvm/ADT/STLExtras.h"
21#include "llvm/ADT/StringRef.h"
22#include "llvm/ADT/Twine.h"
26#include "llvm/Analysis/Loads.h"
58#include "llvm/IR/Argument.h"
59#include "llvm/IR/Attributes.h"
60#include "llvm/IR/BasicBlock.h"
61#include "llvm/IR/CFG.h"
62#include "llvm/IR/CallingConv.h"
63#include "llvm/IR/Constant.h"
65#include "llvm/IR/Constants.h"
66#include "llvm/IR/DataLayout.h"
67#include "llvm/IR/DebugInfo.h"
72#include "llvm/IR/Function.h"
74#include "llvm/IR/InlineAsm.h"
75#include "llvm/IR/InstrTypes.h"
78#include "llvm/IR/Intrinsics.h"
79#include "llvm/IR/IntrinsicsAArch64.h"
80#include "llvm/IR/IntrinsicsAMDGPU.h"
81#include "llvm/IR/IntrinsicsWebAssembly.h"
82#include "llvm/IR/LLVMContext.h"
84#include "llvm/IR/Metadata.h"
85#include "llvm/IR/Module.h"
86#include "llvm/IR/Operator.h"
88#include "llvm/IR/Statepoint.h"
89#include "llvm/IR/Type.h"
90#include "llvm/IR/User.h"
91#include "llvm/IR/Value.h"
92#include "llvm/MC/MCContext.h"
97#include "llvm/Support/Debug.h"
105#include <cstddef>
106#include <limits>
107#include <optional>
108#include <tuple>
109
110using namespace llvm;
111using namespace PatternMatch;
112using namespace SwitchCG;
113
114#define DEBUG_TYPE "isel"
115
116/// LimitFloatPrecision - Generate low-precision inline sequences for
117/// some float libcalls (6, 8 or 12 bits).
118static unsigned LimitFloatPrecision;
119
120static cl::opt<bool>
121 InsertAssertAlign("insert-assert-align", cl::init(true),
122 cl::desc("Insert the experimental `assertalign` node."),
124
126 LimitFPPrecision("limit-float-precision",
127 cl::desc("Generate low-precision inline sequences "
128 "for some float libcalls"),
130 cl::init(0));
131
133 "switch-peel-threshold", cl::Hidden, cl::init(66),
134 cl::desc("Set the case probability threshold for peeling the case from a "
135 "switch statement. A value greater than 100 will void this "
136 "optimization"));
137
138// Limit the width of DAG chains. This is important in general to prevent
139// DAG-based analysis from blowing up. For example, alias analysis and
140// load clustering may not complete in reasonable time. It is difficult to
141// recognize and avoid this situation within each individual analysis, and
142// future analyses are likely to have the same behavior. Limiting DAG width is
143// the safe approach and will be especially important with global DAGs.
144//
145// MaxParallelChains default is arbitrarily high to avoid affecting
146// optimization, but could be lowered to improve compile time. Any ld-ld-st-st
147// sequence over this should have been converted to llvm.memcpy by the
148// frontend. It is easy to induce this behavior with .ll code such as:
149// %buffer = alloca [4096 x i8]
150// %data = load [4096 x i8]* %argPtr
151// store [4096 x i8] %data, [4096 x i8]* %buffer
152static const unsigned MaxParallelChains = 64;
153
155 const SDValue *Parts, unsigned NumParts,
156 MVT PartVT, EVT ValueVT, const Value *V,
157 SDValue InChain,
158 std::optional<CallingConv::ID> CC);
159
160/// getCopyFromParts - Create a value that contains the specified legal parts
161/// combined into the value they represent. If the parts combine to a type
162/// larger than ValueVT then AssertOp can be used to specify whether the extra
163/// bits are known to be zero (ISD::AssertZext) or sign extended from ValueVT
164/// (ISD::AssertSext).
165static SDValue
166getCopyFromParts(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts,
167 unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V,
168 SDValue InChain,
169 std::optional<CallingConv::ID> CC = std::nullopt,
170 std::optional<ISD::NodeType> AssertOp = std::nullopt) {
171 // Let the target assemble the parts if it wants to
172 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
173 if (SDValue Val = TLI.joinRegisterPartsIntoValue(DAG, DL, Parts, NumParts,
174 PartVT, ValueVT, CC))
175 return Val;
176
177 if (ValueVT.isVector())
178 return getCopyFromPartsVector(DAG, DL, Parts, NumParts, PartVT, ValueVT, V,
179 InChain, CC);
180
181 assert(NumParts > 0 && "No parts to assemble!");
182 SDValue Val = Parts[0];
183
184 if (NumParts > 1) {
185 // Assemble the value from multiple parts.
186 if (ValueVT.isInteger()) {
187 unsigned PartBits = PartVT.getSizeInBits();
188 unsigned ValueBits = ValueVT.getSizeInBits();
189
190 // Assemble the power of 2 part.
191 unsigned RoundParts = llvm::bit_floor(NumParts);
192 unsigned RoundBits = PartBits * RoundParts;
193 EVT RoundVT = RoundBits == ValueBits ?
194 ValueVT : EVT::getIntegerVT(*DAG.getContext(), RoundBits);
195 SDValue Lo, Hi;
196
197 EVT HalfVT = EVT::getIntegerVT(*DAG.getContext(), RoundBits/2);
198
199 if (RoundParts > 2) {
200 Lo = getCopyFromParts(DAG, DL, Parts, RoundParts / 2, PartVT, HalfVT, V,
201 InChain);
202 Hi = getCopyFromParts(DAG, DL, Parts + RoundParts / 2, RoundParts / 2,
203 PartVT, HalfVT, V, InChain);
204 } else {
205 Lo = DAG.getNode(ISD::BITCAST, DL, HalfVT, Parts[0]);
206 Hi = DAG.getNode(ISD::BITCAST, DL, HalfVT, Parts[1]);
207 }
208
209 if (DAG.getDataLayout().isBigEndian())
210 std::swap(Lo, Hi);
211
212 Val = DAG.getNode(ISD::BUILD_PAIR, DL, RoundVT, Lo, Hi);
213
214 if (RoundParts < NumParts) {
215 // Assemble the trailing non-power-of-2 part.
216 unsigned OddParts = NumParts - RoundParts;
217 EVT OddVT = EVT::getIntegerVT(*DAG.getContext(), OddParts * PartBits);
218 Hi = getCopyFromParts(DAG, DL, Parts + RoundParts, OddParts, PartVT,
219 OddVT, V, InChain, CC);
220
221 // Combine the round and odd parts.
222 Lo = Val;
223 if (DAG.getDataLayout().isBigEndian())
224 std::swap(Lo, Hi);
225 EVT TotalVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
226 Hi = DAG.getNode(ISD::ANY_EXTEND, DL, TotalVT, Hi);
227 Hi = DAG.getNode(
228 ISD::SHL, DL, TotalVT, Hi,
229 DAG.getShiftAmountConstant(Lo.getValueSizeInBits(), TotalVT, DL));
230 Lo = DAG.getNode(ISD::ZERO_EXTEND, DL, TotalVT, Lo);
231 Val = DAG.getNode(ISD::OR, DL, TotalVT, Lo, Hi);
232 }
233 } else if (PartVT.isFloatingPoint()) {
234 // FP split into multiple FP parts (for ppcf128)
235 assert(ValueVT == EVT(MVT::ppcf128) && PartVT == MVT::f64 &&
236 "Unexpected split");
237 SDValue Lo, Hi;
238 Lo = DAG.getNode(ISD::BITCAST, DL, EVT(MVT::f64), Parts[0]);
239 Hi = DAG.getNode(ISD::BITCAST, DL, EVT(MVT::f64), Parts[1]);
240 if (TLI.hasBigEndianPartOrdering(ValueVT, DAG.getDataLayout()))
241 std::swap(Lo, Hi);
242 Val = DAG.getNode(ISD::BUILD_PAIR, DL, ValueVT, Lo, Hi);
243 } else {
244 // FP split into integer parts (soft fp)
245 assert(ValueVT.isFloatingPoint() && PartVT.isInteger() &&
246 !PartVT.isVector() && "Unexpected split");
247 EVT IntVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
248 Val = getCopyFromParts(DAG, DL, Parts, NumParts, PartVT, IntVT, V,
249 InChain, CC);
250 }
251 }
252
253 // There is now one part, held in Val. Correct it to match ValueVT.
254 // PartEVT is the type of the register class that holds the value.
255 // ValueVT is the type of the inline asm operation.
256 EVT PartEVT = Val.getValueType();
257
258 if (PartEVT == ValueVT)
259 return Val;
260
261 if (PartEVT.isInteger() && ValueVT.isFloatingPoint() &&
262 ValueVT.bitsLT(PartEVT)) {
263 // For an FP value in an integer part, we need to truncate to the right
264 // width first.
265 PartEVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
266 Val = DAG.getNode(ISD::TRUNCATE, DL, PartEVT, Val);
267 }
268
269 // Handle types that have the same size.
270 if (PartEVT.getSizeInBits() == ValueVT.getSizeInBits())
271 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
272
273 // Handle types with different sizes.
274 if (PartEVT.isInteger() && ValueVT.isInteger()) {
275 if (ValueVT.bitsLT(PartEVT)) {
276 // For a truncate, see if we have any information to
277 // indicate whether the truncated bits will always be
278 // zero or sign-extension.
279 if (AssertOp)
280 Val = DAG.getNode(*AssertOp, DL, PartEVT, Val,
281 DAG.getValueType(ValueVT));
282 return DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
283 }
284 return DAG.getNode(ISD::ANY_EXTEND, DL, ValueVT, Val);
285 }
286
287 if (PartEVT.isFloatingPoint() && ValueVT.isFloatingPoint()) {
288 // FP_ROUND's are always exact here.
289 if (ValueVT.bitsLT(Val.getValueType())) {
290
291 SDValue NoChange =
293
294 if (DAG.getMachineFunction().getFunction().getAttributes().hasFnAttr(
295 llvm::Attribute::StrictFP)) {
296 return DAG.getNode(ISD::STRICT_FP_ROUND, DL,
297 DAG.getVTList(ValueVT, MVT::Other), InChain, Val,
298 NoChange);
299 }
300
301 return DAG.getNode(ISD::FP_ROUND, DL, ValueVT, Val, NoChange);
302 }
303
304 return DAG.getNode(ISD::FP_EXTEND, DL, ValueVT, Val);
305 }
306
307 // Handle MMX to a narrower integer type by bitcasting MMX to integer and
308 // then truncating.
309 if (PartEVT == MVT::x86mmx && ValueVT.isInteger() &&
310 ValueVT.bitsLT(PartEVT)) {
311 Val = DAG.getNode(ISD::BITCAST, DL, MVT::i64, Val);
312 return DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
313 }
314
315 report_fatal_error("Unknown mismatch in getCopyFromParts!");
316}
317
319 const Twine &ErrMsg) {
321 if (!I)
322 return Ctx.emitError(ErrMsg);
323
324 if (const CallInst *CI = dyn_cast<CallInst>(I))
325 if (CI->isInlineAsm()) {
326 return Ctx.diagnose(DiagnosticInfoInlineAsm(
327 *CI, ErrMsg + ", possible invalid constraint for vector type"));
328 }
329
330 return Ctx.emitError(I, ErrMsg);
331}
332
333/// getCopyFromPartsVector - Create a value that contains the specified legal
334/// parts combined into the value they represent. If the parts combine to a
335/// type larger than ValueVT then AssertOp can be used to specify whether the
336/// extra bits are known to be zero (ISD::AssertZext) or sign extended from
337/// ValueVT (ISD::AssertSext).
339 const SDValue *Parts, unsigned NumParts,
340 MVT PartVT, EVT ValueVT, const Value *V,
341 SDValue InChain,
342 std::optional<CallingConv::ID> CallConv) {
343 assert(ValueVT.isVector() && "Not a vector value");
344 assert(NumParts > 0 && "No parts to assemble!");
345 const bool IsABIRegCopy = CallConv.has_value();
346
347 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
348 SDValue Val = Parts[0];
349
350 // Handle a multi-element vector.
351 if (NumParts > 1) {
352 EVT IntermediateVT;
353 MVT RegisterVT;
354 unsigned NumIntermediates;
355 unsigned NumRegs;
356
357 if (IsABIRegCopy) {
359 *DAG.getContext(), *CallConv, ValueVT, IntermediateVT,
360 NumIntermediates, RegisterVT);
361 } else {
362 NumRegs =
363 TLI.getVectorTypeBreakdown(*DAG.getContext(), ValueVT, IntermediateVT,
364 NumIntermediates, RegisterVT);
365 }
366
367 assert(NumRegs == NumParts && "Part count doesn't match vector breakdown!");
368 NumParts = NumRegs; // Silence a compiler warning.
369 assert(RegisterVT == PartVT && "Part type doesn't match vector breakdown!");
370 assert(RegisterVT.getSizeInBits() ==
371 Parts[0].getSimpleValueType().getSizeInBits() &&
372 "Part type sizes don't match!");
373
374 // Assemble the parts into intermediate operands.
375 SmallVector<SDValue, 8> Ops(NumIntermediates);
376 if (NumIntermediates == NumParts) {
377 // If the register was not expanded, truncate or copy the value,
378 // as appropriate.
379 for (unsigned i = 0; i != NumParts; ++i)
380 Ops[i] = getCopyFromParts(DAG, DL, &Parts[i], 1, PartVT, IntermediateVT,
381 V, InChain, CallConv);
382 } else if (NumParts > 0) {
383 // If the intermediate type was expanded, build the intermediate
384 // operands from the parts.
385 assert(NumParts % NumIntermediates == 0 &&
386 "Must expand into a divisible number of parts!");
387 unsigned Factor = NumParts / NumIntermediates;
388 for (unsigned i = 0; i != NumIntermediates; ++i)
389 Ops[i] = getCopyFromParts(DAG, DL, &Parts[i * Factor], Factor, PartVT,
390 IntermediateVT, V, InChain, CallConv);
391 }
392
393 // Build a vector with BUILD_VECTOR or CONCAT_VECTORS from the
394 // intermediate operands.
395 EVT BuiltVectorTy =
396 IntermediateVT.isVector()
398 *DAG.getContext(), IntermediateVT.getScalarType(),
399 IntermediateVT.getVectorElementCount() * NumParts)
401 IntermediateVT.getScalarType(),
402 NumIntermediates);
403 Val = DAG.getNode(IntermediateVT.isVector() ? ISD::CONCAT_VECTORS
405 DL, BuiltVectorTy, Ops);
406 }
407
408 // There is now one part, held in Val. Correct it to match ValueVT.
409 EVT PartEVT = Val.getValueType();
410
411 if (PartEVT == ValueVT)
412 return Val;
413
414 if (PartEVT.isVector()) {
415 // Vector/Vector bitcast.
416 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits())
417 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
418
419 // If the parts vector has more elements than the value vector, then we
420 // have a vector widening case (e.g. <2 x float> -> <4 x float>).
421 // Extract the elements we want.
422 if (PartEVT.getVectorElementCount() != ValueVT.getVectorElementCount()) {
425 (PartEVT.getVectorElementCount().isScalable() ==
426 ValueVT.getVectorElementCount().isScalable()) &&
427 "Cannot narrow, it would be a lossy transformation");
428 PartEVT =
430 ValueVT.getVectorElementCount());
431 Val = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, PartEVT, Val,
432 DAG.getVectorIdxConstant(0, DL));
433 if (PartEVT == ValueVT)
434 return Val;
435 if (PartEVT.isInteger() && ValueVT.isFloatingPoint())
436 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
437
438 // Vector/Vector bitcast (e.g. <2 x bfloat> -> <2 x half>).
439 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits())
440 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
441 }
442
443 // Promoted vector extract
444 return DAG.getAnyExtOrTrunc(Val, DL, ValueVT);
445 }
446
447 // Trivial bitcast if the types are the same size and the destination
448 // vector type is legal.
449 if (PartEVT.getSizeInBits() == ValueVT.getSizeInBits() &&
450 TLI.isTypeLegal(ValueVT))
451 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
452
453 if (ValueVT.getVectorNumElements() != 1) {
454 // Certain ABIs require that vectors are passed as integers. For vectors
455 // are the same size, this is an obvious bitcast.
456 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits()) {
457 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
458 } else if (ValueVT.bitsLT(PartEVT)) {
459 const uint64_t ValueSize = ValueVT.getFixedSizeInBits();
460 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
461 // Drop the extra bits.
462 Val = DAG.getNode(ISD::TRUNCATE, DL, IntermediateType, Val);
463 return DAG.getBitcast(ValueVT, Val);
464 }
465
467 *DAG.getContext(), V, "non-trivial scalar-to-vector conversion");
468 return DAG.getUNDEF(ValueVT);
469 }
470
471 // Handle cases such as i8 -> <1 x i1>
472 EVT ValueSVT = ValueVT.getVectorElementType();
473 if (ValueVT.getVectorNumElements() == 1 && ValueSVT != PartEVT) {
474 unsigned ValueSize = ValueSVT.getSizeInBits();
475 if (ValueSize == PartEVT.getSizeInBits()) {
476 Val = DAG.getNode(ISD::BITCAST, DL, ValueSVT, Val);
477 } else if (ValueSVT.isFloatingPoint() && PartEVT.isInteger()) {
478 // It's possible a scalar floating point type gets softened to integer and
479 // then promoted to a larger integer. If PartEVT is the larger integer
480 // we need to truncate it and then bitcast to the FP type.
481 assert(ValueSVT.bitsLT(PartEVT) && "Unexpected types");
482 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
483 Val = DAG.getNode(ISD::TRUNCATE, DL, IntermediateType, Val);
484 Val = DAG.getBitcast(ValueSVT, Val);
485 } else {
486 Val = ValueVT.isFloatingPoint()
487 ? DAG.getFPExtendOrRound(Val, DL, ValueSVT)
488 : DAG.getAnyExtOrTrunc(Val, DL, ValueSVT);
489 }
490 }
491
492 return DAG.getBuildVector(ValueVT, DL, Val);
493}
494
495static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &dl,
496 SDValue Val, SDValue *Parts, unsigned NumParts,
497 MVT PartVT, const Value *V,
498 std::optional<CallingConv::ID> CallConv);
499
500/// getCopyToParts - Create a series of nodes that contain the specified value
501/// split into legal parts. If the parts contain more bits than Val, then, for
502/// integers, ExtendKind can be used to specify how to generate the extra bits.
503static void
505 unsigned NumParts, MVT PartVT, const Value *V,
506 std::optional<CallingConv::ID> CallConv = std::nullopt,
507 ISD::NodeType ExtendKind = ISD::ANY_EXTEND) {
508 // Let the target split the parts if it wants to
509 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
510 if (TLI.splitValueIntoRegisterParts(DAG, DL, Val, Parts, NumParts, PartVT,
511 CallConv))
512 return;
513 EVT ValueVT = Val.getValueType();
514
515 // Handle the vector case separately.
516 if (ValueVT.isVector())
517 return getCopyToPartsVector(DAG, DL, Val, Parts, NumParts, PartVT, V,
518 CallConv);
519
520 unsigned OrigNumParts = NumParts;
522 "Copying to an illegal type!");
523
524 if (NumParts == 0)
525 return;
526
527 assert(!ValueVT.isVector() && "Vector case handled elsewhere");
528 EVT PartEVT = PartVT;
529 if (PartEVT == ValueVT) {
530 assert(NumParts == 1 && "No-op copy with multiple parts!");
531 Parts[0] = Val;
532 return;
533 }
534
535 unsigned PartBits = PartVT.getSizeInBits();
536 if (NumParts * PartBits > ValueVT.getSizeInBits()) {
537 // If the parts cover more bits than the value has, promote the value.
538 if (PartVT.isFloatingPoint() && ValueVT.isFloatingPoint()) {
539 assert(NumParts == 1 && "Do not know what to promote to!");
540 Val = DAG.getNode(ISD::FP_EXTEND, DL, PartVT, Val);
541 } else {
542 if (ValueVT.isFloatingPoint()) {
543 // FP values need to be bitcast, then extended if they are being put
544 // into a larger container.
545 ValueVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
546 Val = DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
547 }
548 assert((PartVT.isInteger() || PartVT == MVT::x86mmx) &&
549 ValueVT.isInteger() &&
550 "Unknown mismatch!");
551 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
552 Val = DAG.getNode(ExtendKind, DL, ValueVT, Val);
553 if (PartVT == MVT::x86mmx)
554 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
555 }
556 } else if (PartBits == ValueVT.getSizeInBits()) {
557 // Different types of the same size.
558 assert(NumParts == 1 && PartEVT != ValueVT);
559 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
560 } else if (NumParts * PartBits < ValueVT.getSizeInBits()) {
561 // If the parts cover less bits than value has, truncate the value.
562 assert((PartVT.isInteger() || PartVT == MVT::x86mmx) &&
563 ValueVT.isInteger() &&
564 "Unknown mismatch!");
565 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
566 Val = DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
567 if (PartVT == MVT::x86mmx)
568 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
569 }
570
571 // The value may have changed - recompute ValueVT.
572 ValueVT = Val.getValueType();
573 assert(NumParts * PartBits == ValueVT.getSizeInBits() &&
574 "Failed to tile the value with PartVT!");
575
576 if (NumParts == 1) {
577 if (PartEVT != ValueVT) {
579 "scalar-to-vector conversion failed");
580 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
581 }
582
583 Parts[0] = Val;
584 return;
585 }
586
587 // Expand the value into multiple parts.
588 if (NumParts & (NumParts - 1)) {
589 // The number of parts is not a power of 2. Split off and copy the tail.
590 assert(PartVT.isInteger() && ValueVT.isInteger() &&
591 "Do not know what to expand to!");
592 unsigned RoundParts = llvm::bit_floor(NumParts);
593 unsigned RoundBits = RoundParts * PartBits;
594 unsigned OddParts = NumParts - RoundParts;
595 SDValue OddVal = DAG.getNode(ISD::SRL, DL, ValueVT, Val,
596 DAG.getShiftAmountConstant(RoundBits, ValueVT, DL));
597
598 getCopyToParts(DAG, DL, OddVal, Parts + RoundParts, OddParts, PartVT, V,
599 CallConv);
600
601 if (DAG.getDataLayout().isBigEndian())
602 // The odd parts were reversed by getCopyToParts - unreverse them.
603 std::reverse(Parts + RoundParts, Parts + NumParts);
604
605 NumParts = RoundParts;
606 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
607 Val = DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
608 }
609
610 // The number of parts is a power of 2. Repeatedly bisect the value using
611 // EXTRACT_ELEMENT.
612 Parts[0] = DAG.getNode(ISD::BITCAST, DL,
614 ValueVT.getSizeInBits()),
615 Val);
616
617 for (unsigned StepSize = NumParts; StepSize > 1; StepSize /= 2) {
618 for (unsigned i = 0; i < NumParts; i += StepSize) {
619 unsigned ThisBits = StepSize * PartBits / 2;
620 EVT ThisVT = EVT::getIntegerVT(*DAG.getContext(), ThisBits);
621 SDValue &Part0 = Parts[i];
622 SDValue &Part1 = Parts[i+StepSize/2];
623
624 Part1 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL,
625 ThisVT, Part0, DAG.getIntPtrConstant(1, DL));
626 Part0 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL,
627 ThisVT, Part0, DAG.getIntPtrConstant(0, DL));
628
629 if (ThisBits == PartBits && ThisVT != PartVT) {
630 Part0 = DAG.getNode(ISD::BITCAST, DL, PartVT, Part0);
631 Part1 = DAG.getNode(ISD::BITCAST, DL, PartVT, Part1);
632 }
633 }
634 }
635
636 if (DAG.getDataLayout().isBigEndian())
637 std::reverse(Parts, Parts + OrigNumParts);
638}
639
641 const SDLoc &DL, EVT PartVT) {
642 if (!PartVT.isVector())
643 return SDValue();
644
645 EVT ValueVT = Val.getValueType();
646 EVT PartEVT = PartVT.getVectorElementType();
647 EVT ValueEVT = ValueVT.getVectorElementType();
648 ElementCount PartNumElts = PartVT.getVectorElementCount();
649 ElementCount ValueNumElts = ValueVT.getVectorElementCount();
650
651 // We only support widening vectors with equivalent element types and
652 // fixed/scalable properties. If a target needs to widen a fixed-length type
653 // to a scalable one, it should be possible to use INSERT_SUBVECTOR below.
654 if (ElementCount::isKnownLE(PartNumElts, ValueNumElts) ||
655 PartNumElts.isScalable() != ValueNumElts.isScalable())
656 return SDValue();
657
658 // Have a try for bf16 because some targets share its ABI with fp16.
659 if (ValueEVT == MVT::bf16 && PartEVT == MVT::f16) {
661 "Cannot widen to illegal type");
662 Val = DAG.getNode(
664 ValueVT.changeVectorElementType(*DAG.getContext(), MVT::f16), Val);
665 } else if (PartEVT != ValueEVT) {
666 return SDValue();
667 }
668
669 // Widening a scalable vector to another scalable vector is done by inserting
670 // the vector into a larger undef one.
671 if (PartNumElts.isScalable())
672 return DAG.getNode(ISD::INSERT_SUBVECTOR, DL, PartVT, DAG.getUNDEF(PartVT),
673 Val, DAG.getVectorIdxConstant(0, DL));
674
675 // Vector widening case, e.g. <2 x float> -> <4 x float>. Shuffle in
676 // undef elements.
678 DAG.ExtractVectorElements(Val, Ops);
679 SDValue EltUndef = DAG.getUNDEF(PartEVT);
680 Ops.append((PartNumElts - ValueNumElts).getFixedValue(), EltUndef);
681
682 // FIXME: Use CONCAT for 2x -> 4x.
683 return DAG.getBuildVector(PartVT, DL, Ops);
684}
685
686/// getCopyToPartsVector - Create a series of nodes that contain the specified
687/// value split into legal parts.
688static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &DL,
689 SDValue Val, SDValue *Parts, unsigned NumParts,
690 MVT PartVT, const Value *V,
691 std::optional<CallingConv::ID> CallConv) {
692 EVT ValueVT = Val.getValueType();
693 assert(ValueVT.isVector() && "Not a vector");
694 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
695 const bool IsABIRegCopy = CallConv.has_value();
696
697 if (NumParts == 1) {
698 EVT PartEVT = PartVT;
699 if (PartEVT == ValueVT) {
700 // Nothing to do.
701 } else if (PartVT.getSizeInBits() == ValueVT.getSizeInBits()) {
702 // Bitconvert vector->vector case.
703 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
704 } else if (SDValue Widened = widenVectorToPartType(DAG, Val, DL, PartVT)) {
705 Val = Widened;
706 } else if (PartVT.isVector() &&
708 ValueVT.getVectorElementType()) &&
709 PartEVT.getVectorElementCount() ==
710 ValueVT.getVectorElementCount()) {
711
712 // Promoted vector extract
713 Val = DAG.getAnyExtOrTrunc(Val, DL, PartVT);
714 } else if (PartEVT.isVector() &&
715 PartEVT.getVectorElementType() !=
716 ValueVT.getVectorElementType() &&
717 TLI.getTypeAction(*DAG.getContext(), ValueVT) ==
719 // Combination of widening and promotion.
720 EVT WidenVT =
722 PartVT.getVectorElementCount());
723 SDValue Widened = widenVectorToPartType(DAG, Val, DL, WidenVT);
724 Val = DAG.getAnyExtOrTrunc(Widened, DL, PartVT);
725 } else {
726 // Don't extract an integer from a float vector. This can happen if the
727 // FP type gets softened to integer and then promoted. The promotion
728 // prevents it from being picked up by the earlier bitcast case.
729 if (ValueVT.getVectorElementCount().isScalar() &&
730 (!ValueVT.isFloatingPoint() || !PartVT.isInteger())) {
731 // If we reach this condition and PartVT is FP, this means that
732 // ValueVT is also FP and both have a different size, otherwise we
733 // would have bitcasted them. Producing an EXTRACT_VECTOR_ELT here
734 // would be invalid since that would mean the smaller FP type has to
735 // be extended to the larger one.
736 if (PartVT.isFloatingPoint()) {
737 Val = DAG.getBitcast(ValueVT.getScalarType(), Val);
738 Val = DAG.getNode(ISD::FP_EXTEND, DL, PartVT, Val);
739 } else
740 Val = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, PartVT, Val,
741 DAG.getVectorIdxConstant(0, DL));
742 } else {
743 uint64_t ValueSize = ValueVT.getFixedSizeInBits();
744 assert(PartVT.getFixedSizeInBits() > ValueSize &&
745 "lossy conversion of vector to scalar type");
746 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
747 Val = DAG.getBitcast(IntermediateType, Val);
748 Val = DAG.getAnyExtOrTrunc(Val, DL, PartVT);
749 }
750 }
751
752 assert(Val.getValueType() == PartVT && "Unexpected vector part value type");
753 Parts[0] = Val;
754 return;
755 }
756
757 // Handle a multi-element vector.
758 EVT IntermediateVT;
759 MVT RegisterVT;
760 unsigned NumIntermediates;
761 unsigned NumRegs;
762 if (IsABIRegCopy) {
764 *DAG.getContext(), *CallConv, ValueVT, IntermediateVT, NumIntermediates,
765 RegisterVT);
766 } else {
767 NumRegs =
768 TLI.getVectorTypeBreakdown(*DAG.getContext(), ValueVT, IntermediateVT,
769 NumIntermediates, RegisterVT);
770 }
771
772 assert(NumRegs == NumParts && "Part count doesn't match vector breakdown!");
773 NumParts = NumRegs; // Silence a compiler warning.
774 assert(RegisterVT == PartVT && "Part type doesn't match vector breakdown!");
775
776 assert(IntermediateVT.isScalableVector() == ValueVT.isScalableVector() &&
777 "Mixing scalable and fixed vectors when copying in parts");
778
779 std::optional<ElementCount> DestEltCnt;
780
781 if (IntermediateVT.isVector())
782 DestEltCnt = IntermediateVT.getVectorElementCount() * NumIntermediates;
783 else
784 DestEltCnt = ElementCount::getFixed(NumIntermediates);
785
786 EVT BuiltVectorTy = EVT::getVectorVT(
787 *DAG.getContext(), IntermediateVT.getScalarType(), *DestEltCnt);
788
789 if (ValueVT == BuiltVectorTy) {
790 // Nothing to do.
791 } else if (ValueVT.getSizeInBits() == BuiltVectorTy.getSizeInBits()) {
792 // Bitconvert vector->vector case.
793 Val = DAG.getNode(ISD::BITCAST, DL, BuiltVectorTy, Val);
794 } else {
795 if (BuiltVectorTy.getVectorElementType().bitsGT(
796 ValueVT.getVectorElementType())) {
797 // Integer promotion.
798 ValueVT = EVT::getVectorVT(*DAG.getContext(),
799 BuiltVectorTy.getVectorElementType(),
800 ValueVT.getVectorElementCount());
801 Val = DAG.getNode(ISD::ANY_EXTEND, DL, ValueVT, Val);
802 }
803
804 if (SDValue Widened = widenVectorToPartType(DAG, Val, DL, BuiltVectorTy)) {
805 Val = Widened;
806 }
807 }
808
809 assert(Val.getValueType() == BuiltVectorTy && "Unexpected vector value type");
810
811 // Split the vector into intermediate operands.
812 SmallVector<SDValue, 8> Ops(NumIntermediates);
813 for (unsigned i = 0; i != NumIntermediates; ++i) {
814 if (IntermediateVT.isVector()) {
815 // This does something sensible for scalable vectors - see the
816 // definition of EXTRACT_SUBVECTOR for further details.
817 unsigned IntermediateNumElts = IntermediateVT.getVectorMinNumElements();
818 Ops[i] =
819 DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, IntermediateVT, Val,
820 DAG.getVectorIdxConstant(i * IntermediateNumElts, DL));
821 } else {
822 Ops[i] = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, IntermediateVT, Val,
823 DAG.getVectorIdxConstant(i, DL));
824 }
825 }
826
827 // Split the intermediate operands into legal parts.
828 if (NumParts == NumIntermediates) {
829 // If the register was not expanded, promote or copy the value,
830 // as appropriate.
831 for (unsigned i = 0; i != NumParts; ++i)
832 getCopyToParts(DAG, DL, Ops[i], &Parts[i], 1, PartVT, V, CallConv);
833 } else if (NumParts > 0) {
834 // If the intermediate type was expanded, split each the value into
835 // legal parts.
836 assert(NumIntermediates != 0 && "division by zero");
837 assert(NumParts % NumIntermediates == 0 &&
838 "Must expand into a divisible number of parts!");
839 unsigned Factor = NumParts / NumIntermediates;
840 for (unsigned i = 0; i != NumIntermediates; ++i)
841 getCopyToParts(DAG, DL, Ops[i], &Parts[i * Factor], Factor, PartVT, V,
842 CallConv);
843 }
844}
845
846static void failForInvalidBundles(const CallBase &I, StringRef Name,
847 ArrayRef<uint32_t> AllowedBundles) {
848 if (I.hasOperandBundlesOtherThan(AllowedBundles)) {
849 ListSeparator LS;
850 std::string Error;
852 for (unsigned i = 0, e = I.getNumOperandBundles(); i != e; ++i) {
853 OperandBundleUse U = I.getOperandBundleAt(i);
854 if (!is_contained(AllowedBundles, U.getTagID()))
855 OS << LS << U.getTagName();
856 }
858 Twine("cannot lower ", Name)
859 .concat(Twine(" with arbitrary operand bundles: ", Error)));
860 }
861}
862
864 EVT valuevt, std::optional<CallingConv::ID> CC)
865 : ValueVTs(1, valuevt), RegVTs(1, regvt), Regs(regs),
866 RegCount(1, regs.size()), CallConv(CC) {}
867
869 const DataLayout &DL, Register Reg, Type *Ty,
870 std::optional<CallingConv::ID> CC) {
871 ComputeValueVTs(TLI, DL, Ty, ValueVTs);
872
873 CallConv = CC;
874
875 for (EVT ValueVT : ValueVTs) {
876 unsigned NumRegs =
878 ? TLI.getNumRegistersForCallingConv(Context, *CC, ValueVT)
879 : TLI.getNumRegisters(Context, ValueVT);
880 MVT RegisterVT =
882 ? TLI.getRegisterTypeForCallingConv(Context, *CC, ValueVT)
883 : TLI.getRegisterType(Context, ValueVT);
884 for (unsigned i = 0; i != NumRegs; ++i)
885 Regs.push_back(Reg + i);
886 RegVTs.push_back(RegisterVT);
887 RegCount.push_back(NumRegs);
888 Reg = Reg.id() + NumRegs;
889 }
890}
891
893 FunctionLoweringInfo &FuncInfo,
894 const SDLoc &dl, SDValue &Chain,
895 SDValue *Glue, const Value *V) const {
896 // A Value with type {} or [0 x %t] needs no registers.
897 if (ValueVTs.empty())
898 return SDValue();
899
900 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
901
902 // Assemble the legal parts into the final values.
903 SmallVector<SDValue, 4> Values(ValueVTs.size());
905 for (unsigned Value = 0, Part = 0, e = ValueVTs.size(); Value != e; ++Value) {
906 // Copy the legal parts from the registers.
907 EVT ValueVT = ValueVTs[Value];
908 unsigned NumRegs = RegCount[Value];
909 MVT RegisterVT = isABIMangled()
911 *DAG.getContext(), *CallConv, RegVTs[Value])
912 : RegVTs[Value];
913
914 Parts.resize(NumRegs);
915 for (unsigned i = 0; i != NumRegs; ++i) {
916 SDValue P;
917 if (!Glue) {
918 P = DAG.getCopyFromReg(Chain, dl, Regs[Part+i], RegisterVT);
919 } else {
920 P = DAG.getCopyFromReg(Chain, dl, Regs[Part+i], RegisterVT, *Glue);
921 *Glue = P.getValue(2);
922 }
923
924 Chain = P.getValue(1);
925 Parts[i] = P;
926
927 // If the source register was virtual and if we know something about it,
928 // add an assert node.
929 if (!Regs[Part + i].isVirtual() || !RegisterVT.isInteger())
930 continue;
931
933 FuncInfo.GetLiveOutRegInfo(Regs[Part+i]);
934 if (!LOI)
935 continue;
936
937 unsigned RegSize = RegisterVT.getScalarSizeInBits();
938 unsigned NumSignBits = LOI->NumSignBits;
939 unsigned NumZeroBits = LOI->Known.countMinLeadingZeros();
940
941 if (NumZeroBits == RegSize) {
942 // The current value is a zero.
943 // Explicitly express that as it would be easier for
944 // optimizations to kick in.
945 Parts[i] = DAG.getConstant(0, dl, RegisterVT);
946 continue;
947 }
948
949 // FIXME: We capture more information than the dag can represent. For
950 // now, just use the tightest assertzext/assertsext possible.
951 bool isSExt;
952 EVT FromVT(MVT::Other);
953 if (NumZeroBits) {
954 FromVT = EVT::getIntegerVT(*DAG.getContext(), RegSize - NumZeroBits);
955 isSExt = false;
956 } else if (NumSignBits > 1) {
957 FromVT =
958 EVT::getIntegerVT(*DAG.getContext(), RegSize - NumSignBits + 1);
959 isSExt = true;
960 } else {
961 continue;
962 }
963 // Add an assertion node.
964 assert(FromVT != MVT::Other);
965 Parts[i] = DAG.getNode(isSExt ? ISD::AssertSext : ISD::AssertZext, dl,
966 RegisterVT, P, DAG.getValueType(FromVT));
967 }
968
969 Values[Value] = getCopyFromParts(DAG, dl, Parts.begin(), NumRegs,
970 RegisterVT, ValueVT, V, Chain, CallConv);
971 Part += NumRegs;
972 Parts.clear();
973 }
974
975 return DAG.getNode(ISD::MERGE_VALUES, dl, DAG.getVTList(ValueVTs), Values);
976}
977
979 const SDLoc &dl, SDValue &Chain, SDValue *Glue,
980 const Value *V,
981 ISD::NodeType PreferredExtendType) const {
982 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
983 ISD::NodeType ExtendKind = PreferredExtendType;
984
985 // Get the list of the values's legal parts.
986 unsigned NumRegs = Regs.size();
987 SmallVector<SDValue, 8> Parts(NumRegs);
988 for (unsigned Value = 0, Part = 0, e = ValueVTs.size(); Value != e; ++Value) {
989 unsigned NumParts = RegCount[Value];
990
991 MVT RegisterVT = isABIMangled()
993 *DAG.getContext(), *CallConv, RegVTs[Value])
994 : RegVTs[Value];
995
996 if (ExtendKind == ISD::ANY_EXTEND && TLI.isZExtFree(Val, RegisterVT))
997 ExtendKind = ISD::ZERO_EXTEND;
998
999 getCopyToParts(DAG, dl, Val.getValue(Val.getResNo() + Value), &Parts[Part],
1000 NumParts, RegisterVT, V, CallConv, ExtendKind);
1001 Part += NumParts;
1002 }
1003
1004 // Copy the parts into the registers.
1005 SmallVector<SDValue, 8> Chains(NumRegs);
1006 for (unsigned i = 0; i != NumRegs; ++i) {
1007 SDValue Part;
1008 if (!Glue) {
1009 Part = DAG.getCopyToReg(Chain, dl, Regs[i], Parts[i]);
1010 } else {
1011 Part = DAG.getCopyToReg(Chain, dl, Regs[i], Parts[i], *Glue);
1012 *Glue = Part.getValue(1);
1013 }
1014
1015 Chains[i] = Part.getValue(0);
1016 }
1017
1018 if (NumRegs == 1 || Glue)
1019 // If NumRegs > 1 && Glue is used then the use of the last CopyToReg is
1020 // flagged to it. That is the CopyToReg nodes and the user are considered
1021 // a single scheduling unit. If we create a TokenFactor and return it as
1022 // chain, then the TokenFactor is both a predecessor (operand) of the
1023 // user as well as a successor (the TF operands are flagged to the user).
1024 // c1, f1 = CopyToReg
1025 // c2, f2 = CopyToReg
1026 // c3 = TokenFactor c1, c2
1027 // ...
1028 // = op c3, ..., f2
1029 Chain = Chains[NumRegs-1];
1030 else
1031 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chains);
1032}
1033
1035 unsigned MatchingIdx, const SDLoc &dl,
1036 SelectionDAG &DAG,
1037 std::vector<SDValue> &Ops) const {
1038 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1039
1040 InlineAsm::Flag Flag(Code, Regs.size());
1041 if (HasMatching)
1042 Flag.setMatchingOp(MatchingIdx);
1043 else if (!Regs.empty() && Regs.front().isVirtual()) {
1044 // Put the register class of the virtual registers in the flag word. That
1045 // way, later passes can recompute register class constraints for inline
1046 // assembly as well as normal instructions.
1047 // Don't do this for tied operands that can use the regclass information
1048 // from the def.
1050 const TargetRegisterClass *RC = MRI.getRegClass(Regs.front());
1051 Flag.setRegClass(RC->getID());
1052 }
1053
1054 SDValue Res = DAG.getTargetConstant(Flag, dl, MVT::i32);
1055 Ops.push_back(Res);
1056
1057 if (Code == InlineAsm::Kind::Clobber) {
1058 // Clobbers should always have a 1:1 mapping with registers, and may
1059 // reference registers that have illegal (e.g. vector) types. Hence, we
1060 // shouldn't try to apply any sort of splitting logic to them.
1061 assert(Regs.size() == RegVTs.size() && Regs.size() == ValueVTs.size() &&
1062 "No 1:1 mapping from clobbers to regs?");
1064 (void)SP;
1065 for (unsigned I = 0, E = ValueVTs.size(); I != E; ++I) {
1066 Ops.push_back(DAG.getRegister(Regs[I], RegVTs[I]));
1067 assert(
1068 (Regs[I] != SP ||
1070 "If we clobbered the stack pointer, MFI should know about it.");
1071 }
1072 return;
1073 }
1074
1075 for (unsigned Value = 0, Reg = 0, e = ValueVTs.size(); Value != e; ++Value) {
1076 MVT RegisterVT = RegVTs[Value];
1077 unsigned NumRegs = TLI.getNumRegisters(*DAG.getContext(), ValueVTs[Value],
1078 RegisterVT);
1079 for (unsigned i = 0; i != NumRegs; ++i) {
1080 assert(Reg < Regs.size() && "Mismatch in # registers expected");
1081 Register TheReg = Regs[Reg++];
1082 Ops.push_back(DAG.getRegister(TheReg, RegisterVT));
1083 }
1084 }
1085}
1086
1090 unsigned I = 0;
1091 for (auto CountAndVT : zip_first(RegCount, RegVTs)) {
1092 unsigned RegCount = std::get<0>(CountAndVT);
1093 MVT RegisterVT = std::get<1>(CountAndVT);
1094 TypeSize RegisterSize = RegisterVT.getSizeInBits();
1095 for (unsigned E = I + RegCount; I != E; ++I)
1096 OutVec.push_back(std::make_pair(Regs[I], RegisterSize));
1097 }
1098 return OutVec;
1099}
1100
1102 AssumptionCache *ac, const TargetLibraryInfo *li,
1103 const TargetTransformInfo &TTI) {
1104 BatchAA = aa;
1105 AC = ac;
1106 GFI = gfi;
1107 LibInfo = li;
1108 Context = DAG.getContext();
1109 LPadToCallSiteMap.clear();
1110 this->TTI = &TTI;
1111 SL->init(DAG.getTargetLoweringInfo(), TM, DAG.getDataLayout());
1112 AssignmentTrackingEnabled = isAssignmentTrackingEnabled(
1113 *DAG.getMachineFunction().getFunction().getParent());
1114}
1115
1117 NodeMap.clear();
1118 UnusedArgNodeMap.clear();
1119 PendingLoads.clear();
1120 PendingExports.clear();
1121 PendingConstrainedFP.clear();
1122 PendingConstrainedFPStrict.clear();
1123 CurInst = nullptr;
1124 HasTailCall = false;
1125 SDNodeOrder = LowestSDNodeOrder;
1126 StatepointLowering.clear();
1127}
1128
1130 DanglingDebugInfoMap.clear();
1131}
1132
1133// Update DAG root to include dependencies on Pending chains.
1134SDValue SelectionDAGBuilder::updateRoot(SmallVectorImpl<SDValue> &Pending) {
1135 SDValue Root = DAG.getRoot();
1136
1137 if (Pending.empty())
1138 return Root;
1139
1140 // Add current root to PendingChains, unless we already indirectly
1141 // depend on it.
1142 if (Root.getOpcode() != ISD::EntryToken) {
1143 unsigned i = 0, e = Pending.size();
1144 for (; i != e; ++i) {
1145 assert(Pending[i].getNode()->getNumOperands() > 1);
1146 if (Pending[i].getNode()->getOperand(0) == Root)
1147 break; // Don't add the root if we already indirectly depend on it.
1148 }
1149
1150 if (i == e)
1151 Pending.push_back(Root);
1152 }
1153
1154 if (Pending.size() == 1)
1155 Root = Pending[0];
1156 else
1157 Root = DAG.getTokenFactor(getCurSDLoc(), Pending);
1158
1159 DAG.setRoot(Root);
1160 Pending.clear();
1161 return Root;
1162}
1163
1167
1169 // If the new exception behavior differs from that of the pending
1170 // ones, chain up them and update the root.
1171 switch (EB) {
1174 // Floating-point exceptions produced by such operations are not intended
1175 // to be observed, so the sequence of these operations does not need to be
1176 // preserved.
1177 //
1178 // They however must not be mixed with the instructions that have strict
1179 // exception behavior. Placing an operation with 'ebIgnore' behavior between
1180 // 'ebStrict' operations could distort the observed exception behavior.
1181 if (!PendingConstrainedFPStrict.empty()) {
1182 assert(PendingConstrainedFP.empty());
1183 updateRoot(PendingConstrainedFPStrict);
1184 }
1185 break;
1187 // Floating-point exception produced by these operations may be observed, so
1188 // they must be correctly chained. If trapping on FP exceptions is
1189 // disabled, the exceptions can be observed only by functions that read
1190 // exception flags, like 'llvm.get_fpenv' or 'fetestexcept'. It means that
1191 // the order of operations is not significant between barriers.
1192 //
1193 // If trapping is enabled, each operation becomes an implicit observation
1194 // point, so the operations must be sequenced according their original
1195 // source order.
1196 if (!PendingConstrainedFP.empty()) {
1197 assert(PendingConstrainedFPStrict.empty());
1198 updateRoot(PendingConstrainedFP);
1199 }
1200 // TODO: Add support for trapping-enabled scenarios.
1201 }
1202 return DAG.getRoot();
1203}
1204
1206 // Chain up all pending constrained intrinsics together with all
1207 // pending loads, by simply appending them to PendingLoads and
1208 // then calling getMemoryRoot().
1209 PendingLoads.reserve(PendingLoads.size() +
1210 PendingConstrainedFP.size() +
1211 PendingConstrainedFPStrict.size());
1212 PendingLoads.append(PendingConstrainedFP.begin(),
1213 PendingConstrainedFP.end());
1214 PendingLoads.append(PendingConstrainedFPStrict.begin(),
1215 PendingConstrainedFPStrict.end());
1216 PendingConstrainedFP.clear();
1217 PendingConstrainedFPStrict.clear();
1218 return getMemoryRoot();
1219}
1220
1222 // We need to emit pending fpexcept.strict constrained intrinsics,
1223 // so append them to the PendingExports list.
1224 PendingExports.append(PendingConstrainedFPStrict.begin(),
1225 PendingConstrainedFPStrict.end());
1226 PendingConstrainedFPStrict.clear();
1227 return updateRoot(PendingExports);
1228}
1229
1231 DILocalVariable *Variable,
1233 DebugLoc DL) {
1234 assert(Variable && "Missing variable");
1235
1236 // Check if address has undef value.
1237 if (!Address || isa<UndefValue>(Address) ||
1238 (Address->use_empty() && !isa<Argument>(Address))) {
1239 LLVM_DEBUG(
1240 dbgs()
1241 << "dbg_declare: Dropping debug info (bad/undef/unused-arg address)\n");
1242 return;
1243 }
1244
1245 bool IsParameter = Variable->isParameter() || isa<Argument>(Address);
1246
1247 SDValue &N = NodeMap[Address];
1248 if (!N.getNode() && isa<Argument>(Address))
1249 // Check unused arguments map.
1250 N = UnusedArgNodeMap[Address];
1251 SDDbgValue *SDV;
1252 if (N.getNode()) {
1253 if (const BitCastInst *BCI = dyn_cast<BitCastInst>(Address))
1254 Address = BCI->getOperand(0);
1255 // Parameters are handled specially.
1256 auto *FINode = dyn_cast<FrameIndexSDNode>(N.getNode());
1257 if (IsParameter && FINode) {
1258 // Byval parameter. We have a frame index at this point.
1259 SDV = DAG.getFrameIndexDbgValue(Variable, Expression, FINode->getIndex(),
1260 /*IsIndirect*/ true, DL, SDNodeOrder);
1261 } else if (isa<Argument>(Address)) {
1262 // Address is an argument, so try to emit its dbg value using
1263 // virtual register info from the FuncInfo.ValueMap.
1264 EmitFuncArgumentDbgValue(Address, Variable, Expression, DL,
1265 FuncArgumentDbgValueKind::Declare, N);
1266 return;
1267 } else {
1268 SDV = DAG.getDbgValue(Variable, Expression, N.getNode(), N.getResNo(),
1269 true, DL, SDNodeOrder);
1270 }
1271 DAG.AddDbgValue(SDV, IsParameter);
1272 } else {
1273 // If Address is an argument then try to emit its dbg value using
1274 // virtual register info from the FuncInfo.ValueMap.
1275 if (!EmitFuncArgumentDbgValue(Address, Variable, Expression, DL,
1276 FuncArgumentDbgValueKind::Declare, N)) {
1277 LLVM_DEBUG(dbgs() << "dbg_declare: Dropping debug info"
1278 << " (could not emit func-arg dbg_value)\n");
1279 }
1280 }
1281}
1282
1284 // Add SDDbgValue nodes for any var locs here. Do so before updating
1285 // SDNodeOrder, as this mapping is {Inst -> Locs BEFORE Inst}.
1286 if (FunctionVarLocs const *FnVarLocs = DAG.getFunctionVarLocs()) {
1287 // Add SDDbgValue nodes for any var locs here. Do so before updating
1288 // SDNodeOrder, as this mapping is {Inst -> Locs BEFORE Inst}.
1289 for (auto It = FnVarLocs->locs_begin(&I), End = FnVarLocs->locs_end(&I);
1290 It != End; ++It) {
1291 auto *Var = FnVarLocs->getDILocalVariable(It->VariableID);
1292 dropDanglingDebugInfo(Var, It->Expr);
1293 if (It->Values.isKillLocation(It->Expr)) {
1294 handleKillDebugValue(Var, It->Expr, It->DL, SDNodeOrder);
1295 continue;
1296 }
1297 SmallVector<Value *> Values(It->Values.location_ops());
1298 if (!handleDebugValue(Values, Var, It->Expr, It->DL, SDNodeOrder,
1299 It->Values.hasArgList())) {
1300 SmallVector<Value *, 4> Vals(It->Values.location_ops());
1302 FnVarLocs->getDILocalVariable(It->VariableID),
1303 It->Expr, Vals.size() > 1, It->DL, SDNodeOrder);
1304 }
1305 }
1306 }
1307
1308 // We must skip DbgVariableRecords if they've already been processed above as
1309 // we have just emitted the debug values resulting from assignment tracking
1310 // analysis, making any existing DbgVariableRecords redundant (and probably
1311 // less correct). We still need to process DbgLabelRecords. This does sink
1312 // DbgLabelRecords to the bottom of the group of debug records. That sholdn't
1313 // be important as it does so deterministcally and ordering between
1314 // DbgLabelRecords and DbgVariableRecords is immaterial (other than for MIR/IR
1315 // printing).
1316 bool SkipDbgVariableRecords = DAG.getFunctionVarLocs();
1317 // Is there is any debug-info attached to this instruction, in the form of
1318 // DbgRecord non-instruction debug-info records.
1319 for (DbgRecord &DR : I.getDbgRecordRange()) {
1320 if (DbgLabelRecord *DLR = dyn_cast<DbgLabelRecord>(&DR)) {
1321 assert(DLR->getLabel() && "Missing label");
1322 SDDbgLabel *SDV =
1323 DAG.getDbgLabel(DLR->getLabel(), DLR->getDebugLoc(), SDNodeOrder);
1324 DAG.AddDbgLabel(SDV);
1325 continue;
1326 }
1327
1328 if (SkipDbgVariableRecords)
1329 continue;
1331 DILocalVariable *Variable = DVR.getVariable();
1334
1336 if (FuncInfo.PreprocessedDVRDeclares.contains(&DVR))
1337 continue;
1338 LLVM_DEBUG(dbgs() << "SelectionDAG visiting dbg_declare: " << DVR
1339 << "\n");
1341 DVR.getDebugLoc());
1342 continue;
1343 }
1344
1345 // A DbgVariableRecord with no locations is a kill location.
1347 if (Values.empty()) {
1349 SDNodeOrder);
1350 continue;
1351 }
1352
1353 // A DbgVariableRecord with an undef or absent location is also a kill
1354 // location.
1355 if (llvm::any_of(Values,
1356 [](Value *V) { return !V || isa<UndefValue>(V); })) {
1358 SDNodeOrder);
1359 continue;
1360 }
1361
1362 bool IsVariadic = DVR.hasArgList();
1363 if (!handleDebugValue(Values, Variable, Expression, DVR.getDebugLoc(),
1364 SDNodeOrder, IsVariadic)) {
1365 addDanglingDebugInfo(Values, Variable, Expression, IsVariadic,
1366 DVR.getDebugLoc(), SDNodeOrder);
1367 }
1368 }
1369}
1370
1372 visitDbgInfo(I);
1373
1374 // Set up outgoing PHI node register values before emitting the terminator.
1375 if (I.isTerminator()) {
1376 HandlePHINodesInSuccessorBlocks(I.getParent());
1377 }
1378
1379 ++SDNodeOrder;
1380 CurInst = &I;
1381
1382 // Set inserted listener only if required.
1383 bool NodeInserted = false;
1384 std::unique_ptr<SelectionDAG::DAGNodeInsertedListener> InsertedListener;
1385 MDNode *PCSectionsMD = I.getMetadata(LLVMContext::MD_pcsections);
1386 MDNode *MMRA = I.getMetadata(LLVMContext::MD_mmra);
1387 if (PCSectionsMD || MMRA) {
1388 InsertedListener = std::make_unique<SelectionDAG::DAGNodeInsertedListener>(
1389 DAG, [&](SDNode *) { NodeInserted = true; });
1390 }
1391
1392 visit(I.getOpcode(), I);
1393
1394 if (!I.isTerminator() && !HasTailCall &&
1395 !isa<GCStatepointInst>(I)) // statepoints handle their exports internally
1397
1398 // Handle metadata.
1399 if (PCSectionsMD || MMRA) {
1400 auto It = NodeMap.find(&I);
1401 if (It != NodeMap.end()) {
1402 if (PCSectionsMD)
1403 DAG.addPCSections(It->second.getNode(), PCSectionsMD);
1404 if (MMRA)
1405 DAG.addMMRAMetadata(It->second.getNode(), MMRA);
1406 } else if (NodeInserted) {
1407 // This should not happen; if it does, don't let it go unnoticed so we can
1408 // fix it. Relevant visit*() function is probably missing a setValue().
1409 errs() << "warning: loosing !pcsections and/or !mmra metadata ["
1410 << I.getModule()->getName() << "]\n";
1411 LLVM_DEBUG(I.dump());
1412 assert(false);
1413 }
1414 }
1415
1416 CurInst = nullptr;
1417}
1418
1419void SelectionDAGBuilder::visitPHI(const PHINode &) {
1420 llvm_unreachable("SelectionDAGBuilder shouldn't visit PHI nodes!");
1421}
1422
1423void SelectionDAGBuilder::visit(unsigned Opcode, const User &I) {
1424 // Note: this doesn't use InstVisitor, because it has to work with
1425 // ConstantExpr's in addition to instructions.
1426 switch (Opcode) {
1427 default: llvm_unreachable("Unknown instruction type encountered!");
1428 // Build the switch statement using the Instruction.def file.
1429#define HANDLE_INST(NUM, OPCODE, CLASS) \
1430 case Instruction::OPCODE: visit##OPCODE((const CLASS&)I); break;
1431#include "llvm/IR/Instruction.def"
1432 }
1433}
1434
1436 DILocalVariable *Variable,
1437 DebugLoc DL, unsigned Order,
1440 // For variadic dbg_values we will now insert poison.
1441 // FIXME: We can potentially recover these!
1443 for (const Value *V : Values) {
1444 auto *Poison = PoisonValue::get(V->getType());
1446 }
1447 SDDbgValue *SDV = DAG.getDbgValueList(Variable, Expression, Locs, {},
1448 /*IsIndirect=*/false, DL, Order,
1449 /*IsVariadic=*/true);
1450 DAG.AddDbgValue(SDV, /*isParameter=*/false);
1451 return true;
1452}
1453
1455 DILocalVariable *Var,
1456 DIExpression *Expr,
1457 bool IsVariadic, DebugLoc DL,
1458 unsigned Order) {
1459 if (IsVariadic) {
1460 handleDanglingVariadicDebugInfo(DAG, Var, DL, Order, Values, Expr);
1461 return;
1462 }
1463 // TODO: Dangling debug info will eventually either be resolved or produce
1464 // a poison DBG_VALUE. However in the resolution case, a gap may appear
1465 // between the original dbg.value location and its resolved DBG_VALUE,
1466 // which we should ideally fill with an extra poison DBG_VALUE.
1467 assert(Values.size() == 1);
1468 DanglingDebugInfoMap[Values[0]].emplace_back(Var, Expr, DL, Order);
1469}
1470
1472 const DIExpression *Expr) {
1473 auto isMatchingDbgValue = [&](DanglingDebugInfo &DDI) {
1474 DIVariable *DanglingVariable = DDI.getVariable();
1475 DIExpression *DanglingExpr = DDI.getExpression();
1476 if (DanglingVariable == Variable && Expr->fragmentsOverlap(DanglingExpr)) {
1477 LLVM_DEBUG(dbgs() << "Dropping dangling debug info for "
1478 << printDDI(nullptr, DDI) << "\n");
1479 return true;
1480 }
1481 return false;
1482 };
1483
1484 for (auto &DDIMI : DanglingDebugInfoMap) {
1485 DanglingDebugInfoVector &DDIV = DDIMI.second;
1486
1487 // If debug info is to be dropped, run it through final checks to see
1488 // whether it can be salvaged.
1489 for (auto &DDI : DDIV)
1490 if (isMatchingDbgValue(DDI))
1491 salvageUnresolvedDbgValue(DDIMI.first, DDI);
1492
1493 erase_if(DDIV, isMatchingDbgValue);
1494 }
1495}
1496
1497// resolveDanglingDebugInfo - if we saw an earlier dbg_value referring to V,
1498// generate the debug data structures now that we've seen its definition.
1500 SDValue Val) {
1501 auto DanglingDbgInfoIt = DanglingDebugInfoMap.find(V);
1502 if (DanglingDbgInfoIt == DanglingDebugInfoMap.end())
1503 return;
1504
1505 DanglingDebugInfoVector &DDIV = DanglingDbgInfoIt->second;
1506 for (auto &DDI : DDIV) {
1507 DebugLoc DL = DDI.getDebugLoc();
1508 unsigned DbgSDNodeOrder = DDI.getSDNodeOrder();
1509 DILocalVariable *Variable = DDI.getVariable();
1510 DIExpression *Expr = DDI.getExpression();
1511 assert(Variable->isValidLocationForIntrinsic(DL) &&
1512 "Expected inlined-at fields to agree");
1513 SDDbgValue *SDV;
1514 if (Val.getNode()) {
1515 // FIXME: I doubt that it is correct to resolve a dangling DbgValue as a
1516 // FuncArgumentDbgValue (it would be hoisted to the function entry, and if
1517 // we couldn't resolve it directly when examining the DbgValue intrinsic
1518 // in the first place we should not be more successful here). Unless we
1519 // have some test case that prove this to be correct we should avoid
1520 // calling EmitFuncArgumentDbgValue here.
1521 unsigned ValSDNodeOrder = Val.getNode()->getIROrder();
1522 if (!EmitFuncArgumentDbgValue(V, Variable, Expr, DL,
1523 FuncArgumentDbgValueKind::Value, Val)) {
1524 LLVM_DEBUG(dbgs() << "Resolve dangling debug info for "
1525 << printDDI(V, DDI) << "\n");
1526 LLVM_DEBUG(dbgs() << " By mapping to:\n "; Val.dump());
1527 // Increase the SDNodeOrder for the DbgValue here to make sure it is
1528 // inserted after the definition of Val when emitting the instructions
1529 // after ISel. An alternative could be to teach
1530 // ScheduleDAGSDNodes::EmitSchedule to delay the insertion properly.
1531 LLVM_DEBUG(if (ValSDNodeOrder > DbgSDNodeOrder) dbgs()
1532 << "changing SDNodeOrder from " << DbgSDNodeOrder << " to "
1533 << ValSDNodeOrder << "\n");
1534 SDV = getDbgValue(Val, Variable, Expr, DL,
1535 std::max(DbgSDNodeOrder, ValSDNodeOrder));
1536 DAG.AddDbgValue(SDV, false);
1537 } else
1538 LLVM_DEBUG(dbgs() << "Resolved dangling debug info for "
1539 << printDDI(V, DDI)
1540 << " in EmitFuncArgumentDbgValue\n");
1541 } else {
1542 LLVM_DEBUG(dbgs() << "Dropping debug info for " << printDDI(V, DDI)
1543 << "\n");
1544 auto Poison = PoisonValue::get(V->getType());
1545 auto SDV =
1546 DAG.getConstantDbgValue(Variable, Expr, Poison, DL, DbgSDNodeOrder);
1547 DAG.AddDbgValue(SDV, false);
1548 }
1549 }
1550 DDIV.clear();
1551}
1552
1554 DanglingDebugInfo &DDI) {
1555 // TODO: For the variadic implementation, instead of only checking the fail
1556 // state of `handleDebugValue`, we need know specifically which values were
1557 // invalid, so that we attempt to salvage only those values when processing
1558 // a DIArgList.
1559 const Value *OrigV = V;
1560 DILocalVariable *Var = DDI.getVariable();
1561 DIExpression *Expr = DDI.getExpression();
1562 DebugLoc DL = DDI.getDebugLoc();
1563 unsigned SDOrder = DDI.getSDNodeOrder();
1564
1565 // Currently we consider only dbg.value intrinsics -- we tell the salvager
1566 // that DW_OP_stack_value is desired.
1567 bool StackValue = true;
1568
1569 // Can this Value can be encoded without any further work?
1570 if (handleDebugValue(V, Var, Expr, DL, SDOrder, /*IsVariadic=*/false))
1571 return;
1572
1573 // Attempt to salvage back through as many instructions as possible. Bail if
1574 // a non-instruction is seen, such as a constant expression or global
1575 // variable. FIXME: Further work could recover those too.
1576 while (isa<Instruction>(V)) {
1577 const Instruction &VAsInst = *cast<const Instruction>(V);
1578 // Temporary "0", awaiting real implementation.
1580 SmallVector<Value *, 4> AdditionalValues;
1581 V = salvageDebugInfoImpl(const_cast<Instruction &>(VAsInst),
1582 Expr->getNumLocationOperands(), Ops,
1583 AdditionalValues);
1584 // If we cannot salvage any further, and haven't yet found a suitable debug
1585 // expression, bail out.
1586 if (!V)
1587 break;
1588
1589 // TODO: If AdditionalValues isn't empty, then the salvage can only be
1590 // represented with a DBG_VALUE_LIST, so we give up. When we have support
1591 // here for variadic dbg_values, remove that condition.
1592 if (!AdditionalValues.empty())
1593 break;
1594
1595 // New value and expr now represent this debuginfo.
1596 Expr = DIExpression::appendOpsToArg(Expr, Ops, 0, StackValue);
1597
1598 // Some kind of simplification occurred: check whether the operand of the
1599 // salvaged debug expression can be encoded in this DAG.
1600 if (handleDebugValue(V, Var, Expr, DL, SDOrder, /*IsVariadic=*/false)) {
1601 LLVM_DEBUG(
1602 dbgs() << "Salvaged debug location info for:\n " << *Var << "\n"
1603 << *OrigV << "\nBy stripping back to:\n " << *V << "\n");
1604 return;
1605 }
1606 }
1607
1608 // This was the final opportunity to salvage this debug information, and it
1609 // couldn't be done. Place a poison DBG_VALUE at this location to terminate
1610 // any earlier variable location.
1611 assert(OrigV && "V shouldn't be null");
1612 auto *Poison = PoisonValue::get(OrigV->getType());
1613 auto *SDV = DAG.getConstantDbgValue(Var, Expr, Poison, DL, SDNodeOrder);
1614 DAG.AddDbgValue(SDV, false);
1615 LLVM_DEBUG(dbgs() << "Dropping debug value info for:\n "
1616 << printDDI(OrigV, DDI) << "\n");
1617}
1618
1620 DIExpression *Expr,
1621 DebugLoc DbgLoc,
1622 unsigned Order) {
1626 handleDebugValue(Poison, Var, NewExpr, DbgLoc, Order,
1627 /*IsVariadic*/ false);
1628}
1629
1631 DILocalVariable *Var,
1632 DIExpression *Expr, DebugLoc DbgLoc,
1633 unsigned Order, bool IsVariadic) {
1634 if (Values.empty())
1635 return true;
1636
1637 // Filter EntryValue locations out early.
1638 if (visitEntryValueDbgValue(Values, Var, Expr, DbgLoc))
1639 return true;
1640
1641 SmallVector<SDDbgOperand> LocationOps;
1642 SmallVector<SDNode *> Dependencies;
1643 for (const Value *V : Values) {
1644 // Constant value.
1647 LocationOps.emplace_back(SDDbgOperand::fromConst(V));
1648 continue;
1649 }
1650
1651 // Look through IntToPtr constants.
1652 if (auto *CE = dyn_cast<ConstantExpr>(V))
1653 if (CE->getOpcode() == Instruction::IntToPtr) {
1654 LocationOps.emplace_back(SDDbgOperand::fromConst(CE->getOperand(0)));
1655 continue;
1656 }
1657
1658 // If the Value is a frame index, we can create a FrameIndex debug value
1659 // without relying on the DAG at all.
1660 if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
1661 auto SI = FuncInfo.StaticAllocaMap.find(AI);
1662 if (SI != FuncInfo.StaticAllocaMap.end()) {
1663 LocationOps.emplace_back(SDDbgOperand::fromFrameIdx(SI->second));
1664 continue;
1665 }
1666 }
1667
1668 // Do not use getValue() in here; we don't want to generate code at
1669 // this point if it hasn't been done yet.
1670 SDValue N = NodeMap[V];
1671 if (!N.getNode() && isa<Argument>(V)) // Check unused arguments map.
1672 N = UnusedArgNodeMap[V];
1673
1674 if (N.getNode()) {
1675 // Only emit func arg dbg value for non-variadic dbg.values for now.
1676 if (!IsVariadic &&
1677 EmitFuncArgumentDbgValue(V, Var, Expr, DbgLoc,
1678 FuncArgumentDbgValueKind::Value, N))
1679 return true;
1680 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(N.getNode())) {
1681 // Construct a FrameIndexDbgValue for FrameIndexSDNodes so we can
1682 // describe stack slot locations.
1683 //
1684 // Consider "int x = 0; int *px = &x;". There are two kinds of
1685 // interesting debug values here after optimization:
1686 //
1687 // dbg.value(i32* %px, !"int *px", !DIExpression()), and
1688 // dbg.value(i32* %px, !"int x", !DIExpression(DW_OP_deref))
1689 //
1690 // Both describe the direct values of their associated variables.
1691 Dependencies.push_back(N.getNode());
1692 LocationOps.emplace_back(SDDbgOperand::fromFrameIdx(FISDN->getIndex()));
1693 continue;
1694 }
1695 LocationOps.emplace_back(
1696 SDDbgOperand::fromNode(N.getNode(), N.getResNo()));
1697 continue;
1698 }
1699
1700 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1701 // Special rules apply for the first dbg.values of parameter variables in a
1702 // function. Identify them by the fact they reference Argument Values, that
1703 // they're parameters, and they are parameters of the current function. We
1704 // need to let them dangle until they get an SDNode.
1705 bool IsParamOfFunc =
1706 isa<Argument>(V) && Var->isParameter() && !DbgLoc.getInlinedAt();
1707 if (IsParamOfFunc)
1708 return false;
1709
1710 // The value is not used in this block yet (or it would have an SDNode).
1711 // We still want the value to appear for the user if possible -- if it has
1712 // an associated VReg, we can refer to that instead.
1713 auto VMI = FuncInfo.ValueMap.find(V);
1714 if (VMI != FuncInfo.ValueMap.end()) {
1715 Register Reg = VMI->second;
1716 // If this is a PHI node, it may be split up into several MI PHI nodes
1717 // (in FunctionLoweringInfo::set).
1718 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), Reg,
1719 V->getType(), std::nullopt);
1720 if (RFV.occupiesMultipleRegs()) {
1721 // FIXME: We could potentially support variadic dbg_values here.
1722 if (IsVariadic)
1723 return false;
1724 unsigned Offset = 0;
1725 unsigned BitsToDescribe = 0;
1726 if (auto VarSize = Var->getSizeInBits())
1727 BitsToDescribe = *VarSize;
1728 if (auto Fragment = Expr->getFragmentInfo())
1729 BitsToDescribe = Fragment->SizeInBits;
1730 for (const auto &RegAndSize : RFV.getRegsAndSizes()) {
1731 // Bail out if all bits are described already.
1732 if (Offset >= BitsToDescribe)
1733 break;
1734 // TODO: handle scalable vectors.
1735 unsigned RegisterSize = RegAndSize.second;
1736 unsigned FragmentSize = (Offset + RegisterSize > BitsToDescribe)
1737 ? BitsToDescribe - Offset
1738 : RegisterSize;
1739 auto FragmentExpr = DIExpression::createFragmentExpression(
1740 Expr, Offset, FragmentSize);
1741 if (!FragmentExpr)
1742 continue;
1743 SDDbgValue *SDV = DAG.getVRegDbgValue(
1744 Var, *FragmentExpr, RegAndSize.first, false, DbgLoc, Order);
1745 DAG.AddDbgValue(SDV, false);
1746 Offset += RegisterSize;
1747 }
1748 return true;
1749 }
1750 // We can use simple vreg locations for variadic dbg_values as well.
1751 LocationOps.emplace_back(SDDbgOperand::fromVReg(Reg));
1752 continue;
1753 }
1754 // We failed to create a SDDbgOperand for V.
1755 return false;
1756 }
1757
1758 // We have created a SDDbgOperand for each Value in Values.
1759 assert(!LocationOps.empty());
1760 SDDbgValue *SDV =
1761 DAG.getDbgValueList(Var, Expr, LocationOps, Dependencies,
1762 /*IsIndirect=*/false, DbgLoc, Order, IsVariadic);
1763 DAG.AddDbgValue(SDV, /*isParameter=*/false);
1764 return true;
1765}
1766
1768 // Try to fixup any remaining dangling debug info -- and drop it if we can't.
1769 for (auto &Pair : DanglingDebugInfoMap)
1770 for (auto &DDI : Pair.second)
1771 salvageUnresolvedDbgValue(const_cast<Value *>(Pair.first), DDI);
1773}
1774
1775/// getCopyFromRegs - If there was virtual register allocated for the value V
1776/// emit CopyFromReg of the specified type Ty. Return empty SDValue() otherwise.
1779 SDValue Result;
1780
1781 if (It != FuncInfo.ValueMap.end()) {
1782 Register InReg = It->second;
1783
1784 RegsForValue RFV(*DAG.getContext(), DAG.getTargetLoweringInfo(),
1785 DAG.getDataLayout(), InReg, Ty,
1786 std::nullopt); // This is not an ABI copy.
1787 SDValue Chain = DAG.getEntryNode();
1788 Result = RFV.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(), Chain, nullptr,
1789 V);
1790 resolveDanglingDebugInfo(V, Result);
1791 }
1792
1793 return Result;
1794}
1795
1796/// getValue - Return an SDValue for the given Value.
1798 // If we already have an SDValue for this value, use it. It's important
1799 // to do this first, so that we don't create a CopyFromReg if we already
1800 // have a regular SDValue.
1801 SDValue &N = NodeMap[V];
1802 if (N.getNode()) return N;
1803
1804 // If there's a virtual register allocated and initialized for this
1805 // value, use it.
1806 if (SDValue copyFromReg = getCopyFromRegs(V, V->getType()))
1807 return copyFromReg;
1808
1809 // Otherwise create a new SDValue and remember it.
1810 SDValue Val = getValueImpl(V);
1811 NodeMap[V] = Val;
1813 return Val;
1814}
1815
1816/// getNonRegisterValue - Return an SDValue for the given Value, but
1817/// don't look in FuncInfo.ValueMap for a virtual register.
1819 // If we already have an SDValue for this value, use it.
1820 SDValue &N = NodeMap[V];
1821 if (N.getNode()) {
1822 if (isIntOrFPConstant(N)) {
1823 // Remove the debug location from the node as the node is about to be used
1824 // in a location which may differ from the original debug location. This
1825 // is relevant to Constant and ConstantFP nodes because they can appear
1826 // as constant expressions inside PHI nodes.
1827 N->setDebugLoc(DebugLoc());
1828 }
1829 return N;
1830 }
1831
1832 // Otherwise create a new SDValue and remember it.
1833 SDValue Val = getValueImpl(V);
1834 NodeMap[V] = Val;
1836 return Val;
1837}
1838
1839/// getValueImpl - Helper function for getValue and getNonRegisterValue.
1840/// Create an SDValue for the given value.
1842 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1843
1844 if (const Constant *C = dyn_cast<Constant>(V)) {
1845 EVT VT = TLI.getValueType(DAG.getDataLayout(), V->getType(), true);
1846
1847 if (const ConstantInt *CI = dyn_cast<ConstantInt>(C)) {
1848 SDLoc DL = getCurSDLoc();
1849
1850 // DAG.getConstant() may attempt to legalise the vector constant which can
1851 // significantly change the combines applied to the DAG. To reduce the
1852 // divergence when enabling ConstantInt based vectors we try to construct
1853 // the DAG in the same way as shufflevector based splats. TODO: The
1854 // divergence sometimes leads to better optimisations. Ideally we should
1855 // prevent DAG.getConstant() from legalising too early but there are some
1856 // degradations preventing this.
1857 if (VT.isScalableVector())
1858 return DAG.getNode(
1859 ISD::SPLAT_VECTOR, DL, VT,
1860 DAG.getConstant(CI->getValue(), DL, VT.getVectorElementType()));
1861 if (VT.isFixedLengthVector())
1862 return DAG.getSplatBuildVector(
1863 VT, DL,
1864 DAG.getConstant(CI->getValue(), DL, VT.getVectorElementType()));
1865 return DAG.getConstant(*CI, DL, VT);
1866 }
1867
1868 if (const GlobalValue *GV = dyn_cast<GlobalValue>(C))
1869 return DAG.getGlobalAddress(GV, getCurSDLoc(), VT);
1870
1871 if (const ConstantPtrAuth *CPA = dyn_cast<ConstantPtrAuth>(C)) {
1872 return DAG.getNode(ISD::PtrAuthGlobalAddress, getCurSDLoc(), VT,
1873 getValue(CPA->getPointer()), getValue(CPA->getKey()),
1874 getValue(CPA->getAddrDiscriminator()),
1875 getValue(CPA->getDiscriminator()));
1876 }
1877
1879 return DAG.getConstant(0, getCurSDLoc(), VT);
1880
1881 if (match(C, m_VScale()))
1882 return DAG.getVScale(getCurSDLoc(), VT, APInt(VT.getSizeInBits(), 1));
1883
1884 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C))
1885 return DAG.getConstantFP(*CFP, getCurSDLoc(), VT);
1886
1887 if (isa<UndefValue>(C) && !V->getType()->isAggregateType())
1888 return isa<PoisonValue>(C) ? DAG.getPOISON(VT) : DAG.getUNDEF(VT);
1889
1890 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
1891 visit(CE->getOpcode(), *CE);
1892 SDValue N1 = NodeMap[V];
1893 assert(N1.getNode() && "visit didn't populate the NodeMap!");
1894 return N1;
1895 }
1896
1898 SmallVector<SDValue, 4> Constants;
1899 for (const Use &U : C->operands()) {
1900 SDNode *Val = getValue(U).getNode();
1901 // If the operand is an empty aggregate, there are no values.
1902 if (!Val) continue;
1903 // Add each leaf value from the operand to the Constants list
1904 // to form a flattened list of all the values.
1905 for (unsigned i = 0, e = Val->getNumValues(); i != e; ++i)
1906 Constants.push_back(SDValue(Val, i));
1907 }
1908
1909 return DAG.getMergeValues(Constants, getCurSDLoc());
1910 }
1911
1912 if (const ConstantDataSequential *CDS =
1915 for (uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i) {
1916 SDNode *Val = getValue(CDS->getElementAsConstant(i)).getNode();
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 Ops.push_back(SDValue(Val, i));
1921 }
1922
1923 if (isa<ArrayType>(CDS->getType()))
1924 return DAG.getMergeValues(Ops, getCurSDLoc());
1925 return DAG.getBuildVector(VT, getCurSDLoc(), Ops);
1926 }
1927
1928 if (C->getType()->isStructTy() || C->getType()->isArrayTy()) {
1930 "Unknown struct or array constant!");
1931
1932 SmallVector<EVT, 4> ValueVTs;
1933 ComputeValueVTs(TLI, DAG.getDataLayout(), C->getType(), ValueVTs);
1934 unsigned NumElts = ValueVTs.size();
1935 if (NumElts == 0)
1936 return SDValue(); // empty struct
1937 SmallVector<SDValue, 4> Constants(NumElts);
1938 for (unsigned i = 0; i != NumElts; ++i) {
1939 EVT EltVT = ValueVTs[i];
1940 if (isa<UndefValue>(C))
1941 Constants[i] = DAG.getUNDEF(EltVT);
1942 else if (EltVT.isFloatingPoint())
1943 Constants[i] = DAG.getConstantFP(0, getCurSDLoc(), EltVT);
1944 else
1945 Constants[i] = DAG.getConstant(0, getCurSDLoc(), EltVT);
1946 }
1947
1948 return DAG.getMergeValues(Constants, getCurSDLoc());
1949 }
1950
1951 if (const BlockAddress *BA = dyn_cast<BlockAddress>(C))
1952 return DAG.getBlockAddress(BA, VT);
1953
1954 if (const auto *Equiv = dyn_cast<DSOLocalEquivalent>(C))
1955 return getValue(Equiv->getGlobalValue());
1956
1957 if (const auto *NC = dyn_cast<NoCFIValue>(C))
1958 return getValue(NC->getGlobalValue());
1959
1960 if (VT == MVT::aarch64svcount) {
1961 assert(C->isNullValue() && "Can only zero this target type!");
1962 return DAG.getNode(ISD::BITCAST, getCurSDLoc(), VT,
1963 DAG.getConstant(0, getCurSDLoc(), MVT::nxv16i1));
1964 }
1965
1966 if (VT.isRISCVVectorTuple()) {
1967 assert(C->isNullValue() && "Can only zero this target type!");
1968 return DAG.getNode(
1970 DAG.getNode(
1972 EVT::getVectorVT(*DAG.getContext(), MVT::i8,
1973 VT.getSizeInBits().getKnownMinValue() / 8, true),
1974 DAG.getConstant(0, getCurSDLoc(), MVT::getIntegerVT(8))));
1975 }
1976
1977 VectorType *VecTy = cast<VectorType>(V->getType());
1978
1979 // Now that we know the number and type of the elements, get that number of
1980 // elements into the Ops array based on what kind of constant it is.
1981 if (const ConstantVector *CV = dyn_cast<ConstantVector>(C)) {
1983 unsigned NumElements = cast<FixedVectorType>(VecTy)->getNumElements();
1984 for (unsigned i = 0; i != NumElements; ++i)
1985 Ops.push_back(getValue(CV->getOperand(i)));
1986
1987 return DAG.getBuildVector(VT, getCurSDLoc(), Ops);
1988 }
1989
1991 EVT EltVT =
1992 TLI.getValueType(DAG.getDataLayout(), VecTy->getElementType());
1993
1994 SDValue Op;
1995 if (EltVT.isFloatingPoint())
1996 Op = DAG.getConstantFP(0, getCurSDLoc(), EltVT);
1997 else
1998 Op = DAG.getConstant(0, getCurSDLoc(), EltVT);
1999
2000 return DAG.getSplat(VT, getCurSDLoc(), Op);
2001 }
2002
2003 llvm_unreachable("Unknown vector constant");
2004 }
2005
2006 // If this is a static alloca, generate it as the frameindex instead of
2007 // computation.
2008 if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
2010 FuncInfo.StaticAllocaMap.find(AI);
2011 if (SI != FuncInfo.StaticAllocaMap.end())
2012 return DAG.getFrameIndex(
2013 SI->second, TLI.getValueType(DAG.getDataLayout(), AI->getType()));
2014 }
2015
2016 // If this is an instruction which fast-isel has deferred, select it now.
2017 if (const Instruction *Inst = dyn_cast<Instruction>(V)) {
2018 Register InReg = FuncInfo.InitializeRegForValue(Inst);
2019 RegsForValue RFV(*DAG.getContext(), TLI, DAG.getDataLayout(), InReg,
2020 Inst->getType(), std::nullopt);
2021 SDValue Chain = DAG.getEntryNode();
2022 return RFV.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(), Chain, nullptr, V);
2023 }
2024
2025 if (const MetadataAsValue *MD = dyn_cast<MetadataAsValue>(V))
2026 return DAG.getMDNode(cast<MDNode>(MD->getMetadata()));
2027
2028 if (const auto *BB = dyn_cast<BasicBlock>(V))
2029 return DAG.getBasicBlock(FuncInfo.getMBB(BB));
2030
2031 llvm_unreachable("Can't get register for value!");
2032}
2033
2034void SelectionDAGBuilder::visitCatchPad(const CatchPadInst &I) {
2036 bool IsMSVCCXX = Pers == EHPersonality::MSVC_CXX;
2037 bool IsCoreCLR = Pers == EHPersonality::CoreCLR;
2038 bool IsSEH = isAsynchronousEHPersonality(Pers);
2039 MachineBasicBlock *CatchPadMBB = FuncInfo.MBB;
2040 if (IsSEH) {
2041 // For SEH, EHCont Guard needs to know that this catchpad is a target.
2042 CatchPadMBB->setIsEHContTarget(true);
2044 } else
2045 CatchPadMBB->setIsEHScopeEntry();
2046 // In MSVC C++ and CoreCLR, catchblocks are funclets and need prologues.
2047 if (IsMSVCCXX || IsCoreCLR)
2048 CatchPadMBB->setIsEHFuncletEntry();
2049}
2050
2051void SelectionDAGBuilder::visitCatchRet(const CatchReturnInst &I) {
2052 // Update machine-CFG edge.
2053 MachineBasicBlock *TargetMBB = FuncInfo.getMBB(I.getSuccessor());
2054 FuncInfo.MBB->addSuccessor(TargetMBB);
2055
2056 auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn());
2057 bool IsSEH = isAsynchronousEHPersonality(Pers);
2058 if (IsSEH) {
2059 // If this is not a fall-through branch or optimizations are switched off,
2060 // emit the branch.
2061 if (TargetMBB != NextBlock(FuncInfo.MBB) ||
2062 TM.getOptLevel() == CodeGenOptLevel::None)
2063 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
2064 getControlRoot(), DAG.getBasicBlock(TargetMBB)));
2065 return;
2066 }
2067
2068 // For non-SEH, EHCont Guard needs to know that this catchret is a target.
2069 TargetMBB->setIsEHContTarget(true);
2070 DAG.getMachineFunction().setHasEHContTarget(true);
2071
2072 // Figure out the funclet membership for the catchret's successor.
2073 // This will be used by the FuncletLayout pass to determine how to order the
2074 // BB's.
2075 // A 'catchret' returns to the outer scope's color.
2076 Value *ParentPad = I.getCatchSwitchParentPad();
2077 const BasicBlock *SuccessorColor;
2078 if (isa<ConstantTokenNone>(ParentPad))
2079 SuccessorColor = &FuncInfo.Fn->getEntryBlock();
2080 else
2081 SuccessorColor = cast<Instruction>(ParentPad)->getParent();
2082 assert(SuccessorColor && "No parent funclet for catchret!");
2083 MachineBasicBlock *SuccessorColorMBB = FuncInfo.getMBB(SuccessorColor);
2084 assert(SuccessorColorMBB && "No MBB for SuccessorColor!");
2085
2086 // Create the terminator node.
2087 SDValue Ret = DAG.getNode(ISD::CATCHRET, getCurSDLoc(), MVT::Other,
2088 getControlRoot(), DAG.getBasicBlock(TargetMBB),
2089 DAG.getBasicBlock(SuccessorColorMBB));
2090 DAG.setRoot(Ret);
2091}
2092
2093void SelectionDAGBuilder::visitCleanupPad(const CleanupPadInst &CPI) {
2094 // Don't emit any special code for the cleanuppad instruction. It just marks
2095 // the start of an EH scope/funclet.
2096 FuncInfo.MBB->setIsEHScopeEntry();
2097 auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn());
2098 if (Pers != EHPersonality::Wasm_CXX) {
2099 FuncInfo.MBB->setIsEHFuncletEntry();
2100 FuncInfo.MBB->setIsCleanupFuncletEntry();
2101 }
2102}
2103
2104/// When an invoke or a cleanupret unwinds to the next EH pad, there are
2105/// many places it could ultimately go. In the IR, we have a single unwind
2106/// destination, but in the machine CFG, we enumerate all the possible blocks.
2107/// This function skips over imaginary basic blocks that hold catchswitch
2108/// instructions, and finds all the "real" machine
2109/// basic block destinations. As those destinations may not be successors of
2110/// EHPadBB, here we also calculate the edge probability to those destinations.
2111/// The passed-in Prob is the edge probability to EHPadBB.
2113 FunctionLoweringInfo &FuncInfo, const BasicBlock *EHPadBB,
2114 BranchProbability Prob,
2115 SmallVectorImpl<std::pair<MachineBasicBlock *, BranchProbability>>
2116 &UnwindDests) {
2117 EHPersonality Personality =
2119 bool IsMSVCCXX = Personality == EHPersonality::MSVC_CXX;
2120 bool IsCoreCLR = Personality == EHPersonality::CoreCLR;
2121 bool IsWasmCXX = Personality == EHPersonality::Wasm_CXX;
2122 bool IsSEH = isAsynchronousEHPersonality(Personality);
2123
2124 while (EHPadBB) {
2126 BasicBlock *NewEHPadBB = nullptr;
2127 if (isa<LandingPadInst>(Pad)) {
2128 // Stop on landingpads. They are not funclets.
2129 UnwindDests.emplace_back(FuncInfo.getMBB(EHPadBB), Prob);
2130 break;
2131 } else if (isa<CleanupPadInst>(Pad)) {
2132 // Stop on cleanup pads. Cleanups are always funclet entries for all known
2133 // personalities except Wasm. And in Wasm this becomes a catch_all(_ref),
2134 // which always catches an exception.
2135 UnwindDests.emplace_back(FuncInfo.getMBB(EHPadBB), Prob);
2136 UnwindDests.back().first->setIsEHScopeEntry();
2137 // In Wasm, EH scopes are not funclets
2138 if (!IsWasmCXX)
2139 UnwindDests.back().first->setIsEHFuncletEntry();
2140 break;
2141 } else if (const auto *CatchSwitch = dyn_cast<CatchSwitchInst>(Pad)) {
2142 // Add the catchpad handlers to the possible destinations.
2143 for (const BasicBlock *CatchPadBB : CatchSwitch->handlers()) {
2144 UnwindDests.emplace_back(FuncInfo.getMBB(CatchPadBB), Prob);
2145 // For MSVC++ and the CLR, catchblocks are funclets and need prologues.
2146 if (IsMSVCCXX || IsCoreCLR)
2147 UnwindDests.back().first->setIsEHFuncletEntry();
2148 if (!IsSEH)
2149 UnwindDests.back().first->setIsEHScopeEntry();
2150 }
2151 NewEHPadBB = CatchSwitch->getUnwindDest();
2152 } else {
2153 continue;
2154 }
2155
2156 BranchProbabilityInfo *BPI = FuncInfo.BPI;
2157 if (BPI && NewEHPadBB)
2158 Prob *= BPI->getEdgeProbability(EHPadBB, NewEHPadBB);
2159 EHPadBB = NewEHPadBB;
2160 }
2161}
2162
2163void SelectionDAGBuilder::visitCleanupRet(const CleanupReturnInst &I) {
2164 // Update successor info.
2166 auto UnwindDest = I.getUnwindDest();
2167 BranchProbabilityInfo *BPI = FuncInfo.BPI;
2168 BranchProbability UnwindDestProb =
2169 (BPI && UnwindDest)
2170 ? BPI->getEdgeProbability(FuncInfo.MBB->getBasicBlock(), UnwindDest)
2172 findUnwindDestinations(FuncInfo, UnwindDest, UnwindDestProb, UnwindDests);
2173 for (auto &UnwindDest : UnwindDests) {
2174 UnwindDest.first->setIsEHPad();
2175 addSuccessorWithProb(FuncInfo.MBB, UnwindDest.first, UnwindDest.second);
2176 }
2177 FuncInfo.MBB->normalizeSuccProbs();
2178
2179 // Create the terminator node.
2180 MachineBasicBlock *CleanupPadMBB =
2181 FuncInfo.getMBB(I.getCleanupPad()->getParent());
2182 SDValue Ret = DAG.getNode(ISD::CLEANUPRET, getCurSDLoc(), MVT::Other,
2183 getControlRoot(), DAG.getBasicBlock(CleanupPadMBB));
2184 DAG.setRoot(Ret);
2185}
2186
2187void SelectionDAGBuilder::visitCatchSwitch(const CatchSwitchInst &CSI) {
2188 report_fatal_error("visitCatchSwitch not yet implemented!");
2189}
2190
2191void SelectionDAGBuilder::visitRet(const ReturnInst &I) {
2192 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
2193 auto &DL = DAG.getDataLayout();
2194 SDValue Chain = getControlRoot();
2197
2198 // Calls to @llvm.experimental.deoptimize don't generate a return value, so
2199 // lower
2200 //
2201 // %val = call <ty> @llvm.experimental.deoptimize()
2202 // ret <ty> %val
2203 //
2204 // differently.
2205 if (I.getParent()->getTerminatingDeoptimizeCall()) {
2207 return;
2208 }
2209
2210 if (!FuncInfo.CanLowerReturn) {
2211 Register DemoteReg = FuncInfo.DemoteRegister;
2212
2213 // Emit a store of the return value through the virtual register.
2214 // Leave Outs empty so that LowerReturn won't try to load return
2215 // registers the usual way.
2216 MVT PtrValueVT = TLI.getPointerTy(DL, DL.getAllocaAddrSpace());
2217 SDValue RetPtr =
2218 DAG.getCopyFromReg(Chain, getCurSDLoc(), DemoteReg, PtrValueVT);
2219 SDValue RetOp = getValue(I.getOperand(0));
2220
2221 SmallVector<EVT, 4> ValueVTs, MemVTs;
2222 SmallVector<uint64_t, 4> Offsets;
2223 ComputeValueVTs(TLI, DL, I.getOperand(0)->getType(), ValueVTs, &MemVTs,
2224 &Offsets, 0);
2225 unsigned NumValues = ValueVTs.size();
2226
2227 SmallVector<SDValue, 4> Chains(NumValues);
2228 Align BaseAlign = DL.getPrefTypeAlign(I.getOperand(0)->getType());
2229 for (unsigned i = 0; i != NumValues; ++i) {
2230 // An aggregate return value cannot wrap around the address space, so
2231 // offsets to its parts don't wrap either.
2232 SDValue Ptr = DAG.getObjectPtrOffset(getCurSDLoc(), RetPtr,
2233 TypeSize::getFixed(Offsets[i]));
2234
2235 SDValue Val = RetOp.getValue(RetOp.getResNo() + i);
2236 if (MemVTs[i] != ValueVTs[i])
2237 Val = DAG.getPtrExtOrTrunc(Val, getCurSDLoc(), MemVTs[i]);
2238 Chains[i] = DAG.getStore(
2239 Chain, getCurSDLoc(), Val,
2240 // FIXME: better loc info would be nice.
2241 Ptr, MachinePointerInfo::getUnknownStack(DAG.getMachineFunction()),
2242 commonAlignment(BaseAlign, Offsets[i]));
2243 }
2244
2245 Chain = DAG.getNode(ISD::TokenFactor, getCurSDLoc(),
2246 MVT::Other, Chains);
2247 } else if (I.getNumOperands() != 0) {
2249 ComputeValueTypes(DL, I.getOperand(0)->getType(), Types);
2250 unsigned NumValues = Types.size();
2251 if (NumValues) {
2252 SDValue RetOp = getValue(I.getOperand(0));
2253
2254 const Function *F = I.getParent()->getParent();
2255
2256 bool NeedsRegBlock = TLI.functionArgumentNeedsConsecutiveRegisters(
2257 I.getOperand(0)->getType(), F->getCallingConv(),
2258 /*IsVarArg*/ false, DL);
2259
2260 ISD::NodeType ExtendKind = ISD::ANY_EXTEND;
2261 if (F->getAttributes().hasRetAttr(Attribute::SExt))
2262 ExtendKind = ISD::SIGN_EXTEND;
2263 else if (F->getAttributes().hasRetAttr(Attribute::ZExt))
2264 ExtendKind = ISD::ZERO_EXTEND;
2265
2266 LLVMContext &Context = F->getContext();
2267 bool RetInReg = F->getAttributes().hasRetAttr(Attribute::InReg);
2268
2269 for (unsigned j = 0; j != NumValues; ++j) {
2270 EVT VT = TLI.getValueType(DL, Types[j]);
2271
2272 if (ExtendKind != ISD::ANY_EXTEND && VT.isInteger())
2273 VT = TLI.getTypeForExtReturn(Context, VT, ExtendKind);
2274
2275 CallingConv::ID CC = F->getCallingConv();
2276
2277 unsigned NumParts = TLI.getNumRegistersForCallingConv(Context, CC, VT);
2278 MVT PartVT = TLI.getRegisterTypeForCallingConv(Context, CC, VT);
2279 SmallVector<SDValue, 4> Parts(NumParts);
2281 SDValue(RetOp.getNode(), RetOp.getResNo() + j),
2282 &Parts[0], NumParts, PartVT, &I, CC, ExtendKind);
2283
2284 // 'inreg' on function refers to return value
2285 ISD::ArgFlagsTy Flags = ISD::ArgFlagsTy();
2286 if (RetInReg)
2287 Flags.setInReg();
2288
2289 if (I.getOperand(0)->getType()->isPointerTy()) {
2290 Flags.setPointer();
2291 Flags.setPointerAddrSpace(
2292 cast<PointerType>(I.getOperand(0)->getType())->getAddressSpace());
2293 }
2294
2295 if (NeedsRegBlock) {
2296 Flags.setInConsecutiveRegs();
2297 if (j == NumValues - 1)
2298 Flags.setInConsecutiveRegsLast();
2299 }
2300
2301 // Propagate extension type if any
2302 if (ExtendKind == ISD::SIGN_EXTEND)
2303 Flags.setSExt();
2304 else if (ExtendKind == ISD::ZERO_EXTEND)
2305 Flags.setZExt();
2306 else if (F->getAttributes().hasRetAttr(Attribute::NoExt))
2307 Flags.setNoExt();
2308
2309 for (unsigned i = 0; i < NumParts; ++i) {
2310 Outs.push_back(ISD::OutputArg(Flags,
2311 Parts[i].getValueType().getSimpleVT(),
2312 VT, Types[j], 0, 0));
2313 OutVals.push_back(Parts[i]);
2314 }
2315 }
2316 }
2317 }
2318
2319 // Push in swifterror virtual register as the last element of Outs. This makes
2320 // sure swifterror virtual register will be returned in the swifterror
2321 // physical register.
2322 const Function *F = I.getParent()->getParent();
2323 if (TLI.supportSwiftError() &&
2324 F->getAttributes().hasAttrSomewhere(Attribute::SwiftError)) {
2325 assert(SwiftError.getFunctionArg() && "Need a swift error argument");
2326 ISD::ArgFlagsTy Flags = ISD::ArgFlagsTy();
2327 Flags.setSwiftError();
2328 Outs.push_back(ISD::OutputArg(Flags, /*vt=*/TLI.getPointerTy(DL),
2329 /*argvt=*/EVT(TLI.getPointerTy(DL)),
2330 PointerType::getUnqual(*DAG.getContext()),
2331 /*origidx=*/1, /*partOffs=*/0));
2332 // Create SDNode for the swifterror virtual register.
2333 OutVals.push_back(
2334 DAG.getRegister(SwiftError.getOrCreateVRegUseAt(
2335 &I, FuncInfo.MBB, SwiftError.getFunctionArg()),
2336 EVT(TLI.getPointerTy(DL))));
2337 }
2338
2339 bool isVarArg = DAG.getMachineFunction().getFunction().isVarArg();
2340 CallingConv::ID CallConv =
2341 DAG.getMachineFunction().getFunction().getCallingConv();
2342 Chain = DAG.getTargetLoweringInfo().LowerReturn(
2343 Chain, CallConv, isVarArg, Outs, OutVals, getCurSDLoc(), DAG);
2344
2345 // Verify that the target's LowerReturn behaved as expected.
2346 assert(Chain.getNode() && Chain.getValueType() == MVT::Other &&
2347 "LowerReturn didn't return a valid chain!");
2348
2349 // Update the DAG with the new chain value resulting from return lowering.
2350 DAG.setRoot(Chain);
2351}
2352
2353/// CopyToExportRegsIfNeeded - If the given value has virtual registers
2354/// created for it, emit nodes to copy the value into the virtual
2355/// registers.
2357 // Skip empty types
2358 if (V->getType()->isEmptyTy())
2359 return;
2360
2362 if (VMI != FuncInfo.ValueMap.end()) {
2363 assert((!V->use_empty() || isa<CallBrInst>(V)) &&
2364 "Unused value assigned virtual registers!");
2365 CopyValueToVirtualRegister(V, VMI->second);
2366 }
2367}
2368
2369/// ExportFromCurrentBlock - If this condition isn't known to be exported from
2370/// the current basic block, add it to ValueMap now so that we'll get a
2371/// CopyTo/FromReg.
2373 // No need to export constants.
2374 if (!isa<Instruction>(V) && !isa<Argument>(V)) return;
2375
2376 // Already exported?
2377 if (FuncInfo.isExportedInst(V)) return;
2378
2379 Register Reg = FuncInfo.InitializeRegForValue(V);
2381}
2382
2384 const BasicBlock *FromBB) {
2385 // The operands of the setcc have to be in this block. We don't know
2386 // how to export them from some other block.
2387 if (const Instruction *VI = dyn_cast<Instruction>(V)) {
2388 // Can export from current BB.
2389 if (VI->getParent() == FromBB)
2390 return true;
2391
2392 // Is already exported, noop.
2393 return FuncInfo.isExportedInst(V);
2394 }
2395
2396 // If this is an argument, we can export it if the BB is the entry block or
2397 // if it is already exported.
2398 if (isa<Argument>(V)) {
2399 if (FromBB->isEntryBlock())
2400 return true;
2401
2402 // Otherwise, can only export this if it is already exported.
2403 return FuncInfo.isExportedInst(V);
2404 }
2405
2406 // Otherwise, constants can always be exported.
2407 return true;
2408}
2409
2410/// Return branch probability calculated by BranchProbabilityInfo for IR blocks.
2412SelectionDAGBuilder::getEdgeProbability(const MachineBasicBlock *Src,
2413 const MachineBasicBlock *Dst) const {
2415 const BasicBlock *SrcBB = Src->getBasicBlock();
2416 const BasicBlock *DstBB = Dst->getBasicBlock();
2417 if (!BPI) {
2418 // If BPI is not available, set the default probability as 1 / N, where N is
2419 // the number of successors.
2420 auto SuccSize = std::max<uint32_t>(succ_size(SrcBB), 1);
2421 return BranchProbability(1, SuccSize);
2422 }
2423 return BPI->getEdgeProbability(SrcBB, DstBB);
2424}
2425
2426void SelectionDAGBuilder::addSuccessorWithProb(MachineBasicBlock *Src,
2427 MachineBasicBlock *Dst,
2428 BranchProbability Prob) {
2429 if (!FuncInfo.BPI)
2430 Src->addSuccessorWithoutProb(Dst);
2431 else {
2432 if (Prob.isUnknown())
2433 Prob = getEdgeProbability(Src, Dst);
2434 Src->addSuccessor(Dst, Prob);
2435 }
2436}
2437
2438static bool InBlock(const Value *V, const BasicBlock *BB) {
2439 if (const Instruction *I = dyn_cast<Instruction>(V))
2440 return I->getParent() == BB;
2441 return true;
2442}
2443
2444/// EmitBranchForMergedCondition - Helper method for FindMergedConditions.
2445/// This function emits a branch and is used at the leaves of an OR or an
2446/// AND operator tree.
2447void
2450 MachineBasicBlock *FBB,
2451 MachineBasicBlock *CurBB,
2452 MachineBasicBlock *SwitchBB,
2453 BranchProbability TProb,
2454 BranchProbability FProb,
2455 bool InvertCond) {
2456 const BasicBlock *BB = CurBB->getBasicBlock();
2457
2458 // If the leaf of the tree is a comparison, merge the condition into
2459 // the caseblock.
2460 if (const CmpInst *BOp = dyn_cast<CmpInst>(Cond)) {
2461 // The operands of the cmp have to be in this block. We don't know
2462 // how to export them from some other block. If this is the first block
2463 // of the sequence, no exporting is needed.
2464 if (CurBB == SwitchBB ||
2465 (isExportableFromCurrentBlock(BOp->getOperand(0), BB) &&
2466 isExportableFromCurrentBlock(BOp->getOperand(1), BB))) {
2467 ISD::CondCode Condition;
2468 if (const ICmpInst *IC = dyn_cast<ICmpInst>(Cond)) {
2469 ICmpInst::Predicate Pred =
2470 InvertCond ? IC->getInversePredicate() : IC->getPredicate();
2471 Condition = getICmpCondCode(Pred);
2472 } else {
2473 const FCmpInst *FC = cast<FCmpInst>(Cond);
2474 FCmpInst::Predicate Pred =
2475 InvertCond ? FC->getInversePredicate() : FC->getPredicate();
2476 Condition = getFCmpCondCode(Pred);
2477 if (FC->hasNoNaNs() ||
2478 (isKnownNeverNaN(FC->getOperand(0),
2479 SimplifyQuery(DAG.getDataLayout(), FC)) &&
2480 isKnownNeverNaN(FC->getOperand(1),
2481 SimplifyQuery(DAG.getDataLayout(), FC))))
2482 Condition = getFCmpCodeWithoutNaN(Condition);
2483 }
2484
2485 CaseBlock CB(Condition, BOp->getOperand(0), BOp->getOperand(1), nullptr,
2486 TBB, FBB, CurBB, getCurSDLoc(), TProb, FProb);
2487 SL->SwitchCases.push_back(CB);
2488 return;
2489 }
2490 }
2491
2492 // Create a CaseBlock record representing this branch.
2493 ISD::CondCode Opc = InvertCond ? ISD::SETNE : ISD::SETEQ;
2494 CaseBlock CB(Opc, Cond, ConstantInt::getTrue(*DAG.getContext()),
2495 nullptr, TBB, FBB, CurBB, getCurSDLoc(), TProb, FProb);
2496 SL->SwitchCases.push_back(CB);
2497}
2498
2499// Collect dependencies on V recursively. This is used for the cost analysis in
2500// `shouldKeepJumpConditionsTogether`.
2504 unsigned Depth = 0) {
2505 // Return false if we have an incomplete count.
2507 return false;
2508
2509 auto *I = dyn_cast<Instruction>(V);
2510 if (I == nullptr)
2511 return true;
2512
2513 if (Necessary != nullptr) {
2514 // This instruction is necessary for the other side of the condition so
2515 // don't count it.
2516 if (Necessary->contains(I))
2517 return true;
2518 }
2519
2520 // Already added this dep.
2521 if (!Deps->try_emplace(I, false).second)
2522 return true;
2523
2524 for (unsigned OpIdx = 0, E = I->getNumOperands(); OpIdx < E; ++OpIdx)
2525 if (!collectInstructionDeps(Deps, I->getOperand(OpIdx), Necessary,
2526 Depth + 1))
2527 return false;
2528 return true;
2529}
2530
2533 Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs,
2535 if (I.getNumSuccessors() != 2)
2536 return false;
2537
2538 if (!I.isConditional())
2539 return false;
2540
2541 if (Params.BaseCost < 0)
2542 return false;
2543
2544 // Baseline cost.
2545 InstructionCost CostThresh = Params.BaseCost;
2546
2547 BranchProbabilityInfo *BPI = nullptr;
2548 if (Params.LikelyBias || Params.UnlikelyBias)
2549 BPI = FuncInfo.BPI;
2550 if (BPI != nullptr) {
2551 // See if we are either likely to get an early out or compute both lhs/rhs
2552 // of the condition.
2553 BasicBlock *IfFalse = I.getSuccessor(0);
2554 BasicBlock *IfTrue = I.getSuccessor(1);
2555
2556 std::optional<bool> Likely;
2557 if (BPI->isEdgeHot(I.getParent(), IfTrue))
2558 Likely = true;
2559 else if (BPI->isEdgeHot(I.getParent(), IfFalse))
2560 Likely = false;
2561
2562 if (Likely) {
2563 if (Opc == (*Likely ? Instruction::And : Instruction::Or))
2564 // Its likely we will have to compute both lhs and rhs of condition
2565 CostThresh += Params.LikelyBias;
2566 else {
2567 if (Params.UnlikelyBias < 0)
2568 return false;
2569 // Its likely we will get an early out.
2570 CostThresh -= Params.UnlikelyBias;
2571 }
2572 }
2573 }
2574
2575 if (CostThresh <= 0)
2576 return false;
2577
2578 // Collect "all" instructions that lhs condition is dependent on.
2579 // Use map for stable iteration (to avoid non-determanism of iteration of
2580 // SmallPtrSet). The `bool` value is just a dummy.
2582 collectInstructionDeps(&LhsDeps, Lhs);
2583 // Collect "all" instructions that rhs condition is dependent on AND are
2584 // dependencies of lhs. This gives us an estimate on which instructions we
2585 // stand to save by splitting the condition.
2586 if (!collectInstructionDeps(&RhsDeps, Rhs, &LhsDeps))
2587 return false;
2588 // Add the compare instruction itself unless its a dependency on the LHS.
2589 if (const auto *RhsI = dyn_cast<Instruction>(Rhs))
2590 if (!LhsDeps.contains(RhsI))
2591 RhsDeps.try_emplace(RhsI, false);
2592
2593 InstructionCost CostOfIncluding = 0;
2594 // See if this instruction will need to computed independently of whether RHS
2595 // is.
2596 Value *BrCond = I.getCondition();
2597 auto ShouldCountInsn = [&RhsDeps, &BrCond](const Instruction *Ins) {
2598 for (const auto *U : Ins->users()) {
2599 // If user is independent of RHS calculation we don't need to count it.
2600 if (auto *UIns = dyn_cast<Instruction>(U))
2601 if (UIns != BrCond && !RhsDeps.contains(UIns))
2602 return false;
2603 }
2604 return true;
2605 };
2606
2607 // Prune instructions from RHS Deps that are dependencies of unrelated
2608 // instructions. The value (SelectionDAG::MaxRecursionDepth) is fairly
2609 // arbitrary and just meant to cap the how much time we spend in the pruning
2610 // loop. Its highly unlikely to come into affect.
2611 const unsigned MaxPruneIters = SelectionDAG::MaxRecursionDepth;
2612 // Stop after a certain point. No incorrectness from including too many
2613 // instructions.
2614 for (unsigned PruneIters = 0; PruneIters < MaxPruneIters; ++PruneIters) {
2615 const Instruction *ToDrop = nullptr;
2616 for (const auto &InsPair : RhsDeps) {
2617 if (!ShouldCountInsn(InsPair.first)) {
2618 ToDrop = InsPair.first;
2619 break;
2620 }
2621 }
2622 if (ToDrop == nullptr)
2623 break;
2624 RhsDeps.erase(ToDrop);
2625 }
2626
2627 for (const auto &InsPair : RhsDeps) {
2628 // Finally accumulate latency that we can only attribute to computing the
2629 // RHS condition. Use latency because we are essentially trying to calculate
2630 // the cost of the dependency chain.
2631 // Possible TODO: We could try to estimate ILP and make this more precise.
2632 CostOfIncluding += TTI->getInstructionCost(
2633 InsPair.first, TargetTransformInfo::TCK_Latency);
2634
2635 if (CostOfIncluding > CostThresh)
2636 return false;
2637 }
2638 return true;
2639}
2640
2643 MachineBasicBlock *FBB,
2644 MachineBasicBlock *CurBB,
2645 MachineBasicBlock *SwitchBB,
2647 BranchProbability TProb,
2648 BranchProbability FProb,
2649 bool InvertCond) {
2650 // Skip over not part of the tree and remember to invert op and operands at
2651 // next level.
2652 Value *NotCond;
2653 if (match(Cond, m_OneUse(m_Not(m_Value(NotCond)))) &&
2654 InBlock(NotCond, CurBB->getBasicBlock())) {
2655 FindMergedConditions(NotCond, TBB, FBB, CurBB, SwitchBB, Opc, TProb, FProb,
2656 !InvertCond);
2657 return;
2658 }
2659
2661 const Value *BOpOp0, *BOpOp1;
2662 // Compute the effective opcode for Cond, taking into account whether it needs
2663 // to be inverted, e.g.
2664 // and (not (or A, B)), C
2665 // gets lowered as
2666 // and (and (not A, not B), C)
2668 if (BOp) {
2669 BOpc = match(BOp, m_LogicalAnd(m_Value(BOpOp0), m_Value(BOpOp1)))
2670 ? Instruction::And
2671 : (match(BOp, m_LogicalOr(m_Value(BOpOp0), m_Value(BOpOp1)))
2672 ? Instruction::Or
2674 if (InvertCond) {
2675 if (BOpc == Instruction::And)
2676 BOpc = Instruction::Or;
2677 else if (BOpc == Instruction::Or)
2678 BOpc = Instruction::And;
2679 }
2680 }
2681
2682 // If this node is not part of the or/and tree, emit it as a branch.
2683 // Note that all nodes in the tree should have same opcode.
2684 bool BOpIsInOrAndTree = BOpc && BOpc == Opc && BOp->hasOneUse();
2685 if (!BOpIsInOrAndTree || BOp->getParent() != CurBB->getBasicBlock() ||
2686 !InBlock(BOpOp0, CurBB->getBasicBlock()) ||
2687 !InBlock(BOpOp1, CurBB->getBasicBlock())) {
2688 EmitBranchForMergedCondition(Cond, TBB, FBB, CurBB, SwitchBB,
2689 TProb, FProb, InvertCond);
2690 return;
2691 }
2692
2693 // Create TmpBB after CurBB.
2694 MachineFunction::iterator BBI(CurBB);
2695 MachineFunction &MF = DAG.getMachineFunction();
2697 CurBB->getParent()->insert(++BBI, TmpBB);
2698
2699 if (Opc == Instruction::Or) {
2700 // Codegen X | Y as:
2701 // BB1:
2702 // jmp_if_X TBB
2703 // jmp TmpBB
2704 // TmpBB:
2705 // jmp_if_Y TBB
2706 // jmp FBB
2707 //
2708
2709 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
2710 // The requirement is that
2711 // TrueProb for BB1 + (FalseProb for BB1 * TrueProb for TmpBB)
2712 // = TrueProb for original BB.
2713 // Assuming the original probabilities are A and B, one choice is to set
2714 // BB1's probabilities to A/2 and A/2+B, and set TmpBB's probabilities to
2715 // A/(1+B) and 2B/(1+B). This choice assumes that
2716 // TrueProb for BB1 == FalseProb for BB1 * TrueProb for TmpBB.
2717 // Another choice is to assume TrueProb for BB1 equals to TrueProb for
2718 // TmpBB, but the math is more complicated.
2719
2720 auto NewTrueProb = TProb / 2;
2721 auto NewFalseProb = TProb / 2 + FProb;
2722 // Emit the LHS condition.
2723 FindMergedConditions(BOpOp0, TBB, TmpBB, CurBB, SwitchBB, Opc, NewTrueProb,
2724 NewFalseProb, InvertCond);
2725
2726 // Normalize A/2 and B to get A/(1+B) and 2B/(1+B).
2727 SmallVector<BranchProbability, 2> Probs{TProb / 2, FProb};
2729 // Emit the RHS condition into TmpBB.
2730 FindMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
2731 Probs[1], InvertCond);
2732 } else {
2733 assert(Opc == Instruction::And && "Unknown merge op!");
2734 // Codegen X & Y as:
2735 // BB1:
2736 // jmp_if_X TmpBB
2737 // jmp FBB
2738 // TmpBB:
2739 // jmp_if_Y TBB
2740 // jmp FBB
2741 //
2742 // This requires creation of TmpBB after CurBB.
2743
2744 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
2745 // The requirement is that
2746 // FalseProb for BB1 + (TrueProb for BB1 * FalseProb for TmpBB)
2747 // = FalseProb for original BB.
2748 // Assuming the original probabilities are A and B, one choice is to set
2749 // BB1's probabilities to A+B/2 and B/2, and set TmpBB's probabilities to
2750 // 2A/(1+A) and B/(1+A). This choice assumes that FalseProb for BB1 ==
2751 // TrueProb for BB1 * FalseProb for TmpBB.
2752
2753 auto NewTrueProb = TProb + FProb / 2;
2754 auto NewFalseProb = FProb / 2;
2755 // Emit the LHS condition.
2756 FindMergedConditions(BOpOp0, TmpBB, FBB, CurBB, SwitchBB, Opc, NewTrueProb,
2757 NewFalseProb, InvertCond);
2758
2759 // Normalize A and B/2 to get 2A/(1+A) and B/(1+A).
2760 SmallVector<BranchProbability, 2> Probs{TProb, FProb / 2};
2762 // Emit the RHS condition into TmpBB.
2763 FindMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
2764 Probs[1], InvertCond);
2765 }
2766}
2767
2768/// If the set of cases should be emitted as a series of branches, return true.
2769/// If we should emit this as a bunch of and/or'd together conditions, return
2770/// false.
2771bool
2772SelectionDAGBuilder::ShouldEmitAsBranches(const std::vector<CaseBlock> &Cases) {
2773 if (Cases.size() != 2) return true;
2774
2775 // If this is two comparisons of the same values or'd or and'd together, they
2776 // will get folded into a single comparison, so don't emit two blocks.
2777 if ((Cases[0].CmpLHS == Cases[1].CmpLHS &&
2778 Cases[0].CmpRHS == Cases[1].CmpRHS) ||
2779 (Cases[0].CmpRHS == Cases[1].CmpLHS &&
2780 Cases[0].CmpLHS == Cases[1].CmpRHS)) {
2781 return false;
2782 }
2783
2784 // Handle: (X != null) | (Y != null) --> (X|Y) != 0
2785 // Handle: (X == null) & (Y == null) --> (X|Y) == 0
2786 if (Cases[0].CmpRHS == Cases[1].CmpRHS &&
2787 Cases[0].CC == Cases[1].CC &&
2788 isa<Constant>(Cases[0].CmpRHS) &&
2789 cast<Constant>(Cases[0].CmpRHS)->isNullValue()) {
2790 if (Cases[0].CC == ISD::SETEQ && Cases[0].TrueBB == Cases[1].ThisBB)
2791 return false;
2792 if (Cases[0].CC == ISD::SETNE && Cases[0].FalseBB == Cases[1].ThisBB)
2793 return false;
2794 }
2795
2796 return true;
2797}
2798
2799void SelectionDAGBuilder::visitUncondBr(const UncondBrInst &I) {
2801
2802 MachineBasicBlock *Succ0MBB = FuncInfo.getMBB(I.getSuccessor(0));
2803
2804 // Update machine-CFG edges.
2805 BrMBB->addSuccessor(Succ0MBB);
2806
2807 // If this is not a fall-through branch or optimizations are switched off,
2808 // emit the branch.
2809 if (Succ0MBB != NextBlock(BrMBB) ||
2811 auto Br = DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other, getControlRoot(),
2812 DAG.getBasicBlock(Succ0MBB));
2813 setValue(&I, Br);
2814 DAG.setRoot(Br);
2815 }
2816}
2817
2818void SelectionDAGBuilder::visitCondBr(const CondBrInst &I) {
2819 MachineBasicBlock *BrMBB = FuncInfo.MBB;
2820
2821 MachineBasicBlock *Succ0MBB = FuncInfo.getMBB(I.getSuccessor(0));
2822
2823 // If this condition is one of the special cases we handle, do special stuff
2824 // now.
2825 const Value *CondVal = I.getCondition();
2826 MachineBasicBlock *Succ1MBB = FuncInfo.getMBB(I.getSuccessor(1));
2827
2828 // If this is a series of conditions that are or'd or and'd together, emit
2829 // this as a sequence of branches instead of setcc's with and/or operations.
2830 // As long as jumps are not expensive (exceptions for multi-use logic ops,
2831 // unpredictable branches, and vector extracts because those jumps are likely
2832 // expensive for any target), this should improve performance.
2833 // For example, instead of something like:
2834 // cmp A, B
2835 // C = seteq
2836 // cmp D, E
2837 // F = setle
2838 // or C, F
2839 // jnz foo
2840 // Emit:
2841 // cmp A, B
2842 // je foo
2843 // cmp D, E
2844 // jle foo
2845 bool IsUnpredictable = I.hasMetadata(LLVMContext::MD_unpredictable);
2846 const Instruction *BOp = dyn_cast<Instruction>(CondVal);
2847 if (!DAG.getTargetLoweringInfo().isJumpExpensive() && BOp &&
2848 BOp->hasOneUse() && !IsUnpredictable) {
2849 Value *Vec;
2850 const Value *BOp0, *BOp1;
2852 if (match(BOp, m_LogicalAnd(m_Value(BOp0), m_Value(BOp1))))
2853 Opcode = Instruction::And;
2854 else if (match(BOp, m_LogicalOr(m_Value(BOp0), m_Value(BOp1))))
2855 Opcode = Instruction::Or;
2856
2857 if (Opcode &&
2858 !(match(BOp0, m_ExtractElt(m_Value(Vec), m_Value())) &&
2859 match(BOp1, m_ExtractElt(m_Specific(Vec), m_Value()))) &&
2861 FuncInfo, I, Opcode, BOp0, BOp1,
2862 DAG.getTargetLoweringInfo().getJumpConditionMergingParams(
2863 Opcode, BOp0, BOp1))) {
2864 FindMergedConditions(BOp, Succ0MBB, Succ1MBB, BrMBB, BrMBB, Opcode,
2865 getEdgeProbability(BrMBB, Succ0MBB),
2866 getEdgeProbability(BrMBB, Succ1MBB),
2867 /*InvertCond=*/false);
2868 // If the compares in later blocks need to use values not currently
2869 // exported from this block, export them now. This block should always
2870 // be the first entry.
2871 assert(SL->SwitchCases[0].ThisBB == BrMBB && "Unexpected lowering!");
2872
2873 // Allow some cases to be rejected.
2874 if (ShouldEmitAsBranches(SL->SwitchCases)) {
2875 for (unsigned i = 1, e = SL->SwitchCases.size(); i != e; ++i) {
2876 ExportFromCurrentBlock(SL->SwitchCases[i].CmpLHS);
2877 ExportFromCurrentBlock(SL->SwitchCases[i].CmpRHS);
2878 }
2879
2880 // Emit the branch for this block.
2881 visitSwitchCase(SL->SwitchCases[0], BrMBB);
2882 SL->SwitchCases.erase(SL->SwitchCases.begin());
2883 return;
2884 }
2885
2886 // Okay, we decided not to do this, remove any inserted MBB's and clear
2887 // SwitchCases.
2888 for (unsigned i = 1, e = SL->SwitchCases.size(); i != e; ++i)
2889 FuncInfo.MF->erase(SL->SwitchCases[i].ThisBB);
2890
2891 SL->SwitchCases.clear();
2892 }
2893 }
2894
2895 // Create a CaseBlock record representing this branch.
2896 CaseBlock CB(ISD::SETEQ, CondVal, ConstantInt::getTrue(*DAG.getContext()),
2897 nullptr, Succ0MBB, Succ1MBB, BrMBB, getCurSDLoc(),
2899 IsUnpredictable);
2900
2901 // Use visitSwitchCase to actually insert the fast branch sequence for this
2902 // cond branch.
2903 visitSwitchCase(CB, BrMBB);
2904}
2905
2906/// visitSwitchCase - Emits the necessary code to represent a single node in
2907/// the binary search tree resulting from lowering a switch instruction.
2909 MachineBasicBlock *SwitchBB) {
2910 SDValue Cond;
2911 SDValue CondLHS = getValue(CB.CmpLHS);
2912 SDLoc dl = CB.DL;
2913
2914 if (CB.CC == ISD::SETTRUE) {
2915 // Branch or fall through to TrueBB.
2916 addSuccessorWithProb(SwitchBB, CB.TrueBB, CB.TrueProb);
2917 SwitchBB->normalizeSuccProbs();
2918 if (CB.TrueBB != NextBlock(SwitchBB)) {
2919 DAG.setRoot(DAG.getNode(ISD::BR, dl, MVT::Other, getControlRoot(),
2920 DAG.getBasicBlock(CB.TrueBB)));
2921 }
2922 return;
2923 }
2924
2925 auto &TLI = DAG.getTargetLoweringInfo();
2926 EVT MemVT = TLI.getMemValueType(DAG.getDataLayout(), CB.CmpLHS->getType());
2927
2928 // Build the setcc now.
2929 if (!CB.CmpMHS) {
2930 // Fold "(X == true)" to X and "(X == false)" to !X to
2931 // handle common cases produced by branch lowering.
2932 if (CB.CmpRHS == ConstantInt::getTrue(*DAG.getContext()) &&
2933 CB.CC == ISD::SETEQ)
2934 Cond = CondLHS;
2935 else if (CB.CmpRHS == ConstantInt::getFalse(*DAG.getContext()) &&
2936 CB.CC == ISD::SETEQ) {
2937 SDValue True = DAG.getConstant(1, dl, CondLHS.getValueType());
2938 Cond = DAG.getNode(ISD::XOR, dl, CondLHS.getValueType(), CondLHS, True);
2939 } else {
2940 SDValue CondRHS = getValue(CB.CmpRHS);
2941
2942 // If a pointer's DAG type is larger than its memory type then the DAG
2943 // values are zero-extended. This breaks signed comparisons so truncate
2944 // back to the underlying type before doing the compare.
2945 if (CondLHS.getValueType() != MemVT) {
2946 CondLHS = DAG.getPtrExtOrTrunc(CondLHS, getCurSDLoc(), MemVT);
2947 CondRHS = DAG.getPtrExtOrTrunc(CondRHS, getCurSDLoc(), MemVT);
2948 }
2949 Cond = DAG.getSetCC(dl, MVT::i1, CondLHS, CondRHS, CB.CC);
2950 }
2951 } else {
2952 assert(CB.CC == ISD::SETLE && "Can handle only LE ranges now");
2953
2954 const APInt& Low = cast<ConstantInt>(CB.CmpLHS)->getValue();
2955 const APInt& High = cast<ConstantInt>(CB.CmpRHS)->getValue();
2956
2957 SDValue CmpOp = getValue(CB.CmpMHS);
2958 EVT VT = CmpOp.getValueType();
2959
2960 if (cast<ConstantInt>(CB.CmpLHS)->isMinValue(true)) {
2961 Cond = DAG.getSetCC(dl, MVT::i1, CmpOp, DAG.getConstant(High, dl, VT),
2962 ISD::SETLE);
2963 } else {
2964 SDValue SUB = DAG.getNode(ISD::SUB, dl,
2965 VT, CmpOp, DAG.getConstant(Low, dl, VT));
2966 Cond = DAG.getSetCC(dl, MVT::i1, SUB,
2967 DAG.getConstant(High-Low, dl, VT), ISD::SETULE);
2968 }
2969 }
2970
2971 // Update successor info
2972 addSuccessorWithProb(SwitchBB, CB.TrueBB, CB.TrueProb);
2973 // TrueBB and FalseBB are always different unless the incoming IR is
2974 // degenerate. This only happens when running llc on weird IR.
2975 if (CB.TrueBB != CB.FalseBB)
2976 addSuccessorWithProb(SwitchBB, CB.FalseBB, CB.FalseProb);
2977 SwitchBB->normalizeSuccProbs();
2978
2979 // If the lhs block is the next block, invert the condition so that we can
2980 // fall through to the lhs instead of the rhs block.
2981 if (CB.TrueBB == NextBlock(SwitchBB)) {
2982 std::swap(CB.TrueBB, CB.FalseBB);
2983 SDValue True = DAG.getConstant(1, dl, Cond.getValueType());
2984 Cond = DAG.getNode(ISD::XOR, dl, Cond.getValueType(), Cond, True);
2985 }
2986
2987 SDNodeFlags Flags;
2989 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl, MVT::Other, getControlRoot(),
2990 Cond, DAG.getBasicBlock(CB.TrueBB), Flags);
2991
2992 setValue(CurInst, BrCond);
2993
2994 // Insert the false branch. Do this even if it's a fall through branch,
2995 // this makes it easier to do DAG optimizations which require inverting
2996 // the branch condition.
2997 BrCond = DAG.getNode(ISD::BR, dl, MVT::Other, BrCond,
2998 DAG.getBasicBlock(CB.FalseBB));
2999
3000 DAG.setRoot(BrCond);
3001}
3002
3003/// visitJumpTable - Emit JumpTable node in the current MBB
3005 // Emit the code for the jump table
3006 assert(JT.SL && "Should set SDLoc for SelectionDAG!");
3007 assert(JT.Reg && "Should lower JT Header first!");
3008 EVT PTy = DAG.getTargetLoweringInfo().getJumpTableRegTy(DAG.getDataLayout());
3009 SDValue Index = DAG.getCopyFromReg(getControlRoot(), *JT.SL, JT.Reg, PTy);
3010 SDValue Table = DAG.getJumpTable(JT.JTI, PTy);
3011 SDValue BrJumpTable = DAG.getNode(ISD::BR_JT, *JT.SL, MVT::Other,
3012 Index.getValue(1), Table, Index);
3013 DAG.setRoot(BrJumpTable);
3014}
3015
3016/// visitJumpTableHeader - This function emits necessary code to produce index
3017/// in the JumpTable from switch case.
3019 JumpTableHeader &JTH,
3020 MachineBasicBlock *SwitchBB) {
3021 assert(JT.SL && "Should set SDLoc for SelectionDAG!");
3022 const SDLoc &dl = *JT.SL;
3023
3024 // Subtract the lowest switch case value from the value being switched on.
3025 SDValue SwitchOp = getValue(JTH.SValue);
3026 EVT VT = SwitchOp.getValueType();
3027 SDValue Sub = DAG.getNode(ISD::SUB, dl, VT, SwitchOp,
3028 DAG.getConstant(JTH.First, dl, VT));
3029
3030 // The SDNode we just created, which holds the value being switched on minus
3031 // the smallest case value, needs to be copied to a virtual register so it
3032 // can be used as an index into the jump table in a subsequent basic block.
3033 // This value may be smaller or larger than the target's pointer type, and
3034 // therefore require extension or truncating.
3035 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3036 SwitchOp =
3037 DAG.getZExtOrTrunc(Sub, dl, TLI.getJumpTableRegTy(DAG.getDataLayout()));
3038
3039 Register JumpTableReg =
3040 FuncInfo.CreateReg(TLI.getJumpTableRegTy(DAG.getDataLayout()));
3041 SDValue CopyTo =
3042 DAG.getCopyToReg(getControlRoot(), dl, JumpTableReg, SwitchOp);
3043 JT.Reg = JumpTableReg;
3044
3045 if (!JTH.FallthroughUnreachable) {
3046 // Emit the range check for the jump table, and branch to the default block
3047 // for the switch statement if the value being switched on exceeds the
3048 // largest case in the switch.
3049 SDValue CMP = DAG.getSetCC(
3050 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
3051 Sub.getValueType()),
3052 Sub, DAG.getConstant(JTH.Last - JTH.First, dl, VT), ISD::SETUGT);
3053
3054 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl,
3055 MVT::Other, CopyTo, CMP,
3056 DAG.getBasicBlock(JT.Default));
3057
3058 // Avoid emitting unnecessary branches to the next block.
3059 if (JT.MBB != NextBlock(SwitchBB))
3060 BrCond = DAG.getNode(ISD::BR, dl, MVT::Other, BrCond,
3061 DAG.getBasicBlock(JT.MBB));
3062
3063 DAG.setRoot(BrCond);
3064 } else {
3065 // Avoid emitting unnecessary branches to the next block.
3066 if (JT.MBB != NextBlock(SwitchBB))
3067 DAG.setRoot(DAG.getNode(ISD::BR, dl, MVT::Other, CopyTo,
3068 DAG.getBasicBlock(JT.MBB)));
3069 else
3070 DAG.setRoot(CopyTo);
3071 }
3072}
3073
3074/// Create a LOAD_STACK_GUARD node, and let it carry the target specific global
3075/// variable if there exists one.
3077 SDValue &Chain) {
3078 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3079 EVT PtrTy = TLI.getPointerTy(DAG.getDataLayout());
3080 EVT PtrMemTy = TLI.getPointerMemTy(DAG.getDataLayout());
3082 Value *Global =
3085 DAG.getMachineNode(TargetOpcode::LOAD_STACK_GUARD, DL, PtrTy, Chain);
3086 if (Global) {
3087 MachinePointerInfo MPInfo(Global);
3091 MPInfo, Flags, PtrTy.getSizeInBits() / 8, DAG.getEVTAlign(PtrTy));
3092 DAG.setNodeMemRefs(Node, {MemRef});
3093 }
3094 if (PtrTy != PtrMemTy)
3095 return DAG.getPtrExtOrTrunc(SDValue(Node, 0), DL, PtrMemTy);
3096 return SDValue(Node, 0);
3097}
3098
3099/// Codegen a new tail for a stack protector check ParentMBB which has had its
3100/// tail spliced into a stack protector check success bb.
3101///
3102/// For a high level explanation of how this fits into the stack protector
3103/// generation see the comment on the declaration of class
3104/// StackProtectorDescriptor.
3106 MachineBasicBlock *ParentBB) {
3107
3108 // First create the loads to the guard/stack slot for the comparison.
3109 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3110 auto &DL = DAG.getDataLayout();
3111 EVT PtrTy = TLI.getFrameIndexTy(DL);
3112 EVT PtrMemTy = TLI.getPointerMemTy(DL, DL.getAllocaAddrSpace());
3113
3114 MachineFrameInfo &MFI = ParentBB->getParent()->getFrameInfo();
3115 int FI = MFI.getStackProtectorIndex();
3116
3117 SDValue Guard;
3118 SDLoc dl = getCurSDLoc();
3119 SDValue StackSlotPtr = DAG.getFrameIndex(FI, PtrTy);
3120 const Module &M = *ParentBB->getParent()->getFunction().getParent();
3121 Align Align = DL.getPrefTypeAlign(
3122 PointerType::get(M.getContext(), DL.getAllocaAddrSpace()));
3123
3124 // Generate code to load the content of the guard slot.
3125 SDValue GuardVal = DAG.getLoad(
3126 PtrMemTy, dl, DAG.getEntryNode(), StackSlotPtr,
3127 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI), Align,
3129
3130 if (TLI.useStackGuardXorFP())
3131 GuardVal = TLI.emitStackGuardXorFP(DAG, GuardVal, dl);
3132
3133 // If we're using function-based instrumentation, call the guard check
3134 // function
3136 // Get the guard check function from the target and verify it exists since
3137 // we're using function-based instrumentation
3138 const Function *GuardCheckFn =
3139 TLI.getSSPStackGuardCheck(M, DAG.getLibcalls());
3140 assert(GuardCheckFn && "Guard check function is null");
3141
3142 // The target provides a guard check function to validate the guard value.
3143 // Generate a call to that function with the content of the guard slot as
3144 // argument.
3145 FunctionType *FnTy = GuardCheckFn->getFunctionType();
3146 assert(FnTy->getNumParams() == 1 && "Invalid function signature");
3147
3149 TargetLowering::ArgListEntry Entry(GuardVal, FnTy->getParamType(0));
3150 if (GuardCheckFn->hasParamAttribute(0, Attribute::AttrKind::InReg))
3151 Entry.IsInReg = true;
3152 Args.push_back(Entry);
3153
3156 .setChain(DAG.getEntryNode())
3157 .setCallee(GuardCheckFn->getCallingConv(), FnTy->getReturnType(),
3158 getValue(GuardCheckFn), std::move(Args));
3159
3160 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
3161 DAG.setRoot(Result.second);
3162 return;
3163 }
3164
3165 // If useLoadStackGuardNode returns true, generate LOAD_STACK_GUARD.
3166 // Otherwise, emit a volatile load to retrieve the stack guard value.
3167 SDValue Chain = DAG.getEntryNode();
3168 if (TLI.useLoadStackGuardNode(M)) {
3169 Guard = getLoadStackGuard(DAG, dl, Chain);
3170 } else {
3171 if (const Value *IRGuard = TLI.getSDagStackGuard(M, DAG.getLibcalls())) {
3172 SDValue GuardPtr = getValue(IRGuard);
3173 Guard = DAG.getLoad(PtrMemTy, dl, Chain, GuardPtr,
3174 MachinePointerInfo(IRGuard, 0), Align,
3176 } else {
3177 LLVMContext &Ctx = *DAG.getContext();
3178 Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
3179 Guard = DAG.getPOISON(PtrMemTy);
3180 }
3181 }
3182
3183 // Perform the comparison via a getsetcc.
3184 SDValue Cmp = DAG.getSetCC(
3185 dl, TLI.getSetCCResultType(DL, *DAG.getContext(), Guard.getValueType()),
3186 Guard, GuardVal, ISD::SETNE);
3187
3188 // If the guard/stackslot do not equal, branch to failure MBB.
3189 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl, MVT::Other, getControlRoot(),
3190 Cmp, DAG.getBasicBlock(SPD.getFailureMBB()));
3191 // Otherwise branch to success MBB.
3192 SDValue Br = DAG.getNode(ISD::BR, dl,
3193 MVT::Other, BrCond,
3194 DAG.getBasicBlock(SPD.getSuccessMBB()));
3195
3196 DAG.setRoot(Br);
3197}
3198
3199/// Codegen the failure basic block for a stack protector check.
3200///
3201/// A failure stack protector machine basic block consists simply of a call to
3202/// __stack_chk_fail().
3203///
3204/// For a high level explanation of how this fits into the stack protector
3205/// generation see the comment on the declaration of class
3206/// StackProtectorDescriptor.
3209
3210 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3211 MachineBasicBlock *ParentBB = SPD.getParentMBB();
3212 const Module &M = *ParentBB->getParent()->getFunction().getParent();
3213 SDValue Chain;
3214
3215 // For -Oz builds with a guard check function, we use function-based
3216 // instrumentation. Otherwise, if we have a guard check function, we call it
3217 // in the failure block.
3218 auto *GuardCheckFn = TLI.getSSPStackGuardCheck(M, DAG.getLibcalls());
3219 if (GuardCheckFn && !SPD.shouldEmitFunctionBasedCheckStackProtector()) {
3220 // First create the loads to the guard/stack slot for the comparison.
3221 auto &DL = DAG.getDataLayout();
3222 EVT PtrTy = TLI.getFrameIndexTy(DL);
3223 EVT PtrMemTy = TLI.getPointerMemTy(DL, DL.getAllocaAddrSpace());
3224
3225 MachineFrameInfo &MFI = ParentBB->getParent()->getFrameInfo();
3226 int FI = MFI.getStackProtectorIndex();
3227
3228 SDLoc dl = getCurSDLoc();
3229 SDValue StackSlotPtr = DAG.getFrameIndex(FI, PtrTy);
3230 Align Align = DL.getPrefTypeAlign(
3231 PointerType::get(M.getContext(), DL.getAllocaAddrSpace()));
3232
3233 // Generate code to load the content of the guard slot.
3234 SDValue GuardVal = DAG.getLoad(
3235 PtrMemTy, dl, DAG.getEntryNode(), StackSlotPtr,
3236 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI), Align,
3238
3239 if (TLI.useStackGuardXorFP())
3240 GuardVal = TLI.emitStackGuardXorFP(DAG, GuardVal, dl);
3241
3242 // The target provides a guard check function to validate the guard value.
3243 // Generate a call to that function with the content of the guard slot as
3244 // argument.
3245 FunctionType *FnTy = GuardCheckFn->getFunctionType();
3246 assert(FnTy->getNumParams() == 1 && "Invalid function signature");
3247
3249 TargetLowering::ArgListEntry Entry(GuardVal, FnTy->getParamType(0));
3250 if (GuardCheckFn->hasParamAttribute(0, Attribute::AttrKind::InReg))
3251 Entry.IsInReg = true;
3252 Args.push_back(Entry);
3253
3256 .setChain(DAG.getEntryNode())
3257 .setCallee(GuardCheckFn->getCallingConv(), FnTy->getReturnType(),
3258 getValue(GuardCheckFn), std::move(Args));
3259
3260 Chain = TLI.LowerCallTo(CLI).second;
3261 } else {
3263 CallOptions.setDiscardResult(true);
3264 Chain = TLI.makeLibCall(DAG, RTLIB::STACKPROTECTOR_CHECK_FAIL, MVT::isVoid,
3265 {}, CallOptions, getCurSDLoc())
3266 .second;
3267 }
3268
3269 // Emit a trap instruction if we are required to do so.
3270 const TargetOptions &TargetOpts = DAG.getTarget().Options;
3271 if (TargetOpts.TrapUnreachable && !TargetOpts.NoTrapAfterNoreturn)
3272 Chain = DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, Chain);
3273
3274 DAG.setRoot(Chain);
3275}
3276
3277/// visitBitTestHeader - This function emits necessary code to produce value
3278/// suitable for "bit tests"
3280 MachineBasicBlock *SwitchBB) {
3281 SDLoc dl = getCurSDLoc();
3282
3283 // Subtract the minimum value.
3284 SDValue SwitchOp = getValue(B.SValue);
3285 EVT VT = SwitchOp.getValueType();
3286 SDValue RangeSub =
3287 DAG.getNode(ISD::SUB, dl, VT, SwitchOp, DAG.getConstant(B.First, dl, VT));
3288
3289 // Determine the type of the test operands.
3290 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3291 bool UsePtrType = false;
3292 if (!TLI.isTypeLegal(VT)) {
3293 UsePtrType = true;
3294 } else {
3295 for (const BitTestCase &Case : B.Cases)
3296 if (!isUIntN(VT.getSizeInBits(), Case.Mask)) {
3297 // Switch table case range are encoded into series of masks.
3298 // Just use pointer type, it's guaranteed to fit.
3299 UsePtrType = true;
3300 break;
3301 }
3302 }
3303 SDValue Sub = RangeSub;
3304 if (UsePtrType) {
3305 VT = TLI.getPointerTy(DAG.getDataLayout());
3306 Sub = DAG.getZExtOrTrunc(Sub, dl, VT);
3307 }
3308
3309 B.RegVT = VT.getSimpleVT();
3310 B.Reg = FuncInfo.CreateReg(B.RegVT);
3311 SDValue CopyTo = DAG.getCopyToReg(getControlRoot(), dl, B.Reg, Sub);
3312
3313 MachineBasicBlock* MBB = B.Cases[0].ThisBB;
3314
3315 if (!B.FallthroughUnreachable)
3316 addSuccessorWithProb(SwitchBB, B.Default, B.DefaultProb);
3317 addSuccessorWithProb(SwitchBB, MBB, B.Prob);
3318 SwitchBB->normalizeSuccProbs();
3319
3320 SDValue Root = CopyTo;
3321 if (!B.FallthroughUnreachable) {
3322 // Conditional branch to the default block.
3323 SDValue RangeCmp = DAG.getSetCC(dl,
3324 TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
3325 RangeSub.getValueType()),
3326 RangeSub, DAG.getConstant(B.Range, dl, RangeSub.getValueType()),
3327 ISD::SETUGT);
3328
3329 Root = DAG.getNode(ISD::BRCOND, dl, MVT::Other, Root, RangeCmp,
3330 DAG.getBasicBlock(B.Default));
3331 }
3332
3333 // Avoid emitting unnecessary branches to the next block.
3334 if (MBB != NextBlock(SwitchBB))
3335 Root = DAG.getNode(ISD::BR, dl, MVT::Other, Root, DAG.getBasicBlock(MBB));
3336
3337 DAG.setRoot(Root);
3338}
3339
3340/// visitBitTestCase - this function produces one "bit test"
3342 MachineBasicBlock *NextMBB,
3343 BranchProbability BranchProbToNext,
3344 Register Reg, BitTestCase &B,
3345 MachineBasicBlock *SwitchBB) {
3346 SDLoc dl = getCurSDLoc();
3347 MVT VT = BB.RegVT;
3348 SDValue ShiftOp = DAG.getCopyFromReg(getControlRoot(), dl, Reg, VT);
3349 SDValue Cmp;
3350 unsigned PopCount = llvm::popcount(B.Mask);
3351 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3352 if (PopCount == 1) {
3353 // Testing for a single bit; just compare the shift count with what it
3354 // would need to be to shift a 1 bit in that position.
3355 Cmp = DAG.getSetCC(
3356 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3357 ShiftOp, DAG.getConstant(llvm::countr_zero(B.Mask), dl, VT),
3358 ISD::SETEQ);
3359 } else if (PopCount == BB.Range) {
3360 // There is only one zero bit in the range, test for it directly.
3361 Cmp = DAG.getSetCC(
3362 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3363 ShiftOp, DAG.getConstant(llvm::countr_one(B.Mask), dl, VT), ISD::SETNE);
3364 } else {
3365 // Make desired shift
3366 SDValue SwitchVal = DAG.getNode(ISD::SHL, dl, VT,
3367 DAG.getConstant(1, dl, VT), ShiftOp);
3368
3369 // Emit bit tests and jumps
3370 SDValue AndOp = DAG.getNode(ISD::AND, dl,
3371 VT, SwitchVal, DAG.getConstant(B.Mask, dl, VT));
3372 Cmp = DAG.getSetCC(
3373 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3374 AndOp, DAG.getConstant(0, dl, VT), ISD::SETNE);
3375 }
3376
3377 // The branch probability from SwitchBB to B.TargetBB is B.ExtraProb.
3378 addSuccessorWithProb(SwitchBB, B.TargetBB, B.ExtraProb);
3379 // The branch probability from SwitchBB to NextMBB is BranchProbToNext.
3380 addSuccessorWithProb(SwitchBB, NextMBB, BranchProbToNext);
3381 // It is not guaranteed that the sum of B.ExtraProb and BranchProbToNext is
3382 // one as they are relative probabilities (and thus work more like weights),
3383 // and hence we need to normalize them to let the sum of them become one.
3384 SwitchBB->normalizeSuccProbs();
3385
3386 SDValue BrAnd = DAG.getNode(ISD::BRCOND, dl,
3387 MVT::Other, getControlRoot(),
3388 Cmp, DAG.getBasicBlock(B.TargetBB));
3389
3390 // Avoid emitting unnecessary branches to the next block.
3391 if (NextMBB != NextBlock(SwitchBB))
3392 BrAnd = DAG.getNode(ISD::BR, dl, MVT::Other, BrAnd,
3393 DAG.getBasicBlock(NextMBB));
3394
3395 DAG.setRoot(BrAnd);
3396}
3397
3398void SelectionDAGBuilder::visitInvoke(const InvokeInst &I) {
3399 MachineBasicBlock *InvokeMBB = FuncInfo.MBB;
3400
3401 // Retrieve successors. Look through artificial IR level blocks like
3402 // catchswitch for successors.
3403 MachineBasicBlock *Return = FuncInfo.getMBB(I.getSuccessor(0));
3404 const BasicBlock *EHPadBB = I.getSuccessor(1);
3405 MachineBasicBlock *EHPadMBB = FuncInfo.getMBB(EHPadBB);
3406
3407 // Deopt and ptrauth bundles are lowered in helper functions, and we don't
3408 // have to do anything here to lower funclet bundles.
3409 failForInvalidBundles(I, "invokes",
3415
3416 const Value *Callee(I.getCalledOperand());
3417 const Function *Fn = dyn_cast<Function>(Callee);
3418 if (isa<InlineAsm>(Callee))
3419 visitInlineAsm(I, EHPadBB);
3420 else if (Fn && Fn->isIntrinsic()) {
3421 switch (Fn->getIntrinsicID()) {
3422 default:
3423 llvm_unreachable("Cannot invoke this intrinsic");
3424 case Intrinsic::donothing:
3425 // Ignore invokes to @llvm.donothing: jump directly to the next BB.
3426 case Intrinsic::seh_try_begin:
3427 case Intrinsic::seh_scope_begin:
3428 case Intrinsic::seh_try_end:
3429 case Intrinsic::seh_scope_end:
3430 if (EHPadMBB)
3431 // a block referenced by EH table
3432 // so dtor-funclet not removed by opts
3433 EHPadMBB->setMachineBlockAddressTaken();
3434 break;
3435 case Intrinsic::experimental_patchpoint_void:
3436 case Intrinsic::experimental_patchpoint:
3437 visitPatchpoint(I, EHPadBB);
3438 break;
3439 case Intrinsic::experimental_gc_statepoint:
3441 break;
3442 // wasm_throw, wasm_rethrow: This is usually done in visitTargetIntrinsic,
3443 // but these intrinsics are special because they can be invoked, so we
3444 // manually lower it to a DAG node here.
3445 case Intrinsic::wasm_throw: {
3447 std::array<SDValue, 4> Ops = {
3448 getControlRoot(), // inchain for the terminator node
3449 DAG.getTargetConstant(Intrinsic::wasm_throw, getCurSDLoc(),
3451 getValue(I.getArgOperand(0)), // tag
3452 getValue(I.getArgOperand(1)) // thrown value
3453 };
3454 SDVTList VTs = DAG.getVTList(ArrayRef<EVT>({MVT::Other})); // outchain
3455 DAG.setRoot(DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops));
3456 break;
3457 }
3458 case Intrinsic::wasm_rethrow: {
3459 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3460 std::array<SDValue, 2> Ops = {
3461 getControlRoot(), // inchain for the terminator node
3462 DAG.getTargetConstant(Intrinsic::wasm_rethrow, getCurSDLoc(),
3463 TLI.getPointerTy(DAG.getDataLayout()))};
3464 SDVTList VTs = DAG.getVTList(ArrayRef<EVT>({MVT::Other})); // outchain
3465 DAG.setRoot(DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops));
3466 break;
3467 }
3468 }
3469 } else if (I.hasDeoptState()) {
3470 // Currently we do not lower any intrinsic calls with deopt operand bundles.
3471 // Eventually we will support lowering the @llvm.experimental.deoptimize
3472 // intrinsic, and right now there are no plans to support other intrinsics
3473 // with deopt state.
3474 LowerCallSiteWithDeoptBundle(&I, getValue(Callee), EHPadBB);
3475 } else if (I.countOperandBundlesOfType(LLVMContext::OB_ptrauth)) {
3477 } else {
3478 LowerCallTo(I, getValue(Callee), false, false, EHPadBB);
3479 }
3480
3481 // If the value of the invoke is used outside of its defining block, make it
3482 // available as a virtual register.
3483 // We already took care of the exported value for the statepoint instruction
3484 // during call to the LowerStatepoint.
3485 if (!isa<GCStatepointInst>(I)) {
3487 }
3488
3490 BranchProbabilityInfo *BPI = FuncInfo.BPI;
3491 BranchProbability EHPadBBProb =
3492 BPI ? BPI->getEdgeProbability(InvokeMBB->getBasicBlock(), EHPadBB)
3494 findUnwindDestinations(FuncInfo, EHPadBB, EHPadBBProb, UnwindDests);
3495
3496 // Update successor info.
3497 addSuccessorWithProb(InvokeMBB, Return);
3498 for (auto &UnwindDest : UnwindDests) {
3499 UnwindDest.first->setIsEHPad();
3500 addSuccessorWithProb(InvokeMBB, UnwindDest.first, UnwindDest.second);
3501 }
3502 InvokeMBB->normalizeSuccProbs();
3503
3504 // Drop into normal successor.
3505 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other, getControlRoot(),
3506 DAG.getBasicBlock(Return)));
3507}
3508
3509/// The intrinsics currently supported by callbr are implicit control flow
3510/// intrinsics such as amdgcn.kill.
3511/// - they should be called (no "dontcall-" attributes)
3512/// - they do not touch memory on the target (= !TLI.getTgtMemIntrinsic())
3513/// - they do not need custom argument handling (no
3514/// TLI.CollectTargetIntrinsicOperands())
3515void SelectionDAGBuilder::visitCallBrIntrinsic(const CallBrInst &I) {
3516#ifndef NDEBUG
3518 DAG.getTargetLoweringInfo().getTgtMemIntrinsic(
3519 Infos, I, DAG.getMachineFunction(), I.getIntrinsicID());
3520 assert(Infos.empty() && "Intrinsic touches memory");
3521#endif
3522
3523 auto [HasChain, OnlyLoad] = getTargetIntrinsicCallProperties(I);
3524
3526 getTargetIntrinsicOperands(I, HasChain, OnlyLoad);
3527 SDVTList VTs = getTargetIntrinsicVTList(I, HasChain);
3528
3529 // Create the node.
3530 SDValue Result =
3531 getTargetNonMemIntrinsicNode(*I.getType(), HasChain, Ops, VTs);
3532 Result = handleTargetIntrinsicRet(I, HasChain, OnlyLoad, Result);
3533
3534 setValue(&I, Result);
3535}
3536
3537void SelectionDAGBuilder::visitCallBr(const CallBrInst &I) {
3538 MachineBasicBlock *CallBrMBB = FuncInfo.MBB;
3539
3540 if (I.isInlineAsm()) {
3541 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
3542 // have to do anything here to lower funclet bundles.
3543 failForInvalidBundles(I, "callbrs",
3545 visitInlineAsm(I);
3546 } else {
3547 assert(!I.hasOperandBundles() &&
3548 "Can't have operand bundles for intrinsics");
3549 visitCallBrIntrinsic(I);
3550 }
3552
3553 // Retrieve successors.
3554 SmallPtrSet<BasicBlock *, 8> Dests;
3555 Dests.insert(I.getDefaultDest());
3556 MachineBasicBlock *Return = FuncInfo.getMBB(I.getDefaultDest());
3557
3558 // Update successor info.
3559 addSuccessorWithProb(CallBrMBB, Return, BranchProbability::getOne());
3560 // TODO: For most of the cases where there is an intrinsic callbr, we're
3561 // having exactly one indirect target, which will be unreachable. As soon as
3562 // this changes, we might need to enhance
3563 // Target->setIsInlineAsmBrIndirectTarget or add something similar for
3564 // intrinsic indirect branches.
3565 if (I.isInlineAsm()) {
3566 for (BasicBlock *Dest : I.getIndirectDests()) {
3567 MachineBasicBlock *Target = FuncInfo.getMBB(Dest);
3568 Target->setIsInlineAsmBrIndirectTarget();
3569 // If we introduce a type of asm goto statement that is permitted to use
3570 // an indirect call instruction to jump to its labels, then we should add
3571 // a call to Target->setMachineBlockAddressTaken() here, to mark the
3572 // target block as requiring a BTI.
3573
3574 Target->setLabelMustBeEmitted();
3575 // Don't add duplicate machine successors.
3576 if (Dests.insert(Dest).second)
3577 addSuccessorWithProb(CallBrMBB, Target, BranchProbability::getZero());
3578 }
3579 }
3580 CallBrMBB->normalizeSuccProbs();
3581
3582 // Drop into default successor.
3583 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(),
3584 MVT::Other, getControlRoot(),
3585 DAG.getBasicBlock(Return)));
3586}
3587
3588void SelectionDAGBuilder::visitResume(const ResumeInst &RI) {
3589 llvm_unreachable("SelectionDAGBuilder shouldn't visit resume instructions!");
3590}
3591
3592void SelectionDAGBuilder::visitLandingPad(const LandingPadInst &LP) {
3593 assert(FuncInfo.MBB->isEHPad() &&
3594 "Call to landingpad not in landing pad!");
3595
3596 // If there aren't registers to copy the values into (e.g., during SjLj
3597 // exceptions), then don't bother to create these DAG nodes.
3598 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3599 const Constant *PersonalityFn = FuncInfo.Fn->getPersonalityFn();
3600 if (TLI.getExceptionPointerRegister(PersonalityFn) == 0 &&
3601 TLI.getExceptionSelectorRegister(PersonalityFn) == 0)
3602 return;
3603
3604 // If landingpad's return type is token type, we don't create DAG nodes
3605 // for its exception pointer and selector value. The extraction of exception
3606 // pointer or selector value from token type landingpads is not currently
3607 // supported.
3608 if (LP.getType()->isTokenTy())
3609 return;
3610
3611 SmallVector<EVT, 2> ValueVTs;
3612 SDLoc dl = getCurSDLoc();
3613 ComputeValueVTs(TLI, DAG.getDataLayout(), LP.getType(), ValueVTs);
3614 assert(ValueVTs.size() == 2 && "Only two-valued landingpads are supported");
3615
3616 // Get the two live-in registers as SDValues. The physregs have already been
3617 // copied into virtual registers.
3618 SDValue Ops[2];
3619 if (FuncInfo.ExceptionPointerVirtReg) {
3620 Ops[0] = DAG.getZExtOrTrunc(
3621 DAG.getCopyFromReg(DAG.getEntryNode(), dl,
3622 FuncInfo.ExceptionPointerVirtReg,
3623 TLI.getPointerTy(DAG.getDataLayout())),
3624 dl, ValueVTs[0]);
3625 } else {
3626 Ops[0] = DAG.getConstant(0, dl, TLI.getPointerTy(DAG.getDataLayout()));
3627 }
3628 Ops[1] = DAG.getZExtOrTrunc(
3629 DAG.getCopyFromReg(DAG.getEntryNode(), dl,
3630 FuncInfo.ExceptionSelectorVirtReg,
3631 TLI.getPointerTy(DAG.getDataLayout())),
3632 dl, ValueVTs[1]);
3633
3634 // Merge into one.
3635 SDValue Res = DAG.getNode(ISD::MERGE_VALUES, dl,
3636 DAG.getVTList(ValueVTs), Ops);
3637 setValue(&LP, Res);
3638}
3639
3642 // Update JTCases.
3643 for (JumpTableBlock &JTB : SL->JTCases)
3644 if (JTB.first.HeaderBB == First)
3645 JTB.first.HeaderBB = Last;
3646
3647 // Update BitTestCases.
3648 for (BitTestBlock &BTB : SL->BitTestCases)
3649 if (BTB.Parent == First)
3650 BTB.Parent = Last;
3651}
3652
3653void SelectionDAGBuilder::visitIndirectBr(const IndirectBrInst &I) {
3654 MachineBasicBlock *IndirectBrMBB = FuncInfo.MBB;
3655
3656 // Update machine-CFG edges with unique successors.
3658 for (unsigned i = 0, e = I.getNumSuccessors(); i != e; ++i) {
3659 BasicBlock *BB = I.getSuccessor(i);
3660 bool Inserted = Done.insert(BB).second;
3661 if (!Inserted)
3662 continue;
3663
3664 MachineBasicBlock *Succ = FuncInfo.getMBB(BB);
3665 addSuccessorWithProb(IndirectBrMBB, Succ);
3666 }
3667 IndirectBrMBB->normalizeSuccProbs();
3668
3670 MVT::Other, getControlRoot(),
3671 getValue(I.getAddress())));
3672}
3673
3674void SelectionDAGBuilder::visitUnreachable(const UnreachableInst &I) {
3675 if (!I.shouldLowerToTrap(DAG.getTarget().Options.TrapUnreachable,
3676 DAG.getTarget().Options.NoTrapAfterNoreturn))
3677 return;
3678
3679 DAG.setRoot(DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, DAG.getRoot()));
3680}
3681
3682void SelectionDAGBuilder::visitUnary(const User &I, unsigned Opcode) {
3683 SDNodeFlags Flags;
3684 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3685 Flags.copyFMF(*FPOp);
3686
3687 SDValue Op = getValue(I.getOperand(0));
3688 SDValue UnNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op.getValueType(),
3689 Op, Flags);
3690 setValue(&I, UnNodeValue);
3691}
3692
3693void SelectionDAGBuilder::visitBinary(const User &I, unsigned Opcode) {
3694 SDNodeFlags Flags;
3695 if (auto *OFBinOp = dyn_cast<OverflowingBinaryOperator>(&I)) {
3696 Flags.setNoSignedWrap(OFBinOp->hasNoSignedWrap());
3697 Flags.setNoUnsignedWrap(OFBinOp->hasNoUnsignedWrap());
3698 }
3699 if (auto *ExactOp = dyn_cast<PossiblyExactOperator>(&I))
3700 Flags.setExact(ExactOp->isExact());
3701 if (auto *DisjointOp = dyn_cast<PossiblyDisjointInst>(&I))
3702 Flags.setDisjoint(DisjointOp->isDisjoint());
3703 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3704 Flags.copyFMF(*FPOp);
3705
3706 SDValue Op1 = getValue(I.getOperand(0));
3707 SDValue Op2 = getValue(I.getOperand(1));
3708 SDValue BinNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(),
3709 Op1, Op2, Flags);
3710 setValue(&I, BinNodeValue);
3711}
3712
3713void SelectionDAGBuilder::visitShift(const User &I, unsigned Opcode) {
3714 SDValue Op1 = getValue(I.getOperand(0));
3715 SDValue Op2 = getValue(I.getOperand(1));
3716
3717 EVT ShiftTy = DAG.getTargetLoweringInfo().getShiftAmountTy(
3718 Op1.getValueType(), DAG.getDataLayout());
3719
3720 // Coerce the shift amount to the right type if we can. This exposes the
3721 // truncate or zext to optimization early.
3722 if (!I.getType()->isVectorTy() && Op2.getValueType() != ShiftTy) {
3724 "Unexpected shift type");
3725 Op2 = DAG.getZExtOrTrunc(Op2, getCurSDLoc(), ShiftTy);
3726 }
3727
3728 bool nuw = false;
3729 bool nsw = false;
3730 bool exact = false;
3731
3732 if (Opcode == ISD::SRL || Opcode == ISD::SRA || Opcode == ISD::SHL) {
3733
3734 if (const OverflowingBinaryOperator *OFBinOp =
3736 nuw = OFBinOp->hasNoUnsignedWrap();
3737 nsw = OFBinOp->hasNoSignedWrap();
3738 }
3739 if (const PossiblyExactOperator *ExactOp =
3741 exact = ExactOp->isExact();
3742 }
3743 SDNodeFlags Flags;
3744 Flags.setExact(exact);
3745 Flags.setNoSignedWrap(nsw);
3746 Flags.setNoUnsignedWrap(nuw);
3747 SDValue Res = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(), Op1, Op2,
3748 Flags);
3749 setValue(&I, Res);
3750}
3751
3752void SelectionDAGBuilder::visitSDiv(const User &I) {
3753 SDValue Op1 = getValue(I.getOperand(0));
3754 SDValue Op2 = getValue(I.getOperand(1));
3755
3756 SDNodeFlags Flags;
3757 Flags.setExact(isa<PossiblyExactOperator>(&I) &&
3758 cast<PossiblyExactOperator>(&I)->isExact());
3759 setValue(&I, DAG.getNode(ISD::SDIV, getCurSDLoc(), Op1.getValueType(), Op1,
3760 Op2, Flags));
3761}
3762
3763void SelectionDAGBuilder::visitICmp(const ICmpInst &I) {
3764 ICmpInst::Predicate predicate = I.getPredicate();
3765 SDValue Op1 = getValue(I.getOperand(0));
3766 SDValue Op2 = getValue(I.getOperand(1));
3767 ISD::CondCode Opcode = getICmpCondCode(predicate);
3768
3769 auto &TLI = DAG.getTargetLoweringInfo();
3770 EVT MemVT =
3771 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
3772
3773 // If a pointer's DAG type is larger than its memory type then the DAG values
3774 // are zero-extended. This breaks signed comparisons so truncate back to the
3775 // underlying type before doing the compare.
3776 if (Op1.getValueType() != MemVT) {
3777 Op1 = DAG.getPtrExtOrTrunc(Op1, getCurSDLoc(), MemVT);
3778 Op2 = DAG.getPtrExtOrTrunc(Op2, getCurSDLoc(), MemVT);
3779 }
3780
3781 SDNodeFlags Flags;
3782 Flags.setSameSign(I.hasSameSign());
3783 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
3784
3785 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3786 I.getType());
3787 setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Opcode));
3788}
3789
3790void SelectionDAGBuilder::visitFCmp(const FCmpInst &I) {
3791 FCmpInst::Predicate predicate = I.getPredicate();
3792 SDValue Op1 = getValue(I.getOperand(0));
3793 SDValue Op2 = getValue(I.getOperand(1));
3794
3795 ISD::CondCode Condition = getFCmpCondCode(predicate);
3796 auto *FPMO = cast<FPMathOperator>(&I);
3797 if (FPMO->hasNoNaNs() ||
3798 (DAG.isKnownNeverNaN(Op1) && DAG.isKnownNeverNaN(Op2)))
3799 Condition = getFCmpCodeWithoutNaN(Condition);
3800
3801 SDNodeFlags Flags;
3802 Flags.copyFMF(*FPMO);
3803 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
3804
3805 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3806 I.getType());
3807 setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Condition,
3808 /*Chian=*/{}, /*IsSignaling=*/false, Flags));
3809}
3810
3811// Check if the condition of the select has one use or two users that are both
3812// selects with the same condition.
3813static bool hasOnlySelectUsers(const Value *Cond) {
3814 return llvm::all_of(Cond->users(), [](const Value *V) {
3815 return isa<SelectInst>(V);
3816 });
3817}
3818
3819void SelectionDAGBuilder::visitSelect(const User &I) {
3820 SmallVector<EVT, 4> ValueVTs;
3821 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
3822 ValueVTs);
3823 unsigned NumValues = ValueVTs.size();
3824 if (NumValues == 0) return;
3825
3826 SmallVector<SDValue, 4> Values(NumValues);
3827 SDValue Cond = getValue(I.getOperand(0));
3828 SDValue LHSVal = getValue(I.getOperand(1));
3829 SDValue RHSVal = getValue(I.getOperand(2));
3830 SmallVector<SDValue, 1> BaseOps(1, Cond);
3832 Cond.getValueType().isVector() ? ISD::VSELECT : ISD::SELECT;
3833
3834 bool IsUnaryAbs = false;
3835 bool Negate = false;
3836
3837 SDNodeFlags Flags;
3838 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3839 Flags.copyFMF(*FPOp);
3840
3841 Flags.setUnpredictable(
3842 cast<SelectInst>(I).getMetadata(LLVMContext::MD_unpredictable));
3843
3844 // Min/max matching is only viable if all output VTs are the same.
3845 if (all_equal(ValueVTs)) {
3846 EVT VT = ValueVTs[0];
3847 LLVMContext &Ctx = *DAG.getContext();
3848 auto &TLI = DAG.getTargetLoweringInfo();
3849
3850 // We care about the legality of the operation after it has been type
3851 // legalized.
3852 while (TLI.getTypeAction(Ctx, VT) != TargetLoweringBase::TypeLegal)
3853 VT = TLI.getTypeToTransformTo(Ctx, VT);
3854
3855 // If the vselect is legal, assume we want to leave this as a vector setcc +
3856 // vselect. Otherwise, if this is going to be scalarized, we want to see if
3857 // min/max is legal on the scalar type.
3858 bool UseScalarMinMax = VT.isVector() &&
3860
3861 // ValueTracking's select pattern matching does not account for -0.0,
3862 // so we can't lower to FMINIMUM/FMAXIMUM because those nodes specify that
3863 // -0.0 is less than +0.0.
3864 const Value *LHS, *RHS;
3865 auto SPR = matchSelectPattern(&I, LHS, RHS);
3867 switch (SPR.Flavor) {
3868 case SPF_UMAX: Opc = ISD::UMAX; break;
3869 case SPF_UMIN: Opc = ISD::UMIN; break;
3870 case SPF_SMAX: Opc = ISD::SMAX; break;
3871 case SPF_SMIN: Opc = ISD::SMIN; break;
3872 case SPF_FMINNUM:
3874 break;
3875
3876 switch (SPR.NaNBehavior) {
3877 case SPNB_NA: llvm_unreachable("No NaN behavior for FP op?");
3878 case SPNB_RETURNS_NAN: break;
3879 case SPNB_RETURNS_OTHER:
3881 Flags.setNoSignedZeros(true);
3882 break;
3883 case SPNB_RETURNS_ANY:
3885 (UseScalarMinMax &&
3887 Opc = ISD::FMINNUM;
3888 break;
3889 }
3890 break;
3891 case SPF_FMAXNUM:
3893 break;
3894
3895 switch (SPR.NaNBehavior) {
3896 case SPNB_NA: llvm_unreachable("No NaN behavior for FP op?");
3897 case SPNB_RETURNS_NAN: break;
3898 case SPNB_RETURNS_OTHER:
3900 Flags.setNoSignedZeros(true);
3901 break;
3902 case SPNB_RETURNS_ANY:
3904 (UseScalarMinMax &&
3906 Opc = ISD::FMAXNUM;
3907 break;
3908 }
3909 break;
3910 case SPF_NABS:
3911 Negate = true;
3912 [[fallthrough]];
3913 case SPF_ABS:
3914 IsUnaryAbs = true;
3915 Opc = ISD::ABS;
3916 break;
3917 default: break;
3918 }
3919
3920 if (!IsUnaryAbs && Opc != ISD::DELETED_NODE &&
3921 (TLI.isOperationLegalOrCustom(Opc, VT) ||
3922 (UseScalarMinMax &&
3924 // If the underlying comparison instruction is used by any other
3925 // instruction, the consumed instructions won't be destroyed, so it is
3926 // not profitable to convert to a min/max.
3928 OpCode = Opc;
3929 LHSVal = getValue(LHS);
3930 RHSVal = getValue(RHS);
3931 BaseOps.clear();
3932 }
3933
3934 if (IsUnaryAbs) {
3935 OpCode = Opc;
3936 LHSVal = getValue(LHS);
3937 BaseOps.clear();
3938 }
3939 }
3940
3941 if (IsUnaryAbs) {
3942 for (unsigned i = 0; i != NumValues; ++i) {
3943 SDLoc dl = getCurSDLoc();
3944 EVT VT = LHSVal.getNode()->getValueType(LHSVal.getResNo() + i);
3945 Values[i] =
3946 DAG.getNode(OpCode, dl, VT, LHSVal.getValue(LHSVal.getResNo() + i));
3947 if (Negate)
3948 Values[i] = DAG.getNegative(Values[i], dl, VT);
3949 }
3950 } else {
3951 for (unsigned i = 0; i != NumValues; ++i) {
3952 SmallVector<SDValue, 3> Ops(BaseOps.begin(), BaseOps.end());
3953 Ops.push_back(SDValue(LHSVal.getNode(), LHSVal.getResNo() + i));
3954 Ops.push_back(SDValue(RHSVal.getNode(), RHSVal.getResNo() + i));
3955 Values[i] = DAG.getNode(
3956 OpCode, getCurSDLoc(),
3957 LHSVal.getNode()->getValueType(LHSVal.getResNo() + i), Ops, Flags);
3958 }
3959 }
3960
3962 DAG.getVTList(ValueVTs), Values));
3963}
3964
3965void SelectionDAGBuilder::visitTrunc(const User &I) {
3966 // TruncInst cannot be a no-op cast because sizeof(src) > sizeof(dest).
3967 SDValue N = getValue(I.getOperand(0));
3968 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3969 I.getType());
3970 SDNodeFlags Flags;
3971 if (auto *Trunc = dyn_cast<TruncInst>(&I)) {
3972 Flags.setNoSignedWrap(Trunc->hasNoSignedWrap());
3973 Flags.setNoUnsignedWrap(Trunc->hasNoUnsignedWrap());
3974 }
3975
3976 setValue(&I, DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), DestVT, N, Flags));
3977}
3978
3979void SelectionDAGBuilder::visitZExt(const User &I) {
3980 // ZExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
3981 // ZExt also can't be a cast to bool for same reason. So, nothing much to do
3982 SDValue N = getValue(I.getOperand(0));
3983 auto &TLI = DAG.getTargetLoweringInfo();
3984 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
3985
3986 SDNodeFlags Flags;
3987 if (auto *PNI = dyn_cast<PossiblyNonNegInst>(&I))
3988 Flags.setNonNeg(PNI->hasNonNeg());
3989
3990 // Eagerly use nonneg information to canonicalize towards sign_extend if
3991 // that is the target's preference.
3992 // TODO: Let the target do this later.
3993 if (Flags.hasNonNeg() &&
3994 TLI.isSExtCheaperThanZExt(N.getValueType(), DestVT)) {
3995 setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));
3996 return;
3997 }
3998
3999 setValue(&I, DAG.getNode(ISD::ZERO_EXTEND, getCurSDLoc(), DestVT, N, Flags));
4000}
4001
4002void SelectionDAGBuilder::visitSExt(const User &I) {
4003 // SExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
4004 // SExt also can't be a cast to bool for same reason. So, nothing much to do
4005 SDValue N = getValue(I.getOperand(0));
4006 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4007 I.getType());
4008 setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));
4009}
4010
4011void SelectionDAGBuilder::visitFPTrunc(const User &I) {
4012 // FPTrunc is never a no-op cast, no need to check
4013 SDValue N = getValue(I.getOperand(0));
4014 SDLoc dl = getCurSDLoc();
4015 SDNodeFlags Flags;
4016 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
4017 Flags.copyFMF(*FPOp);
4018 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4019 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4020 setValue(&I, DAG.getNode(ISD::FP_ROUND, dl, DestVT, N,
4021 DAG.getTargetConstant(
4022 0, dl, TLI.getPointerTy(DAG.getDataLayout())),
4023 Flags));
4024}
4025
4026void SelectionDAGBuilder::visitFPExt(const User &I) {
4027 // FPExt is never a no-op cast, no need to check
4028 SDValue N = getValue(I.getOperand(0));
4029 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4030 I.getType());
4031 SDNodeFlags Flags;
4032 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
4033 Flags.copyFMF(*FPOp);
4034 setValue(&I, DAG.getNode(ISD::FP_EXTEND, getCurSDLoc(), DestVT, N, Flags));
4035}
4036
4037void SelectionDAGBuilder::visitFPToUI(const User &I) {
4038 // FPToUI is never a no-op cast, no need to check
4039 SDValue N = getValue(I.getOperand(0));
4040 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4041 I.getType());
4042 setValue(&I, DAG.getNode(ISD::FP_TO_UINT, getCurSDLoc(), DestVT, N));
4043}
4044
4045void SelectionDAGBuilder::visitFPToSI(const User &I) {
4046 // FPToSI is never a no-op cast, no need to check
4047 SDValue N = getValue(I.getOperand(0));
4048 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4049 I.getType());
4050 setValue(&I, DAG.getNode(ISD::FP_TO_SINT, getCurSDLoc(), DestVT, N));
4051}
4052
4053void SelectionDAGBuilder::visitUIToFP(const User &I) {
4054 // UIToFP is never a no-op cast, no need to check
4055 SDValue N = getValue(I.getOperand(0));
4056 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4057 I.getType());
4058 SDNodeFlags Flags;
4059 if (auto *PNI = dyn_cast<PossiblyNonNegInst>(&I))
4060 Flags.setNonNeg(PNI->hasNonNeg());
4061
4062 setValue(&I, DAG.getNode(ISD::UINT_TO_FP, getCurSDLoc(), DestVT, N, Flags));
4063}
4064
4065void SelectionDAGBuilder::visitSIToFP(const User &I) {
4066 // SIToFP is never a no-op cast, no need to check
4067 SDValue N = getValue(I.getOperand(0));
4068 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4069 I.getType());
4070 setValue(&I, DAG.getNode(ISD::SINT_TO_FP, getCurSDLoc(), DestVT, N));
4071}
4072
4073void SelectionDAGBuilder::visitPtrToAddr(const User &I) {
4074 SDValue N = getValue(I.getOperand(0));
4075 // By definition the type of the ptrtoaddr must be equal to the address type.
4076 const auto &TLI = DAG.getTargetLoweringInfo();
4077 EVT AddrVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4078 // The address width must be smaller or equal to the pointer representation
4079 // width, so we lower ptrtoaddr as a truncate (possibly folded to a no-op).
4080 N = DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), AddrVT, N);
4081 setValue(&I, N);
4082}
4083
4084void SelectionDAGBuilder::visitPtrToInt(const User &I) {
4085 // What to do depends on the size of the integer and the size of the pointer.
4086 // We can either truncate, zero extend, or no-op, accordingly.
4087 SDValue N = getValue(I.getOperand(0));
4088 auto &TLI = DAG.getTargetLoweringInfo();
4089 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4090 I.getType());
4091 EVT PtrMemVT =
4092 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
4093 N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), PtrMemVT);
4094 N = DAG.getZExtOrTrunc(N, getCurSDLoc(), DestVT);
4095 setValue(&I, N);
4096}
4097
4098void SelectionDAGBuilder::visitIntToPtr(const User &I) {
4099 // What to do depends on the size of the integer and the size of the pointer.
4100 // We can either truncate, zero extend, or no-op, accordingly.
4101 SDValue N = getValue(I.getOperand(0));
4102 auto &TLI = DAG.getTargetLoweringInfo();
4103 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4104 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(), I.getType());
4105 N = DAG.getZExtOrTrunc(N, getCurSDLoc(), PtrMemVT);
4106 N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), DestVT);
4107 setValue(&I, N);
4108}
4109
4110void SelectionDAGBuilder::visitBitCast(const User &I) {
4111 SDValue N = getValue(I.getOperand(0));
4112 SDLoc dl = getCurSDLoc();
4113 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4114 I.getType());
4115
4116 // BitCast assures us that source and destination are the same size so this is
4117 // either a BITCAST or a no-op.
4118 if (DestVT != N.getValueType())
4119 setValue(&I, DAG.getNode(ISD::BITCAST, dl,
4120 DestVT, N)); // convert types.
4121 // Check if the original LLVM IR Operand was a ConstantInt, because getValue()
4122 // might fold any kind of constant expression to an integer constant and that
4123 // is not what we are looking for. Only recognize a bitcast of a genuine
4124 // constant integer as an opaque constant.
4125 else if(ConstantInt *C = dyn_cast<ConstantInt>(I.getOperand(0)))
4126 setValue(&I, DAG.getConstant(C->getValue(), dl, DestVT, /*isTarget=*/false,
4127 /*isOpaque*/true));
4128 else
4129 setValue(&I, N); // noop cast.
4130}
4131
4132void SelectionDAGBuilder::visitAddrSpaceCast(const User &I) {
4133 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4134 const Value *SV = I.getOperand(0);
4135 SDValue N = getValue(SV);
4136 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4137
4138 unsigned SrcAS = SV->getType()->getPointerAddressSpace();
4139 unsigned DestAS = I.getType()->getPointerAddressSpace();
4140
4141 if (!TM.isNoopAddrSpaceCast(SrcAS, DestAS))
4142 N = DAG.getAddrSpaceCast(getCurSDLoc(), DestVT, N, SrcAS, DestAS);
4143
4144 setValue(&I, N);
4145}
4146
4147void SelectionDAGBuilder::visitInsertElement(const User &I) {
4148 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4149 SDValue InVec = getValue(I.getOperand(0));
4150 SDValue InVal = getValue(I.getOperand(1));
4151 SDValue InIdx = DAG.getZExtOrTrunc(getValue(I.getOperand(2)), getCurSDLoc(),
4152 TLI.getVectorIdxTy(DAG.getDataLayout()));
4154 TLI.getValueType(DAG.getDataLayout(), I.getType()),
4155 InVec, InVal, InIdx));
4156}
4157
4158void SelectionDAGBuilder::visitExtractElement(const User &I) {
4159 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4160 SDValue InVec = getValue(I.getOperand(0));
4161 SDValue InIdx = DAG.getZExtOrTrunc(getValue(I.getOperand(1)), getCurSDLoc(),
4162 TLI.getVectorIdxTy(DAG.getDataLayout()));
4164 TLI.getValueType(DAG.getDataLayout(), I.getType()),
4165 InVec, InIdx));
4166}
4167
4168void SelectionDAGBuilder::visitShuffleVector(const User &I) {
4169 SDValue Src1 = getValue(I.getOperand(0));
4170 SDValue Src2 = getValue(I.getOperand(1));
4171 ArrayRef<int> Mask;
4172 if (auto *SVI = dyn_cast<ShuffleVectorInst>(&I))
4173 Mask = SVI->getShuffleMask();
4174 else
4175 Mask = cast<ConstantExpr>(I).getShuffleMask();
4176 SDLoc DL = getCurSDLoc();
4177 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4178 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4179 EVT SrcVT = Src1.getValueType();
4180
4181 if (all_of(Mask, equal_to(0)) && VT.isScalableVector()) {
4182 // Canonical splat form of first element of first input vector.
4183 SDValue FirstElt =
4184 DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, SrcVT.getScalarType(), Src1,
4185 DAG.getVectorIdxConstant(0, DL));
4186 setValue(&I, DAG.getNode(ISD::SPLAT_VECTOR, DL, VT, FirstElt));
4187 return;
4188 }
4189
4190 // For now, we only handle splats for scalable vectors.
4191 // The DAGCombiner will perform a BUILD_VECTOR -> SPLAT_VECTOR transformation
4192 // for targets that support a SPLAT_VECTOR for non-scalable vector types.
4193 assert(!VT.isScalableVector() && "Unsupported scalable vector shuffle");
4194
4195 unsigned SrcNumElts = SrcVT.getVectorNumElements();
4196 unsigned MaskNumElts = Mask.size();
4197
4198 if (SrcNumElts == MaskNumElts) {
4199 setValue(&I, DAG.getVectorShuffle(VT, DL, Src1, Src2, Mask));
4200 return;
4201 }
4202
4203 // Normalize the shuffle vector since mask and vector length don't match.
4204 if (SrcNumElts < MaskNumElts) {
4205 // Mask is longer than the source vectors. We can use concatenate vector to
4206 // make the mask and vectors lengths match.
4207
4208 if (MaskNumElts % SrcNumElts == 0) {
4209 // Mask length is a multiple of the source vector length.
4210 // Check if the shuffle is some kind of concatenation of the input
4211 // vectors.
4212 unsigned NumConcat = MaskNumElts / SrcNumElts;
4213 bool IsConcat = true;
4214 SmallVector<int, 8> ConcatSrcs(NumConcat, -1);
4215 for (unsigned i = 0; i != MaskNumElts; ++i) {
4216 int Idx = Mask[i];
4217 if (Idx < 0)
4218 continue;
4219 // Ensure the indices in each SrcVT sized piece are sequential and that
4220 // the same source is used for the whole piece.
4221 if ((Idx % SrcNumElts != (i % SrcNumElts)) ||
4222 (ConcatSrcs[i / SrcNumElts] >= 0 &&
4223 ConcatSrcs[i / SrcNumElts] != (int)(Idx / SrcNumElts))) {
4224 IsConcat = false;
4225 break;
4226 }
4227 // Remember which source this index came from.
4228 ConcatSrcs[i / SrcNumElts] = Idx / SrcNumElts;
4229 }
4230
4231 // The shuffle is concatenating multiple vectors together. Just emit
4232 // a CONCAT_VECTORS operation.
4233 if (IsConcat) {
4234 SmallVector<SDValue, 8> ConcatOps;
4235 for (auto Src : ConcatSrcs) {
4236 if (Src < 0)
4237 ConcatOps.push_back(DAG.getUNDEF(SrcVT));
4238 else if (Src == 0)
4239 ConcatOps.push_back(Src1);
4240 else
4241 ConcatOps.push_back(Src2);
4242 }
4243 setValue(&I, DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, ConcatOps));
4244 return;
4245 }
4246 }
4247
4248 unsigned PaddedMaskNumElts = alignTo(MaskNumElts, SrcNumElts);
4249 unsigned NumConcat = PaddedMaskNumElts / SrcNumElts;
4250 EVT PaddedVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(),
4251 PaddedMaskNumElts);
4252
4253 // Pad both vectors with undefs to make them the same length as the mask.
4254 SDValue UndefVal = DAG.getUNDEF(SrcVT);
4255
4256 SmallVector<SDValue, 8> MOps1(NumConcat, UndefVal);
4257 SmallVector<SDValue, 8> MOps2(NumConcat, UndefVal);
4258 MOps1[0] = Src1;
4259 MOps2[0] = Src2;
4260
4261 Src1 = DAG.getNode(ISD::CONCAT_VECTORS, DL, PaddedVT, MOps1);
4262 Src2 = DAG.getNode(ISD::CONCAT_VECTORS, DL, PaddedVT, MOps2);
4263
4264 // Readjust mask for new input vector length.
4265 SmallVector<int, 8> MappedOps(PaddedMaskNumElts, -1);
4266 for (unsigned i = 0; i != MaskNumElts; ++i) {
4267 int Idx = Mask[i];
4268 if (Idx >= (int)SrcNumElts)
4269 Idx -= SrcNumElts - PaddedMaskNumElts;
4270 MappedOps[i] = Idx;
4271 }
4272
4273 SDValue Result = DAG.getVectorShuffle(PaddedVT, DL, Src1, Src2, MappedOps);
4274
4275 // If the concatenated vector was padded, extract a subvector with the
4276 // correct number of elements.
4277 if (MaskNumElts != PaddedMaskNumElts)
4278 Result = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Result,
4279 DAG.getVectorIdxConstant(0, DL));
4280
4281 setValue(&I, Result);
4282 return;
4283 }
4284
4285 assert(SrcNumElts > MaskNumElts);
4286
4287 // Analyze the access pattern of the vector to see if we can extract
4288 // two subvectors and do the shuffle.
4289 int StartIdx[2] = {-1, -1}; // StartIdx to extract from
4290 bool CanExtract = true;
4291 for (int Idx : Mask) {
4292 unsigned Input = 0;
4293 if (Idx < 0)
4294 continue;
4295
4296 if (Idx >= (int)SrcNumElts) {
4297 Input = 1;
4298 Idx -= SrcNumElts;
4299 }
4300
4301 // If all the indices come from the same MaskNumElts sized portion of
4302 // the sources we can use extract. Also make sure the extract wouldn't
4303 // extract past the end of the source.
4304 int NewStartIdx = alignDown(Idx, MaskNumElts);
4305 if (NewStartIdx + MaskNumElts > SrcNumElts ||
4306 (StartIdx[Input] >= 0 && StartIdx[Input] != NewStartIdx))
4307 CanExtract = false;
4308 // Make sure we always update StartIdx as we use it to track if all
4309 // elements are undef.
4310 StartIdx[Input] = NewStartIdx;
4311 }
4312
4313 if (StartIdx[0] < 0 && StartIdx[1] < 0) {
4314 setValue(&I, DAG.getUNDEF(VT)); // Vectors are not used.
4315 return;
4316 }
4317 if (CanExtract) {
4318 // Extract appropriate subvector and generate a vector shuffle
4319 for (unsigned Input = 0; Input < 2; ++Input) {
4320 SDValue &Src = Input == 0 ? Src1 : Src2;
4321 if (StartIdx[Input] < 0)
4322 Src = DAG.getUNDEF(VT);
4323 else {
4324 Src = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Src,
4325 DAG.getVectorIdxConstant(StartIdx[Input], DL));
4326 }
4327 }
4328
4329 // Calculate new mask.
4330 SmallVector<int, 8> MappedOps(Mask);
4331 for (int &Idx : MappedOps) {
4332 if (Idx >= (int)SrcNumElts)
4333 Idx -= SrcNumElts + StartIdx[1] - MaskNumElts;
4334 else if (Idx >= 0)
4335 Idx -= StartIdx[0];
4336 }
4337
4338 setValue(&I, DAG.getVectorShuffle(VT, DL, Src1, Src2, MappedOps));
4339 return;
4340 }
4341
4342 // We can't use either concat vectors or extract subvectors so fall back to
4343 // replacing the shuffle with extract and build vector.
4344 // to insert and build vector.
4345 EVT EltVT = VT.getVectorElementType();
4347 for (int Idx : Mask) {
4348 SDValue Res;
4349
4350 if (Idx < 0) {
4351 Res = DAG.getUNDEF(EltVT);
4352 } else {
4353 SDValue &Src = Idx < (int)SrcNumElts ? Src1 : Src2;
4354 if (Idx >= (int)SrcNumElts) Idx -= SrcNumElts;
4355
4356 Res = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Src,
4357 DAG.getVectorIdxConstant(Idx, DL));
4358 }
4359
4360 Ops.push_back(Res);
4361 }
4362
4363 setValue(&I, DAG.getBuildVector(VT, DL, Ops));
4364}
4365
4366void SelectionDAGBuilder::visitInsertValue(const InsertValueInst &I) {
4367 ArrayRef<unsigned> Indices = I.getIndices();
4368 const Value *Op0 = I.getOperand(0);
4369 const Value *Op1 = I.getOperand(1);
4370 Type *AggTy = I.getType();
4371 Type *ValTy = Op1->getType();
4372 bool IntoUndef = isa<UndefValue>(Op0);
4373 bool FromUndef = isa<UndefValue>(Op1);
4374
4375 unsigned LinearIndex = ComputeLinearIndex(AggTy, Indices);
4376
4377 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4378 SmallVector<EVT, 4> AggValueVTs;
4379 ComputeValueVTs(TLI, DAG.getDataLayout(), AggTy, AggValueVTs);
4380 SmallVector<EVT, 4> ValValueVTs;
4381 ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);
4382
4383 unsigned NumAggValues = AggValueVTs.size();
4384 unsigned NumValValues = ValValueVTs.size();
4385 SmallVector<SDValue, 4> Values(NumAggValues);
4386
4387 // Ignore an insertvalue that produces an empty object
4388 if (!NumAggValues) {
4389 setValue(&I, DAG.getUNDEF(MVT(MVT::Other)));
4390 return;
4391 }
4392
4393 SDValue Agg = getValue(Op0);
4394 unsigned i = 0;
4395 // Copy the beginning value(s) from the original aggregate.
4396 for (; i != LinearIndex; ++i)
4397 Values[i] = IntoUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4398 SDValue(Agg.getNode(), Agg.getResNo() + i);
4399 // Copy values from the inserted value(s).
4400 if (NumValValues) {
4401 SDValue Val = getValue(Op1);
4402 for (; i != LinearIndex + NumValValues; ++i)
4403 Values[i] = FromUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4404 SDValue(Val.getNode(), Val.getResNo() + i - LinearIndex);
4405 }
4406 // Copy remaining value(s) from the original aggregate.
4407 for (; i != NumAggValues; ++i)
4408 Values[i] = IntoUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4409 SDValue(Agg.getNode(), Agg.getResNo() + i);
4410
4412 DAG.getVTList(AggValueVTs), Values));
4413}
4414
4415void SelectionDAGBuilder::visitExtractValue(const ExtractValueInst &I) {
4416 ArrayRef<unsigned> Indices = I.getIndices();
4417 const Value *Op0 = I.getOperand(0);
4418 Type *AggTy = Op0->getType();
4419 Type *ValTy = I.getType();
4420 bool OutOfUndef = isa<UndefValue>(Op0);
4421
4422 unsigned LinearIndex = ComputeLinearIndex(AggTy, Indices);
4423
4424 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4425 SmallVector<EVT, 4> ValValueVTs;
4426 ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);
4427
4428 unsigned NumValValues = ValValueVTs.size();
4429
4430 // Ignore a extractvalue that produces an empty object
4431 if (!NumValValues) {
4432 setValue(&I, DAG.getUNDEF(MVT(MVT::Other)));
4433 return;
4434 }
4435
4436 SmallVector<SDValue, 4> Values(NumValValues);
4437
4438 SDValue Agg = getValue(Op0);
4439 // Copy out the selected value(s).
4440 for (unsigned i = LinearIndex; i != LinearIndex + NumValValues; ++i)
4441 Values[i - LinearIndex] =
4442 OutOfUndef ?
4443 DAG.getUNDEF(Agg.getNode()->getValueType(Agg.getResNo() + i)) :
4444 SDValue(Agg.getNode(), Agg.getResNo() + i);
4445
4447 DAG.getVTList(ValValueVTs), Values));
4448}
4449
4450void SelectionDAGBuilder::visitGetElementPtr(const User &I) {
4451 Value *Op0 = I.getOperand(0);
4452 // Note that the pointer operand may be a vector of pointers. Take the scalar
4453 // element which holds a pointer.
4454 unsigned AS = Op0->getType()->getScalarType()->getPointerAddressSpace();
4455 SDValue N = getValue(Op0);
4456 SDLoc dl = getCurSDLoc();
4457 auto &TLI = DAG.getTargetLoweringInfo();
4458 GEPNoWrapFlags NW = cast<GEPOperator>(I).getNoWrapFlags();
4459
4460 // For a vector GEP, keep the prefix scalar as long as possible, then
4461 // convert any scalars encountered after the first vector operand to vectors.
4462 bool IsVectorGEP = I.getType()->isVectorTy();
4463 ElementCount VectorElementCount =
4464 IsVectorGEP ? cast<VectorType>(I.getType())->getElementCount()
4466
4468 GTI != E; ++GTI) {
4469 const Value *Idx = GTI.getOperand();
4470 if (StructType *StTy = GTI.getStructTypeOrNull()) {
4471 unsigned Field = cast<Constant>(Idx)->getUniqueInteger().getZExtValue();
4472 if (Field) {
4473 // N = N + Offset
4474 uint64_t Offset =
4475 DAG.getDataLayout().getStructLayout(StTy)->getElementOffset(Field);
4476
4477 // In an inbounds GEP with an offset that is nonnegative even when
4478 // interpreted as signed, assume there is no unsigned overflow.
4479 SDNodeFlags Flags;
4480 if (NW.hasNoUnsignedWrap() ||
4481 (int64_t(Offset) >= 0 && NW.hasNoUnsignedSignedWrap()))
4483 Flags.setInBounds(NW.isInBounds());
4484
4485 N = DAG.getMemBasePlusOffset(
4486 N, DAG.getConstant(Offset, dl, N.getValueType()), dl, Flags);
4487 }
4488 } else {
4489 // IdxSize is the width of the arithmetic according to IR semantics.
4490 // In SelectionDAG, we may prefer to do arithmetic in a wider bitwidth
4491 // (and fix up the result later).
4492 unsigned IdxSize = DAG.getDataLayout().getIndexSizeInBits(AS);
4493 MVT IdxTy = MVT::getIntegerVT(IdxSize);
4494 TypeSize ElementSize =
4495 GTI.getSequentialElementStride(DAG.getDataLayout());
4496 // We intentionally mask away the high bits here; ElementSize may not
4497 // fit in IdxTy.
4498 APInt ElementMul(IdxSize, ElementSize.getKnownMinValue(),
4499 /*isSigned=*/false, /*implicitTrunc=*/true);
4500 bool ElementScalable = ElementSize.isScalable();
4501
4502 // If this is a scalar constant or a splat vector of constants,
4503 // handle it quickly.
4504 const auto *C = dyn_cast<Constant>(Idx);
4505 if (C && isa<VectorType>(C->getType()))
4506 C = C->getSplatValue();
4507
4508 const auto *CI = dyn_cast_or_null<ConstantInt>(C);
4509 if (CI && CI->isZero())
4510 continue;
4511 if (CI && !ElementScalable) {
4512 APInt Offs = ElementMul * CI->getValue().sextOrTrunc(IdxSize);
4513 LLVMContext &Context = *DAG.getContext();
4514 SDValue OffsVal;
4515 if (N.getValueType().isVector())
4516 OffsVal = DAG.getConstant(
4517 Offs, dl, EVT::getVectorVT(Context, IdxTy, VectorElementCount));
4518 else
4519 OffsVal = DAG.getConstant(Offs, dl, IdxTy);
4520
4521 // In an inbounds GEP with an offset that is nonnegative even when
4522 // interpreted as signed, assume there is no unsigned overflow.
4523 SDNodeFlags Flags;
4524 if (NW.hasNoUnsignedWrap() ||
4525 (Offs.isNonNegative() && NW.hasNoUnsignedSignedWrap()))
4526 Flags.setNoUnsignedWrap(true);
4527 Flags.setInBounds(NW.isInBounds());
4528
4529 OffsVal = DAG.getSExtOrTrunc(OffsVal, dl, N.getValueType());
4530
4531 N = DAG.getMemBasePlusOffset(N, OffsVal, dl, Flags);
4532 continue;
4533 }
4534
4535 // N = N + Idx * ElementMul;
4536 SDValue IdxN = getValue(Idx);
4537
4538 if (IdxN.getValueType().isVector() != N.getValueType().isVector()) {
4539 if (N.getValueType().isVector()) {
4540 EVT VT = EVT::getVectorVT(*Context, IdxN.getValueType(),
4541 VectorElementCount);
4542 IdxN = DAG.getSplat(VT, dl, IdxN);
4543 } else {
4544 EVT VT =
4545 EVT::getVectorVT(*Context, N.getValueType(), VectorElementCount);
4546 N = DAG.getSplat(VT, dl, N);
4547 }
4548 }
4549
4550 // If the index is smaller or larger than intptr_t, truncate or extend
4551 // it.
4552 IdxN = DAG.getSExtOrTrunc(IdxN, dl, N.getValueType());
4553
4554 SDNodeFlags ScaleFlags;
4555 // The multiplication of an index by the type size does not wrap the
4556 // pointer index type in a signed sense (mul nsw).
4558
4559 // The multiplication of an index by the type size does not wrap the
4560 // pointer index type in an unsigned sense (mul nuw).
4561 ScaleFlags.setNoUnsignedWrap(NW.hasNoUnsignedWrap());
4562
4563 if (ElementScalable) {
4564 EVT VScaleTy = N.getValueType().getScalarType();
4565 SDValue VScale = DAG.getNode(
4566 ISD::VSCALE, dl, VScaleTy,
4567 DAG.getConstant(ElementMul.getZExtValue(), dl, VScaleTy));
4568 if (N.getValueType().isVector())
4569 VScale = DAG.getSplatVector(N.getValueType(), dl, VScale);
4570 IdxN = DAG.getNode(ISD::MUL, dl, N.getValueType(), IdxN, VScale,
4571 ScaleFlags);
4572 } else {
4573 // If this is a multiply by a power of two, turn it into a shl
4574 // immediately. This is a very common case.
4575 if (ElementMul != 1) {
4576 if (ElementMul.isPowerOf2()) {
4577 unsigned Amt = ElementMul.logBase2();
4578 IdxN = DAG.getNode(
4579 ISD::SHL, dl, N.getValueType(), IdxN,
4580 DAG.getShiftAmountConstant(Amt, N.getValueType(), dl),
4581 ScaleFlags);
4582 } else {
4583 SDValue Scale = DAG.getConstant(ElementMul.getZExtValue(), dl,
4584 IdxN.getValueType());
4585 IdxN = DAG.getNode(ISD::MUL, dl, N.getValueType(), IdxN, Scale,
4586 ScaleFlags);
4587 }
4588 }
4589 }
4590
4591 // The successive addition of the current address, truncated to the
4592 // pointer index type and interpreted as an unsigned number, and each
4593 // offset, also interpreted as an unsigned number, does not wrap the
4594 // pointer index type (add nuw).
4595 SDNodeFlags AddFlags;
4596 AddFlags.setNoUnsignedWrap(NW.hasNoUnsignedWrap());
4597 AddFlags.setInBounds(NW.isInBounds());
4598
4599 N = DAG.getMemBasePlusOffset(N, IdxN, dl, AddFlags);
4600 }
4601 }
4602
4603 if (IsVectorGEP && !N.getValueType().isVector()) {
4604 EVT VT = EVT::getVectorVT(*Context, N.getValueType(), VectorElementCount);
4605 N = DAG.getSplat(VT, dl, N);
4606 }
4607
4608 MVT PtrTy = TLI.getPointerTy(DAG.getDataLayout(), AS);
4609 MVT PtrMemTy = TLI.getPointerMemTy(DAG.getDataLayout(), AS);
4610 if (IsVectorGEP) {
4611 PtrTy = MVT::getVectorVT(PtrTy, VectorElementCount);
4612 PtrMemTy = MVT::getVectorVT(PtrMemTy, VectorElementCount);
4613 }
4614
4615 if (PtrMemTy != PtrTy && !cast<GEPOperator>(I).isInBounds())
4616 N = DAG.getPtrExtendInReg(N, dl, PtrMemTy);
4617
4618 setValue(&I, N);
4619}
4620
4621void SelectionDAGBuilder::visitAlloca(const AllocaInst &I) {
4622 // If this is a fixed sized alloca in the entry block of the function,
4623 // allocate it statically on the stack.
4624 if (FuncInfo.StaticAllocaMap.count(&I))
4625 return; // getValue will auto-populate this.
4626
4627 SDLoc dl = getCurSDLoc();
4628 Type *Ty = I.getAllocatedType();
4629 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4630 auto &DL = DAG.getDataLayout();
4631 TypeSize TySize = DL.getTypeAllocSize(Ty);
4632 MaybeAlign Alignment = I.getAlign();
4633
4634 SDValue AllocSize = getValue(I.getArraySize());
4635
4636 EVT IntPtr = TLI.getPointerTy(DL, I.getAddressSpace());
4637 if (AllocSize.getValueType() != IntPtr)
4638 AllocSize = DAG.getZExtOrTrunc(AllocSize, dl, IntPtr);
4639
4640 AllocSize = DAG.getNode(
4641 ISD::MUL, dl, IntPtr, AllocSize,
4642 DAG.getZExtOrTrunc(DAG.getTypeSize(dl, MVT::i64, TySize), dl, IntPtr));
4643
4644 // Handle alignment. If the requested alignment is less than or equal to
4645 // the stack alignment, ignore it. If the size is greater than or equal to
4646 // the stack alignment, we note this in the DYNAMIC_STACKALLOC node.
4647 Align StackAlign = DAG.getSubtarget().getFrameLowering()->getStackAlign();
4648 if (*Alignment <= StackAlign)
4649 Alignment = std::nullopt;
4650
4651 const uint64_t StackAlignMask = StackAlign.value() - 1U;
4652 // Round the size of the allocation up to the stack alignment size
4653 // by add SA-1 to the size. This doesn't overflow because we're computing
4654 // an address inside an alloca.
4655 AllocSize = DAG.getNode(ISD::ADD, dl, AllocSize.getValueType(), AllocSize,
4656 DAG.getConstant(StackAlignMask, dl, IntPtr),
4658
4659 // Mask out the low bits for alignment purposes.
4660 AllocSize = DAG.getNode(ISD::AND, dl, AllocSize.getValueType(), AllocSize,
4661 DAG.getSignedConstant(~StackAlignMask, dl, IntPtr));
4662
4663 SDValue Ops[] = {
4664 getRoot(), AllocSize,
4665 DAG.getConstant(Alignment ? Alignment->value() : 0, dl, IntPtr)};
4666 SDVTList VTs = DAG.getVTList(AllocSize.getValueType(), MVT::Other);
4667 SDValue DSA = DAG.getNode(ISD::DYNAMIC_STACKALLOC, dl, VTs, Ops);
4668 setValue(&I, DSA);
4669 DAG.setRoot(DSA.getValue(1));
4670
4671 assert(FuncInfo.MF->getFrameInfo().hasVarSizedObjects());
4672}
4673
4674static const MDNode *getRangeMetadata(const Instruction &I) {
4675 return I.getMetadata(LLVMContext::MD_range);
4676}
4677
4678static std::optional<ConstantRange> getRange(const Instruction &I) {
4679 if (const auto *CB = dyn_cast<CallBase>(&I))
4680 if (std::optional<ConstantRange> CR = CB->getRange())
4681 return CR;
4682 if (const MDNode *Range = getRangeMetadata(I))
4684 return std::nullopt;
4685}
4686
4688 if (const auto *CB = dyn_cast<CallBase>(&I))
4689 return CB->getRetNoFPClass();
4690 return fcNone;
4691}
4692
4693void SelectionDAGBuilder::visitLoad(const LoadInst &I) {
4694 if (I.isAtomic())
4695 return visitAtomicLoad(I);
4696
4697 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4698 const Value *SV = I.getOperand(0);
4699 if (TLI.supportSwiftError()) {
4700 // Swifterror values can come from either a function parameter with
4701 // swifterror attribute or an alloca with swifterror attribute.
4702 if (const Argument *Arg = dyn_cast<Argument>(SV)) {
4703 if (Arg->hasSwiftErrorAttr())
4704 return visitLoadFromSwiftError(I);
4705 }
4706
4707 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(SV)) {
4708 if (Alloca->isSwiftError())
4709 return visitLoadFromSwiftError(I);
4710 }
4711 }
4712
4713 SDValue Ptr = getValue(SV);
4714
4715 Type *Ty = I.getType();
4716 SmallVector<EVT, 4> ValueVTs, MemVTs;
4718 ComputeValueVTs(TLI, DAG.getDataLayout(), Ty, ValueVTs, &MemVTs, &Offsets);
4719 unsigned NumValues = ValueVTs.size();
4720 if (NumValues == 0)
4721 return;
4722
4723 Align Alignment = I.getAlign();
4724 AAMDNodes AAInfo = I.getAAMetadata();
4725 const MDNode *Ranges = getRangeMetadata(I);
4726 bool isVolatile = I.isVolatile();
4727 MachineMemOperand::Flags MMOFlags =
4728 TLI.getLoadMemOperandFlags(I, DAG.getDataLayout(), AC, LibInfo);
4729
4730 SDValue Root;
4731 bool ConstantMemory = false;
4732 if (isVolatile)
4733 // Serialize volatile loads with other side effects.
4734 Root = getRoot();
4735 else if (NumValues > MaxParallelChains)
4736 Root = getMemoryRoot();
4737 else if (BatchAA &&
4738 BatchAA->pointsToConstantMemory(MemoryLocation(
4739 SV,
4740 LocationSize::precise(DAG.getDataLayout().getTypeStoreSize(Ty)),
4741 AAInfo))) {
4742 // Do not serialize (non-volatile) loads of constant memory with anything.
4743 Root = DAG.getEntryNode();
4744 ConstantMemory = true;
4746 } else {
4747 // Do not serialize non-volatile loads against each other.
4748 Root = DAG.getRoot();
4749 }
4750
4751 SDLoc dl = getCurSDLoc();
4752
4753 if (isVolatile)
4754 Root = TLI.prepareVolatileOrAtomicLoad(Root, dl, DAG);
4755
4756 SmallVector<SDValue, 4> Values(NumValues);
4757 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4758
4759 unsigned ChainI = 0;
4760 for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
4761 // Serializing loads here may result in excessive register pressure, and
4762 // TokenFactor places arbitrary choke points on the scheduler. SD scheduling
4763 // could recover a bit by hoisting nodes upward in the chain by recognizing
4764 // they are side-effect free or do not alias. The optimizer should really
4765 // avoid this case by converting large object/array copies to llvm.memcpy
4766 // (MaxParallelChains should always remain as failsafe).
4767 if (ChainI == MaxParallelChains) {
4768 assert(PendingLoads.empty() && "PendingLoads must be serialized first");
4769 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4770 ArrayRef(Chains.data(), ChainI));
4771 Root = Chain;
4772 ChainI = 0;
4773 }
4774
4775 // TODO: MachinePointerInfo only supports a fixed length offset.
4776 MachinePointerInfo PtrInfo =
4777 !Offsets[i].isScalable() || Offsets[i].isZero()
4778 ? MachinePointerInfo(SV, Offsets[i].getKnownMinValue())
4779 : MachinePointerInfo();
4780
4781 SDValue A = DAG.getObjectPtrOffset(dl, Ptr, Offsets[i]);
4782 SDValue L = DAG.getLoad(MemVTs[i], dl, Root, A, PtrInfo, Alignment,
4783 MMOFlags, AAInfo, Ranges);
4784 Chains[ChainI] = L.getValue(1);
4785
4786 if (MemVTs[i] != ValueVTs[i])
4787 L = DAG.getPtrExtOrTrunc(L, dl, ValueVTs[i]);
4788
4789 if (MDNode *NoFPClassMD = I.getMetadata(LLVMContext::MD_nofpclass)) {
4790 uint64_t FPTestInt =
4791 cast<ConstantInt>(
4792 cast<ConstantAsMetadata>(NoFPClassMD->getOperand(0))->getValue())
4793 ->getZExtValue();
4794 if (FPTestInt != fcNone) {
4795 SDValue FPTestConst =
4796 DAG.getTargetConstant(FPTestInt, SDLoc(), MVT::i32);
4797 L = DAG.getNode(ISD::AssertNoFPClass, dl, L.getValueType(), L,
4798 FPTestConst);
4799 }
4800 }
4801 Values[i] = L;
4802 }
4803
4804 if (!ConstantMemory) {
4805 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4806 ArrayRef(Chains.data(), ChainI));
4807 if (isVolatile)
4808 DAG.setRoot(Chain);
4809 else
4810 PendingLoads.push_back(Chain);
4811 }
4812
4813 setValue(&I, DAG.getNode(ISD::MERGE_VALUES, dl,
4814 DAG.getVTList(ValueVTs), Values));
4815}
4816
4817void SelectionDAGBuilder::visitStoreToSwiftError(const StoreInst &I) {
4818 assert(DAG.getTargetLoweringInfo().supportSwiftError() &&
4819 "call visitStoreToSwiftError when backend supports swifterror");
4820
4821 SmallVector<EVT, 4> ValueVTs;
4822 SmallVector<uint64_t, 4> Offsets;
4823 const Value *SrcV = I.getOperand(0);
4824 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(),
4825 SrcV->getType(), ValueVTs, /*MemVTs=*/nullptr, &Offsets, 0);
4826 assert(ValueVTs.size() == 1 && Offsets[0] == 0 &&
4827 "expect a single EVT for swifterror");
4828
4829 SDValue Src = getValue(SrcV);
4830 // Create a virtual register, then update the virtual register.
4831 Register VReg =
4832 SwiftError.getOrCreateVRegDefAt(&I, FuncInfo.MBB, I.getPointerOperand());
4833 // Chain, DL, Reg, N or Chain, DL, Reg, N, Glue
4834 // Chain can be getRoot or getControlRoot.
4835 SDValue CopyNode = DAG.getCopyToReg(getRoot(), getCurSDLoc(), VReg,
4836 SDValue(Src.getNode(), Src.getResNo()));
4837 DAG.setRoot(CopyNode);
4838}
4839
4840void SelectionDAGBuilder::visitLoadFromSwiftError(const LoadInst &I) {
4841 assert(DAG.getTargetLoweringInfo().supportSwiftError() &&
4842 "call visitLoadFromSwiftError when backend supports swifterror");
4843
4844 assert(!I.isVolatile() &&
4845 !I.hasMetadata(LLVMContext::MD_nontemporal) &&
4846 !I.hasMetadata(LLVMContext::MD_invariant_load) &&
4847 "Support volatile, non temporal, invariant for load_from_swift_error");
4848
4849 const Value *SV = I.getOperand(0);
4850 Type *Ty = I.getType();
4851 assert(
4852 (!BatchAA ||
4853 !BatchAA->pointsToConstantMemory(MemoryLocation(
4854 SV, LocationSize::precise(DAG.getDataLayout().getTypeStoreSize(Ty)),
4855 I.getAAMetadata()))) &&
4856 "load_from_swift_error should not be constant memory");
4857
4858 SmallVector<EVT, 4> ValueVTs;
4859 SmallVector<uint64_t, 4> Offsets;
4860 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), Ty,
4861 ValueVTs, /*MemVTs=*/nullptr, &Offsets, 0);
4862 assert(ValueVTs.size() == 1 && Offsets[0] == 0 &&
4863 "expect a single EVT for swifterror");
4864
4865 // Chain, DL, Reg, VT, Glue or Chain, DL, Reg, VT
4866 SDValue L = DAG.getCopyFromReg(
4867 getRoot(), getCurSDLoc(),
4868 SwiftError.getOrCreateVRegUseAt(&I, FuncInfo.MBB, SV), ValueVTs[0]);
4869
4870 setValue(&I, L);
4871}
4872
4873void SelectionDAGBuilder::visitStore(const StoreInst &I) {
4874 if (I.isAtomic())
4875 return visitAtomicStore(I);
4876
4877 const Value *SrcV = I.getOperand(0);
4878 const Value *PtrV = I.getOperand(1);
4879
4880 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4881 if (TLI.supportSwiftError()) {
4882 // Swifterror values can come from either a function parameter with
4883 // swifterror attribute or an alloca with swifterror attribute.
4884 if (const Argument *Arg = dyn_cast<Argument>(PtrV)) {
4885 if (Arg->hasSwiftErrorAttr())
4886 return visitStoreToSwiftError(I);
4887 }
4888
4889 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(PtrV)) {
4890 if (Alloca->isSwiftError())
4891 return visitStoreToSwiftError(I);
4892 }
4893 }
4894
4895 SmallVector<EVT, 4> ValueVTs, MemVTs;
4897 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(),
4898 SrcV->getType(), ValueVTs, &MemVTs, &Offsets);
4899 unsigned NumValues = ValueVTs.size();
4900 if (NumValues == 0)
4901 return;
4902
4903 // Get the lowered operands. Note that we do this after
4904 // checking if NumResults is zero, because with zero results
4905 // the operands won't have values in the map.
4906 SDValue Src = getValue(SrcV);
4907 SDValue Ptr = getValue(PtrV);
4908
4909 SDValue Root = I.isVolatile() ? getRoot() : getMemoryRoot();
4910 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4911 SDLoc dl = getCurSDLoc();
4912 Align Alignment = I.getAlign();
4913 AAMDNodes AAInfo = I.getAAMetadata();
4914
4915 auto MMOFlags = TLI.getStoreMemOperandFlags(I, DAG.getDataLayout());
4916
4917 unsigned ChainI = 0;
4918 for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
4919 // See visitLoad comments.
4920 if (ChainI == MaxParallelChains) {
4921 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4922 ArrayRef(Chains.data(), ChainI));
4923 Root = Chain;
4924 ChainI = 0;
4925 }
4926
4927 // TODO: MachinePointerInfo only supports a fixed length offset.
4928 MachinePointerInfo PtrInfo =
4929 !Offsets[i].isScalable() || Offsets[i].isZero()
4930 ? MachinePointerInfo(PtrV, Offsets[i].getKnownMinValue())
4931 : MachinePointerInfo();
4932
4933 SDValue Add = DAG.getObjectPtrOffset(dl, Ptr, Offsets[i]);
4934 SDValue Val = SDValue(Src.getNode(), Src.getResNo() + i);
4935 if (MemVTs[i] != ValueVTs[i])
4936 Val = DAG.getPtrExtOrTrunc(Val, dl, MemVTs[i]);
4937 SDValue St =
4938 DAG.getStore(Root, dl, Val, Add, PtrInfo, Alignment, MMOFlags, AAInfo);
4939 Chains[ChainI] = St;
4940 }
4941
4942 SDValue StoreNode = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4943 ArrayRef(Chains.data(), ChainI));
4944 setValue(&I, StoreNode);
4945 DAG.setRoot(StoreNode);
4946}
4947
4948void SelectionDAGBuilder::visitMaskedStore(const CallInst &I,
4949 bool IsCompressing) {
4950 SDLoc sdl = getCurSDLoc();
4951
4952 Value *Src0Operand = I.getArgOperand(0);
4953 Value *PtrOperand = I.getArgOperand(1);
4954 Value *MaskOperand = I.getArgOperand(2);
4955 Align Alignment = I.getParamAlign(1).valueOrOne();
4956
4957 SDValue Ptr = getValue(PtrOperand);
4958 SDValue Src0 = getValue(Src0Operand);
4959 SDValue Mask = getValue(MaskOperand);
4960 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
4961
4962 EVT VT = Src0.getValueType();
4963
4964 auto MMOFlags = MachineMemOperand::MOStore;
4965 if (I.hasMetadata(LLVMContext::MD_nontemporal))
4967
4968 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
4969 MachinePointerInfo(PtrOperand), MMOFlags,
4970 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata());
4971
4972 const auto &TLI = DAG.getTargetLoweringInfo();
4973
4974 SDValue StoreNode =
4975 !IsCompressing && TTI->hasConditionalLoadStoreForType(
4976 I.getArgOperand(0)->getType(), /*IsStore=*/true)
4977 ? TLI.visitMaskedStore(DAG, sdl, getMemoryRoot(), MMO, Ptr, Src0,
4978 Mask)
4979 : DAG.getMaskedStore(getMemoryRoot(), sdl, Src0, Ptr, Offset, Mask,
4980 VT, MMO, ISD::UNINDEXED, /*Truncating=*/false,
4981 IsCompressing);
4982 DAG.setRoot(StoreNode);
4983 setValue(&I, StoreNode);
4984}
4985
4986// Get a uniform base for the Gather/Scatter intrinsic.
4987// The first argument of the Gather/Scatter intrinsic is a vector of pointers.
4988// We try to represent it as a base pointer + vector of indices.
4989// Usually, the vector of pointers comes from a 'getelementptr' instruction.
4990// The first operand of the GEP may be a single pointer or a vector of pointers
4991// Example:
4992// %gep.ptr = getelementptr i32, <8 x i32*> %vptr, <8 x i32> %ind
4993// or
4994// %gep.ptr = getelementptr i32, i32* %ptr, <8 x i32> %ind
4995// %res = call <8 x i32> @llvm.masked.gather.v8i32(<8 x i32*> %gep.ptr, ..
4996//
4997// When the first GEP operand is a single pointer - it is the uniform base we
4998// are looking for. If first operand of the GEP is a splat vector - we
4999// extract the splat value and use it as a uniform base.
5000// In all other cases the function returns 'false'.
5001static bool getUniformBase(const Value *Ptr, SDValue &Base, SDValue &Index,
5002 SDValue &Scale, SelectionDAGBuilder *SDB,
5003 const BasicBlock *CurBB, uint64_t ElemSize) {
5004 SelectionDAG& DAG = SDB->DAG;
5005 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5006 const DataLayout &DL = DAG.getDataLayout();
5007
5008 assert(Ptr->getType()->isVectorTy() && "Unexpected pointer type");
5009
5010 // Handle splat constant pointer.
5011 if (auto *C = dyn_cast<Constant>(Ptr)) {
5012 C = C->getSplatValue();
5013 if (!C)
5014 return false;
5015
5016 Base = SDB->getValue(C);
5017
5018 ElementCount NumElts = cast<VectorType>(Ptr->getType())->getElementCount();
5019 EVT VT = EVT::getVectorVT(*DAG.getContext(), TLI.getPointerTy(DL), NumElts);
5020 Index = DAG.getConstant(0, SDB->getCurSDLoc(), VT);
5021 Scale = DAG.getTargetConstant(1, SDB->getCurSDLoc(), TLI.getPointerTy(DL));
5022 return true;
5023 }
5024
5026 if (!GEP || GEP->getParent() != CurBB)
5027 return false;
5028
5029 if (GEP->getNumOperands() != 2)
5030 return false;
5031
5032 const Value *BasePtr = GEP->getPointerOperand();
5033 const Value *IndexVal = GEP->getOperand(GEP->getNumOperands() - 1);
5034
5035 // Make sure the base is scalar and the index is a vector.
5036 if (BasePtr->getType()->isVectorTy() || !IndexVal->getType()->isVectorTy())
5037 return false;
5038
5039 TypeSize ScaleVal = DL.getTypeAllocSize(GEP->getResultElementType());
5040 if (ScaleVal.isScalable())
5041 return false;
5042
5043 // Target may not support the required addressing mode.
5044 if (ScaleVal != 1 &&
5045 !TLI.isLegalScaleForGatherScatter(ScaleVal.getFixedValue(), ElemSize))
5046 return false;
5047
5048 Base = SDB->getValue(BasePtr);
5049 Index = SDB->getValue(IndexVal);
5050
5051 Scale =
5052 DAG.getTargetConstant(ScaleVal, SDB->getCurSDLoc(), TLI.getPointerTy(DL));
5053 return true;
5054}
5055
5056void SelectionDAGBuilder::visitMaskedScatter(const CallInst &I) {
5057 SDLoc sdl = getCurSDLoc();
5058
5059 // llvm.masked.scatter.*(Src0, Ptrs, Mask)
5060 const Value *Ptr = I.getArgOperand(1);
5061 SDValue Src0 = getValue(I.getArgOperand(0));
5062 SDValue Mask = getValue(I.getArgOperand(2));
5063 EVT VT = Src0.getValueType();
5064 Align Alignment = I.getParamAlign(1).valueOrOne();
5065 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5066
5067 SDValue Base;
5068 SDValue Index;
5069 SDValue Scale;
5070 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
5071 I.getParent(), VT.getScalarStoreSize());
5072
5073 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
5074 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5075 MachinePointerInfo(AS), MachineMemOperand::MOStore,
5076 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata());
5077 if (!UniformBase) {
5078 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5079 Index = getValue(Ptr);
5080 Scale =
5081 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5082 }
5083
5084 EVT IdxVT = Index.getValueType();
5085 EVT EltTy = IdxVT.getVectorElementType();
5086 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
5087 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
5088 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
5089 }
5090
5091 SDValue Ops[] = { getMemoryRoot(), Src0, Mask, Base, Index, Scale };
5092 SDValue Scatter = DAG.getMaskedScatter(DAG.getVTList(MVT::Other), VT, sdl,
5093 Ops, MMO, ISD::SIGNED_SCALED, false);
5094 DAG.setRoot(Scatter);
5095 setValue(&I, Scatter);
5096}
5097
5098void SelectionDAGBuilder::visitMaskedLoad(const CallInst &I, bool IsExpanding) {
5099 SDLoc sdl = getCurSDLoc();
5100
5101 Value *PtrOperand = I.getArgOperand(0);
5102 Value *MaskOperand = I.getArgOperand(1);
5103 Value *Src0Operand = I.getArgOperand(2);
5104 Align Alignment = I.getParamAlign(0).valueOrOne();
5105
5106 SDValue Ptr = getValue(PtrOperand);
5107 SDValue Src0 = getValue(Src0Operand);
5108 SDValue Mask = getValue(MaskOperand);
5109 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
5110
5111 EVT VT = Src0.getValueType();
5112 AAMDNodes AAInfo = I.getAAMetadata();
5113 const MDNode *Ranges = getRangeMetadata(I);
5114
5115 // Do not serialize masked loads of constant memory with anything.
5116 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
5117 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
5118
5119 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
5120
5121 auto MMOFlags = MachineMemOperand::MOLoad;
5122 if (I.hasMetadata(LLVMContext::MD_nontemporal))
5124 if (I.hasMetadata(LLVMContext::MD_invariant_load))
5126
5127 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5128 MachinePointerInfo(PtrOperand), MMOFlags,
5129 VT.getStoreSize(), Alignment, AAInfo, Ranges);
5130
5131 const auto &TLI = DAG.getTargetLoweringInfo();
5132
5133 // The Load/Res may point to different values and both of them are output
5134 // variables.
5135 SDValue Load;
5136 SDValue Res;
5137 if (!IsExpanding &&
5138 TTI->hasConditionalLoadStoreForType(Src0Operand->getType(),
5139 /*IsStore=*/false))
5140 Res = TLI.visitMaskedLoad(DAG, sdl, InChain, MMO, Load, Ptr, Src0, Mask);
5141 else
5142 Res = Load =
5143 DAG.getMaskedLoad(VT, sdl, InChain, Ptr, Offset, Mask, Src0, VT, MMO,
5144 ISD::UNINDEXED, ISD::NON_EXTLOAD, IsExpanding);
5145 if (AddToChain)
5146 PendingLoads.push_back(Load.getValue(1));
5147 setValue(&I, Res);
5148}
5149
5150void SelectionDAGBuilder::visitMaskedGather(const CallInst &I) {
5151 SDLoc sdl = getCurSDLoc();
5152
5153 // @llvm.masked.gather.*(Ptrs, Mask, Src0)
5154 const Value *Ptr = I.getArgOperand(0);
5155 SDValue Src0 = getValue(I.getArgOperand(2));
5156 SDValue Mask = getValue(I.getArgOperand(1));
5157
5158 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5159 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
5160 Align Alignment = I.getParamAlign(0).valueOrOne();
5161
5162 const MDNode *Ranges = getRangeMetadata(I);
5163
5164 SDValue Root = DAG.getRoot();
5165 SDValue Base;
5166 SDValue Index;
5167 SDValue Scale;
5168 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
5169 I.getParent(), VT.getScalarStoreSize());
5170 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
5171 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5172 MachinePointerInfo(AS), MachineMemOperand::MOLoad,
5173 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata(),
5174 Ranges);
5175
5176 if (!UniformBase) {
5177 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5178 Index = getValue(Ptr);
5179 Scale =
5180 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5181 }
5182
5183 EVT IdxVT = Index.getValueType();
5184 EVT EltTy = IdxVT.getVectorElementType();
5185 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
5186 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
5187 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
5188 }
5189
5190 SDValue Ops[] = { Root, Src0, Mask, Base, Index, Scale };
5191 SDValue Gather =
5192 DAG.getMaskedGather(DAG.getVTList(VT, MVT::Other), VT, sdl, Ops, MMO,
5194
5195 PendingLoads.push_back(Gather.getValue(1));
5196 setValue(&I, Gather);
5197}
5198
5199void SelectionDAGBuilder::visitAtomicCmpXchg(const AtomicCmpXchgInst &I) {
5200 SDLoc dl = getCurSDLoc();
5201 AtomicOrdering SuccessOrdering = I.getSuccessOrdering();
5202 AtomicOrdering FailureOrdering = I.getFailureOrdering();
5203 SyncScope::ID SSID = I.getSyncScopeID();
5204
5205 SDValue InChain = getRoot();
5206
5207 MVT MemVT = getValue(I.getCompareOperand()).getSimpleValueType();
5208 SDVTList VTs = DAG.getVTList(MemVT, MVT::i1, MVT::Other);
5209
5210 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5211 auto Flags = TLI.getAtomicMemOperandFlags(I, DAG.getDataLayout());
5212
5213 MachineFunction &MF = DAG.getMachineFunction();
5214 MachineMemOperand *MMO = MF.getMachineMemOperand(
5215 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5216 DAG.getEVTAlign(MemVT), AAMDNodes(), nullptr, SSID, SuccessOrdering,
5217 FailureOrdering);
5218
5220 dl, MemVT, VTs, InChain,
5221 getValue(I.getPointerOperand()),
5222 getValue(I.getCompareOperand()),
5223 getValue(I.getNewValOperand()), MMO);
5224
5225 SDValue OutChain = L.getValue(2);
5226
5227 setValue(&I, L);
5228 DAG.setRoot(OutChain);
5229}
5230
5231void SelectionDAGBuilder::visitAtomicRMW(const AtomicRMWInst &I) {
5232 SDLoc dl = getCurSDLoc();
5234 switch (I.getOperation()) {
5235 default: llvm_unreachable("Unknown atomicrmw operation");
5253 break;
5256 break;
5259 break;
5262 break;
5265 break;
5268 break;
5269 }
5270 AtomicOrdering Ordering = I.getOrdering();
5271 SyncScope::ID SSID = I.getSyncScopeID();
5272
5273 SDValue InChain = getRoot();
5274
5275 auto MemVT = getValue(I.getValOperand()).getSimpleValueType();
5276 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5277 auto Flags = TLI.getAtomicMemOperandFlags(I, DAG.getDataLayout());
5278
5279 MachineFunction &MF = DAG.getMachineFunction();
5280 MachineMemOperand *MMO = MF.getMachineMemOperand(
5281 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5282 DAG.getEVTAlign(MemVT), AAMDNodes(), nullptr, SSID, Ordering);
5283
5284 SDValue L =
5285 DAG.getAtomic(NT, dl, MemVT, InChain,
5286 getValue(I.getPointerOperand()), getValue(I.getValOperand()),
5287 MMO);
5288
5289 SDValue OutChain = L.getValue(1);
5290
5291 setValue(&I, L);
5292 DAG.setRoot(OutChain);
5293}
5294
5295void SelectionDAGBuilder::visitFence(const FenceInst &I) {
5296 SDLoc dl = getCurSDLoc();
5297 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5298 SDValue Ops[3];
5299 Ops[0] = getRoot();
5300 Ops[1] = DAG.getTargetConstant((unsigned)I.getOrdering(), dl,
5301 TLI.getFenceOperandTy(DAG.getDataLayout()));
5302 Ops[2] = DAG.getTargetConstant(I.getSyncScopeID(), dl,
5303 TLI.getFenceOperandTy(DAG.getDataLayout()));
5304 SDValue N = DAG.getNode(ISD::ATOMIC_FENCE, dl, MVT::Other, Ops);
5305 setValue(&I, N);
5306 DAG.setRoot(N);
5307}
5308
5309void SelectionDAGBuilder::visitAtomicLoad(const LoadInst &I) {
5310 SDLoc dl = getCurSDLoc();
5311 AtomicOrdering Order = I.getOrdering();
5312 SyncScope::ID SSID = I.getSyncScopeID();
5313
5314 SDValue InChain = getRoot();
5315
5316 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5317 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
5318 EVT MemVT = TLI.getMemValueType(DAG.getDataLayout(), I.getType());
5319
5320 if (!TLI.supportsUnalignedAtomics() &&
5321 I.getAlign().value() < MemVT.getSizeInBits() / 8)
5322 report_fatal_error("Cannot generate unaligned atomic load");
5323
5324 auto Flags = TLI.getLoadMemOperandFlags(I, DAG.getDataLayout(), AC, LibInfo);
5325
5326 const MDNode *Ranges = getRangeMetadata(I);
5327 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5328 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5329 I.getAlign(), AAMDNodes(), Ranges, SSID, Order);
5330
5331 InChain = TLI.prepareVolatileOrAtomicLoad(InChain, dl, DAG);
5332
5333 SDValue Ptr = getValue(I.getPointerOperand());
5334 SDValue L =
5335 DAG.getAtomicLoad(ISD::NON_EXTLOAD, dl, MemVT, MemVT, InChain, Ptr, MMO);
5336
5337 SDValue OutChain = L.getValue(1);
5338 if (MemVT != VT)
5339 L = DAG.getPtrExtOrTrunc(L, dl, VT);
5340
5341 setValue(&I, L);
5342 DAG.setRoot(OutChain);
5343}
5344
5345void SelectionDAGBuilder::visitAtomicStore(const StoreInst &I) {
5346 SDLoc dl = getCurSDLoc();
5347
5348 AtomicOrdering Ordering = I.getOrdering();
5349 SyncScope::ID SSID = I.getSyncScopeID();
5350
5351 SDValue InChain = getRoot();
5352
5353 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5354 EVT MemVT =
5355 TLI.getMemValueType(DAG.getDataLayout(), I.getValueOperand()->getType());
5356
5357 if (!TLI.supportsUnalignedAtomics() &&
5358 I.getAlign().value() < MemVT.getSizeInBits() / 8)
5359 report_fatal_error("Cannot generate unaligned atomic store");
5360
5361 auto Flags = TLI.getStoreMemOperandFlags(I, DAG.getDataLayout());
5362
5363 MachineFunction &MF = DAG.getMachineFunction();
5364 MachineMemOperand *MMO = MF.getMachineMemOperand(
5365 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5366 I.getAlign(), AAMDNodes(), nullptr, SSID, Ordering);
5367
5368 SDValue Val = getValue(I.getValueOperand());
5369 if (Val.getValueType() != MemVT)
5370 Val = DAG.getPtrExtOrTrunc(Val, dl, MemVT);
5371 SDValue Ptr = getValue(I.getPointerOperand());
5372
5373 SDValue OutChain =
5374 DAG.getAtomic(ISD::ATOMIC_STORE, dl, MemVT, InChain, Val, Ptr, MMO);
5375
5376 setValue(&I, OutChain);
5377 DAG.setRoot(OutChain);
5378}
5379
5380/// Check if this intrinsic call depends on the chain (1st return value)
5381/// and if it only *loads* memory.
5382/// Ignore the callsite's attributes. A specific call site may be marked with
5383/// readnone, but the lowering code will expect the chain based on the
5384/// definition.
5385std::pair<bool, bool>
5386SelectionDAGBuilder::getTargetIntrinsicCallProperties(const CallBase &I) {
5387 const Function *F = I.getCalledFunction();
5388 bool HasChain = !F->doesNotAccessMemory();
5389 bool OnlyLoad =
5390 HasChain && F->onlyReadsMemory() && F->willReturn() && F->doesNotThrow();
5391
5392 return {HasChain, OnlyLoad};
5393}
5394
5395SmallVector<SDValue, 8> SelectionDAGBuilder::getTargetIntrinsicOperands(
5396 const CallBase &I, bool HasChain, bool OnlyLoad,
5397 TargetLowering::IntrinsicInfo *TgtMemIntrinsicInfo) {
5398 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5399
5400 // Build the operand list.
5402 if (HasChain) { // If this intrinsic has side-effects, chainify it.
5403 if (OnlyLoad) {
5404 // We don't need to serialize loads against other loads.
5405 Ops.push_back(DAG.getRoot());
5406 } else {
5407 Ops.push_back(getRoot());
5408 }
5409 }
5410
5411 // Add the intrinsic ID as an integer operand if it's not a target intrinsic.
5412 if (!TgtMemIntrinsicInfo || TgtMemIntrinsicInfo->opc == ISD::INTRINSIC_VOID ||
5413 TgtMemIntrinsicInfo->opc == ISD::INTRINSIC_W_CHAIN)
5414 Ops.push_back(DAG.getTargetConstant(I.getIntrinsicID(), getCurSDLoc(),
5415 TLI.getPointerTy(DAG.getDataLayout())));
5416
5417 // Add all operands of the call to the operand list.
5418 for (unsigned i = 0, e = I.arg_size(); i != e; ++i) {
5419 const Value *Arg = I.getArgOperand(i);
5420 if (!I.paramHasAttr(i, Attribute::ImmArg)) {
5421 Ops.push_back(getValue(Arg));
5422 continue;
5423 }
5424
5425 // Use TargetConstant instead of a regular constant for immarg.
5426 EVT VT = TLI.getValueType(DAG.getDataLayout(), Arg->getType(), true);
5427 if (const ConstantInt *CI = dyn_cast<ConstantInt>(Arg)) {
5428 assert(CI->getBitWidth() <= 64 &&
5429 "large intrinsic immediates not handled");
5430 Ops.push_back(DAG.getTargetConstant(*CI, SDLoc(), VT));
5431 } else {
5432 Ops.push_back(
5433 DAG.getTargetConstantFP(*cast<ConstantFP>(Arg), SDLoc(), VT));
5434 }
5435 }
5436
5437 if (std::optional<OperandBundleUse> Bundle =
5438 I.getOperandBundle(LLVMContext::OB_deactivation_symbol)) {
5439 auto *Sym = Bundle->Inputs[0].get();
5440 SDValue SDSym = getValue(Sym);
5441 SDSym = DAG.getDeactivationSymbol(cast<GlobalValue>(Sym));
5442 Ops.push_back(SDSym);
5443 }
5444
5445 if (std::optional<OperandBundleUse> Bundle =
5446 I.getOperandBundle(LLVMContext::OB_convergencectrl)) {
5447 Value *Token = Bundle->Inputs[0].get();
5448 SDValue ConvControlToken = getValue(Token);
5449 assert(Ops.back().getValueType() != MVT::Glue &&
5450 "Did not expect another glue node here.");
5451 ConvControlToken =
5452 DAG.getNode(ISD::CONVERGENCECTRL_GLUE, {}, MVT::Glue, ConvControlToken);
5453 Ops.push_back(ConvControlToken);
5454 }
5455
5456 return Ops;
5457}
5458
5459SDVTList SelectionDAGBuilder::getTargetIntrinsicVTList(const CallBase &I,
5460 bool HasChain) {
5461 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5462
5463 SmallVector<EVT, 4> ValueVTs;
5464 ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);
5465
5466 if (HasChain)
5467 ValueVTs.push_back(MVT::Other);
5468
5469 return DAG.getVTList(ValueVTs);
5470}
5471
5472/// Get an INTRINSIC node for a target intrinsic which does not touch memory.
5473SDValue SelectionDAGBuilder::getTargetNonMemIntrinsicNode(
5474 const Type &IntrinsicVT, bool HasChain, ArrayRef<SDValue> Ops,
5475 const SDVTList &VTs) {
5476 if (!HasChain)
5477 return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, getCurSDLoc(), VTs, Ops);
5478 if (!IntrinsicVT.isVoidTy())
5479 return DAG.getNode(ISD::INTRINSIC_W_CHAIN, getCurSDLoc(), VTs, Ops);
5480 return DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops);
5481}
5482
5483/// Set root, convert return type if necessary and check alignment.
5484SDValue SelectionDAGBuilder::handleTargetIntrinsicRet(const CallBase &I,
5485 bool HasChain,
5486 bool OnlyLoad,
5487 SDValue Result) {
5488 if (HasChain) {
5489 SDValue Chain = Result.getValue(Result.getNode()->getNumValues() - 1);
5490 if (OnlyLoad)
5491 PendingLoads.push_back(Chain);
5492 else
5493 DAG.setRoot(Chain);
5494 }
5495
5496 if (I.getType()->isVoidTy())
5497 return Result;
5498
5499 if (MaybeAlign Alignment = I.getRetAlign(); InsertAssertAlign && Alignment) {
5500 // Insert `assertalign` node if there's an alignment.
5501 Result = DAG.getAssertAlign(getCurSDLoc(), Result, Alignment.valueOrOne());
5502 } else if (!isa<VectorType>(I.getType())) {
5503 Result = lowerRangeToAssertZExt(DAG, I, Result);
5504 }
5505
5506 return Result;
5507}
5508
5509/// visitTargetIntrinsic - Lower a call of a target intrinsic to an INTRINSIC
5510/// node.
5511void SelectionDAGBuilder::visitTargetIntrinsic(const CallInst &I,
5512 unsigned Intrinsic) {
5513 auto [HasChain, OnlyLoad] = getTargetIntrinsicCallProperties(I);
5514
5515 // Infos is set by getTgtMemIntrinsic.
5517 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5518 TLI.getTgtMemIntrinsic(Infos, I, DAG.getMachineFunction(), Intrinsic);
5519 // Use the first (primary) info determines the node opcode.
5520 TargetLowering::IntrinsicInfo *Info = !Infos.empty() ? &Infos[0] : nullptr;
5521
5523 getTargetIntrinsicOperands(I, HasChain, OnlyLoad, Info);
5524 SDVTList VTs = getTargetIntrinsicVTList(I, HasChain);
5525
5526 // Propagate fast-math-flags from IR to node(s).
5527 SDNodeFlags Flags;
5528 if (auto *FPMO = dyn_cast<FPMathOperator>(&I))
5529 Flags.copyFMF(*FPMO);
5530 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
5531
5532 // Create the node.
5534
5535 // In some cases, custom collection of operands from CallInst I may be needed.
5537 if (!Infos.empty()) {
5538 // This is target intrinsic that touches memory
5539 // Create MachineMemOperands for each memory access described by the target.
5540 MachineFunction &MF = DAG.getMachineFunction();
5542 for (const auto &Info : Infos) {
5543 // TODO: We currently just fallback to address space 0 if
5544 // getTgtMemIntrinsic didn't yield anything useful.
5545 MachinePointerInfo MPI;
5546 if (Info.ptrVal)
5547 MPI = MachinePointerInfo(Info.ptrVal, Info.offset);
5548 else if (Info.fallbackAddressSpace)
5549 MPI = MachinePointerInfo(*Info.fallbackAddressSpace);
5550 EVT MemVT = Info.memVT;
5551 LocationSize Size = LocationSize::precise(Info.size);
5552 if (Size.hasValue() && !Size.getValue())
5554 Align Alignment = Info.align.value_or(DAG.getEVTAlign(MemVT));
5555 MachineMemOperand *MMO = MF.getMachineMemOperand(
5556 MPI, Info.flags, Size, Alignment, I.getAAMetadata(),
5557 /*Ranges=*/nullptr, Info.ssid, Info.order, Info.failureOrder);
5558 MMOs.push_back(MMO);
5559 }
5560
5561 Result = DAG.getMemIntrinsicNode(Info->opc, getCurSDLoc(), VTs, Ops,
5562 Info->memVT, MMOs);
5563 } else {
5564 Result = getTargetNonMemIntrinsicNode(*I.getType(), HasChain, Ops, VTs);
5565 }
5566
5567 Result = handleTargetIntrinsicRet(I, HasChain, OnlyLoad, Result);
5568
5569 setValue(&I, Result);
5570}
5571
5572/// GetSignificand - Get the significand and build it into a floating-point
5573/// number with exponent of 1:
5574///
5575/// Op = (Op & 0x007fffff) | 0x3f800000;
5576///
5577/// where Op is the hexadecimal representation of floating point value.
5579 SDValue t1 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
5580 DAG.getConstant(0x007fffff, dl, MVT::i32));
5581 SDValue t2 = DAG.getNode(ISD::OR, dl, MVT::i32, t1,
5582 DAG.getConstant(0x3f800000, dl, MVT::i32));
5583 return DAG.getNode(ISD::BITCAST, dl, MVT::f32, t2);
5584}
5585
5586/// GetExponent - Get the exponent:
5587///
5588/// (float)(int)(((Op & 0x7f800000) >> 23) - 127);
5589///
5590/// where Op is the hexadecimal representation of floating point value.
5592 const TargetLowering &TLI, const SDLoc &dl) {
5593 SDValue t0 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
5594 DAG.getConstant(0x7f800000, dl, MVT::i32));
5595 SDValue t1 = DAG.getNode(ISD::SRL, dl, MVT::i32, t0,
5596 DAG.getShiftAmountConstant(23, MVT::i32, dl));
5597 SDValue t2 = DAG.getNode(ISD::SUB, dl, MVT::i32, t1,
5598 DAG.getConstant(127, dl, MVT::i32));
5599 return DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, t2);
5600}
5601
5602/// getF32Constant - Get 32-bit floating point constant.
5603static SDValue getF32Constant(SelectionDAG &DAG, unsigned Flt,
5604 const SDLoc &dl) {
5605 return DAG.getConstantFP(APFloat(APFloat::IEEEsingle(), APInt(32, Flt)), dl,
5606 MVT::f32);
5607}
5608
5610 SelectionDAG &DAG) {
5611 // TODO: What fast-math-flags should be set on the floating-point nodes?
5612
5613 // IntegerPartOfX = ((int32_t)(t0);
5614 SDValue IntegerPartOfX = DAG.getNode(ISD::FP_TO_SINT, dl, MVT::i32, t0);
5615
5616 // FractionalPartOfX = t0 - (float)IntegerPartOfX;
5617 SDValue t1 = DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, IntegerPartOfX);
5618 SDValue X = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0, t1);
5619
5620 // IntegerPartOfX <<= 23;
5621 IntegerPartOfX = DAG.getNode(ISD::SHL, dl, MVT::i32, IntegerPartOfX,
5622 DAG.getShiftAmountConstant(23, MVT::i32, dl));
5623
5624 SDValue TwoToFractionalPartOfX;
5625 if (LimitFloatPrecision <= 6) {
5626 // For floating-point precision of 6:
5627 //
5628 // TwoToFractionalPartOfX =
5629 // 0.997535578f +
5630 // (0.735607626f + 0.252464424f * x) * x;
5631 //
5632 // error 0.0144103317, which is 6 bits
5633 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5634 getF32Constant(DAG, 0x3e814304, dl));
5635 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5636 getF32Constant(DAG, 0x3f3c50c8, dl));
5637 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5638 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5639 getF32Constant(DAG, 0x3f7f5e7e, dl));
5640 } else if (LimitFloatPrecision <= 12) {
5641 // For floating-point precision of 12:
5642 //
5643 // TwoToFractionalPartOfX =
5644 // 0.999892986f +
5645 // (0.696457318f +
5646 // (0.224338339f + 0.792043434e-1f * x) * x) * x;
5647 //
5648 // error 0.000107046256, which is 13 to 14 bits
5649 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5650 getF32Constant(DAG, 0x3da235e3, dl));
5651 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5652 getF32Constant(DAG, 0x3e65b8f3, dl));
5653 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5654 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5655 getF32Constant(DAG, 0x3f324b07, dl));
5656 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5657 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5658 getF32Constant(DAG, 0x3f7ff8fd, dl));
5659 } else { // LimitFloatPrecision <= 18
5660 // For floating-point precision of 18:
5661 //
5662 // TwoToFractionalPartOfX =
5663 // 0.999999982f +
5664 // (0.693148872f +
5665 // (0.240227044f +
5666 // (0.554906021e-1f +
5667 // (0.961591928e-2f +
5668 // (0.136028312e-2f + 0.157059148e-3f *x)*x)*x)*x)*x)*x;
5669 // error 2.47208000*10^(-7), which is better than 18 bits
5670 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5671 getF32Constant(DAG, 0x3924b03e, dl));
5672 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5673 getF32Constant(DAG, 0x3ab24b87, dl));
5674 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5675 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5676 getF32Constant(DAG, 0x3c1d8c17, dl));
5677 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5678 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5679 getF32Constant(DAG, 0x3d634a1d, dl));
5680 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5681 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5682 getF32Constant(DAG, 0x3e75fe14, dl));
5683 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5684 SDValue t11 = DAG.getNode(ISD::FADD, dl, MVT::f32, t10,
5685 getF32Constant(DAG, 0x3f317234, dl));
5686 SDValue t12 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t11, X);
5687 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t12,
5688 getF32Constant(DAG, 0x3f800000, dl));
5689 }
5690
5691 // Add the exponent into the result in integer domain.
5692 SDValue t13 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, TwoToFractionalPartOfX);
5693 return DAG.getNode(ISD::BITCAST, dl, MVT::f32,
5694 DAG.getNode(ISD::ADD, dl, MVT::i32, t13, IntegerPartOfX));
5695}
5696
5697/// expandExp - Lower an exp intrinsic. Handles the special sequences for
5698/// limited-precision mode.
5700 const TargetLowering &TLI, SDNodeFlags Flags) {
5701 if (Op.getValueType() == MVT::f32 &&
5703
5704 // Put the exponent in the right bit position for later addition to the
5705 // final result:
5706 //
5707 // t0 = Op * log2(e)
5708
5709 // TODO: What fast-math-flags should be set here?
5710 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, Op,
5711 DAG.getConstantFP(numbers::log2ef, dl, MVT::f32));
5712 return getLimitedPrecisionExp2(t0, dl, DAG);
5713 }
5714
5715 // No special expansion.
5716 return DAG.getNode(ISD::FEXP, dl, Op.getValueType(), Op, Flags);
5717}
5718
5719/// expandLog - Lower a log intrinsic. Handles the special sequences for
5720/// limited-precision mode.
5722 const TargetLowering &TLI, SDNodeFlags Flags) {
5723 // TODO: What fast-math-flags should be set on the floating-point nodes?
5724
5725 if (Op.getValueType() == MVT::f32 &&
5727 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5728
5729 // Scale the exponent by log(2).
5730 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5731 SDValue LogOfExponent =
5732 DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5733 DAG.getConstantFP(numbers::ln2f, dl, MVT::f32));
5734
5735 // Get the significand and build it into a floating-point number with
5736 // exponent of 1.
5737 SDValue X = GetSignificand(DAG, Op1, dl);
5738
5739 SDValue LogOfMantissa;
5740 if (LimitFloatPrecision <= 6) {
5741 // For floating-point precision of 6:
5742 //
5743 // LogofMantissa =
5744 // -1.1609546f +
5745 // (1.4034025f - 0.23903021f * x) * x;
5746 //
5747 // error 0.0034276066, which is better than 8 bits
5748 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5749 getF32Constant(DAG, 0xbe74c456, dl));
5750 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5751 getF32Constant(DAG, 0x3fb3a2b1, dl));
5752 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5753 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5754 getF32Constant(DAG, 0x3f949a29, dl));
5755 } else if (LimitFloatPrecision <= 12) {
5756 // For floating-point precision of 12:
5757 //
5758 // LogOfMantissa =
5759 // -1.7417939f +
5760 // (2.8212026f +
5761 // (-1.4699568f +
5762 // (0.44717955f - 0.56570851e-1f * x) * x) * x) * x;
5763 //
5764 // error 0.000061011436, which is 14 bits
5765 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5766 getF32Constant(DAG, 0xbd67b6d6, dl));
5767 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5768 getF32Constant(DAG, 0x3ee4f4b8, dl));
5769 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5770 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5771 getF32Constant(DAG, 0x3fbc278b, dl));
5772 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5773 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5774 getF32Constant(DAG, 0x40348e95, dl));
5775 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5776 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5777 getF32Constant(DAG, 0x3fdef31a, dl));
5778 } else { // LimitFloatPrecision <= 18
5779 // For floating-point precision of 18:
5780 //
5781 // LogOfMantissa =
5782 // -2.1072184f +
5783 // (4.2372794f +
5784 // (-3.7029485f +
5785 // (2.2781945f +
5786 // (-0.87823314f +
5787 // (0.19073739f - 0.17809712e-1f * x) * x) * x) * x) * x)*x;
5788 //
5789 // error 0.0000023660568, which is better than 18 bits
5790 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5791 getF32Constant(DAG, 0xbc91e5ac, dl));
5792 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5793 getF32Constant(DAG, 0x3e4350aa, dl));
5794 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5795 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5796 getF32Constant(DAG, 0x3f60d3e3, dl));
5797 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5798 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5799 getF32Constant(DAG, 0x4011cdf0, dl));
5800 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5801 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5802 getF32Constant(DAG, 0x406cfd1c, dl));
5803 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5804 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5805 getF32Constant(DAG, 0x408797cb, dl));
5806 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5807 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t10,
5808 getF32Constant(DAG, 0x4006dcab, dl));
5809 }
5810
5811 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, LogOfMantissa);
5812 }
5813
5814 // No special expansion.
5815 return DAG.getNode(ISD::FLOG, dl, Op.getValueType(), Op, Flags);
5816}
5817
5818/// expandLog2 - Lower a log2 intrinsic. Handles the special sequences for
5819/// limited-precision mode.
5821 const TargetLowering &TLI, SDNodeFlags Flags) {
5822 // TODO: What fast-math-flags should be set on the floating-point nodes?
5823
5824 if (Op.getValueType() == MVT::f32 &&
5826 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5827
5828 // Get the exponent.
5829 SDValue LogOfExponent = GetExponent(DAG, Op1, TLI, dl);
5830
5831 // Get the significand and build it into a floating-point number with
5832 // exponent of 1.
5833 SDValue X = GetSignificand(DAG, Op1, dl);
5834
5835 // Different possible minimax approximations of significand in
5836 // floating-point for various degrees of accuracy over [1,2].
5837 SDValue Log2ofMantissa;
5838 if (LimitFloatPrecision <= 6) {
5839 // For floating-point precision of 6:
5840 //
5841 // Log2ofMantissa = -1.6749035f + (2.0246817f - .34484768f * x) * x;
5842 //
5843 // error 0.0049451742, which is more than 7 bits
5844 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5845 getF32Constant(DAG, 0xbeb08fe0, dl));
5846 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5847 getF32Constant(DAG, 0x40019463, dl));
5848 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5849 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5850 getF32Constant(DAG, 0x3fd6633d, dl));
5851 } else if (LimitFloatPrecision <= 12) {
5852 // For floating-point precision of 12:
5853 //
5854 // Log2ofMantissa =
5855 // -2.51285454f +
5856 // (4.07009056f +
5857 // (-2.12067489f +
5858 // (.645142248f - 0.816157886e-1f * x) * x) * x) * x;
5859 //
5860 // error 0.0000876136000, which is better than 13 bits
5861 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5862 getF32Constant(DAG, 0xbda7262e, dl));
5863 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5864 getF32Constant(DAG, 0x3f25280b, dl));
5865 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5866 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5867 getF32Constant(DAG, 0x4007b923, dl));
5868 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5869 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5870 getF32Constant(DAG, 0x40823e2f, dl));
5871 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5872 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5873 getF32Constant(DAG, 0x4020d29c, dl));
5874 } else { // LimitFloatPrecision <= 18
5875 // For floating-point precision of 18:
5876 //
5877 // Log2ofMantissa =
5878 // -3.0400495f +
5879 // (6.1129976f +
5880 // (-5.3420409f +
5881 // (3.2865683f +
5882 // (-1.2669343f +
5883 // (0.27515199f -
5884 // 0.25691327e-1f * x) * x) * x) * x) * x) * x;
5885 //
5886 // error 0.0000018516, which is better than 18 bits
5887 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5888 getF32Constant(DAG, 0xbcd2769e, dl));
5889 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5890 getF32Constant(DAG, 0x3e8ce0b9, dl));
5891 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5892 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5893 getF32Constant(DAG, 0x3fa22ae7, dl));
5894 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5895 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5896 getF32Constant(DAG, 0x40525723, dl));
5897 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5898 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5899 getF32Constant(DAG, 0x40aaf200, dl));
5900 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5901 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5902 getF32Constant(DAG, 0x40c39dad, dl));
5903 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5904 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t10,
5905 getF32Constant(DAG, 0x4042902c, dl));
5906 }
5907
5908 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, Log2ofMantissa);
5909 }
5910
5911 // No special expansion.
5912 return DAG.getNode(ISD::FLOG2, dl, Op.getValueType(), Op, Flags);
5913}
5914
5915/// expandLog10 - Lower a log10 intrinsic. Handles the special sequences for
5916/// limited-precision mode.
5918 const TargetLowering &TLI, SDNodeFlags Flags) {
5919 // TODO: What fast-math-flags should be set on the floating-point nodes?
5920
5921 if (Op.getValueType() == MVT::f32 &&
5923 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5924
5925 // Scale the exponent by log10(2) [0.30102999f].
5926 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5927 SDValue LogOfExponent = DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5928 getF32Constant(DAG, 0x3e9a209a, dl));
5929
5930 // Get the significand and build it into a floating-point number with
5931 // exponent of 1.
5932 SDValue X = GetSignificand(DAG, Op1, dl);
5933
5934 SDValue Log10ofMantissa;
5935 if (LimitFloatPrecision <= 6) {
5936 // For floating-point precision of 6:
5937 //
5938 // Log10ofMantissa =
5939 // -0.50419619f +
5940 // (0.60948995f - 0.10380950f * x) * x;
5941 //
5942 // error 0.0014886165, which is 6 bits
5943 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5944 getF32Constant(DAG, 0xbdd49a13, dl));
5945 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5946 getF32Constant(DAG, 0x3f1c0789, dl));
5947 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5948 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5949 getF32Constant(DAG, 0x3f011300, dl));
5950 } else if (LimitFloatPrecision <= 12) {
5951 // For floating-point precision of 12:
5952 //
5953 // Log10ofMantissa =
5954 // -0.64831180f +
5955 // (0.91751397f +
5956 // (-0.31664806f + 0.47637168e-1f * x) * x) * x;
5957 //
5958 // error 0.00019228036, which is better than 12 bits
5959 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5960 getF32Constant(DAG, 0x3d431f31, dl));
5961 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
5962 getF32Constant(DAG, 0x3ea21fb2, dl));
5963 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5964 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5965 getF32Constant(DAG, 0x3f6ae232, dl));
5966 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5967 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
5968 getF32Constant(DAG, 0x3f25f7c3, dl));
5969 } else { // LimitFloatPrecision <= 18
5970 // For floating-point precision of 18:
5971 //
5972 // Log10ofMantissa =
5973 // -0.84299375f +
5974 // (1.5327582f +
5975 // (-1.0688956f +
5976 // (0.49102474f +
5977 // (-0.12539807f + 0.13508273e-1f * x) * x) * x) * x) * x;
5978 //
5979 // error 0.0000037995730, which is better than 18 bits
5980 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5981 getF32Constant(DAG, 0x3c5d51ce, dl));
5982 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
5983 getF32Constant(DAG, 0x3e00685a, dl));
5984 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5985 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5986 getF32Constant(DAG, 0x3efb6798, dl));
5987 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5988 SDValue t5 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
5989 getF32Constant(DAG, 0x3f88d192, dl));
5990 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5991 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5992 getF32Constant(DAG, 0x3fc4316c, dl));
5993 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5994 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t8,
5995 getF32Constant(DAG, 0x3f57ce70, dl));
5996 }
5997
5998 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, Log10ofMantissa);
5999 }
6000
6001 // No special expansion.
6002 return DAG.getNode(ISD::FLOG10, dl, Op.getValueType(), Op, Flags);
6003}
6004
6005/// expandExp2 - Lower an exp2 intrinsic. Handles the special sequences for
6006/// limited-precision mode.
6008 const TargetLowering &TLI, SDNodeFlags Flags) {
6009 if (Op.getValueType() == MVT::f32 &&
6011 return getLimitedPrecisionExp2(Op, dl, DAG);
6012
6013 // No special expansion.
6014 return DAG.getNode(ISD::FEXP2, dl, Op.getValueType(), Op, Flags);
6015}
6016
6017/// visitPow - Lower a pow intrinsic. Handles the special sequences for
6018/// limited-precision mode with x == 10.0f.
6020 SelectionDAG &DAG, const TargetLowering &TLI,
6021 SDNodeFlags Flags) {
6022 bool IsExp10 = false;
6023 if (LHS.getValueType() == MVT::f32 && RHS.getValueType() == MVT::f32 &&
6026 APFloat Ten(10.0f);
6027 IsExp10 = LHSC->isExactlyValue(Ten);
6028 }
6029 }
6030
6031 // TODO: What fast-math-flags should be set on the FMUL node?
6032 if (IsExp10) {
6033 // Put the exponent in the right bit position for later addition to the
6034 // final result:
6035 //
6036 // #define LOG2OF10 3.3219281f
6037 // t0 = Op * LOG2OF10;
6038 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, RHS,
6039 getF32Constant(DAG, 0x40549a78, dl));
6040 return getLimitedPrecisionExp2(t0, dl, DAG);
6041 }
6042
6043 // No special expansion.
6044 return DAG.getNode(ISD::FPOW, dl, LHS.getValueType(), LHS, RHS, Flags);
6045}
6046
6047/// ExpandPowI - Expand a llvm.powi intrinsic.
6049 SelectionDAG &DAG) {
6050 // If RHS is a constant, we can expand this out to a multiplication tree if
6051 // it's beneficial on the target, otherwise we end up lowering to a call to
6052 // __powidf2 (for example).
6054 unsigned Val = RHSC->getSExtValue();
6055
6056 // powi(x, 0) -> 1.0
6057 if (Val == 0)
6058 return DAG.getConstantFP(1.0, DL, LHS.getValueType());
6059
6061 Val, DAG.shouldOptForSize())) {
6062 // Get the exponent as a positive value.
6063 if ((int)Val < 0)
6064 Val = -Val;
6065 // We use the simple binary decomposition method to generate the multiply
6066 // sequence. There are more optimal ways to do this (for example,
6067 // powi(x,15) generates one more multiply than it should), but this has
6068 // the benefit of being both really simple and much better than a libcall.
6069 SDValue Res; // Logically starts equal to 1.0
6070 SDValue CurSquare = LHS;
6071 // TODO: Intrinsics should have fast-math-flags that propagate to these
6072 // nodes.
6073 while (Val) {
6074 if (Val & 1) {
6075 if (Res.getNode())
6076 Res =
6077 DAG.getNode(ISD::FMUL, DL, Res.getValueType(), Res, CurSquare);
6078 else
6079 Res = CurSquare; // 1.0*CurSquare.
6080 }
6081
6082 CurSquare = DAG.getNode(ISD::FMUL, DL, CurSquare.getValueType(),
6083 CurSquare, CurSquare);
6084 Val >>= 1;
6085 }
6086
6087 // If the original was negative, invert the result, producing 1/(x*x*x).
6088 if (RHSC->getSExtValue() < 0)
6089 Res = DAG.getNode(ISD::FDIV, DL, LHS.getValueType(),
6090 DAG.getConstantFP(1.0, DL, LHS.getValueType()), Res);
6091 return Res;
6092 }
6093 }
6094
6095 // Otherwise, expand to a libcall.
6096 return DAG.getNode(ISD::FPOWI, DL, LHS.getValueType(), LHS, RHS);
6097}
6098
6099static SDValue expandDivFix(unsigned Opcode, const SDLoc &DL,
6100 SDValue LHS, SDValue RHS, SDValue Scale,
6101 SelectionDAG &DAG, const TargetLowering &TLI) {
6102 EVT VT = LHS.getValueType();
6103 bool Signed = Opcode == ISD::SDIVFIX || Opcode == ISD::SDIVFIXSAT;
6104 bool Saturating = Opcode == ISD::SDIVFIXSAT || Opcode == ISD::UDIVFIXSAT;
6105 LLVMContext &Ctx = *DAG.getContext();
6106
6107 // If the type is legal but the operation isn't, this node might survive all
6108 // the way to operation legalization. If we end up there and we do not have
6109 // the ability to widen the type (if VT*2 is not legal), we cannot expand the
6110 // node.
6111
6112 // Coax the legalizer into expanding the node during type legalization instead
6113 // by bumping the size by one bit. This will force it to Promote, enabling the
6114 // early expansion and avoiding the need to expand later.
6115
6116 // We don't have to do this if Scale is 0; that can always be expanded, unless
6117 // it's a saturating signed operation. Those can experience true integer
6118 // division overflow, a case which we must avoid.
6119
6120 // FIXME: We wouldn't have to do this (or any of the early
6121 // expansion/promotion) if it was possible to expand a libcall of an
6122 // illegal type during operation legalization. But it's not, so things
6123 // get a bit hacky.
6124 unsigned ScaleInt = Scale->getAsZExtVal();
6125 if ((ScaleInt > 0 || (Saturating && Signed)) &&
6126 (TLI.isTypeLegal(VT) ||
6127 (VT.isVector() && TLI.isTypeLegal(VT.getVectorElementType())))) {
6129 Opcode, VT, ScaleInt);
6130 if (Action != TargetLowering::Legal && Action != TargetLowering::Custom) {
6131 EVT PromVT;
6132 if (VT.isScalarInteger())
6133 PromVT = EVT::getIntegerVT(Ctx, VT.getSizeInBits() + 1);
6134 else if (VT.isVector()) {
6135 PromVT = VT.getVectorElementType();
6136 PromVT = EVT::getIntegerVT(Ctx, PromVT.getSizeInBits() + 1);
6137 PromVT = EVT::getVectorVT(Ctx, PromVT, VT.getVectorElementCount());
6138 } else
6139 llvm_unreachable("Wrong VT for DIVFIX?");
6140 LHS = DAG.getExtOrTrunc(Signed, LHS, DL, PromVT);
6141 RHS = DAG.getExtOrTrunc(Signed, RHS, DL, PromVT);
6142 EVT ShiftTy = TLI.getShiftAmountTy(PromVT, DAG.getDataLayout());
6143 // For saturating operations, we need to shift up the LHS to get the
6144 // proper saturation width, and then shift down again afterwards.
6145 if (Saturating)
6146 LHS = DAG.getNode(ISD::SHL, DL, PromVT, LHS,
6147 DAG.getConstant(1, DL, ShiftTy));
6148 SDValue Res = DAG.getNode(Opcode, DL, PromVT, LHS, RHS, Scale);
6149 if (Saturating)
6150 Res = DAG.getNode(Signed ? ISD::SRA : ISD::SRL, DL, PromVT, Res,
6151 DAG.getConstant(1, DL, ShiftTy));
6152 return DAG.getZExtOrTrunc(Res, DL, VT);
6153 }
6154 }
6155
6156 return DAG.getNode(Opcode, DL, VT, LHS, RHS, Scale);
6157}
6158
6159// getUnderlyingArgRegs - Find underlying registers used for a truncated,
6160// bitcasted, or split argument. Returns a list of <Register, size in bits>
6161static void
6162getUnderlyingArgRegs(SmallVectorImpl<std::pair<Register, TypeSize>> &Regs,
6163 const SDValue &N) {
6164 switch (N.getOpcode()) {
6165 case ISD::CopyFromReg: {
6166 SDValue Op = N.getOperand(1);
6167 Regs.emplace_back(cast<RegisterSDNode>(Op)->getReg(),
6168 Op.getValueType().getSizeInBits());
6169 return;
6170 }
6171 case ISD::BITCAST:
6172 case ISD::AssertZext:
6173 case ISD::AssertSext:
6174 case ISD::TRUNCATE:
6175 getUnderlyingArgRegs(Regs, N.getOperand(0));
6176 return;
6177 case ISD::BUILD_PAIR:
6178 case ISD::BUILD_VECTOR:
6180 for (SDValue Op : N->op_values())
6181 getUnderlyingArgRegs(Regs, Op);
6182 return;
6183 default:
6184 return;
6185 }
6186}
6187
6188/// If the DbgValueInst is a dbg_value of a function argument, create the
6189/// corresponding DBG_VALUE machine instruction for it now. At the end of
6190/// instruction selection, they will be inserted to the entry BB.
6191/// We don't currently support this for variadic dbg_values, as they shouldn't
6192/// appear for function arguments or in the prologue.
6193bool SelectionDAGBuilder::EmitFuncArgumentDbgValue(
6194 const Value *V, DILocalVariable *Variable, DIExpression *Expr,
6195 DILocation *DL, FuncArgumentDbgValueKind Kind, const SDValue &N) {
6196 const Argument *Arg = dyn_cast<Argument>(V);
6197 if (!Arg)
6198 return false;
6199
6200 MachineFunction &MF = DAG.getMachineFunction();
6201 const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo();
6202
6203 // Helper to create DBG_INSTR_REFs or DBG_VALUEs, depending on what kind
6204 // we've been asked to pursue.
6205 auto MakeVRegDbgValue = [&](Register Reg, DIExpression *FragExpr,
6206 bool Indirect) {
6207 if (Reg.isVirtual() && MF.useDebugInstrRef()) {
6208 // For VRegs, in instruction referencing mode, create a DBG_INSTR_REF
6209 // pointing at the VReg, which will be patched up later.
6210 auto &Inst = TII->get(TargetOpcode::DBG_INSTR_REF);
6212 /* Reg */ Reg, /* isDef */ false, /* isImp */ false,
6213 /* isKill */ false, /* isDead */ false,
6214 /* isUndef */ false, /* isEarlyClobber */ false,
6215 /* SubReg */ 0, /* isDebug */ true)});
6216
6217 auto *NewDIExpr = FragExpr;
6218 // We don't have an "Indirect" field in DBG_INSTR_REF, fold that into
6219 // the DIExpression.
6220 if (Indirect)
6221 NewDIExpr = DIExpression::prepend(FragExpr, DIExpression::DerefBefore);
6223 NewDIExpr = DIExpression::prependOpcodes(NewDIExpr, Ops);
6224 return BuildMI(MF, DL, Inst, false, MOs, Variable, NewDIExpr);
6225 } else {
6226 // Create a completely standard DBG_VALUE.
6227 auto &Inst = TII->get(TargetOpcode::DBG_VALUE);
6228 return BuildMI(MF, DL, Inst, Indirect, Reg, Variable, FragExpr);
6229 }
6230 };
6231
6232 if (Kind == FuncArgumentDbgValueKind::Value) {
6233 // ArgDbgValues are hoisted to the beginning of the entry block. So we
6234 // should only emit as ArgDbgValue if the dbg.value intrinsic is found in
6235 // the entry block.
6236 bool IsInEntryBlock = FuncInfo.MBB == &FuncInfo.MF->front();
6237 if (!IsInEntryBlock)
6238 return false;
6239
6240 // ArgDbgValues are hoisted to the beginning of the entry block. So we
6241 // should only emit as ArgDbgValue if the dbg.value intrinsic describes a
6242 // variable that also is a param.
6243 //
6244 // Although, if we are at the top of the entry block already, we can still
6245 // emit using ArgDbgValue. This might catch some situations when the
6246 // dbg.value refers to an argument that isn't used in the entry block, so
6247 // any CopyToReg node would be optimized out and the only way to express
6248 // this DBG_VALUE is by using the physical reg (or FI) as done in this
6249 // method. ArgDbgValues are hoisted to the beginning of the entry block. So
6250 // we should only emit as ArgDbgValue if the Variable is an argument to the
6251 // current function, and the dbg.value intrinsic is found in the entry
6252 // block.
6253 bool VariableIsFunctionInputArg = Variable->isParameter() &&
6254 !DL->getInlinedAt();
6255 bool IsInPrologue = SDNodeOrder == LowestSDNodeOrder;
6256 if (!IsInPrologue && !VariableIsFunctionInputArg)
6257 return false;
6258
6259 // Here we assume that a function argument on IR level only can be used to
6260 // describe one input parameter on source level. If we for example have
6261 // source code like this
6262 //
6263 // struct A { long x, y; };
6264 // void foo(struct A a, long b) {
6265 // ...
6266 // b = a.x;
6267 // ...
6268 // }
6269 //
6270 // and IR like this
6271 //
6272 // define void @foo(i32 %a1, i32 %a2, i32 %b) {
6273 // entry:
6274 // call void @llvm.dbg.value(metadata i32 %a1, "a", DW_OP_LLVM_fragment
6275 // call void @llvm.dbg.value(metadata i32 %a2, "a", DW_OP_LLVM_fragment
6276 // call void @llvm.dbg.value(metadata i32 %b, "b",
6277 // ...
6278 // call void @llvm.dbg.value(metadata i32 %a1, "b"
6279 // ...
6280 //
6281 // then the last dbg.value is describing a parameter "b" using a value that
6282 // is an argument. But since we already has used %a1 to describe a parameter
6283 // we should not handle that last dbg.value here (that would result in an
6284 // incorrect hoisting of the DBG_VALUE to the function entry).
6285 // Notice that we allow one dbg.value per IR level argument, to accommodate
6286 // for the situation with fragments above.
6287 // If there is no node for the value being handled, we return true to skip
6288 // the normal generation of debug info, as it would kill existing debug
6289 // info for the parameter in case of duplicates.
6290 if (VariableIsFunctionInputArg) {
6291 unsigned ArgNo = Arg->getArgNo();
6292 if (ArgNo >= FuncInfo.DescribedArgs.size())
6293 FuncInfo.DescribedArgs.resize(ArgNo + 1, false);
6294 else if (!IsInPrologue && FuncInfo.DescribedArgs.test(ArgNo))
6295 return !NodeMap[V].getNode();
6296 FuncInfo.DescribedArgs.set(ArgNo);
6297 }
6298 }
6299
6300 bool IsIndirect = false;
6301 std::optional<MachineOperand> Op;
6302 // Some arguments' frame index is recorded during argument lowering.
6303 int FI = FuncInfo.getArgumentFrameIndex(Arg);
6304 if (FI != std::numeric_limits<int>::max())
6306
6308 if (!Op && N.getNode()) {
6309 getUnderlyingArgRegs(ArgRegsAndSizes, N);
6310 Register Reg;
6311 if (ArgRegsAndSizes.size() == 1)
6312 Reg = ArgRegsAndSizes.front().first;
6313
6314 if (Reg && Reg.isVirtual()) {
6315 MachineRegisterInfo &RegInfo = MF.getRegInfo();
6316 Register PR = RegInfo.getLiveInPhysReg(Reg);
6317 if (PR)
6318 Reg = PR;
6319 }
6320 if (Reg) {
6322 IsIndirect = Kind != FuncArgumentDbgValueKind::Value;
6323 }
6324 }
6325
6326 if (!Op && N.getNode()) {
6327 // Check if frame index is available.
6328 SDValue LCandidate = peekThroughBitcasts(N);
6329 if (LoadSDNode *LNode = dyn_cast<LoadSDNode>(LCandidate.getNode()))
6330 if (FrameIndexSDNode *FINode =
6331 dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
6332 Op = MachineOperand::CreateFI(FINode->getIndex());
6333 }
6334
6335 if (!Op) {
6336 // Create a DBG_VALUE for each decomposed value in ArgRegs to cover Reg
6337 auto splitMultiRegDbgValue =
6338 [&](ArrayRef<std::pair<Register, TypeSize>> SplitRegs) -> bool {
6339 unsigned Offset = 0;
6340 for (const auto &[Reg, RegSizeInBits] : SplitRegs) {
6341 // FIXME: Scalable sizes are not supported in fragment expressions.
6342 if (RegSizeInBits.isScalable())
6343 return false;
6344
6345 // If the expression is already a fragment, the current register
6346 // offset+size might extend beyond the fragment. In this case, only
6347 // the register bits that are inside the fragment are relevant.
6348 int RegFragmentSizeInBits = RegSizeInBits.getFixedValue();
6349 if (auto ExprFragmentInfo = Expr->getFragmentInfo()) {
6350 uint64_t ExprFragmentSizeInBits = ExprFragmentInfo->SizeInBits;
6351 // The register is entirely outside the expression fragment,
6352 // so is irrelevant for debug info.
6353 if (Offset >= ExprFragmentSizeInBits)
6354 break;
6355 // The register is partially outside the expression fragment, only
6356 // the low bits within the fragment are relevant for debug info.
6357 if (Offset + RegFragmentSizeInBits > ExprFragmentSizeInBits) {
6358 RegFragmentSizeInBits = ExprFragmentSizeInBits - Offset;
6359 }
6360 }
6361
6362 auto FragmentExpr = DIExpression::createFragmentExpression(
6363 Expr, Offset, RegFragmentSizeInBits);
6364 Offset += RegSizeInBits.getFixedValue();
6365 // If a valid fragment expression cannot be created, the variable's
6366 // correct value cannot be determined and so it is set as poison.
6367 if (!FragmentExpr) {
6368 SDDbgValue *SDV = DAG.getConstantDbgValue(
6369 Variable, Expr, PoisonValue::get(V->getType()), DL, SDNodeOrder);
6370 DAG.AddDbgValue(SDV, false);
6371 continue;
6372 }
6373 MachineInstr *NewMI = MakeVRegDbgValue(
6374 Reg, *FragmentExpr, Kind != FuncArgumentDbgValueKind::Value);
6375 FuncInfo.ArgDbgValues.push_back(NewMI);
6376 }
6377
6378 return true;
6379 };
6380
6381 // Check if ValueMap has reg number.
6383 VMI = FuncInfo.ValueMap.find(V);
6384 if (VMI != FuncInfo.ValueMap.end()) {
6385 const auto &TLI = DAG.getTargetLoweringInfo();
6386 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), VMI->second,
6387 V->getType(), std::nullopt);
6388 if (RFV.occupiesMultipleRegs())
6389 return splitMultiRegDbgValue(RFV.getRegsAndSizes());
6390
6391 Op = MachineOperand::CreateReg(VMI->second, false);
6392 IsIndirect = Kind != FuncArgumentDbgValueKind::Value;
6393 } else if (ArgRegsAndSizes.size() > 1) {
6394 // This was split due to the calling convention, and no virtual register
6395 // mapping exists for the value.
6396 return splitMultiRegDbgValue(ArgRegsAndSizes);
6397 }
6398 }
6399
6400 if (!Op)
6401 return false;
6402
6403 assert(Variable->isValidLocationForIntrinsic(DL) &&
6404 "Expected inlined-at fields to agree");
6405 MachineInstr *NewMI = nullptr;
6406
6407 if (Op->isReg())
6408 NewMI = MakeVRegDbgValue(Op->getReg(), Expr, IsIndirect);
6409 else
6410 NewMI = BuildMI(MF, DL, TII->get(TargetOpcode::DBG_VALUE), true, *Op,
6411 Variable, Expr);
6412
6413 // Otherwise, use ArgDbgValues.
6414 FuncInfo.ArgDbgValues.push_back(NewMI);
6415 return true;
6416}
6417
6418/// Return the appropriate SDDbgValue based on N.
6419SDDbgValue *SelectionDAGBuilder::getDbgValue(SDValue N,
6420 DILocalVariable *Variable,
6421 DIExpression *Expr,
6422 const DebugLoc &dl,
6423 unsigned DbgSDNodeOrder) {
6424 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(N.getNode())) {
6425 // Construct a FrameIndexDbgValue for FrameIndexSDNodes so we can describe
6426 // stack slot locations.
6427 //
6428 // Consider "int x = 0; int *px = &x;". There are two kinds of interesting
6429 // debug values here after optimization:
6430 //
6431 // dbg.value(i32* %px, !"int *px", !DIExpression()), and
6432 // dbg.value(i32* %px, !"int x", !DIExpression(DW_OP_deref))
6433 //
6434 // Both describe the direct values of their associated variables.
6435 return DAG.getFrameIndexDbgValue(Variable, Expr, FISDN->getIndex(),
6436 /*IsIndirect*/ false, dl, DbgSDNodeOrder);
6437 }
6438 return DAG.getDbgValue(Variable, Expr, N.getNode(), N.getResNo(),
6439 /*IsIndirect*/ false, dl, DbgSDNodeOrder);
6440}
6441
6442static unsigned FixedPointIntrinsicToOpcode(unsigned Intrinsic) {
6443 switch (Intrinsic) {
6444 case Intrinsic::smul_fix:
6445 return ISD::SMULFIX;
6446 case Intrinsic::umul_fix:
6447 return ISD::UMULFIX;
6448 case Intrinsic::smul_fix_sat:
6449 return ISD::SMULFIXSAT;
6450 case Intrinsic::umul_fix_sat:
6451 return ISD::UMULFIXSAT;
6452 case Intrinsic::sdiv_fix:
6453 return ISD::SDIVFIX;
6454 case Intrinsic::udiv_fix:
6455 return ISD::UDIVFIX;
6456 case Intrinsic::sdiv_fix_sat:
6457 return ISD::SDIVFIXSAT;
6458 case Intrinsic::udiv_fix_sat:
6459 return ISD::UDIVFIXSAT;
6460 default:
6461 llvm_unreachable("Unhandled fixed point intrinsic");
6462 }
6463}
6464
6465/// Given a @llvm.call.preallocated.setup, return the corresponding
6466/// preallocated call.
6467static const CallBase *FindPreallocatedCall(const Value *PreallocatedSetup) {
6468 assert(cast<CallBase>(PreallocatedSetup)
6470 ->getIntrinsicID() == Intrinsic::call_preallocated_setup &&
6471 "expected call_preallocated_setup Value");
6472 for (const auto *U : PreallocatedSetup->users()) {
6473 auto *UseCall = cast<CallBase>(U);
6474 const Function *Fn = UseCall->getCalledFunction();
6475 if (!Fn || Fn->getIntrinsicID() != Intrinsic::call_preallocated_arg) {
6476 return UseCall;
6477 }
6478 }
6479 llvm_unreachable("expected corresponding call to preallocated setup/arg");
6480}
6481
6482/// If DI is a debug value with an EntryValue expression, lower it using the
6483/// corresponding physical register of the associated Argument value
6484/// (guaranteed to exist by the verifier).
6485bool SelectionDAGBuilder::visitEntryValueDbgValue(
6486 ArrayRef<const Value *> Values, DILocalVariable *Variable,
6487 DIExpression *Expr, DebugLoc DbgLoc) {
6488 if (!Expr->isEntryValue() || !hasSingleElement(Values))
6489 return false;
6490
6491 // These properties are guaranteed by the verifier.
6492 const Argument *Arg = cast<Argument>(Values[0]);
6493 assert(Arg->hasAttribute(Attribute::AttrKind::SwiftAsync));
6494
6495 auto ArgIt = FuncInfo.ValueMap.find(Arg);
6496 if (ArgIt == FuncInfo.ValueMap.end()) {
6497 LLVM_DEBUG(
6498 dbgs() << "Dropping dbg.value: expression is entry_value but "
6499 "couldn't find an associated register for the Argument\n");
6500 return true;
6501 }
6502 Register ArgVReg = ArgIt->getSecond();
6503
6504 for (auto [PhysReg, VirtReg] : FuncInfo.RegInfo->liveins())
6505 if (ArgVReg == VirtReg || ArgVReg == PhysReg) {
6506 SDDbgValue *SDV = DAG.getVRegDbgValue(
6507 Variable, Expr, PhysReg, false /*IsIndidrect*/, DbgLoc, SDNodeOrder);
6508 DAG.AddDbgValue(SDV, false /*treat as dbg.declare byval parameter*/);
6509 return true;
6510 }
6511 LLVM_DEBUG(dbgs() << "Dropping dbg.value: expression is entry_value but "
6512 "couldn't find a physical register\n");
6513 return true;
6514}
6515
6516/// Lower the call to the specified intrinsic function.
6517void SelectionDAGBuilder::visitConvergenceControl(const CallInst &I,
6518 unsigned Intrinsic) {
6519 SDLoc sdl = getCurSDLoc();
6520 switch (Intrinsic) {
6521 case Intrinsic::experimental_convergence_anchor:
6522 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_ANCHOR, sdl, MVT::Untyped));
6523 break;
6524 case Intrinsic::experimental_convergence_entry:
6525 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_ENTRY, sdl, MVT::Untyped));
6526 break;
6527 case Intrinsic::experimental_convergence_loop: {
6528 auto Bundle = I.getOperandBundle(LLVMContext::OB_convergencectrl);
6529 auto *Token = Bundle->Inputs[0].get();
6530 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_LOOP, sdl, MVT::Untyped,
6531 getValue(Token)));
6532 break;
6533 }
6534 }
6535}
6536
6537void SelectionDAGBuilder::visitVectorHistogram(const CallInst &I,
6538 unsigned IntrinsicID) {
6539 // For now, we're only lowering an 'add' histogram.
6540 // We can add others later, e.g. saturating adds, min/max.
6541 assert(IntrinsicID == Intrinsic::experimental_vector_histogram_add &&
6542 "Tried to lower unsupported histogram type");
6543 SDLoc sdl = getCurSDLoc();
6544 Value *Ptr = I.getOperand(0);
6545 SDValue Inc = getValue(I.getOperand(1));
6546 SDValue Mask = getValue(I.getOperand(2));
6547
6548 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6549 DataLayout TargetDL = DAG.getDataLayout();
6550 EVT VT = Inc.getValueType();
6551 Align Alignment = DAG.getEVTAlign(VT);
6552
6553 const MDNode *Ranges = getRangeMetadata(I);
6554
6555 SDValue Root = DAG.getRoot();
6556 SDValue Base;
6557 SDValue Index;
6558 SDValue Scale;
6559 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
6560 I.getParent(), VT.getScalarStoreSize());
6561
6562 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
6563
6564 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
6565 MachinePointerInfo(AS),
6567 MemoryLocation::UnknownSize, Alignment, I.getAAMetadata(), Ranges);
6568
6569 if (!UniformBase) {
6570 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
6571 Index = getValue(Ptr);
6572 Scale =
6573 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
6574 }
6575
6576 EVT IdxVT = Index.getValueType();
6577
6578 // Avoid using e.g. i32 as index type when the increment must be performed
6579 // on i64's.
6580 bool MustExtendIndex = VT.getScalarSizeInBits() > IdxVT.getScalarSizeInBits();
6581 EVT EltTy = MustExtendIndex ? VT : IdxVT.getVectorElementType();
6582 if (MustExtendIndex || TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
6583 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
6584 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
6585 }
6586
6587 SDValue ID = DAG.getTargetConstant(IntrinsicID, sdl, MVT::i32);
6588
6589 SDValue Ops[] = {Root, Inc, Mask, Base, Index, Scale, ID};
6590 SDValue Histogram = DAG.getMaskedHistogram(DAG.getVTList(MVT::Other), VT, sdl,
6591 Ops, MMO, ISD::SIGNED_SCALED);
6592
6593 setValue(&I, Histogram);
6594 DAG.setRoot(Histogram);
6595}
6596
6597void SelectionDAGBuilder::visitVectorExtractLastActive(const CallInst &I,
6598 unsigned Intrinsic) {
6599 assert(Intrinsic == Intrinsic::experimental_vector_extract_last_active &&
6600 "Tried lowering invalid vector extract last");
6601 SDLoc sdl = getCurSDLoc();
6602 const DataLayout &Layout = DAG.getDataLayout();
6603 SDValue Data = getValue(I.getOperand(0));
6604 SDValue Mask = getValue(I.getOperand(1));
6605
6606 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6607 EVT ResVT = TLI.getValueType(Layout, I.getType());
6608
6609 EVT ExtVT = TLI.getVectorIdxTy(Layout);
6610 SDValue Idx = DAG.getNode(ISD::VECTOR_FIND_LAST_ACTIVE, sdl, ExtVT, Mask);
6611 SDValue Result = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, sdl, ResVT, Data, Idx);
6612
6613 Value *Default = I.getOperand(2);
6615 SDValue PassThru = getValue(Default);
6616 EVT BoolVT = Mask.getValueType().getScalarType();
6617 SDValue AnyActive = DAG.getNode(ISD::VECREDUCE_OR, sdl, BoolVT, Mask);
6618 Result = DAG.getSelect(sdl, ResVT, AnyActive, Result, PassThru);
6619 }
6620
6621 setValue(&I, Result);
6622}
6623
6624/// Lower the call to the specified intrinsic function.
6625void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
6626 unsigned Intrinsic) {
6627 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6628 SDLoc sdl = getCurSDLoc();
6629 DebugLoc dl = getCurDebugLoc();
6630 SDValue Res;
6631
6632 SDNodeFlags Flags;
6633 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
6634 Flags.copyFMF(*FPOp);
6635
6636 switch (Intrinsic) {
6637 default:
6638 // By default, turn this into a target intrinsic node.
6639 visitTargetIntrinsic(I, Intrinsic);
6640 return;
6641 case Intrinsic::vscale: {
6642 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6643 setValue(&I, DAG.getVScale(sdl, VT, APInt(VT.getSizeInBits(), 1)));
6644 return;
6645 }
6646 case Intrinsic::vastart: visitVAStart(I); return;
6647 case Intrinsic::vaend: visitVAEnd(I); return;
6648 case Intrinsic::vacopy: visitVACopy(I); return;
6649 case Intrinsic::returnaddress:
6650 setValue(&I, DAG.getNode(ISD::RETURNADDR, sdl,
6651 TLI.getValueType(DAG.getDataLayout(), I.getType()),
6652 getValue(I.getArgOperand(0))));
6653 return;
6654 case Intrinsic::addressofreturnaddress:
6655 setValue(&I,
6656 DAG.getNode(ISD::ADDROFRETURNADDR, sdl,
6657 TLI.getValueType(DAG.getDataLayout(), I.getType())));
6658 return;
6659 case Intrinsic::sponentry:
6660 setValue(&I,
6661 DAG.getNode(ISD::SPONENTRY, sdl,
6662 TLI.getValueType(DAG.getDataLayout(), I.getType())));
6663 return;
6664 case Intrinsic::frameaddress:
6665 setValue(&I, DAG.getNode(ISD::FRAMEADDR, sdl,
6666 TLI.getFrameIndexTy(DAG.getDataLayout()),
6667 getValue(I.getArgOperand(0))));
6668 return;
6669 case Intrinsic::read_volatile_register:
6670 case Intrinsic::read_register: {
6671 Value *Reg = I.getArgOperand(0);
6672 SDValue Chain = getRoot();
6674 DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
6675 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6676 Res = DAG.getNode(ISD::READ_REGISTER, sdl,
6677 DAG.getVTList(VT, MVT::Other), Chain, RegName);
6678 setValue(&I, Res);
6679 DAG.setRoot(Res.getValue(1));
6680 return;
6681 }
6682 case Intrinsic::write_register: {
6683 Value *Reg = I.getArgOperand(0);
6684 Value *RegValue = I.getArgOperand(1);
6685 SDValue Chain = getRoot();
6687 DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
6688 DAG.setRoot(DAG.getNode(ISD::WRITE_REGISTER, sdl, MVT::Other, Chain,
6689 RegName, getValue(RegValue)));
6690 return;
6691 }
6692 case Intrinsic::memcpy:
6693 case Intrinsic::memcpy_inline: {
6694 const auto &MCI = cast<MemCpyInst>(I);
6695 SDValue Dst = getValue(I.getArgOperand(0));
6696 SDValue Src = getValue(I.getArgOperand(1));
6697 SDValue Size = getValue(I.getArgOperand(2));
6698 assert((!MCI.isForceInlined() || isa<ConstantSDNode>(Size)) &&
6699 "memcpy_inline needs constant size");
6700 // @llvm.memcpy.inline defines 0 and 1 to both mean no alignment.
6701 Align DstAlign = MCI.getDestAlign().valueOrOne();
6702 Align SrcAlign = MCI.getSourceAlign().valueOrOne();
6703 Align Alignment = std::min(DstAlign, SrcAlign);
6704 bool isVol = MCI.isVolatile();
6705 // FIXME: Support passing different dest/src alignments to the memcpy DAG
6706 // node.
6707 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6708 SDValue MC = DAG.getMemcpy(Root, sdl, Dst, Src, Size, Alignment, isVol,
6709 MCI.isForceInlined(), &I, std::nullopt,
6710 MachinePointerInfo(I.getArgOperand(0)),
6711 MachinePointerInfo(I.getArgOperand(1)),
6712 I.getAAMetadata(), BatchAA);
6713 updateDAGForMaybeTailCall(MC);
6714 return;
6715 }
6716 case Intrinsic::memset:
6717 case Intrinsic::memset_inline: {
6718 const auto &MSII = cast<MemSetInst>(I);
6719 SDValue Dst = getValue(I.getArgOperand(0));
6720 SDValue Value = getValue(I.getArgOperand(1));
6721 SDValue Size = getValue(I.getArgOperand(2));
6722 assert((!MSII.isForceInlined() || isa<ConstantSDNode>(Size)) &&
6723 "memset_inline needs constant size");
6724 // @llvm.memset defines 0 and 1 to both mean no alignment.
6725 Align DstAlign = MSII.getDestAlign().valueOrOne();
6726 bool isVol = MSII.isVolatile();
6727 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6728 SDValue MC = DAG.getMemset(
6729 Root, sdl, Dst, Value, Size, DstAlign, isVol, MSII.isForceInlined(),
6730 &I, MachinePointerInfo(I.getArgOperand(0)), I.getAAMetadata());
6731 updateDAGForMaybeTailCall(MC);
6732 return;
6733 }
6734 case Intrinsic::memmove: {
6735 const auto &MMI = cast<MemMoveInst>(I);
6736 SDValue Op1 = getValue(I.getArgOperand(0));
6737 SDValue Op2 = getValue(I.getArgOperand(1));
6738 SDValue Op3 = getValue(I.getArgOperand(2));
6739 // @llvm.memmove defines 0 and 1 to both mean no alignment.
6740 Align DstAlign = MMI.getDestAlign().valueOrOne();
6741 Align SrcAlign = MMI.getSourceAlign().valueOrOne();
6742 Align Alignment = std::min(DstAlign, SrcAlign);
6743 bool isVol = MMI.isVolatile();
6744 // FIXME: Support passing different dest/src alignments to the memmove DAG
6745 // node.
6746 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6747 SDValue MM = DAG.getMemmove(Root, sdl, Op1, Op2, Op3, Alignment, isVol, &I,
6748 /* OverrideTailCall */ std::nullopt,
6749 MachinePointerInfo(I.getArgOperand(0)),
6750 MachinePointerInfo(I.getArgOperand(1)),
6751 I.getAAMetadata(), BatchAA);
6752 updateDAGForMaybeTailCall(MM);
6753 return;
6754 }
6755 case Intrinsic::memcpy_element_unordered_atomic: {
6756 auto &MI = cast<AnyMemCpyInst>(I);
6757 SDValue Dst = getValue(MI.getRawDest());
6758 SDValue Src = getValue(MI.getRawSource());
6759 SDValue Length = getValue(MI.getLength());
6760
6761 Type *LengthTy = MI.getLength()->getType();
6762 unsigned ElemSz = MI.getElementSizeInBytes();
6763 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6764 SDValue MC =
6765 DAG.getAtomicMemcpy(getRoot(), sdl, Dst, Src, Length, LengthTy, ElemSz,
6766 isTC, MachinePointerInfo(MI.getRawDest()),
6767 MachinePointerInfo(MI.getRawSource()));
6768 updateDAGForMaybeTailCall(MC);
6769 return;
6770 }
6771 case Intrinsic::memmove_element_unordered_atomic: {
6772 auto &MI = cast<AnyMemMoveInst>(I);
6773 SDValue Dst = getValue(MI.getRawDest());
6774 SDValue Src = getValue(MI.getRawSource());
6775 SDValue Length = getValue(MI.getLength());
6776
6777 Type *LengthTy = MI.getLength()->getType();
6778 unsigned ElemSz = MI.getElementSizeInBytes();
6779 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6780 SDValue MC =
6781 DAG.getAtomicMemmove(getRoot(), sdl, Dst, Src, Length, LengthTy, ElemSz,
6782 isTC, MachinePointerInfo(MI.getRawDest()),
6783 MachinePointerInfo(MI.getRawSource()));
6784 updateDAGForMaybeTailCall(MC);
6785 return;
6786 }
6787 case Intrinsic::memset_element_unordered_atomic: {
6788 auto &MI = cast<AnyMemSetInst>(I);
6789 SDValue Dst = getValue(MI.getRawDest());
6790 SDValue Val = getValue(MI.getValue());
6791 SDValue Length = getValue(MI.getLength());
6792
6793 Type *LengthTy = MI.getLength()->getType();
6794 unsigned ElemSz = MI.getElementSizeInBytes();
6795 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6796 SDValue MC =
6797 DAG.getAtomicMemset(getRoot(), sdl, Dst, Val, Length, LengthTy, ElemSz,
6798 isTC, MachinePointerInfo(MI.getRawDest()));
6799 updateDAGForMaybeTailCall(MC);
6800 return;
6801 }
6802 case Intrinsic::call_preallocated_setup: {
6803 const CallBase *PreallocatedCall = FindPreallocatedCall(&I);
6804 SDValue SrcValue = DAG.getSrcValue(PreallocatedCall);
6805 SDValue Res = DAG.getNode(ISD::PREALLOCATED_SETUP, sdl, MVT::Other,
6806 getRoot(), SrcValue);
6807 setValue(&I, Res);
6808 DAG.setRoot(Res);
6809 return;
6810 }
6811 case Intrinsic::call_preallocated_arg: {
6812 const CallBase *PreallocatedCall = FindPreallocatedCall(I.getOperand(0));
6813 SDValue SrcValue = DAG.getSrcValue(PreallocatedCall);
6814 SDValue Ops[3];
6815 Ops[0] = getRoot();
6816 Ops[1] = SrcValue;
6817 Ops[2] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(1)), sdl,
6818 MVT::i32); // arg index
6819 SDValue Res = DAG.getNode(
6821 DAG.getVTList(TLI.getPointerTy(DAG.getDataLayout()), MVT::Other), Ops);
6822 setValue(&I, Res);
6823 DAG.setRoot(Res.getValue(1));
6824 return;
6825 }
6826
6827 case Intrinsic::eh_typeid_for: {
6828 // Find the type id for the given typeinfo.
6829 GlobalValue *GV = ExtractTypeInfo(I.getArgOperand(0));
6830 unsigned TypeID = DAG.getMachineFunction().getTypeIDFor(GV);
6831 Res = DAG.getConstant(TypeID, sdl, MVT::i32);
6832 setValue(&I, Res);
6833 return;
6834 }
6835
6836 case Intrinsic::eh_return_i32:
6837 case Intrinsic::eh_return_i64:
6838 DAG.getMachineFunction().setCallsEHReturn(true);
6839 DAG.setRoot(DAG.getNode(ISD::EH_RETURN, sdl,
6840 MVT::Other,
6842 getValue(I.getArgOperand(0)),
6843 getValue(I.getArgOperand(1))));
6844 return;
6845 case Intrinsic::eh_unwind_init:
6846 DAG.getMachineFunction().setCallsUnwindInit(true);
6847 return;
6848 case Intrinsic::eh_dwarf_cfa:
6849 setValue(&I, DAG.getNode(ISD::EH_DWARF_CFA, sdl,
6850 TLI.getPointerTy(DAG.getDataLayout()),
6851 getValue(I.getArgOperand(0))));
6852 return;
6853 case Intrinsic::eh_sjlj_callsite: {
6854 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(0));
6855 assert(FuncInfo.getCurrentCallSite() == 0 && "Overlapping call sites!");
6856
6857 FuncInfo.setCurrentCallSite(CI->getZExtValue());
6858 return;
6859 }
6860 case Intrinsic::eh_sjlj_functioncontext: {
6861 // Get and store the index of the function context.
6862 MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo();
6863 AllocaInst *FnCtx =
6864 cast<AllocaInst>(I.getArgOperand(0)->stripPointerCasts());
6865 int FI = FuncInfo.StaticAllocaMap[FnCtx];
6867 return;
6868 }
6869 case Intrinsic::eh_sjlj_setjmp: {
6870 SDValue Ops[2];
6871 Ops[0] = getRoot();
6872 Ops[1] = getValue(I.getArgOperand(0));
6873 SDValue Op = DAG.getNode(ISD::EH_SJLJ_SETJMP, sdl,
6874 DAG.getVTList(MVT::i32, MVT::Other), Ops);
6875 setValue(&I, Op.getValue(0));
6876 DAG.setRoot(Op.getValue(1));
6877 return;
6878 }
6879 case Intrinsic::eh_sjlj_longjmp:
6880 DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_LONGJMP, sdl, MVT::Other,
6881 getRoot(), getValue(I.getArgOperand(0))));
6882 return;
6883 case Intrinsic::eh_sjlj_setup_dispatch:
6884 DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_SETUP_DISPATCH, sdl, MVT::Other,
6885 getRoot()));
6886 return;
6887 case Intrinsic::masked_gather:
6888 visitMaskedGather(I);
6889 return;
6890 case Intrinsic::masked_load:
6891 visitMaskedLoad(I);
6892 return;
6893 case Intrinsic::masked_scatter:
6894 visitMaskedScatter(I);
6895 return;
6896 case Intrinsic::masked_store:
6897 visitMaskedStore(I);
6898 return;
6899 case Intrinsic::masked_expandload:
6900 visitMaskedLoad(I, true /* IsExpanding */);
6901 return;
6902 case Intrinsic::masked_compressstore:
6903 visitMaskedStore(I, true /* IsCompressing */);
6904 return;
6905 case Intrinsic::powi:
6906 setValue(&I, ExpandPowI(sdl, getValue(I.getArgOperand(0)),
6907 getValue(I.getArgOperand(1)), DAG));
6908 return;
6909 case Intrinsic::log:
6910 setValue(&I, expandLog(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6911 return;
6912 case Intrinsic::log2:
6913 setValue(&I,
6914 expandLog2(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6915 return;
6916 case Intrinsic::log10:
6917 setValue(&I,
6918 expandLog10(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6919 return;
6920 case Intrinsic::exp:
6921 setValue(&I, expandExp(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6922 return;
6923 case Intrinsic::exp2:
6924 setValue(&I,
6925 expandExp2(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6926 return;
6927 case Intrinsic::pow:
6928 setValue(&I, expandPow(sdl, getValue(I.getArgOperand(0)),
6929 getValue(I.getArgOperand(1)), DAG, TLI, Flags));
6930 return;
6931 case Intrinsic::sqrt:
6932 case Intrinsic::fabs:
6933 case Intrinsic::sin:
6934 case Intrinsic::cos:
6935 case Intrinsic::tan:
6936 case Intrinsic::asin:
6937 case Intrinsic::acos:
6938 case Intrinsic::atan:
6939 case Intrinsic::sinh:
6940 case Intrinsic::cosh:
6941 case Intrinsic::tanh:
6942 case Intrinsic::exp10:
6943 case Intrinsic::floor:
6944 case Intrinsic::ceil:
6945 case Intrinsic::trunc:
6946 case Intrinsic::rint:
6947 case Intrinsic::nearbyint:
6948 case Intrinsic::round:
6949 case Intrinsic::roundeven:
6950 case Intrinsic::canonicalize: {
6951 unsigned Opcode;
6952 // clang-format off
6953 switch (Intrinsic) {
6954 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
6955 case Intrinsic::sqrt: Opcode = ISD::FSQRT; break;
6956 case Intrinsic::fabs: Opcode = ISD::FABS; break;
6957 case Intrinsic::sin: Opcode = ISD::FSIN; break;
6958 case Intrinsic::cos: Opcode = ISD::FCOS; break;
6959 case Intrinsic::tan: Opcode = ISD::FTAN; break;
6960 case Intrinsic::asin: Opcode = ISD::FASIN; break;
6961 case Intrinsic::acos: Opcode = ISD::FACOS; break;
6962 case Intrinsic::atan: Opcode = ISD::FATAN; break;
6963 case Intrinsic::sinh: Opcode = ISD::FSINH; break;
6964 case Intrinsic::cosh: Opcode = ISD::FCOSH; break;
6965 case Intrinsic::tanh: Opcode = ISD::FTANH; break;
6966 case Intrinsic::exp10: Opcode = ISD::FEXP10; break;
6967 case Intrinsic::floor: Opcode = ISD::FFLOOR; break;
6968 case Intrinsic::ceil: Opcode = ISD::FCEIL; break;
6969 case Intrinsic::trunc: Opcode = ISD::FTRUNC; break;
6970 case Intrinsic::rint: Opcode = ISD::FRINT; break;
6971 case Intrinsic::nearbyint: Opcode = ISD::FNEARBYINT; break;
6972 case Intrinsic::round: Opcode = ISD::FROUND; break;
6973 case Intrinsic::roundeven: Opcode = ISD::FROUNDEVEN; break;
6974 case Intrinsic::canonicalize: Opcode = ISD::FCANONICALIZE; break;
6975 }
6976 // clang-format on
6977
6978 setValue(&I, DAG.getNode(Opcode, sdl,
6979 getValue(I.getArgOperand(0)).getValueType(),
6980 getValue(I.getArgOperand(0)), Flags));
6981 return;
6982 }
6983 case Intrinsic::atan2:
6984 setValue(&I, DAG.getNode(ISD::FATAN2, sdl,
6985 getValue(I.getArgOperand(0)).getValueType(),
6986 getValue(I.getArgOperand(0)),
6987 getValue(I.getArgOperand(1)), Flags));
6988 return;
6989 case Intrinsic::lround:
6990 case Intrinsic::llround:
6991 case Intrinsic::lrint:
6992 case Intrinsic::llrint: {
6993 unsigned Opcode;
6994 // clang-format off
6995 switch (Intrinsic) {
6996 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
6997 case Intrinsic::lround: Opcode = ISD::LROUND; break;
6998 case Intrinsic::llround: Opcode = ISD::LLROUND; break;
6999 case Intrinsic::lrint: Opcode = ISD::LRINT; break;
7000 case Intrinsic::llrint: Opcode = ISD::LLRINT; break;
7001 }
7002 // clang-format on
7003
7004 EVT RetVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7005 setValue(&I, DAG.getNode(Opcode, sdl, RetVT,
7006 getValue(I.getArgOperand(0))));
7007 return;
7008 }
7009 case Intrinsic::minnum:
7010 setValue(&I, DAG.getNode(ISD::FMINNUM, sdl,
7011 getValue(I.getArgOperand(0)).getValueType(),
7012 getValue(I.getArgOperand(0)),
7013 getValue(I.getArgOperand(1)), Flags));
7014 return;
7015 case Intrinsic::maxnum:
7016 setValue(&I, DAG.getNode(ISD::FMAXNUM, sdl,
7017 getValue(I.getArgOperand(0)).getValueType(),
7018 getValue(I.getArgOperand(0)),
7019 getValue(I.getArgOperand(1)), Flags));
7020 return;
7021 case Intrinsic::minimum:
7022 setValue(&I, DAG.getNode(ISD::FMINIMUM, sdl,
7023 getValue(I.getArgOperand(0)).getValueType(),
7024 getValue(I.getArgOperand(0)),
7025 getValue(I.getArgOperand(1)), Flags));
7026 return;
7027 case Intrinsic::maximum:
7028 setValue(&I, DAG.getNode(ISD::FMAXIMUM, sdl,
7029 getValue(I.getArgOperand(0)).getValueType(),
7030 getValue(I.getArgOperand(0)),
7031 getValue(I.getArgOperand(1)), Flags));
7032 return;
7033 case Intrinsic::minimumnum:
7034 setValue(&I, DAG.getNode(ISD::FMINIMUMNUM, sdl,
7035 getValue(I.getArgOperand(0)).getValueType(),
7036 getValue(I.getArgOperand(0)),
7037 getValue(I.getArgOperand(1)), Flags));
7038 return;
7039 case Intrinsic::maximumnum:
7040 setValue(&I, DAG.getNode(ISD::FMAXIMUMNUM, sdl,
7041 getValue(I.getArgOperand(0)).getValueType(),
7042 getValue(I.getArgOperand(0)),
7043 getValue(I.getArgOperand(1)), Flags));
7044 return;
7045 case Intrinsic::copysign:
7046 setValue(&I, DAG.getNode(ISD::FCOPYSIGN, sdl,
7047 getValue(I.getArgOperand(0)).getValueType(),
7048 getValue(I.getArgOperand(0)),
7049 getValue(I.getArgOperand(1)), Flags));
7050 return;
7051 case Intrinsic::ldexp:
7052 setValue(&I, DAG.getNode(ISD::FLDEXP, sdl,
7053 getValue(I.getArgOperand(0)).getValueType(),
7054 getValue(I.getArgOperand(0)),
7055 getValue(I.getArgOperand(1)), Flags));
7056 return;
7057 case Intrinsic::modf:
7058 case Intrinsic::sincos:
7059 case Intrinsic::sincospi:
7060 case Intrinsic::frexp: {
7061 unsigned Opcode;
7062 switch (Intrinsic) {
7063 default:
7064 llvm_unreachable("unexpected intrinsic");
7065 case Intrinsic::sincos:
7066 Opcode = ISD::FSINCOS;
7067 break;
7068 case Intrinsic::sincospi:
7069 Opcode = ISD::FSINCOSPI;
7070 break;
7071 case Intrinsic::modf:
7072 Opcode = ISD::FMODF;
7073 break;
7074 case Intrinsic::frexp:
7075 Opcode = ISD::FFREXP;
7076 break;
7077 }
7078 SmallVector<EVT, 2> ValueVTs;
7079 ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);
7080 SDVTList VTs = DAG.getVTList(ValueVTs);
7081 setValue(
7082 &I, DAG.getNode(Opcode, sdl, VTs, getValue(I.getArgOperand(0)), Flags));
7083 return;
7084 }
7085 case Intrinsic::arithmetic_fence: {
7086 setValue(&I, DAG.getNode(ISD::ARITH_FENCE, sdl,
7087 getValue(I.getArgOperand(0)).getValueType(),
7088 getValue(I.getArgOperand(0)), Flags));
7089 return;
7090 }
7091 case Intrinsic::fma:
7092 setValue(&I, DAG.getNode(
7093 ISD::FMA, sdl, getValue(I.getArgOperand(0)).getValueType(),
7094 getValue(I.getArgOperand(0)), getValue(I.getArgOperand(1)),
7095 getValue(I.getArgOperand(2)), Flags));
7096 return;
7097#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
7098 case Intrinsic::INTRINSIC:
7099#include "llvm/IR/ConstrainedOps.def"
7100 visitConstrainedFPIntrinsic(cast<ConstrainedFPIntrinsic>(I));
7101 return;
7102#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID:
7103#include "llvm/IR/VPIntrinsics.def"
7104 visitVectorPredicationIntrinsic(cast<VPIntrinsic>(I));
7105 return;
7106 case Intrinsic::fptrunc_round: {
7107 // Get the last argument, the metadata and convert it to an integer in the
7108 // call
7109 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(1))->getMetadata();
7110 std::optional<RoundingMode> RoundMode =
7111 convertStrToRoundingMode(cast<MDString>(MD)->getString());
7112
7113 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7114
7115 // Propagate fast-math-flags from IR to node(s).
7116 SDNodeFlags Flags;
7117 Flags.copyFMF(*cast<FPMathOperator>(&I));
7118 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
7119
7121 Result = DAG.getNode(
7122 ISD::FPTRUNC_ROUND, sdl, VT, getValue(I.getArgOperand(0)),
7123 DAG.getTargetConstant((int)*RoundMode, sdl, MVT::i32));
7124 setValue(&I, Result);
7125
7126 return;
7127 }
7128 case Intrinsic::fmuladd: {
7129 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7130 if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
7131 TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), VT)) {
7132 setValue(&I, DAG.getNode(ISD::FMA, sdl,
7133 getValue(I.getArgOperand(0)).getValueType(),
7134 getValue(I.getArgOperand(0)),
7135 getValue(I.getArgOperand(1)),
7136 getValue(I.getArgOperand(2)), Flags));
7137 } else if (TLI.isOperationLegalOrCustom(ISD::FMULADD, VT)) {
7138 // TODO: Support splitting the vector.
7139 setValue(&I, DAG.getNode(ISD::FMULADD, sdl,
7140 getValue(I.getArgOperand(0)).getValueType(),
7141 getValue(I.getArgOperand(0)),
7142 getValue(I.getArgOperand(1)),
7143 getValue(I.getArgOperand(2)), Flags));
7144 } else {
7145 // TODO: Intrinsic calls should have fast-math-flags.
7146 SDValue Mul = DAG.getNode(
7147 ISD::FMUL, sdl, getValue(I.getArgOperand(0)).getValueType(),
7148 getValue(I.getArgOperand(0)), getValue(I.getArgOperand(1)), Flags);
7149 SDValue Add = DAG.getNode(ISD::FADD, sdl,
7150 getValue(I.getArgOperand(0)).getValueType(),
7151 Mul, getValue(I.getArgOperand(2)), Flags);
7152 setValue(&I, Add);
7153 }
7154 return;
7155 }
7156 case Intrinsic::fptosi_sat: {
7157 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7158 setValue(&I, DAG.getNode(ISD::FP_TO_SINT_SAT, sdl, VT,
7159 getValue(I.getArgOperand(0)),
7160 DAG.getValueType(VT.getScalarType())));
7161 return;
7162 }
7163 case Intrinsic::fptoui_sat: {
7164 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7165 setValue(&I, DAG.getNode(ISD::FP_TO_UINT_SAT, sdl, VT,
7166 getValue(I.getArgOperand(0)),
7167 DAG.getValueType(VT.getScalarType())));
7168 return;
7169 }
7170 case Intrinsic::convert_from_arbitrary_fp: {
7171 // Extract format metadata and convert to semantics enum.
7172 EVT DstVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7173 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(1))->getMetadata();
7174 StringRef FormatStr = cast<MDString>(MD)->getString();
7175 const fltSemantics *SrcSem =
7177 if (!SrcSem) {
7178 DAG.getContext()->emitError(
7179 "convert_from_arbitrary_fp: not implemented format '" + FormatStr +
7180 "'");
7181 setValue(&I, DAG.getPOISON(DstVT));
7182 return;
7183 }
7185
7186 SDValue IntVal = getValue(I.getArgOperand(0));
7187
7188 // Emit ISD::CONVERT_FROM_ARBITRARY_FP node.
7189 SDValue SemConst =
7190 DAG.getTargetConstant(static_cast<int>(SemEnum), sdl, MVT::i32);
7191 setValue(&I, DAG.getNode(ISD::CONVERT_FROM_ARBITRARY_FP, sdl, DstVT, IntVal,
7192 SemConst));
7193 return;
7194 }
7195 case Intrinsic::set_rounding:
7196 Res = DAG.getNode(ISD::SET_ROUNDING, sdl, MVT::Other,
7197 {getRoot(), getValue(I.getArgOperand(0))});
7198 setValue(&I, Res);
7199 DAG.setRoot(Res.getValue(0));
7200 return;
7201 case Intrinsic::is_fpclass: {
7202 const DataLayout DLayout = DAG.getDataLayout();
7203 EVT DestVT = TLI.getValueType(DLayout, I.getType());
7204 EVT ArgVT = TLI.getValueType(DLayout, I.getArgOperand(0)->getType());
7205 FPClassTest Test = static_cast<FPClassTest>(
7206 cast<ConstantInt>(I.getArgOperand(1))->getZExtValue());
7207 MachineFunction &MF = DAG.getMachineFunction();
7208 const Function &F = MF.getFunction();
7209 SDValue Op = getValue(I.getArgOperand(0));
7210 SDNodeFlags Flags;
7211 Flags.setNoFPExcept(
7212 !F.getAttributes().hasFnAttr(llvm::Attribute::StrictFP));
7213 // If ISD::IS_FPCLASS should be expanded, do it right now, because the
7214 // expansion can use illegal types. Making expansion early allows
7215 // legalizing these types prior to selection.
7216 if (!TLI.isOperationLegal(ISD::IS_FPCLASS, ArgVT) &&
7217 !TLI.isOperationCustom(ISD::IS_FPCLASS, ArgVT)) {
7218 SDValue Result = TLI.expandIS_FPCLASS(DestVT, Op, Test, Flags, sdl, DAG);
7219 setValue(&I, Result);
7220 return;
7221 }
7222
7223 SDValue Check = DAG.getTargetConstant(Test, sdl, MVT::i32);
7224 SDValue V = DAG.getNode(ISD::IS_FPCLASS, sdl, DestVT, {Op, Check}, Flags);
7225 setValue(&I, V);
7226 return;
7227 }
7228 case Intrinsic::get_fpenv: {
7229 const DataLayout DLayout = DAG.getDataLayout();
7230 EVT EnvVT = TLI.getValueType(DLayout, I.getType());
7231 Align TempAlign = DAG.getEVTAlign(EnvVT);
7232 SDValue Chain = getRoot();
7233 // Use GET_FPENV if it is legal or custom. Otherwise use memory-based node
7234 // and temporary storage in stack.
7235 if (TLI.isOperationLegalOrCustom(ISD::GET_FPENV, EnvVT)) {
7236 Res = DAG.getNode(
7237 ISD::GET_FPENV, sdl,
7238 DAG.getVTList(TLI.getValueType(DAG.getDataLayout(), I.getType()),
7239 MVT::Other),
7240 Chain);
7241 } else {
7242 SDValue Temp = DAG.CreateStackTemporary(EnvVT, TempAlign.value());
7243 int SPFI = cast<FrameIndexSDNode>(Temp.getNode())->getIndex();
7244 auto MPI =
7245 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI);
7246 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
7248 TempAlign);
7249 Chain = DAG.getGetFPEnv(Chain, sdl, Temp, EnvVT, MMO);
7250 Res = DAG.getLoad(EnvVT, sdl, Chain, Temp, MPI);
7251 }
7252 setValue(&I, Res);
7253 DAG.setRoot(Res.getValue(1));
7254 return;
7255 }
7256 case Intrinsic::set_fpenv: {
7257 const DataLayout DLayout = DAG.getDataLayout();
7258 SDValue Env = getValue(I.getArgOperand(0));
7259 EVT EnvVT = Env.getValueType();
7260 Align TempAlign = DAG.getEVTAlign(EnvVT);
7261 SDValue Chain = getRoot();
7262 // If SET_FPENV is custom or legal, use it. Otherwise use loading
7263 // environment from memory.
7264 if (TLI.isOperationLegalOrCustom(ISD::SET_FPENV, EnvVT)) {
7265 Chain = DAG.getNode(ISD::SET_FPENV, sdl, MVT::Other, Chain, Env);
7266 } else {
7267 // Allocate space in stack, copy environment bits into it and use this
7268 // memory in SET_FPENV_MEM.
7269 SDValue Temp = DAG.CreateStackTemporary(EnvVT, TempAlign.value());
7270 int SPFI = cast<FrameIndexSDNode>(Temp.getNode())->getIndex();
7271 auto MPI =
7272 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI);
7273 Chain = DAG.getStore(Chain, sdl, Env, Temp, MPI, TempAlign,
7275 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
7277 TempAlign);
7278 Chain = DAG.getSetFPEnv(Chain, sdl, Temp, EnvVT, MMO);
7279 }
7280 DAG.setRoot(Chain);
7281 return;
7282 }
7283 case Intrinsic::reset_fpenv:
7284 DAG.setRoot(DAG.getNode(ISD::RESET_FPENV, sdl, MVT::Other, getRoot()));
7285 return;
7286 case Intrinsic::get_fpmode:
7287 Res = DAG.getNode(
7288 ISD::GET_FPMODE, sdl,
7289 DAG.getVTList(TLI.getValueType(DAG.getDataLayout(), I.getType()),
7290 MVT::Other),
7291 DAG.getRoot());
7292 setValue(&I, Res);
7293 DAG.setRoot(Res.getValue(1));
7294 return;
7295 case Intrinsic::set_fpmode:
7296 Res = DAG.getNode(ISD::SET_FPMODE, sdl, MVT::Other, {DAG.getRoot()},
7297 getValue(I.getArgOperand(0)));
7298 DAG.setRoot(Res);
7299 return;
7300 case Intrinsic::reset_fpmode: {
7301 Res = DAG.getNode(ISD::RESET_FPMODE, sdl, MVT::Other, getRoot());
7302 DAG.setRoot(Res);
7303 return;
7304 }
7305 case Intrinsic::pcmarker: {
7306 SDValue Tmp = getValue(I.getArgOperand(0));
7307 DAG.setRoot(DAG.getNode(ISD::PCMARKER, sdl, MVT::Other, getRoot(), Tmp));
7308 return;
7309 }
7310 case Intrinsic::readcyclecounter: {
7311 SDValue Op = getRoot();
7312 Res = DAG.getNode(ISD::READCYCLECOUNTER, sdl,
7313 DAG.getVTList(MVT::i64, MVT::Other), Op);
7314 setValue(&I, Res);
7315 DAG.setRoot(Res.getValue(1));
7316 return;
7317 }
7318 case Intrinsic::readsteadycounter: {
7319 SDValue Op = getRoot();
7320 Res = DAG.getNode(ISD::READSTEADYCOUNTER, sdl,
7321 DAG.getVTList(MVT::i64, MVT::Other), Op);
7322 setValue(&I, Res);
7323 DAG.setRoot(Res.getValue(1));
7324 return;
7325 }
7326 case Intrinsic::bitreverse:
7327 setValue(&I, DAG.getNode(ISD::BITREVERSE, sdl,
7328 getValue(I.getArgOperand(0)).getValueType(),
7329 getValue(I.getArgOperand(0))));
7330 return;
7331 case Intrinsic::bswap:
7332 setValue(&I, DAG.getNode(ISD::BSWAP, sdl,
7333 getValue(I.getArgOperand(0)).getValueType(),
7334 getValue(I.getArgOperand(0))));
7335 return;
7336 case Intrinsic::cttz: {
7337 SDValue Arg = getValue(I.getArgOperand(0));
7338 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
7339 EVT Ty = Arg.getValueType();
7340 setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTTZ : ISD::CTTZ_ZERO_UNDEF,
7341 sdl, Ty, Arg));
7342 return;
7343 }
7344 case Intrinsic::ctlz: {
7345 SDValue Arg = getValue(I.getArgOperand(0));
7346 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
7347 EVT Ty = Arg.getValueType();
7348 setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTLZ : ISD::CTLZ_ZERO_UNDEF,
7349 sdl, Ty, Arg));
7350 return;
7351 }
7352 case Intrinsic::ctpop: {
7353 SDValue Arg = getValue(I.getArgOperand(0));
7354 EVT Ty = Arg.getValueType();
7355 setValue(&I, DAG.getNode(ISD::CTPOP, sdl, Ty, Arg));
7356 return;
7357 }
7358 case Intrinsic::fshl:
7359 case Intrinsic::fshr: {
7360 bool IsFSHL = Intrinsic == Intrinsic::fshl;
7361 SDValue X = getValue(I.getArgOperand(0));
7362 SDValue Y = getValue(I.getArgOperand(1));
7363 SDValue Z = getValue(I.getArgOperand(2));
7364 EVT VT = X.getValueType();
7365
7366 if (X == Y) {
7367 auto RotateOpcode = IsFSHL ? ISD::ROTL : ISD::ROTR;
7368 setValue(&I, DAG.getNode(RotateOpcode, sdl, VT, X, Z));
7369 } else {
7370 auto FunnelOpcode = IsFSHL ? ISD::FSHL : ISD::FSHR;
7371 setValue(&I, DAG.getNode(FunnelOpcode, sdl, VT, X, Y, Z));
7372 }
7373 return;
7374 }
7375 case Intrinsic::clmul: {
7376 SDValue X = getValue(I.getArgOperand(0));
7377 SDValue Y = getValue(I.getArgOperand(1));
7378 setValue(&I, DAG.getNode(ISD::CLMUL, sdl, X.getValueType(), X, Y));
7379 return;
7380 }
7381 case Intrinsic::sadd_sat: {
7382 SDValue Op1 = getValue(I.getArgOperand(0));
7383 SDValue Op2 = getValue(I.getArgOperand(1));
7384 setValue(&I, DAG.getNode(ISD::SADDSAT, sdl, Op1.getValueType(), Op1, Op2));
7385 return;
7386 }
7387 case Intrinsic::uadd_sat: {
7388 SDValue Op1 = getValue(I.getArgOperand(0));
7389 SDValue Op2 = getValue(I.getArgOperand(1));
7390 setValue(&I, DAG.getNode(ISD::UADDSAT, sdl, Op1.getValueType(), Op1, Op2));
7391 return;
7392 }
7393 case Intrinsic::ssub_sat: {
7394 SDValue Op1 = getValue(I.getArgOperand(0));
7395 SDValue Op2 = getValue(I.getArgOperand(1));
7396 setValue(&I, DAG.getNode(ISD::SSUBSAT, sdl, Op1.getValueType(), Op1, Op2));
7397 return;
7398 }
7399 case Intrinsic::usub_sat: {
7400 SDValue Op1 = getValue(I.getArgOperand(0));
7401 SDValue Op2 = getValue(I.getArgOperand(1));
7402 setValue(&I, DAG.getNode(ISD::USUBSAT, sdl, Op1.getValueType(), Op1, Op2));
7403 return;
7404 }
7405 case Intrinsic::sshl_sat:
7406 case Intrinsic::ushl_sat: {
7407 SDValue Op1 = getValue(I.getArgOperand(0));
7408 SDValue Op2 = getValue(I.getArgOperand(1));
7409
7410 EVT ShiftTy = DAG.getTargetLoweringInfo().getShiftAmountTy(
7411 Op1.getValueType(), DAG.getDataLayout());
7412
7413 // Coerce the shift amount to the right type if we can. This exposes the
7414 // truncate or zext to optimization early.
7415 if (!I.getType()->isVectorTy() && Op2.getValueType() != ShiftTy) {
7416 assert(ShiftTy.getSizeInBits() >=
7418 "Unexpected shift type");
7419 Op2 = DAG.getZExtOrTrunc(Op2, getCurSDLoc(), ShiftTy);
7420 }
7421
7422 unsigned Opc =
7423 Intrinsic == Intrinsic::sshl_sat ? ISD::SSHLSAT : ISD::USHLSAT;
7424 setValue(&I, DAG.getNode(Opc, sdl, Op1.getValueType(), Op1, Op2));
7425 return;
7426 }
7427 case Intrinsic::smul_fix:
7428 case Intrinsic::umul_fix:
7429 case Intrinsic::smul_fix_sat:
7430 case Intrinsic::umul_fix_sat: {
7431 SDValue Op1 = getValue(I.getArgOperand(0));
7432 SDValue Op2 = getValue(I.getArgOperand(1));
7433 SDValue Op3 = getValue(I.getArgOperand(2));
7434 setValue(&I, DAG.getNode(FixedPointIntrinsicToOpcode(Intrinsic), sdl,
7435 Op1.getValueType(), Op1, Op2, Op3));
7436 return;
7437 }
7438 case Intrinsic::sdiv_fix:
7439 case Intrinsic::udiv_fix:
7440 case Intrinsic::sdiv_fix_sat:
7441 case Intrinsic::udiv_fix_sat: {
7442 SDValue Op1 = getValue(I.getArgOperand(0));
7443 SDValue Op2 = getValue(I.getArgOperand(1));
7444 SDValue Op3 = getValue(I.getArgOperand(2));
7446 Op1, Op2, Op3, DAG, TLI));
7447 return;
7448 }
7449 case Intrinsic::smax: {
7450 SDValue Op1 = getValue(I.getArgOperand(0));
7451 SDValue Op2 = getValue(I.getArgOperand(1));
7452 setValue(&I, DAG.getNode(ISD::SMAX, sdl, Op1.getValueType(), Op1, Op2));
7453 return;
7454 }
7455 case Intrinsic::smin: {
7456 SDValue Op1 = getValue(I.getArgOperand(0));
7457 SDValue Op2 = getValue(I.getArgOperand(1));
7458 setValue(&I, DAG.getNode(ISD::SMIN, sdl, Op1.getValueType(), Op1, Op2));
7459 return;
7460 }
7461 case Intrinsic::umax: {
7462 SDValue Op1 = getValue(I.getArgOperand(0));
7463 SDValue Op2 = getValue(I.getArgOperand(1));
7464 setValue(&I, DAG.getNode(ISD::UMAX, sdl, Op1.getValueType(), Op1, Op2));
7465 return;
7466 }
7467 case Intrinsic::umin: {
7468 SDValue Op1 = getValue(I.getArgOperand(0));
7469 SDValue Op2 = getValue(I.getArgOperand(1));
7470 setValue(&I, DAG.getNode(ISD::UMIN, sdl, Op1.getValueType(), Op1, Op2));
7471 return;
7472 }
7473 case Intrinsic::abs: {
7474 // TODO: Preserve "int min is poison" arg in SDAG?
7475 SDValue Op1 = getValue(I.getArgOperand(0));
7476 setValue(&I, DAG.getNode(ISD::ABS, sdl, Op1.getValueType(), Op1));
7477 return;
7478 }
7479 case Intrinsic::scmp: {
7480 SDValue Op1 = getValue(I.getArgOperand(0));
7481 SDValue Op2 = getValue(I.getArgOperand(1));
7482 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7483 setValue(&I, DAG.getNode(ISD::SCMP, sdl, DestVT, Op1, Op2));
7484 break;
7485 }
7486 case Intrinsic::ucmp: {
7487 SDValue Op1 = getValue(I.getArgOperand(0));
7488 SDValue Op2 = getValue(I.getArgOperand(1));
7489 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7490 setValue(&I, DAG.getNode(ISD::UCMP, sdl, DestVT, Op1, Op2));
7491 break;
7492 }
7493 case Intrinsic::stackaddress:
7494 case Intrinsic::stacksave: {
7495 unsigned SDOpcode = Intrinsic == Intrinsic::stackaddress ? ISD::STACKADDRESS
7497 SDValue Op = getRoot();
7498 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7499 Res = DAG.getNode(SDOpcode, sdl, DAG.getVTList(VT, MVT::Other), Op);
7500 setValue(&I, Res);
7501 DAG.setRoot(Res.getValue(1));
7502 return;
7503 }
7504 case Intrinsic::stackrestore:
7505 Res = getValue(I.getArgOperand(0));
7506 DAG.setRoot(DAG.getNode(ISD::STACKRESTORE, sdl, MVT::Other, getRoot(), Res));
7507 return;
7508 case Intrinsic::get_dynamic_area_offset: {
7509 SDValue Op = getRoot();
7510 EVT ResTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
7511 Res = DAG.getNode(ISD::GET_DYNAMIC_AREA_OFFSET, sdl, DAG.getVTList(ResTy),
7512 Op);
7513 DAG.setRoot(Op);
7514 setValue(&I, Res);
7515 return;
7516 }
7517 case Intrinsic::stackguard: {
7518 MachineFunction &MF = DAG.getMachineFunction();
7519 const Module &M = *MF.getFunction().getParent();
7520 EVT PtrTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
7521 SDValue Chain = getRoot();
7522 if (TLI.useLoadStackGuardNode(M)) {
7523 Res = getLoadStackGuard(DAG, sdl, Chain);
7524 Res = DAG.getPtrExtOrTrunc(Res, sdl, PtrTy);
7525 } else {
7526 const Value *Global = TLI.getSDagStackGuard(M, DAG.getLibcalls());
7527 if (!Global) {
7528 LLVMContext &Ctx = *DAG.getContext();
7529 Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
7530 setValue(&I, DAG.getPOISON(PtrTy));
7531 return;
7532 }
7533
7534 Align Align = DAG.getDataLayout().getPrefTypeAlign(Global->getType());
7535 Res = DAG.getLoad(PtrTy, sdl, Chain, getValue(Global),
7536 MachinePointerInfo(Global, 0), Align,
7538 }
7539 if (TLI.useStackGuardXorFP())
7540 Res = TLI.emitStackGuardXorFP(DAG, Res, sdl);
7541 DAG.setRoot(Chain);
7542 setValue(&I, Res);
7543 return;
7544 }
7545 case Intrinsic::stackprotector: {
7546 // Emit code into the DAG to store the stack guard onto the stack.
7547 MachineFunction &MF = DAG.getMachineFunction();
7548 MachineFrameInfo &MFI = MF.getFrameInfo();
7549 const Module &M = *MF.getFunction().getParent();
7550 SDValue Src, Chain = getRoot();
7551
7552 if (TLI.useLoadStackGuardNode(M))
7553 Src = getLoadStackGuard(DAG, sdl, Chain);
7554 else
7555 Src = getValue(I.getArgOperand(0)); // The guard's value.
7556
7557 AllocaInst *Slot = cast<AllocaInst>(I.getArgOperand(1));
7558
7559 int FI = FuncInfo.StaticAllocaMap[Slot];
7560 MFI.setStackProtectorIndex(FI);
7561 EVT PtrTy = TLI.getFrameIndexTy(DAG.getDataLayout());
7562
7563 SDValue FIN = DAG.getFrameIndex(FI, PtrTy);
7564
7565 // Store the stack protector onto the stack.
7566 Res = DAG.getStore(
7567 Chain, sdl, Src, FIN,
7568 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI),
7569 MaybeAlign(), MachineMemOperand::MOVolatile);
7570 setValue(&I, Res);
7571 DAG.setRoot(Res);
7572 return;
7573 }
7574 case Intrinsic::objectsize:
7575 llvm_unreachable("llvm.objectsize.* should have been lowered already");
7576
7577 case Intrinsic::is_constant:
7578 llvm_unreachable("llvm.is.constant.* should have been lowered already");
7579
7580 case Intrinsic::annotation:
7581 case Intrinsic::ptr_annotation:
7582 case Intrinsic::launder_invariant_group:
7583 case Intrinsic::strip_invariant_group:
7584 // Drop the intrinsic, but forward the value
7585 setValue(&I, getValue(I.getOperand(0)));
7586 return;
7587
7588 case Intrinsic::type_test:
7589 case Intrinsic::public_type_test:
7590 reportFatalUsageError("llvm.type.test intrinsic must be lowered by the "
7591 "LowerTypeTests pass before code generation");
7592 return;
7593
7594 case Intrinsic::assume:
7595 case Intrinsic::experimental_noalias_scope_decl:
7596 case Intrinsic::var_annotation:
7597 case Intrinsic::sideeffect:
7598 // Discard annotate attributes, noalias scope declarations, assumptions, and
7599 // artificial side-effects.
7600 return;
7601
7602 case Intrinsic::codeview_annotation: {
7603 // Emit a label associated with this metadata.
7604 MachineFunction &MF = DAG.getMachineFunction();
7605 MCSymbol *Label = MF.getContext().createTempSymbol("annotation", true);
7606 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(0))->getMetadata();
7607 MF.addCodeViewAnnotation(Label, cast<MDNode>(MD));
7608 Res = DAG.getLabelNode(ISD::ANNOTATION_LABEL, sdl, getRoot(), Label);
7609 DAG.setRoot(Res);
7610 return;
7611 }
7612
7613 case Intrinsic::init_trampoline: {
7614 const Function *F = cast<Function>(I.getArgOperand(1)->stripPointerCasts());
7615
7616 SDValue Ops[6];
7617 Ops[0] = getRoot();
7618 Ops[1] = getValue(I.getArgOperand(0));
7619 Ops[2] = getValue(I.getArgOperand(1));
7620 Ops[3] = getValue(I.getArgOperand(2));
7621 Ops[4] = DAG.getSrcValue(I.getArgOperand(0));
7622 Ops[5] = DAG.getSrcValue(F);
7623
7624 Res = DAG.getNode(ISD::INIT_TRAMPOLINE, sdl, MVT::Other, Ops);
7625
7626 DAG.setRoot(Res);
7627 return;
7628 }
7629 case Intrinsic::adjust_trampoline:
7630 setValue(&I, DAG.getNode(ISD::ADJUST_TRAMPOLINE, sdl,
7631 TLI.getPointerTy(DAG.getDataLayout()),
7632 getValue(I.getArgOperand(0))));
7633 return;
7634 case Intrinsic::gcroot: {
7635 assert(DAG.getMachineFunction().getFunction().hasGC() &&
7636 "only valid in functions with gc specified, enforced by Verifier");
7637 assert(GFI && "implied by previous");
7638 const Value *Alloca = I.getArgOperand(0)->stripPointerCasts();
7639 const Constant *TypeMap = cast<Constant>(I.getArgOperand(1));
7640
7641 FrameIndexSDNode *FI = cast<FrameIndexSDNode>(getValue(Alloca).getNode());
7642 GFI->addStackRoot(FI->getIndex(), TypeMap);
7643 return;
7644 }
7645 case Intrinsic::gcread:
7646 case Intrinsic::gcwrite:
7647 llvm_unreachable("GC failed to lower gcread/gcwrite intrinsics!");
7648 case Intrinsic::get_rounding:
7649 Res = DAG.getNode(ISD::GET_ROUNDING, sdl, {MVT::i32, MVT::Other}, getRoot());
7650 setValue(&I, Res);
7651 DAG.setRoot(Res.getValue(1));
7652 return;
7653
7654 case Intrinsic::expect:
7655 case Intrinsic::expect_with_probability:
7656 // Just replace __builtin_expect(exp, c) and
7657 // __builtin_expect_with_probability(exp, c, p) with EXP.
7658 setValue(&I, getValue(I.getArgOperand(0)));
7659 return;
7660
7661 case Intrinsic::ubsantrap:
7662 case Intrinsic::debugtrap:
7663 case Intrinsic::trap: {
7664 StringRef TrapFuncName =
7665 I.getAttributes().getFnAttr("trap-func-name").getValueAsString();
7666 if (TrapFuncName.empty()) {
7667 switch (Intrinsic) {
7668 case Intrinsic::trap:
7669 DAG.setRoot(DAG.getNode(ISD::TRAP, sdl, MVT::Other, getRoot()));
7670 break;
7671 case Intrinsic::debugtrap:
7672 DAG.setRoot(DAG.getNode(ISD::DEBUGTRAP, sdl, MVT::Other, getRoot()));
7673 break;
7674 case Intrinsic::ubsantrap:
7675 DAG.setRoot(DAG.getNode(
7676 ISD::UBSANTRAP, sdl, MVT::Other, getRoot(),
7677 DAG.getTargetConstant(
7678 cast<ConstantInt>(I.getArgOperand(0))->getZExtValue(), sdl,
7679 MVT::i32)));
7680 break;
7681 default: llvm_unreachable("unknown trap intrinsic");
7682 }
7683 DAG.addNoMergeSiteInfo(DAG.getRoot().getNode(),
7684 I.hasFnAttr(Attribute::NoMerge));
7685 return;
7686 }
7688 if (Intrinsic == Intrinsic::ubsantrap) {
7689 Value *Arg = I.getArgOperand(0);
7690 Args.emplace_back(Arg, getValue(Arg));
7691 }
7692
7693 TargetLowering::CallLoweringInfo CLI(DAG);
7694 CLI.setDebugLoc(sdl).setChain(getRoot()).setLibCallee(
7695 CallingConv::C, I.getType(),
7696 DAG.getExternalSymbol(TrapFuncName.data(),
7697 TLI.getPointerTy(DAG.getDataLayout())),
7698 std::move(Args));
7699 CLI.NoMerge = I.hasFnAttr(Attribute::NoMerge);
7700 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
7701 DAG.setRoot(Result.second);
7702 return;
7703 }
7704
7705 case Intrinsic::allow_runtime_check:
7706 case Intrinsic::allow_ubsan_check:
7707 setValue(&I, getValue(ConstantInt::getTrue(I.getType())));
7708 return;
7709
7710 case Intrinsic::uadd_with_overflow:
7711 case Intrinsic::sadd_with_overflow:
7712 case Intrinsic::usub_with_overflow:
7713 case Intrinsic::ssub_with_overflow:
7714 case Intrinsic::umul_with_overflow:
7715 case Intrinsic::smul_with_overflow: {
7717 switch (Intrinsic) {
7718 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
7719 case Intrinsic::uadd_with_overflow: Op = ISD::UADDO; break;
7720 case Intrinsic::sadd_with_overflow: Op = ISD::SADDO; break;
7721 case Intrinsic::usub_with_overflow: Op = ISD::USUBO; break;
7722 case Intrinsic::ssub_with_overflow: Op = ISD::SSUBO; break;
7723 case Intrinsic::umul_with_overflow: Op = ISD::UMULO; break;
7724 case Intrinsic::smul_with_overflow: Op = ISD::SMULO; break;
7725 }
7726 SDValue Op1 = getValue(I.getArgOperand(0));
7727 SDValue Op2 = getValue(I.getArgOperand(1));
7728
7729 EVT ResultVT = Op1.getValueType();
7730 EVT OverflowVT = ResultVT.changeElementType(*Context, MVT::i1);
7731
7732 SDVTList VTs = DAG.getVTList(ResultVT, OverflowVT);
7733 setValue(&I, DAG.getNode(Op, sdl, VTs, Op1, Op2));
7734 return;
7735 }
7736 case Intrinsic::prefetch: {
7737 SDValue Ops[5];
7738 unsigned rw = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
7740 Ops[0] = DAG.getRoot();
7741 Ops[1] = getValue(I.getArgOperand(0));
7742 Ops[2] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(1)), sdl,
7743 MVT::i32);
7744 Ops[3] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(2)), sdl,
7745 MVT::i32);
7746 Ops[4] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(3)), sdl,
7747 MVT::i32);
7748 SDValue Result = DAG.getMemIntrinsicNode(
7749 ISD::PREFETCH, sdl, DAG.getVTList(MVT::Other), Ops,
7750 EVT::getIntegerVT(*Context, 8), MachinePointerInfo(I.getArgOperand(0)),
7751 /* align */ std::nullopt, Flags);
7752
7753 // Chain the prefetch in parallel with any pending loads, to stay out of
7754 // the way of later optimizations.
7755 PendingLoads.push_back(Result);
7756 Result = getRoot();
7757 DAG.setRoot(Result);
7758 return;
7759 }
7760 case Intrinsic::lifetime_start:
7761 case Intrinsic::lifetime_end: {
7762 bool IsStart = (Intrinsic == Intrinsic::lifetime_start);
7763 // Stack coloring is not enabled in O0, discard region information.
7764 if (TM.getOptLevel() == CodeGenOptLevel::None)
7765 return;
7766
7767 const AllocaInst *LifetimeObject = dyn_cast<AllocaInst>(I.getArgOperand(0));
7768 if (!LifetimeObject)
7769 return;
7770
7771 // First check that the Alloca is static, otherwise it won't have a
7772 // valid frame index.
7773 auto SI = FuncInfo.StaticAllocaMap.find(LifetimeObject);
7774 if (SI == FuncInfo.StaticAllocaMap.end())
7775 return;
7776
7777 const int FrameIndex = SI->second;
7778 Res = DAG.getLifetimeNode(IsStart, sdl, getRoot(), FrameIndex);
7779 DAG.setRoot(Res);
7780 return;
7781 }
7782 case Intrinsic::pseudoprobe: {
7783 auto Guid = cast<ConstantInt>(I.getArgOperand(0))->getZExtValue();
7784 auto Index = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
7785 auto Attr = cast<ConstantInt>(I.getArgOperand(2))->getZExtValue();
7786 Res = DAG.getPseudoProbeNode(sdl, getRoot(), Guid, Index, Attr);
7787 DAG.setRoot(Res);
7788 return;
7789 }
7790 case Intrinsic::invariant_start:
7791 // Discard region information.
7792 setValue(&I,
7793 DAG.getUNDEF(TLI.getValueType(DAG.getDataLayout(), I.getType())));
7794 return;
7795 case Intrinsic::invariant_end:
7796 // Discard region information.
7797 return;
7798 case Intrinsic::clear_cache: {
7799 SDValue InputChain = DAG.getRoot();
7800 SDValue StartVal = getValue(I.getArgOperand(0));
7801 SDValue EndVal = getValue(I.getArgOperand(1));
7802 Res = DAG.getNode(ISD::CLEAR_CACHE, sdl, DAG.getVTList(MVT::Other),
7803 {InputChain, StartVal, EndVal});
7804 setValue(&I, Res);
7805 DAG.setRoot(Res);
7806 return;
7807 }
7808 case Intrinsic::donothing:
7809 case Intrinsic::seh_try_begin:
7810 case Intrinsic::seh_scope_begin:
7811 case Intrinsic::seh_try_end:
7812 case Intrinsic::seh_scope_end:
7813 // ignore
7814 return;
7815 case Intrinsic::experimental_stackmap:
7816 visitStackmap(I);
7817 return;
7818 case Intrinsic::experimental_patchpoint_void:
7819 case Intrinsic::experimental_patchpoint:
7820 visitPatchpoint(I);
7821 return;
7822 case Intrinsic::experimental_gc_statepoint:
7824 return;
7825 case Intrinsic::experimental_gc_result:
7826 visitGCResult(cast<GCResultInst>(I));
7827 return;
7828 case Intrinsic::experimental_gc_relocate:
7829 visitGCRelocate(cast<GCRelocateInst>(I));
7830 return;
7831 case Intrinsic::instrprof_cover:
7832 llvm_unreachable("instrprof failed to lower a cover");
7833 case Intrinsic::instrprof_increment:
7834 llvm_unreachable("instrprof failed to lower an increment");
7835 case Intrinsic::instrprof_timestamp:
7836 llvm_unreachable("instrprof failed to lower a timestamp");
7837 case Intrinsic::instrprof_value_profile:
7838 llvm_unreachable("instrprof failed to lower a value profiling call");
7839 case Intrinsic::instrprof_mcdc_parameters:
7840 llvm_unreachable("instrprof failed to lower mcdc parameters");
7841 case Intrinsic::instrprof_mcdc_tvbitmap_update:
7842 llvm_unreachable("instrprof failed to lower an mcdc tvbitmap update");
7843 case Intrinsic::localescape: {
7844 MachineFunction &MF = DAG.getMachineFunction();
7845 const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo();
7846
7847 // Directly emit some LOCAL_ESCAPE machine instrs. Label assignment emission
7848 // is the same on all targets.
7849 for (unsigned Idx = 0, E = I.arg_size(); Idx < E; ++Idx) {
7850 Value *Arg = I.getArgOperand(Idx)->stripPointerCasts();
7851 if (isa<ConstantPointerNull>(Arg))
7852 continue; // Skip null pointers. They represent a hole in index space.
7853 AllocaInst *Slot = cast<AllocaInst>(Arg);
7854 assert(FuncInfo.StaticAllocaMap.count(Slot) &&
7855 "can only escape static allocas");
7856 int FI = FuncInfo.StaticAllocaMap[Slot];
7857 MCSymbol *FrameAllocSym = MF.getContext().getOrCreateFrameAllocSymbol(
7859 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, dl,
7860 TII->get(TargetOpcode::LOCAL_ESCAPE))
7861 .addSym(FrameAllocSym)
7862 .addFrameIndex(FI);
7863 }
7864
7865 return;
7866 }
7867
7868 case Intrinsic::localrecover: {
7869 // i8* @llvm.localrecover(i8* %fn, i8* %fp, i32 %idx)
7870 MachineFunction &MF = DAG.getMachineFunction();
7871
7872 // Get the symbol that defines the frame offset.
7873 auto *Fn = cast<Function>(I.getArgOperand(0)->stripPointerCasts());
7874 auto *Idx = cast<ConstantInt>(I.getArgOperand(2));
7875 unsigned IdxVal =
7876 unsigned(Idx->getLimitedValue(std::numeric_limits<int>::max()));
7877 MCSymbol *FrameAllocSym = MF.getContext().getOrCreateFrameAllocSymbol(
7879
7880 Value *FP = I.getArgOperand(1);
7881 SDValue FPVal = getValue(FP);
7882 EVT PtrVT = FPVal.getValueType();
7883
7884 // Create a MCSymbol for the label to avoid any target lowering
7885 // that would make this PC relative.
7886 SDValue OffsetSym = DAG.getMCSymbol(FrameAllocSym, PtrVT);
7887 SDValue OffsetVal =
7888 DAG.getNode(ISD::LOCAL_RECOVER, sdl, PtrVT, OffsetSym);
7889
7890 // Add the offset to the FP.
7891 SDValue Add = DAG.getMemBasePlusOffset(FPVal, OffsetVal, sdl);
7892 setValue(&I, Add);
7893
7894 return;
7895 }
7896
7897 case Intrinsic::fake_use: {
7898 Value *V = I.getArgOperand(0);
7899 SDValue Ops[2];
7900 // For Values not declared or previously used in this basic block, the
7901 // NodeMap will not have an entry, and `getValue` will assert if V has no
7902 // valid register value.
7903 auto FakeUseValue = [&]() -> SDValue {
7904 SDValue &N = NodeMap[V];
7905 if (N.getNode())
7906 return N;
7907
7908 // If there's a virtual register allocated and initialized for this
7909 // value, use it.
7910 if (SDValue copyFromReg = getCopyFromRegs(V, V->getType()))
7911 return copyFromReg;
7912 // FIXME: Do we want to preserve constants? It seems pointless.
7913 if (isa<Constant>(V))
7914 return getValue(V);
7915 return SDValue();
7916 }();
7917 if (!FakeUseValue || FakeUseValue.isUndef())
7918 return;
7919 Ops[0] = getRoot();
7920 Ops[1] = FakeUseValue;
7921 // Also, do not translate a fake use with an undef operand, or any other
7922 // empty SDValues.
7923 if (!Ops[1] || Ops[1].isUndef())
7924 return;
7925 DAG.setRoot(DAG.getNode(ISD::FAKE_USE, sdl, MVT::Other, Ops));
7926 return;
7927 }
7928
7929 case Intrinsic::reloc_none: {
7930 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(0))->getMetadata();
7931 StringRef SymbolName = cast<MDString>(MD)->getString();
7932 SDValue Ops[2] = {
7933 getRoot(),
7934 DAG.getTargetExternalSymbol(
7935 SymbolName.data(), TLI.getProgramPointerTy(DAG.getDataLayout()))};
7936 DAG.setRoot(DAG.getNode(ISD::RELOC_NONE, sdl, MVT::Other, Ops));
7937 return;
7938 }
7939
7940 case Intrinsic::cond_loop: {
7941 SDValue InputChain = DAG.getRoot();
7942 SDValue P = getValue(I.getArgOperand(0));
7943 Res = DAG.getNode(ISD::COND_LOOP, sdl, DAG.getVTList(MVT::Other),
7944 {InputChain, P});
7945 setValue(&I, Res);
7946 DAG.setRoot(Res);
7947 return;
7948 }
7949
7950 case Intrinsic::eh_exceptionpointer:
7951 case Intrinsic::eh_exceptioncode: {
7952 // Get the exception pointer vreg, copy from it, and resize it to fit.
7953 const auto *CPI = cast<CatchPadInst>(I.getArgOperand(0));
7954 MVT PtrVT = TLI.getPointerTy(DAG.getDataLayout());
7955 const TargetRegisterClass *PtrRC = TLI.getRegClassFor(PtrVT);
7956 Register VReg = FuncInfo.getCatchPadExceptionPointerVReg(CPI, PtrRC);
7957 SDValue N = DAG.getCopyFromReg(DAG.getEntryNode(), sdl, VReg, PtrVT);
7958 if (Intrinsic == Intrinsic::eh_exceptioncode)
7959 N = DAG.getZExtOrTrunc(N, sdl, MVT::i32);
7960 setValue(&I, N);
7961 return;
7962 }
7963 case Intrinsic::xray_customevent: {
7964 // Here we want to make sure that the intrinsic behaves as if it has a
7965 // specific calling convention.
7966 const auto &Triple = DAG.getTarget().getTargetTriple();
7967 if (!Triple.isAArch64(64) && Triple.getArch() != Triple::x86_64)
7968 return;
7969
7971
7972 // We want to say that we always want the arguments in registers.
7973 SDValue LogEntryVal = getValue(I.getArgOperand(0));
7974 SDValue StrSizeVal = getValue(I.getArgOperand(1));
7975 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
7976 SDValue Chain = getRoot();
7977 Ops.push_back(LogEntryVal);
7978 Ops.push_back(StrSizeVal);
7979 Ops.push_back(Chain);
7980
7981 // We need to enforce the calling convention for the callsite, so that
7982 // argument ordering is enforced correctly, and that register allocation can
7983 // see that some registers may be assumed clobbered and have to preserve
7984 // them across calls to the intrinsic.
7985 MachineSDNode *MN = DAG.getMachineNode(TargetOpcode::PATCHABLE_EVENT_CALL,
7986 sdl, NodeTys, Ops);
7987 SDValue patchableNode = SDValue(MN, 0);
7988 DAG.setRoot(patchableNode);
7989 setValue(&I, patchableNode);
7990 return;
7991 }
7992 case Intrinsic::xray_typedevent: {
7993 // Here we want to make sure that the intrinsic behaves as if it has a
7994 // specific calling convention.
7995 const auto &Triple = DAG.getTarget().getTargetTriple();
7996 if (!Triple.isAArch64(64) && Triple.getArch() != Triple::x86_64)
7997 return;
7998
8000
8001 // We want to say that we always want the arguments in registers.
8002 // It's unclear to me how manipulating the selection DAG here forces callers
8003 // to provide arguments in registers instead of on the stack.
8004 SDValue LogTypeId = getValue(I.getArgOperand(0));
8005 SDValue LogEntryVal = getValue(I.getArgOperand(1));
8006 SDValue StrSizeVal = getValue(I.getArgOperand(2));
8007 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
8008 SDValue Chain = getRoot();
8009 Ops.push_back(LogTypeId);
8010 Ops.push_back(LogEntryVal);
8011 Ops.push_back(StrSizeVal);
8012 Ops.push_back(Chain);
8013
8014 // We need to enforce the calling convention for the callsite, so that
8015 // argument ordering is enforced correctly, and that register allocation can
8016 // see that some registers may be assumed clobbered and have to preserve
8017 // them across calls to the intrinsic.
8018 MachineSDNode *MN = DAG.getMachineNode(
8019 TargetOpcode::PATCHABLE_TYPED_EVENT_CALL, sdl, NodeTys, Ops);
8020 SDValue patchableNode = SDValue(MN, 0);
8021 DAG.setRoot(patchableNode);
8022 setValue(&I, patchableNode);
8023 return;
8024 }
8025 case Intrinsic::experimental_deoptimize:
8027 return;
8028 case Intrinsic::stepvector:
8029 visitStepVector(I);
8030 return;
8031 case Intrinsic::vector_reduce_fadd:
8032 case Intrinsic::vector_reduce_fmul:
8033 case Intrinsic::vector_reduce_add:
8034 case Intrinsic::vector_reduce_mul:
8035 case Intrinsic::vector_reduce_and:
8036 case Intrinsic::vector_reduce_or:
8037 case Intrinsic::vector_reduce_xor:
8038 case Intrinsic::vector_reduce_smax:
8039 case Intrinsic::vector_reduce_smin:
8040 case Intrinsic::vector_reduce_umax:
8041 case Intrinsic::vector_reduce_umin:
8042 case Intrinsic::vector_reduce_fmax:
8043 case Intrinsic::vector_reduce_fmin:
8044 case Intrinsic::vector_reduce_fmaximum:
8045 case Intrinsic::vector_reduce_fminimum:
8046 visitVectorReduce(I, Intrinsic);
8047 return;
8048
8049 case Intrinsic::icall_branch_funnel: {
8051 Ops.push_back(getValue(I.getArgOperand(0)));
8052
8053 int64_t Offset;
8055 I.getArgOperand(1), Offset, DAG.getDataLayout()));
8056 if (!Base)
8058 "llvm.icall.branch.funnel operand must be a GlobalValue");
8059 Ops.push_back(DAG.getTargetGlobalAddress(Base, sdl, MVT::i64, 0));
8060
8061 struct BranchFunnelTarget {
8062 int64_t Offset;
8064 };
8066
8067 for (unsigned Op = 1, N = I.arg_size(); Op != N; Op += 2) {
8069 I.getArgOperand(Op), Offset, DAG.getDataLayout()));
8070 if (ElemBase != Base)
8071 report_fatal_error("all llvm.icall.branch.funnel operands must refer "
8072 "to the same GlobalValue");
8073
8074 SDValue Val = getValue(I.getArgOperand(Op + 1));
8075 auto *GA = dyn_cast<GlobalAddressSDNode>(Val);
8076 if (!GA)
8078 "llvm.icall.branch.funnel operand must be a GlobalValue");
8079 Targets.push_back({Offset, DAG.getTargetGlobalAddress(
8080 GA->getGlobal(), sdl, Val.getValueType(),
8081 GA->getOffset())});
8082 }
8083 llvm::sort(Targets,
8084 [](const BranchFunnelTarget &T1, const BranchFunnelTarget &T2) {
8085 return T1.Offset < T2.Offset;
8086 });
8087
8088 for (auto &T : Targets) {
8089 Ops.push_back(DAG.getTargetConstant(T.Offset, sdl, MVT::i32));
8090 Ops.push_back(T.Target);
8091 }
8092
8093 Ops.push_back(DAG.getRoot()); // Chain
8094 SDValue N(DAG.getMachineNode(TargetOpcode::ICALL_BRANCH_FUNNEL, sdl,
8095 MVT::Other, Ops),
8096 0);
8097 DAG.setRoot(N);
8098 setValue(&I, N);
8099 HasTailCall = true;
8100 return;
8101 }
8102
8103 case Intrinsic::wasm_landingpad_index:
8104 // Information this intrinsic contained has been transferred to
8105 // MachineFunction in SelectionDAGISel::PrepareEHLandingPad. We can safely
8106 // delete it now.
8107 return;
8108
8109 case Intrinsic::aarch64_settag:
8110 case Intrinsic::aarch64_settag_zero: {
8111 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
8112 bool ZeroMemory = Intrinsic == Intrinsic::aarch64_settag_zero;
8114 DAG, sdl, getRoot(), getValue(I.getArgOperand(0)),
8115 getValue(I.getArgOperand(1)), MachinePointerInfo(I.getArgOperand(0)),
8116 ZeroMemory);
8117 DAG.setRoot(Val);
8118 setValue(&I, Val);
8119 return;
8120 }
8121 case Intrinsic::amdgcn_cs_chain: {
8122 // At this point we don't care if it's amdgpu_cs_chain or
8123 // amdgpu_cs_chain_preserve.
8125
8126 Type *RetTy = I.getType();
8127 assert(RetTy->isVoidTy() && "Should not return");
8128
8129 SDValue Callee = getValue(I.getOperand(0));
8130
8131 // We only have 2 actual args: one for the SGPRs and one for the VGPRs.
8132 // We'll also tack the value of the EXEC mask at the end.
8134 Args.reserve(3);
8135
8136 for (unsigned Idx : {2, 3, 1}) {
8137 TargetLowering::ArgListEntry Arg(getValue(I.getOperand(Idx)),
8138 I.getOperand(Idx)->getType());
8139 Arg.setAttributes(&I, Idx);
8140 Args.push_back(Arg);
8141 }
8142
8143 assert(Args[0].IsInReg && "SGPR args should be marked inreg");
8144 assert(!Args[1].IsInReg && "VGPR args should not be marked inreg");
8145 Args[2].IsInReg = true; // EXEC should be inreg
8146
8147 // Forward the flags and any additional arguments.
8148 for (unsigned Idx = 4; Idx < I.arg_size(); ++Idx) {
8149 TargetLowering::ArgListEntry Arg(getValue(I.getOperand(Idx)),
8150 I.getOperand(Idx)->getType());
8151 Arg.setAttributes(&I, Idx);
8152 Args.push_back(Arg);
8153 }
8154
8155 TargetLowering::CallLoweringInfo CLI(DAG);
8156 CLI.setDebugLoc(getCurSDLoc())
8157 .setChain(getRoot())
8158 .setCallee(CC, RetTy, Callee, std::move(Args))
8159 .setNoReturn(true)
8160 .setTailCall(true)
8161 .setConvergent(I.isConvergent());
8162 CLI.CB = &I;
8163 std::pair<SDValue, SDValue> Result =
8164 lowerInvokable(CLI, /*EHPadBB*/ nullptr);
8165 (void)Result;
8166 assert(!Result.first.getNode() && !Result.second.getNode() &&
8167 "Should've lowered as tail call");
8168
8169 HasTailCall = true;
8170 return;
8171 }
8172 case Intrinsic::amdgcn_call_whole_wave: {
8174 bool isTailCall = I.isTailCall();
8175
8176 // The first argument is the callee. Skip it when assembling the call args.
8177 for (unsigned Idx = 1; Idx < I.arg_size(); ++Idx) {
8178 TargetLowering::ArgListEntry Arg(getValue(I.getArgOperand(Idx)),
8179 I.getArgOperand(Idx)->getType());
8180 Arg.setAttributes(&I, Idx);
8181
8182 // If we have an explicit sret argument that is an Instruction, (i.e., it
8183 // might point to function-local memory), we can't meaningfully tail-call.
8184 if (Arg.IsSRet && isa<Instruction>(I.getArgOperand(Idx)))
8185 isTailCall = false;
8186
8187 Args.push_back(Arg);
8188 }
8189
8190 SDValue ConvControlToken;
8191 if (auto Bundle = I.getOperandBundle(LLVMContext::OB_convergencectrl)) {
8192 auto *Token = Bundle->Inputs[0].get();
8193 ConvControlToken = getValue(Token);
8194 }
8195
8196 TargetLowering::CallLoweringInfo CLI(DAG);
8197 CLI.setDebugLoc(getCurSDLoc())
8198 .setChain(getRoot())
8199 .setCallee(CallingConv::AMDGPU_Gfx_WholeWave, I.getType(),
8200 getValue(I.getArgOperand(0)), std::move(Args))
8201 .setTailCall(isTailCall && canTailCall(I))
8202 .setIsPreallocated(
8203 I.countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0)
8204 .setConvergent(I.isConvergent())
8205 .setConvergenceControlToken(ConvControlToken);
8206 CLI.CB = &I;
8207
8208 std::pair<SDValue, SDValue> Result =
8209 lowerInvokable(CLI, /*EHPadBB=*/nullptr);
8210
8211 if (Result.first.getNode())
8212 setValue(&I, Result.first);
8213 return;
8214 }
8215 case Intrinsic::ptrmask: {
8216 SDValue Ptr = getValue(I.getOperand(0));
8217 SDValue Mask = getValue(I.getOperand(1));
8218
8219 // On arm64_32, pointers are 32 bits when stored in memory, but
8220 // zero-extended to 64 bits when in registers. Thus the mask is 32 bits to
8221 // match the index type, but the pointer is 64 bits, so the mask must be
8222 // zero-extended up to 64 bits to match the pointer.
8223 EVT PtrVT =
8224 TLI.getValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
8225 EVT MemVT =
8226 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
8227 assert(PtrVT == Ptr.getValueType());
8228 if (Mask.getValueType().getFixedSizeInBits() < MemVT.getFixedSizeInBits()) {
8229 // For AMDGPU buffer descriptors the mask is 48 bits, but the pointer is
8230 // 128-bit, so we have to pad the mask with ones for unused bits.
8231 auto HighOnes = DAG.getNode(
8232 ISD::SHL, sdl, PtrVT, DAG.getAllOnesConstant(sdl, PtrVT),
8233 DAG.getShiftAmountConstant(Mask.getValueType().getFixedSizeInBits(),
8234 PtrVT, sdl));
8235 Mask = DAG.getNode(ISD::OR, sdl, PtrVT,
8236 DAG.getZExtOrTrunc(Mask, sdl, PtrVT), HighOnes);
8237 } else if (Mask.getValueType() != PtrVT)
8238 Mask = DAG.getPtrExtOrTrunc(Mask, sdl, PtrVT);
8239
8240 assert(Mask.getValueType() == PtrVT);
8241 setValue(&I, DAG.getNode(ISD::AND, sdl, PtrVT, Ptr, Mask));
8242 return;
8243 }
8244 case Intrinsic::threadlocal_address: {
8245 setValue(&I, getValue(I.getOperand(0)));
8246 return;
8247 }
8248 case Intrinsic::get_active_lane_mask: {
8249 EVT CCVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8250 SDValue Index = getValue(I.getOperand(0));
8251 SDValue TripCount = getValue(I.getOperand(1));
8252 EVT ElementVT = Index.getValueType();
8253
8254 if (!TLI.shouldExpandGetActiveLaneMask(CCVT, ElementVT)) {
8255 setValue(&I, DAG.getNode(ISD::GET_ACTIVE_LANE_MASK, sdl, CCVT, Index,
8256 TripCount));
8257 return;
8258 }
8259
8260 EVT VecTy = EVT::getVectorVT(*DAG.getContext(), ElementVT,
8261 CCVT.getVectorElementCount());
8262
8263 SDValue VectorIndex = DAG.getSplat(VecTy, sdl, Index);
8264 SDValue VectorTripCount = DAG.getSplat(VecTy, sdl, TripCount);
8265 SDValue VectorStep = DAG.getStepVector(sdl, VecTy);
8266 SDValue VectorInduction = DAG.getNode(
8267 ISD::UADDSAT, sdl, VecTy, VectorIndex, VectorStep);
8268 SDValue SetCC = DAG.getSetCC(sdl, CCVT, VectorInduction,
8269 VectorTripCount, ISD::CondCode::SETULT);
8270 setValue(&I, SetCC);
8271 return;
8272 }
8273 case Intrinsic::experimental_get_vector_length: {
8274 assert(cast<ConstantInt>(I.getOperand(1))->getSExtValue() > 0 &&
8275 "Expected positive VF");
8276 unsigned VF = cast<ConstantInt>(I.getOperand(1))->getZExtValue();
8277 bool IsScalable = cast<ConstantInt>(I.getOperand(2))->isOne();
8278
8279 SDValue Count = getValue(I.getOperand(0));
8280 EVT CountVT = Count.getValueType();
8281
8282 if (!TLI.shouldExpandGetVectorLength(CountVT, VF, IsScalable)) {
8283 visitTargetIntrinsic(I, Intrinsic);
8284 return;
8285 }
8286
8287 // Expand to a umin between the trip count and the maximum elements the type
8288 // can hold.
8289 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8290
8291 // Extend the trip count to at least the result VT.
8292 if (CountVT.bitsLT(VT)) {
8293 Count = DAG.getNode(ISD::ZERO_EXTEND, sdl, VT, Count);
8294 CountVT = VT;
8295 }
8296
8297 SDValue MaxEVL = DAG.getElementCount(sdl, CountVT,
8298 ElementCount::get(VF, IsScalable));
8299
8300 SDValue UMin = DAG.getNode(ISD::UMIN, sdl, CountVT, Count, MaxEVL);
8301 // Clip to the result type if needed.
8302 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, sdl, VT, UMin);
8303
8304 setValue(&I, Trunc);
8305 return;
8306 }
8307 case Intrinsic::vector_partial_reduce_add: {
8308 SDValue Acc = getValue(I.getOperand(0));
8309 SDValue Input = getValue(I.getOperand(1));
8310 setValue(&I,
8311 DAG.getNode(ISD::PARTIAL_REDUCE_UMLA, sdl, Acc.getValueType(), Acc,
8312 Input, DAG.getConstant(1, sdl, Input.getValueType())));
8313 return;
8314 }
8315 case Intrinsic::vector_partial_reduce_fadd: {
8316 SDValue Acc = getValue(I.getOperand(0));
8317 SDValue Input = getValue(I.getOperand(1));
8318 setValue(&I, DAG.getNode(
8319 ISD::PARTIAL_REDUCE_FMLA, sdl, Acc.getValueType(), Acc,
8320 Input, DAG.getConstantFP(1.0, sdl, Input.getValueType())));
8321 return;
8322 }
8323 case Intrinsic::experimental_cttz_elts: {
8324 auto DL = getCurSDLoc();
8325 SDValue Op = getValue(I.getOperand(0));
8326 EVT OpVT = Op.getValueType();
8327
8328 if (!TLI.shouldExpandCttzElements(OpVT)) {
8329 visitTargetIntrinsic(I, Intrinsic);
8330 return;
8331 }
8332
8333 if (OpVT.getScalarType() != MVT::i1) {
8334 // Compare the input vector elements to zero & use to count trailing zeros
8335 SDValue AllZero = DAG.getConstant(0, DL, OpVT);
8336 OpVT = EVT::getVectorVT(*DAG.getContext(), MVT::i1,
8337 OpVT.getVectorElementCount());
8338 Op = DAG.getSetCC(DL, OpVT, Op, AllZero, ISD::SETNE);
8339 }
8340
8341 // If the zero-is-poison flag is set, we can assume the upper limit
8342 // of the result is VF-1.
8343 bool ZeroIsPoison =
8344 !cast<ConstantSDNode>(getValue(I.getOperand(1)))->isZero();
8345 ConstantRange VScaleRange(1, true); // Dummy value.
8346 if (isa<ScalableVectorType>(I.getOperand(0)->getType()))
8347 VScaleRange = getVScaleRange(I.getCaller(), 64);
8348 unsigned EltWidth = TLI.getBitWidthForCttzElements(
8349 I.getType(), OpVT.getVectorElementCount(), ZeroIsPoison, &VScaleRange);
8350
8351 MVT NewEltTy = MVT::getIntegerVT(EltWidth);
8352
8353 // Create the new vector type & get the vector length
8354 EVT NewVT = EVT::getVectorVT(*DAG.getContext(), NewEltTy,
8355 OpVT.getVectorElementCount());
8356
8357 SDValue VL =
8358 DAG.getElementCount(DL, NewEltTy, OpVT.getVectorElementCount());
8359
8360 SDValue StepVec = DAG.getStepVector(DL, NewVT);
8361 SDValue SplatVL = DAG.getSplat(NewVT, DL, VL);
8362 SDValue StepVL = DAG.getNode(ISD::SUB, DL, NewVT, SplatVL, StepVec);
8363 SDValue Ext = DAG.getNode(ISD::SIGN_EXTEND, DL, NewVT, Op);
8364 SDValue And = DAG.getNode(ISD::AND, DL, NewVT, StepVL, Ext);
8365 SDValue Max = DAG.getNode(ISD::VECREDUCE_UMAX, DL, NewEltTy, And);
8366 SDValue Sub = DAG.getNode(ISD::SUB, DL, NewEltTy, VL, Max);
8367
8368 EVT RetTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
8369 SDValue Ret = DAG.getZExtOrTrunc(Sub, DL, RetTy);
8370
8371 setValue(&I, Ret);
8372 return;
8373 }
8374 case Intrinsic::vector_insert: {
8375 SDValue Vec = getValue(I.getOperand(0));
8376 SDValue SubVec = getValue(I.getOperand(1));
8377 SDValue Index = getValue(I.getOperand(2));
8378
8379 // The intrinsic's index type is i64, but the SDNode requires an index type
8380 // suitable for the target. Convert the index as required.
8381 MVT VectorIdxTy = TLI.getVectorIdxTy(DAG.getDataLayout());
8382 if (Index.getValueType() != VectorIdxTy)
8383 Index = DAG.getVectorIdxConstant(Index->getAsZExtVal(), sdl);
8384
8385 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8386 setValue(&I, DAG.getNode(ISD::INSERT_SUBVECTOR, sdl, ResultVT, Vec, SubVec,
8387 Index));
8388 return;
8389 }
8390 case Intrinsic::vector_extract: {
8391 SDValue Vec = getValue(I.getOperand(0));
8392 SDValue Index = getValue(I.getOperand(1));
8393 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8394
8395 // The intrinsic's index type is i64, but the SDNode requires an index type
8396 // suitable for the target. Convert the index as required.
8397 MVT VectorIdxTy = TLI.getVectorIdxTy(DAG.getDataLayout());
8398 if (Index.getValueType() != VectorIdxTy)
8399 Index = DAG.getVectorIdxConstant(Index->getAsZExtVal(), sdl);
8400
8401 setValue(&I,
8402 DAG.getNode(ISD::EXTRACT_SUBVECTOR, sdl, ResultVT, Vec, Index));
8403 return;
8404 }
8405 case Intrinsic::experimental_vector_match: {
8406 SDValue Op1 = getValue(I.getOperand(0));
8407 SDValue Op2 = getValue(I.getOperand(1));
8408 SDValue Mask = getValue(I.getOperand(2));
8409 EVT Op1VT = Op1.getValueType();
8410 EVT Op2VT = Op2.getValueType();
8411 EVT ResVT = Mask.getValueType();
8412 unsigned SearchSize = Op2VT.getVectorNumElements();
8413
8414 // If the target has native support for this vector match operation, lower
8415 // the intrinsic untouched; otherwise, expand it below.
8416 if (!TLI.shouldExpandVectorMatch(Op1VT, SearchSize)) {
8417 visitTargetIntrinsic(I, Intrinsic);
8418 return;
8419 }
8420
8421 SDValue Ret = DAG.getConstant(0, sdl, ResVT);
8422
8423 for (unsigned i = 0; i < SearchSize; ++i) {
8424 SDValue Op2Elem = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, sdl,
8425 Op2VT.getVectorElementType(), Op2,
8426 DAG.getVectorIdxConstant(i, sdl));
8427 SDValue Splat = DAG.getNode(ISD::SPLAT_VECTOR, sdl, Op1VT, Op2Elem);
8428 SDValue Cmp = DAG.getSetCC(sdl, ResVT, Op1, Splat, ISD::SETEQ);
8429 Ret = DAG.getNode(ISD::OR, sdl, ResVT, Ret, Cmp);
8430 }
8431
8432 setValue(&I, DAG.getNode(ISD::AND, sdl, ResVT, Ret, Mask));
8433 return;
8434 }
8435 case Intrinsic::vector_reverse:
8436 visitVectorReverse(I);
8437 return;
8438 case Intrinsic::vector_splice_left:
8439 case Intrinsic::vector_splice_right:
8440 visitVectorSplice(I);
8441 return;
8442 case Intrinsic::callbr_landingpad:
8443 visitCallBrLandingPad(I);
8444 return;
8445 case Intrinsic::vector_interleave2:
8446 visitVectorInterleave(I, 2);
8447 return;
8448 case Intrinsic::vector_interleave3:
8449 visitVectorInterleave(I, 3);
8450 return;
8451 case Intrinsic::vector_interleave4:
8452 visitVectorInterleave(I, 4);
8453 return;
8454 case Intrinsic::vector_interleave5:
8455 visitVectorInterleave(I, 5);
8456 return;
8457 case Intrinsic::vector_interleave6:
8458 visitVectorInterleave(I, 6);
8459 return;
8460 case Intrinsic::vector_interleave7:
8461 visitVectorInterleave(I, 7);
8462 return;
8463 case Intrinsic::vector_interleave8:
8464 visitVectorInterleave(I, 8);
8465 return;
8466 case Intrinsic::vector_deinterleave2:
8467 visitVectorDeinterleave(I, 2);
8468 return;
8469 case Intrinsic::vector_deinterleave3:
8470 visitVectorDeinterleave(I, 3);
8471 return;
8472 case Intrinsic::vector_deinterleave4:
8473 visitVectorDeinterleave(I, 4);
8474 return;
8475 case Intrinsic::vector_deinterleave5:
8476 visitVectorDeinterleave(I, 5);
8477 return;
8478 case Intrinsic::vector_deinterleave6:
8479 visitVectorDeinterleave(I, 6);
8480 return;
8481 case Intrinsic::vector_deinterleave7:
8482 visitVectorDeinterleave(I, 7);
8483 return;
8484 case Intrinsic::vector_deinterleave8:
8485 visitVectorDeinterleave(I, 8);
8486 return;
8487 case Intrinsic::experimental_vector_compress:
8488 setValue(&I, DAG.getNode(ISD::VECTOR_COMPRESS, sdl,
8489 getValue(I.getArgOperand(0)).getValueType(),
8490 getValue(I.getArgOperand(0)),
8491 getValue(I.getArgOperand(1)),
8492 getValue(I.getArgOperand(2)), Flags));
8493 return;
8494 case Intrinsic::experimental_convergence_anchor:
8495 case Intrinsic::experimental_convergence_entry:
8496 case Intrinsic::experimental_convergence_loop:
8497 visitConvergenceControl(I, Intrinsic);
8498 return;
8499 case Intrinsic::experimental_vector_histogram_add: {
8500 visitVectorHistogram(I, Intrinsic);
8501 return;
8502 }
8503 case Intrinsic::experimental_vector_extract_last_active: {
8504 visitVectorExtractLastActive(I, Intrinsic);
8505 return;
8506 }
8507 case Intrinsic::loop_dependence_war_mask:
8508 setValue(&I,
8510 EVT::getEVT(I.getType()), getValue(I.getOperand(0)),
8511 getValue(I.getOperand(1)), getValue(I.getOperand(2)),
8512 DAG.getConstant(0, sdl, MVT::i64)));
8513 return;
8514 case Intrinsic::loop_dependence_raw_mask:
8515 setValue(&I,
8517 EVT::getEVT(I.getType()), getValue(I.getOperand(0)),
8518 getValue(I.getOperand(1)), getValue(I.getOperand(2)),
8519 DAG.getConstant(0, sdl, MVT::i64)));
8520 return;
8521 }
8522}
8523
8524void SelectionDAGBuilder::pushFPOpOutChain(SDValue Result,
8526 assert(Result.getNode()->getNumValues() == 2);
8527 SDValue OutChain = Result.getValue(1);
8528 assert(OutChain.getValueType() == MVT::Other);
8529
8530 // Instead of updating the root immediately, push the produced chain to the
8531 // appropriate list, deferring the update until the root is requested. In this
8532 // case, the nodes from the lists are chained using TokenFactor, indicating
8533 // that the operations are independent.
8534 //
8535 // In particular, the root is updated before any call that might access the
8536 // floating-point environment, except for constrained intrinsics.
8537 switch (EB) {
8540 PendingConstrainedFP.push_back(OutChain);
8541 break;
8543 PendingConstrainedFPStrict.push_back(OutChain);
8544 break;
8545 }
8546}
8547
8548void SelectionDAGBuilder::visitConstrainedFPIntrinsic(
8549 const ConstrainedFPIntrinsic &FPI) {
8550 SDLoc sdl = getCurSDLoc();
8551
8552 // We do not need to serialize constrained FP intrinsics against
8553 // each other or against (nonvolatile) loads, so they can be
8554 // chained like loads.
8556 SDValue Chain = getFPOperationRoot(EB);
8558 Opers.push_back(Chain);
8559 for (unsigned I = 0, E = FPI.getNonMetadataArgCount(); I != E; ++I)
8560 Opers.push_back(getValue(FPI.getArgOperand(I)));
8561
8562 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8563 EVT VT = TLI.getValueType(DAG.getDataLayout(), FPI.getType());
8564 SDVTList VTs = DAG.getVTList(VT, MVT::Other);
8565
8566 SDNodeFlags Flags;
8568 Flags.setNoFPExcept(true);
8569
8570 if (auto *FPOp = dyn_cast<FPMathOperator>(&FPI))
8571 Flags.copyFMF(*FPOp);
8572
8573 unsigned Opcode;
8574 switch (FPI.getIntrinsicID()) {
8575 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
8576#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
8577 case Intrinsic::INTRINSIC: \
8578 Opcode = ISD::STRICT_##DAGN; \
8579 break;
8580#include "llvm/IR/ConstrainedOps.def"
8581 case Intrinsic::experimental_constrained_fmuladd: {
8582 Opcode = ISD::STRICT_FMA;
8583 // Break fmuladd into fmul and fadd.
8584 if (TM.Options.AllowFPOpFusion == FPOpFusion::Strict ||
8585 !TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), VT)) {
8586 Opers.pop_back();
8587 SDValue Mul = DAG.getNode(ISD::STRICT_FMUL, sdl, VTs, Opers, Flags);
8588 pushFPOpOutChain(Mul, EB);
8589 Opcode = ISD::STRICT_FADD;
8590 Opers.clear();
8591 Opers.push_back(Mul.getValue(1));
8592 Opers.push_back(Mul.getValue(0));
8593 Opers.push_back(getValue(FPI.getArgOperand(2)));
8594 }
8595 break;
8596 }
8597 }
8598
8599 // A few strict DAG nodes carry additional operands that are not
8600 // set up by the default code above.
8601 switch (Opcode) {
8602 default: break;
8604 Opers.push_back(
8605 DAG.getTargetConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout())));
8606 break;
8607 case ISD::STRICT_FSETCC:
8608 case ISD::STRICT_FSETCCS: {
8609 auto *FPCmp = dyn_cast<ConstrainedFPCmpIntrinsic>(&FPI);
8610 ISD::CondCode Condition = getFCmpCondCode(FPCmp->getPredicate());
8611 if (DAG.isKnownNeverNaN(Opers[1]) && DAG.isKnownNeverNaN(Opers[2]))
8612 Condition = getFCmpCodeWithoutNaN(Condition);
8613 Opers.push_back(DAG.getCondCode(Condition));
8614 break;
8615 }
8616 }
8617
8618 SDValue Result = DAG.getNode(Opcode, sdl, VTs, Opers, Flags);
8619 pushFPOpOutChain(Result, EB);
8620
8621 SDValue FPResult = Result.getValue(0);
8622 setValue(&FPI, FPResult);
8623}
8624
8625static unsigned getISDForVPIntrinsic(const VPIntrinsic &VPIntrin) {
8626 std::optional<unsigned> ResOPC;
8627 switch (VPIntrin.getIntrinsicID()) {
8628 case Intrinsic::vp_ctlz: {
8629 bool IsZeroUndef = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8630 ResOPC = IsZeroUndef ? ISD::VP_CTLZ_ZERO_UNDEF : ISD::VP_CTLZ;
8631 break;
8632 }
8633 case Intrinsic::vp_cttz: {
8634 bool IsZeroUndef = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8635 ResOPC = IsZeroUndef ? ISD::VP_CTTZ_ZERO_UNDEF : ISD::VP_CTTZ;
8636 break;
8637 }
8638 case Intrinsic::vp_cttz_elts: {
8639 bool IsZeroPoison = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8640 ResOPC = IsZeroPoison ? ISD::VP_CTTZ_ELTS_ZERO_UNDEF : ISD::VP_CTTZ_ELTS;
8641 break;
8642 }
8643#define HELPER_MAP_VPID_TO_VPSD(VPID, VPSD) \
8644 case Intrinsic::VPID: \
8645 ResOPC = ISD::VPSD; \
8646 break;
8647#include "llvm/IR/VPIntrinsics.def"
8648 }
8649
8650 if (!ResOPC)
8652 "Inconsistency: no SDNode available for this VPIntrinsic!");
8653
8654 if (*ResOPC == ISD::VP_REDUCE_SEQ_FADD ||
8655 *ResOPC == ISD::VP_REDUCE_SEQ_FMUL) {
8656 if (VPIntrin.getFastMathFlags().allowReassoc())
8657 return *ResOPC == ISD::VP_REDUCE_SEQ_FADD ? ISD::VP_REDUCE_FADD
8658 : ISD::VP_REDUCE_FMUL;
8659 }
8660
8661 return *ResOPC;
8662}
8663
8664void SelectionDAGBuilder::visitVPLoad(
8665 const VPIntrinsic &VPIntrin, EVT VT,
8666 const SmallVectorImpl<SDValue> &OpValues) {
8667 SDLoc DL = getCurSDLoc();
8668 Value *PtrOperand = VPIntrin.getArgOperand(0);
8669 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8670 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8671 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8672 SDValue LD;
8673 // Do not serialize variable-length loads of constant memory with
8674 // anything.
8675 if (!Alignment)
8676 Alignment = DAG.getEVTAlign(VT);
8677 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8678 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8679 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8680 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8681 MachineMemOperand::Flags MMOFlags =
8682 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8683 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8684 MachinePointerInfo(PtrOperand), MMOFlags,
8685 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo, Ranges);
8686 LD = DAG.getLoadVP(VT, DL, InChain, OpValues[0], OpValues[1], OpValues[2],
8687 MMO, false /*IsExpanding */);
8688 if (AddToChain)
8689 PendingLoads.push_back(LD.getValue(1));
8690 setValue(&VPIntrin, LD);
8691}
8692
8693void SelectionDAGBuilder::visitVPLoadFF(
8694 const VPIntrinsic &VPIntrin, EVT VT, EVT EVLVT,
8695 const SmallVectorImpl<SDValue> &OpValues) {
8696 assert(OpValues.size() == 3 && "Unexpected number of operands");
8697 SDLoc DL = getCurSDLoc();
8698 Value *PtrOperand = VPIntrin.getArgOperand(0);
8699 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8700 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8701 const MDNode *Ranges = VPIntrin.getMetadata(LLVMContext::MD_range);
8702 SDValue LD;
8703 // Do not serialize variable-length loads of constant memory with
8704 // anything.
8705 if (!Alignment)
8706 Alignment = DAG.getEVTAlign(VT);
8707 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8708 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8709 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8710 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8711 MachinePointerInfo(PtrOperand), MachineMemOperand::MOLoad,
8712 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo, Ranges);
8713 LD = DAG.getLoadFFVP(VT, DL, InChain, OpValues[0], OpValues[1], OpValues[2],
8714 MMO);
8715 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, EVLVT, LD.getValue(1));
8716 if (AddToChain)
8717 PendingLoads.push_back(LD.getValue(2));
8718 setValue(&VPIntrin, DAG.getMergeValues({LD.getValue(0), Trunc}, DL));
8719}
8720
8721void SelectionDAGBuilder::visitVPGather(
8722 const VPIntrinsic &VPIntrin, EVT VT,
8723 const SmallVectorImpl<SDValue> &OpValues) {
8724 SDLoc DL = getCurSDLoc();
8725 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8726 Value *PtrOperand = VPIntrin.getArgOperand(0);
8727 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8728 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8729 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8730 SDValue LD;
8731 if (!Alignment)
8732 Alignment = DAG.getEVTAlign(VT.getScalarType());
8733 unsigned AS =
8734 PtrOperand->getType()->getScalarType()->getPointerAddressSpace();
8735 MachineMemOperand::Flags MMOFlags =
8736 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8737 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8738 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8739 *Alignment, AAInfo, Ranges);
8740 SDValue Base, Index, Scale;
8741 bool UniformBase =
8742 getUniformBase(PtrOperand, Base, Index, Scale, this, VPIntrin.getParent(),
8743 VT.getScalarStoreSize());
8744 if (!UniformBase) {
8745 Base = DAG.getConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout()));
8746 Index = getValue(PtrOperand);
8747 Scale = DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout()));
8748 }
8749 EVT IdxVT = Index.getValueType();
8750 EVT EltTy = IdxVT.getVectorElementType();
8751 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
8752 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
8753 Index = DAG.getNode(ISD::SIGN_EXTEND, DL, NewIdxVT, Index);
8754 }
8755 LD = DAG.getGatherVP(
8756 DAG.getVTList(VT, MVT::Other), VT, DL,
8757 {DAG.getRoot(), Base, Index, Scale, OpValues[1], OpValues[2]}, MMO,
8759 PendingLoads.push_back(LD.getValue(1));
8760 setValue(&VPIntrin, LD);
8761}
8762
8763void SelectionDAGBuilder::visitVPStore(
8764 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8765 SDLoc DL = getCurSDLoc();
8766 Value *PtrOperand = VPIntrin.getArgOperand(1);
8767 EVT VT = OpValues[0].getValueType();
8768 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8769 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8770 SDValue ST;
8771 if (!Alignment)
8772 Alignment = DAG.getEVTAlign(VT);
8773 SDValue Ptr = OpValues[1];
8774 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
8775 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8776 MachineMemOperand::Flags MMOFlags =
8777 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8778 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8779 MachinePointerInfo(PtrOperand), MMOFlags,
8780 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo);
8781 ST = DAG.getStoreVP(getMemoryRoot(), DL, OpValues[0], Ptr, Offset,
8782 OpValues[2], OpValues[3], VT, MMO, ISD::UNINDEXED,
8783 /* IsTruncating */ false, /*IsCompressing*/ false);
8784 DAG.setRoot(ST);
8785 setValue(&VPIntrin, ST);
8786}
8787
8788void SelectionDAGBuilder::visitVPScatter(
8789 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8790 SDLoc DL = getCurSDLoc();
8791 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8792 Value *PtrOperand = VPIntrin.getArgOperand(1);
8793 EVT VT = OpValues[0].getValueType();
8794 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8795 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8796 SDValue ST;
8797 if (!Alignment)
8798 Alignment = DAG.getEVTAlign(VT.getScalarType());
8799 unsigned AS =
8800 PtrOperand->getType()->getScalarType()->getPointerAddressSpace();
8801 MachineMemOperand::Flags MMOFlags =
8802 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8803 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8804 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8805 *Alignment, AAInfo);
8806 SDValue Base, Index, Scale;
8807 bool UniformBase =
8808 getUniformBase(PtrOperand, Base, Index, Scale, this, VPIntrin.getParent(),
8809 VT.getScalarStoreSize());
8810 if (!UniformBase) {
8811 Base = DAG.getConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout()));
8812 Index = getValue(PtrOperand);
8813 Scale = DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout()));
8814 }
8815 EVT IdxVT = Index.getValueType();
8816 EVT EltTy = IdxVT.getVectorElementType();
8817 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
8818 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
8819 Index = DAG.getNode(ISD::SIGN_EXTEND, DL, NewIdxVT, Index);
8820 }
8821 ST = DAG.getScatterVP(DAG.getVTList(MVT::Other), VT, DL,
8822 {getMemoryRoot(), OpValues[0], Base, Index, Scale,
8823 OpValues[2], OpValues[3]},
8824 MMO, ISD::SIGNED_SCALED);
8825 DAG.setRoot(ST);
8826 setValue(&VPIntrin, ST);
8827}
8828
8829void SelectionDAGBuilder::visitVPStridedLoad(
8830 const VPIntrinsic &VPIntrin, EVT VT,
8831 const SmallVectorImpl<SDValue> &OpValues) {
8832 SDLoc DL = getCurSDLoc();
8833 Value *PtrOperand = VPIntrin.getArgOperand(0);
8834 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8835 if (!Alignment)
8836 Alignment = DAG.getEVTAlign(VT.getScalarType());
8837 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8838 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8839 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8840 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8841 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8842 unsigned AS = PtrOperand->getType()->getPointerAddressSpace();
8843 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8844 MachineMemOperand::Flags MMOFlags =
8845 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8846 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8847 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8848 *Alignment, AAInfo, Ranges);
8849
8850 SDValue LD = DAG.getStridedLoadVP(VT, DL, InChain, OpValues[0], OpValues[1],
8851 OpValues[2], OpValues[3], MMO,
8852 false /*IsExpanding*/);
8853
8854 if (AddToChain)
8855 PendingLoads.push_back(LD.getValue(1));
8856 setValue(&VPIntrin, LD);
8857}
8858
8859void SelectionDAGBuilder::visitVPStridedStore(
8860 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8861 SDLoc DL = getCurSDLoc();
8862 Value *PtrOperand = VPIntrin.getArgOperand(1);
8863 EVT VT = OpValues[0].getValueType();
8864 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8865 if (!Alignment)
8866 Alignment = DAG.getEVTAlign(VT.getScalarType());
8867 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8868 unsigned AS = PtrOperand->getType()->getPointerAddressSpace();
8869 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8870 MachineMemOperand::Flags MMOFlags =
8871 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8872 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8873 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8874 *Alignment, AAInfo);
8875
8876 SDValue ST = DAG.getStridedStoreVP(
8877 getMemoryRoot(), DL, OpValues[0], OpValues[1],
8878 DAG.getUNDEF(OpValues[1].getValueType()), OpValues[2], OpValues[3],
8879 OpValues[4], VT, MMO, ISD::UNINDEXED, /*IsTruncating*/ false,
8880 /*IsCompressing*/ false);
8881
8882 DAG.setRoot(ST);
8883 setValue(&VPIntrin, ST);
8884}
8885
8886void SelectionDAGBuilder::visitVPCmp(const VPCmpIntrinsic &VPIntrin) {
8887 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8888 SDLoc DL = getCurSDLoc();
8889
8890 ISD::CondCode Condition;
8892 bool IsFP = VPIntrin.getOperand(0)->getType()->isFPOrFPVectorTy();
8893 Condition = IsFP ? getFCmpCondCode(CondCode) : getICmpCondCode(CondCode);
8894
8895 SDValue Op1 = getValue(VPIntrin.getOperand(0));
8896 SDValue Op2 = getValue(VPIntrin.getOperand(1));
8897 // #2 is the condition code
8898 SDValue MaskOp = getValue(VPIntrin.getOperand(3));
8899 SDValue EVL = getValue(VPIntrin.getOperand(4));
8900 MVT EVLParamVT = TLI.getVPExplicitVectorLengthTy();
8901 assert(EVLParamVT.isScalarInteger() && EVLParamVT.bitsGE(MVT::i32) &&
8902 "Unexpected target EVL type");
8903 EVL = DAG.getNode(ISD::ZERO_EXTEND, DL, EVLParamVT, EVL);
8904
8905 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
8906 VPIntrin.getType());
8907 if (DAG.isKnownNeverNaN(Op1) && DAG.isKnownNeverNaN(Op2))
8908 Condition = getFCmpCodeWithoutNaN(Condition);
8909 setValue(&VPIntrin,
8910 DAG.getSetCCVP(DL, DestVT, Op1, Op2, Condition, MaskOp, EVL));
8911}
8912
8913void SelectionDAGBuilder::visitVectorPredicationIntrinsic(
8914 const VPIntrinsic &VPIntrin) {
8915 SDLoc DL = getCurSDLoc();
8916 unsigned Opcode = getISDForVPIntrinsic(VPIntrin);
8917
8918 auto IID = VPIntrin.getIntrinsicID();
8919
8920 if (const auto *CmpI = dyn_cast<VPCmpIntrinsic>(&VPIntrin))
8921 return visitVPCmp(*CmpI);
8922
8923 SmallVector<EVT, 4> ValueVTs;
8924 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8925 ComputeValueVTs(TLI, DAG.getDataLayout(), VPIntrin.getType(), ValueVTs);
8926 SDVTList VTs = DAG.getVTList(ValueVTs);
8927
8928 auto EVLParamPos = VPIntrinsic::getVectorLengthParamPos(IID);
8929
8930 MVT EVLParamVT = TLI.getVPExplicitVectorLengthTy();
8931 assert(EVLParamVT.isScalarInteger() && EVLParamVT.bitsGE(MVT::i32) &&
8932 "Unexpected target EVL type");
8933
8934 // Request operands.
8935 SmallVector<SDValue, 7> OpValues;
8936 for (unsigned I = 0; I < VPIntrin.arg_size(); ++I) {
8937 auto Op = getValue(VPIntrin.getArgOperand(I));
8938 if (I == EVLParamPos)
8939 Op = DAG.getNode(ISD::ZERO_EXTEND, DL, EVLParamVT, Op);
8940 OpValues.push_back(Op);
8941 }
8942
8943 switch (Opcode) {
8944 default: {
8945 SDNodeFlags SDFlags;
8946 if (auto *FPMO = dyn_cast<FPMathOperator>(&VPIntrin))
8947 SDFlags.copyFMF(*FPMO);
8948 SDValue Result = DAG.getNode(Opcode, DL, VTs, OpValues, SDFlags);
8949 setValue(&VPIntrin, Result);
8950 break;
8951 }
8952 case ISD::VP_LOAD:
8953 visitVPLoad(VPIntrin, ValueVTs[0], OpValues);
8954 break;
8955 case ISD::VP_LOAD_FF:
8956 visitVPLoadFF(VPIntrin, ValueVTs[0], ValueVTs[1], OpValues);
8957 break;
8958 case ISD::VP_GATHER:
8959 visitVPGather(VPIntrin, ValueVTs[0], OpValues);
8960 break;
8961 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
8962 visitVPStridedLoad(VPIntrin, ValueVTs[0], OpValues);
8963 break;
8964 case ISD::VP_STORE:
8965 visitVPStore(VPIntrin, OpValues);
8966 break;
8967 case ISD::VP_SCATTER:
8968 visitVPScatter(VPIntrin, OpValues);
8969 break;
8970 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
8971 visitVPStridedStore(VPIntrin, OpValues);
8972 break;
8973 case ISD::VP_FMULADD: {
8974 assert(OpValues.size() == 5 && "Unexpected number of operands");
8975 SDNodeFlags SDFlags;
8976 if (auto *FPMO = dyn_cast<FPMathOperator>(&VPIntrin))
8977 SDFlags.copyFMF(*FPMO);
8978 if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
8979 TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), ValueVTs[0])) {
8980 setValue(&VPIntrin, DAG.getNode(ISD::VP_FMA, DL, VTs, OpValues, SDFlags));
8981 } else {
8982 SDValue Mul = DAG.getNode(
8983 ISD::VP_FMUL, DL, VTs,
8984 {OpValues[0], OpValues[1], OpValues[3], OpValues[4]}, SDFlags);
8985 SDValue Add =
8986 DAG.getNode(ISD::VP_FADD, DL, VTs,
8987 {Mul, OpValues[2], OpValues[3], OpValues[4]}, SDFlags);
8988 setValue(&VPIntrin, Add);
8989 }
8990 break;
8991 }
8992 case ISD::VP_IS_FPCLASS: {
8993 const DataLayout DLayout = DAG.getDataLayout();
8994 EVT DestVT = TLI.getValueType(DLayout, VPIntrin.getType());
8995 auto Constant = OpValues[1]->getAsZExtVal();
8996 SDValue Check = DAG.getTargetConstant(Constant, DL, MVT::i32);
8997 SDValue V = DAG.getNode(ISD::VP_IS_FPCLASS, DL, DestVT,
8998 {OpValues[0], Check, OpValues[2], OpValues[3]});
8999 setValue(&VPIntrin, V);
9000 return;
9001 }
9002 case ISD::VP_INTTOPTR: {
9003 SDValue N = OpValues[0];
9004 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), VPIntrin.getType());
9005 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(), VPIntrin.getType());
9006 N = DAG.getVPPtrExtOrTrunc(getCurSDLoc(), DestVT, N, OpValues[1],
9007 OpValues[2]);
9008 N = DAG.getVPZExtOrTrunc(getCurSDLoc(), PtrMemVT, N, OpValues[1],
9009 OpValues[2]);
9010 setValue(&VPIntrin, N);
9011 break;
9012 }
9013 case ISD::VP_PTRTOINT: {
9014 SDValue N = OpValues[0];
9015 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9016 VPIntrin.getType());
9017 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(),
9018 VPIntrin.getOperand(0)->getType());
9019 N = DAG.getVPPtrExtOrTrunc(getCurSDLoc(), PtrMemVT, N, OpValues[1],
9020 OpValues[2]);
9021 N = DAG.getVPZExtOrTrunc(getCurSDLoc(), DestVT, N, OpValues[1],
9022 OpValues[2]);
9023 setValue(&VPIntrin, N);
9024 break;
9025 }
9026 case ISD::VP_ABS:
9027 case ISD::VP_CTLZ:
9028 case ISD::VP_CTLZ_ZERO_UNDEF:
9029 case ISD::VP_CTTZ:
9030 case ISD::VP_CTTZ_ZERO_UNDEF:
9031 case ISD::VP_CTTZ_ELTS_ZERO_UNDEF:
9032 case ISD::VP_CTTZ_ELTS: {
9033 SDValue Result =
9034 DAG.getNode(Opcode, DL, VTs, {OpValues[0], OpValues[2], OpValues[3]});
9035 setValue(&VPIntrin, Result);
9036 break;
9037 }
9038 }
9039}
9040
9041SDValue SelectionDAGBuilder::lowerStartEH(SDValue Chain,
9042 const BasicBlock *EHPadBB,
9043 MCSymbol *&BeginLabel) {
9044 MachineFunction &MF = DAG.getMachineFunction();
9045
9046 // Insert a label before the invoke call to mark the try range. This can be
9047 // used to detect deletion of the invoke via the MachineModuleInfo.
9048 BeginLabel = MF.getContext().createTempSymbol();
9049
9050 // For SjLj, keep track of which landing pads go with which invokes
9051 // so as to maintain the ordering of pads in the LSDA.
9052 unsigned CallSiteIndex = FuncInfo.getCurrentCallSite();
9053 if (CallSiteIndex) {
9054 MF.setCallSiteBeginLabel(BeginLabel, CallSiteIndex);
9055 LPadToCallSiteMap[FuncInfo.getMBB(EHPadBB)].push_back(CallSiteIndex);
9056
9057 // Now that the call site is handled, stop tracking it.
9058 FuncInfo.setCurrentCallSite(0);
9059 }
9060
9061 return DAG.getEHLabel(getCurSDLoc(), Chain, BeginLabel);
9062}
9063
9064SDValue SelectionDAGBuilder::lowerEndEH(SDValue Chain, const InvokeInst *II,
9065 const BasicBlock *EHPadBB,
9066 MCSymbol *BeginLabel) {
9067 assert(BeginLabel && "BeginLabel should've been set");
9068
9069 MachineFunction &MF = DAG.getMachineFunction();
9070
9071 // Insert a label at the end of the invoke call to mark the try range. This
9072 // can be used to detect deletion of the invoke via the MachineModuleInfo.
9073 MCSymbol *EndLabel = MF.getContext().createTempSymbol();
9074 Chain = DAG.getEHLabel(getCurSDLoc(), Chain, EndLabel);
9075
9076 // Inform MachineModuleInfo of range.
9077 auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn());
9078 // There is a platform (e.g. wasm) that uses funclet style IR but does not
9079 // actually use outlined funclets and their LSDA info style.
9080 if (MF.hasEHFunclets() && isFuncletEHPersonality(Pers)) {
9081 assert(II && "II should've been set");
9082 WinEHFuncInfo *EHInfo = MF.getWinEHFuncInfo();
9083 EHInfo->addIPToStateRange(II, BeginLabel, EndLabel);
9084 } else if (!isScopedEHPersonality(Pers)) {
9085 assert(EHPadBB);
9086 MF.addInvoke(FuncInfo.getMBB(EHPadBB), BeginLabel, EndLabel);
9087 }
9088
9089 return Chain;
9090}
9091
9092std::pair<SDValue, SDValue>
9094 const BasicBlock *EHPadBB) {
9095 MCSymbol *BeginLabel = nullptr;
9096
9097 if (EHPadBB) {
9098 // Both PendingLoads and PendingExports must be flushed here;
9099 // this call might not return.
9100 (void)getRoot();
9101 DAG.setRoot(lowerStartEH(getControlRoot(), EHPadBB, BeginLabel));
9102 CLI.setChain(getRoot());
9103 }
9104
9105 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9106 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
9107
9108 assert((CLI.IsTailCall || Result.second.getNode()) &&
9109 "Non-null chain expected with non-tail call!");
9110 assert((Result.second.getNode() || !Result.first.getNode()) &&
9111 "Null value expected with tail call!");
9112
9113 if (!Result.second.getNode()) {
9114 // As a special case, a null chain means that a tail call has been emitted
9115 // and the DAG root is already updated.
9116 HasTailCall = true;
9117
9118 // Since there's no actual continuation from this block, nothing can be
9119 // relying on us setting vregs for them.
9120 PendingExports.clear();
9121 } else {
9122 DAG.setRoot(Result.second);
9123 }
9124
9125 if (EHPadBB) {
9126 DAG.setRoot(lowerEndEH(getRoot(), cast_or_null<InvokeInst>(CLI.CB), EHPadBB,
9127 BeginLabel));
9128 Result.second = getRoot();
9129 }
9130
9131 return Result;
9132}
9133
9135 bool isMustTailCall = CB.isMustTailCall();
9136
9137 // Avoid emitting tail calls in functions with the disable-tail-calls
9138 // attribute.
9139 const Function *Caller = CB.getParent()->getParent();
9140 if (!isMustTailCall &&
9141 Caller->getFnAttribute("disable-tail-calls").getValueAsBool())
9142 return false;
9143
9144 // We can't tail call inside a function with a swifterror argument. Lowering
9145 // does not support this yet. It would have to move into the swifterror
9146 // register before the call.
9147 if (DAG.getTargetLoweringInfo().supportSwiftError() &&
9148 Caller->getAttributes().hasAttrSomewhere(Attribute::SwiftError))
9149 return false;
9150
9151 // Check if target-independent constraints permit a tail call here.
9152 // Target-dependent constraints are checked within TLI->LowerCallTo.
9153 return isInTailCallPosition(CB, DAG.getTarget());
9154}
9155
9157 bool isTailCall, bool isMustTailCall,
9158 const BasicBlock *EHPadBB,
9159 const TargetLowering::PtrAuthInfo *PAI) {
9160 auto &DL = DAG.getDataLayout();
9161 FunctionType *FTy = CB.getFunctionType();
9162 Type *RetTy = CB.getType();
9163
9165 Args.reserve(CB.arg_size());
9166
9167 const Value *SwiftErrorVal = nullptr;
9168 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9169
9170 if (isTailCall)
9171 isTailCall = canTailCall(CB);
9172
9173 for (auto I = CB.arg_begin(), E = CB.arg_end(); I != E; ++I) {
9174 const Value *V = *I;
9175
9176 // Skip empty types
9177 if (V->getType()->isEmptyTy())
9178 continue;
9179
9180 SDValue ArgNode = getValue(V);
9181 TargetLowering::ArgListEntry Entry(ArgNode, V->getType());
9182 Entry.setAttributes(&CB, I - CB.arg_begin());
9183
9184 // Use swifterror virtual register as input to the call.
9185 if (Entry.IsSwiftError && TLI.supportSwiftError()) {
9186 SwiftErrorVal = V;
9187 // We find the virtual register for the actual swifterror argument.
9188 // Instead of using the Value, we use the virtual register instead.
9189 Entry.Node =
9190 DAG.getRegister(SwiftError.getOrCreateVRegUseAt(&CB, FuncInfo.MBB, V),
9191 EVT(TLI.getPointerTy(DL)));
9192 }
9193
9194 Args.push_back(Entry);
9195
9196 // If we have an explicit sret argument that is an Instruction, (i.e., it
9197 // might point to function-local memory), we can't meaningfully tail-call.
9198 if (Entry.IsSRet && isa<Instruction>(V))
9199 isTailCall = false;
9200 }
9201
9202 // If call site has a cfguardtarget operand bundle, create and add an
9203 // additional ArgListEntry.
9204 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_cfguardtarget)) {
9205 Value *V = Bundle->Inputs[0];
9207 Entry.IsCFGuardTarget = true;
9208 Args.push_back(Entry);
9209 }
9210
9211 // Disable tail calls if there is an swifterror argument. Targets have not
9212 // been updated to support tail calls.
9213 if (TLI.supportSwiftError() && SwiftErrorVal)
9214 isTailCall = false;
9215
9216 ConstantInt *CFIType = nullptr;
9217 if (CB.isIndirectCall()) {
9218 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_kcfi)) {
9219 if (!TLI.supportKCFIBundles())
9221 "Target doesn't support calls with kcfi operand bundles.");
9222 CFIType = cast<ConstantInt>(Bundle->Inputs[0]);
9223 assert(CFIType->getType()->isIntegerTy(32) && "Invalid CFI type");
9224 }
9225 }
9226
9227 SDValue ConvControlToken;
9228 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_convergencectrl)) {
9229 auto *Token = Bundle->Inputs[0].get();
9230 ConvControlToken = getValue(Token);
9231 }
9232
9233 GlobalValue *DeactivationSymbol = nullptr;
9235 DeactivationSymbol = cast<GlobalValue>(Bundle->Inputs[0].get());
9236 }
9237
9240 .setChain(getRoot())
9241 .setCallee(RetTy, FTy, Callee, std::move(Args), CB)
9242 .setTailCall(isTailCall)
9246 .setCFIType(CFIType)
9247 .setConvergenceControlToken(ConvControlToken)
9248 .setDeactivationSymbol(DeactivationSymbol);
9249
9250 // Set the pointer authentication info if we have it.
9251 if (PAI) {
9252 if (!TLI.supportPtrAuthBundles())
9254 "This target doesn't support calls with ptrauth operand bundles.");
9255 CLI.setPtrAuth(*PAI);
9256 }
9257
9258 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
9259
9260 if (Result.first.getNode()) {
9261 Result.first = lowerRangeToAssertZExt(DAG, CB, Result.first);
9262 Result.first = lowerNoFPClassToAssertNoFPClass(DAG, CB, Result.first);
9263 setValue(&CB, Result.first);
9264 }
9265
9266 // The last element of CLI.InVals has the SDValue for swifterror return.
9267 // Here we copy it to a virtual register and update SwiftErrorMap for
9268 // book-keeping.
9269 if (SwiftErrorVal && TLI.supportSwiftError()) {
9270 // Get the last element of InVals.
9271 SDValue Src = CLI.InVals.back();
9272 Register VReg =
9273 SwiftError.getOrCreateVRegDefAt(&CB, FuncInfo.MBB, SwiftErrorVal);
9274 SDValue CopyNode = CLI.DAG.getCopyToReg(Result.second, CLI.DL, VReg, Src);
9275 DAG.setRoot(CopyNode);
9276 }
9277}
9278
9279static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT,
9280 SelectionDAGBuilder &Builder) {
9281 // Check to see if this load can be trivially constant folded, e.g. if the
9282 // input is from a string literal.
9283 if (const Constant *LoadInput = dyn_cast<Constant>(PtrVal)) {
9284 // Cast pointer to the type we really want to load.
9285 Type *LoadTy =
9286 Type::getIntNTy(PtrVal->getContext(), LoadVT.getScalarSizeInBits());
9287 if (LoadVT.isVector())
9288 LoadTy = FixedVectorType::get(LoadTy, LoadVT.getVectorNumElements());
9289 if (const Constant *LoadCst =
9290 ConstantFoldLoadFromConstPtr(const_cast<Constant *>(LoadInput),
9291 LoadTy, Builder.DAG.getDataLayout()))
9292 return Builder.getValue(LoadCst);
9293 }
9294
9295 // Otherwise, we have to emit the load. If the pointer is to unfoldable but
9296 // still constant memory, the input chain can be the entry node.
9297 SDValue Root;
9298 bool ConstantMemory = false;
9299
9300 // Do not serialize (non-volatile) loads of constant memory with anything.
9301 if (Builder.BatchAA && Builder.BatchAA->pointsToConstantMemory(PtrVal)) {
9302 Root = Builder.DAG.getEntryNode();
9303 ConstantMemory = true;
9304 } else {
9305 // Do not serialize non-volatile loads against each other.
9306 Root = Builder.DAG.getRoot();
9307 }
9308
9309 SDValue Ptr = Builder.getValue(PtrVal);
9310 SDValue LoadVal =
9311 Builder.DAG.getLoad(LoadVT, Builder.getCurSDLoc(), Root, Ptr,
9312 MachinePointerInfo(PtrVal), Align(1));
9313
9314 if (!ConstantMemory)
9315 Builder.PendingLoads.push_back(LoadVal.getValue(1));
9316 return LoadVal;
9317}
9318
9319/// Record the value for an instruction that produces an integer result,
9320/// converting the type where necessary.
9321void SelectionDAGBuilder::processIntegerCallValue(const Instruction &I,
9322 SDValue Value,
9323 bool IsSigned) {
9324 EVT VT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9325 I.getType(), true);
9326 Value = DAG.getExtOrTrunc(IsSigned, Value, getCurSDLoc(), VT);
9327 setValue(&I, Value);
9328}
9329
9330/// See if we can lower a memcmp/bcmp call into an optimized form. If so, return
9331/// true and lower it. Otherwise return false, and it will be lowered like a
9332/// normal call.
9333/// The caller already checked that \p I calls the appropriate LibFunc with a
9334/// correct prototype.
9335bool SelectionDAGBuilder::visitMemCmpBCmpCall(const CallInst &I) {
9336 const Value *LHS = I.getArgOperand(0), *RHS = I.getArgOperand(1);
9337 const Value *Size = I.getArgOperand(2);
9338 const ConstantSDNode *CSize = dyn_cast<ConstantSDNode>(getValue(Size));
9339 if (CSize && CSize->getZExtValue() == 0) {
9340 EVT CallVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9341 I.getType(), true);
9342 setValue(&I, DAG.getConstant(0, getCurSDLoc(), CallVT));
9343 return true;
9344 }
9345
9346 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9347 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForMemcmp(
9348 DAG, getCurSDLoc(), DAG.getRoot(), getValue(LHS), getValue(RHS),
9349 getValue(Size), &I);
9350 if (Res.first.getNode()) {
9351 processIntegerCallValue(I, Res.first, true);
9352 PendingLoads.push_back(Res.second);
9353 return true;
9354 }
9355
9356 // memcmp(S1,S2,2) != 0 -> (*(short*)LHS != *(short*)RHS) != 0
9357 // memcmp(S1,S2,4) != 0 -> (*(int*)LHS != *(int*)RHS) != 0
9358 if (!CSize || !isOnlyUsedInZeroEqualityComparison(&I))
9359 return false;
9360
9361 // If the target has a fast compare for the given size, it will return a
9362 // preferred load type for that size. Require that the load VT is legal and
9363 // that the target supports unaligned loads of that type. Otherwise, return
9364 // INVALID.
9365 auto hasFastLoadsAndCompare = [&](unsigned NumBits) {
9366 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9367 MVT LVT = TLI.hasFastEqualityCompare(NumBits);
9368 if (LVT != MVT::INVALID_SIMPLE_VALUE_TYPE) {
9369 // TODO: Handle 5 byte compare as 4-byte + 1 byte.
9370 // TODO: Handle 8 byte compare on x86-32 as two 32-bit loads.
9371 // TODO: Check alignment of src and dest ptrs.
9372 unsigned DstAS = LHS->getType()->getPointerAddressSpace();
9373 unsigned SrcAS = RHS->getType()->getPointerAddressSpace();
9374 if (!TLI.isTypeLegal(LVT) ||
9375 !TLI.allowsMisalignedMemoryAccesses(LVT, SrcAS) ||
9376 !TLI.allowsMisalignedMemoryAccesses(LVT, DstAS))
9378 }
9379
9380 return LVT;
9381 };
9382
9383 // This turns into unaligned loads. We only do this if the target natively
9384 // supports the MVT we'll be loading or if it is small enough (<= 4) that
9385 // we'll only produce a small number of byte loads.
9386 MVT LoadVT;
9387 unsigned NumBitsToCompare = CSize->getZExtValue() * 8;
9388 switch (NumBitsToCompare) {
9389 default:
9390 return false;
9391 case 16:
9392 LoadVT = MVT::i16;
9393 break;
9394 case 32:
9395 LoadVT = MVT::i32;
9396 break;
9397 case 64:
9398 case 128:
9399 case 256:
9400 LoadVT = hasFastLoadsAndCompare(NumBitsToCompare);
9401 break;
9402 }
9403
9404 if (LoadVT == MVT::INVALID_SIMPLE_VALUE_TYPE)
9405 return false;
9406
9407 SDValue LoadL = getMemCmpLoad(LHS, LoadVT, *this);
9408 SDValue LoadR = getMemCmpLoad(RHS, LoadVT, *this);
9409
9410 // Bitcast to a wide integer type if the loads are vectors.
9411 if (LoadVT.isVector()) {
9412 EVT CmpVT = EVT::getIntegerVT(LHS->getContext(), LoadVT.getSizeInBits());
9413 LoadL = DAG.getBitcast(CmpVT, LoadL);
9414 LoadR = DAG.getBitcast(CmpVT, LoadR);
9415 }
9416
9417 SDValue Cmp = DAG.getSetCC(getCurSDLoc(), MVT::i1, LoadL, LoadR, ISD::SETNE);
9418 processIntegerCallValue(I, Cmp, false);
9419 return true;
9420}
9421
9422/// See if we can lower a memchr call into an optimized form. If so, return
9423/// true and lower it. Otherwise return false, and it will be lowered like a
9424/// normal call.
9425/// The caller already checked that \p I calls the appropriate LibFunc with a
9426/// correct prototype.
9427bool SelectionDAGBuilder::visitMemChrCall(const CallInst &I) {
9428 const Value *Src = I.getArgOperand(0);
9429 const Value *Char = I.getArgOperand(1);
9430 const Value *Length = I.getArgOperand(2);
9431
9432 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9433 std::pair<SDValue, SDValue> Res =
9434 TSI.EmitTargetCodeForMemchr(DAG, getCurSDLoc(), DAG.getRoot(),
9435 getValue(Src), getValue(Char), getValue(Length),
9436 MachinePointerInfo(Src));
9437 if (Res.first.getNode()) {
9438 setValue(&I, Res.first);
9439 PendingLoads.push_back(Res.second);
9440 return true;
9441 }
9442
9443 return false;
9444}
9445
9446/// See if we can lower a memccpy call into an optimized form. If so, return
9447/// true and lower it, otherwise return false and it will be lowered like a
9448/// normal call.
9449/// The caller already checked that \p I calls the appropriate LibFunc with a
9450/// correct prototype.
9451bool SelectionDAGBuilder::visitMemCCpyCall(const CallInst &I) {
9452 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9453 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForMemccpy(
9454 DAG, getCurSDLoc(), DAG.getRoot(), getValue(I.getArgOperand(0)),
9455 getValue(I.getArgOperand(1)), getValue(I.getArgOperand(2)),
9456 getValue(I.getArgOperand(3)), &I);
9457
9458 if (Res.first) {
9459 processIntegerCallValue(I, Res.first, true);
9460 PendingLoads.push_back(Res.second);
9461 return true;
9462 }
9463 return false;
9464}
9465
9466/// See if we can lower a mempcpy call into an optimized form. If so, return
9467/// true and lower it. Otherwise return false, and it will be lowered like a
9468/// normal call.
9469/// The caller already checked that \p I calls the appropriate LibFunc with a
9470/// correct prototype.
9471bool SelectionDAGBuilder::visitMemPCpyCall(const CallInst &I) {
9472 SDValue Dst = getValue(I.getArgOperand(0));
9473 SDValue Src = getValue(I.getArgOperand(1));
9474 SDValue Size = getValue(I.getArgOperand(2));
9475
9476 Align DstAlign = DAG.InferPtrAlign(Dst).valueOrOne();
9477 Align SrcAlign = DAG.InferPtrAlign(Src).valueOrOne();
9478 // DAG::getMemcpy needs Alignment to be defined.
9479 Align Alignment = std::min(DstAlign, SrcAlign);
9480
9481 SDLoc sdl = getCurSDLoc();
9482
9483 // In the mempcpy context we need to pass in a false value for isTailCall
9484 // because the return pointer needs to be adjusted by the size of
9485 // the copied memory.
9486 SDValue Root = getMemoryRoot();
9487 SDValue MC = DAG.getMemcpy(
9488 Root, sdl, Dst, Src, Size, Alignment, false, false, /*CI=*/nullptr,
9489 std::nullopt, MachinePointerInfo(I.getArgOperand(0)),
9490 MachinePointerInfo(I.getArgOperand(1)), I.getAAMetadata());
9491 assert(MC.getNode() != nullptr &&
9492 "** memcpy should not be lowered as TailCall in mempcpy context **");
9493 DAG.setRoot(MC);
9494
9495 // Check if Size needs to be truncated or extended.
9496 Size = DAG.getSExtOrTrunc(Size, sdl, Dst.getValueType());
9497
9498 // Adjust return pointer to point just past the last dst byte.
9499 SDValue DstPlusSize = DAG.getMemBasePlusOffset(Dst, Size, sdl);
9500 setValue(&I, DstPlusSize);
9501 return true;
9502}
9503
9504/// See if we can lower a strcpy call into an optimized form. If so, return
9505/// true and lower it, otherwise return false and it will be lowered like a
9506/// normal call.
9507/// The caller already checked that \p I calls the appropriate LibFunc with a
9508/// correct prototype.
9509bool SelectionDAGBuilder::visitStrCpyCall(const CallInst &I, bool isStpcpy) {
9510 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9511
9512 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9513 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrcpy(
9514 DAG, getCurSDLoc(), getRoot(), getValue(Arg0), getValue(Arg1),
9515 MachinePointerInfo(Arg0), MachinePointerInfo(Arg1), isStpcpy, &I);
9516 if (Res.first.getNode()) {
9517 setValue(&I, Res.first);
9518 DAG.setRoot(Res.second);
9519 return true;
9520 }
9521
9522 return false;
9523}
9524
9525/// See if we can lower a strcmp call into an optimized form. If so, return
9526/// true and lower it, otherwise return false and it will be lowered like a
9527/// normal call.
9528/// The caller already checked that \p I calls the appropriate LibFunc with a
9529/// correct prototype.
9530bool SelectionDAGBuilder::visitStrCmpCall(const CallInst &I) {
9531 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9532
9533 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9534 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrcmp(
9535 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), getValue(Arg1),
9536 MachinePointerInfo(Arg0), MachinePointerInfo(Arg1), &I);
9537 if (Res.first.getNode()) {
9538 processIntegerCallValue(I, Res.first, true);
9539 PendingLoads.push_back(Res.second);
9540 return true;
9541 }
9542
9543 return false;
9544}
9545
9546/// See if we can lower a strlen call into an optimized form. If so, return
9547/// true and lower it, otherwise return false and it will be lowered like a
9548/// normal call.
9549/// The caller already checked that \p I calls the appropriate LibFunc with a
9550/// correct prototype.
9551bool SelectionDAGBuilder::visitStrLenCall(const CallInst &I) {
9552 const Value *Arg0 = I.getArgOperand(0);
9553
9554 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9555 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrlen(
9556 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), &I);
9557 if (Res.first.getNode()) {
9558 processIntegerCallValue(I, Res.first, false);
9559 PendingLoads.push_back(Res.second);
9560 return true;
9561 }
9562
9563 return false;
9564}
9565
9566/// See if we can lower a strnlen call into an optimized form. If so, return
9567/// true and lower it, otherwise return false and it will be lowered like a
9568/// normal call.
9569/// The caller already checked that \p I calls the appropriate LibFunc with a
9570/// correct prototype.
9571bool SelectionDAGBuilder::visitStrNLenCall(const CallInst &I) {
9572 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9573
9574 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9575 std::pair<SDValue, SDValue> Res =
9576 TSI.EmitTargetCodeForStrnlen(DAG, getCurSDLoc(), DAG.getRoot(),
9577 getValue(Arg0), getValue(Arg1),
9578 MachinePointerInfo(Arg0));
9579 if (Res.first.getNode()) {
9580 processIntegerCallValue(I, Res.first, false);
9581 PendingLoads.push_back(Res.second);
9582 return true;
9583 }
9584
9585 return false;
9586}
9587
9588/// See if we can lower a Strstr call into an optimized form. If so, return
9589/// true and lower it, otherwise return false and it will be lowered like a
9590/// normal call.
9591/// The caller already checked that \p I calls the appropriate LibFunc with a
9592/// correct prototype.
9593bool SelectionDAGBuilder::visitStrstrCall(const CallInst &I) {
9594 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9595 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9596 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrstr(
9597 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), getValue(Arg1), &I);
9598 if (Res.first) {
9599 processIntegerCallValue(I, Res.first, false);
9600 PendingLoads.push_back(Res.second);
9601 return true;
9602 }
9603 return false;
9604}
9605
9606/// See if we can lower a unary floating-point operation into an SDNode with
9607/// the specified Opcode. If so, return true and lower it, otherwise return
9608/// false and it will be lowered like a normal call.
9609/// The caller already checked that \p I calls the appropriate LibFunc with a
9610/// correct prototype.
9611bool SelectionDAGBuilder::visitUnaryFloatCall(const CallInst &I,
9612 unsigned Opcode) {
9613 // We already checked this call's prototype; verify it doesn't modify errno.
9614 // Do not perform optimizations for call sites that require strict
9615 // floating-point semantics.
9616 if (!I.onlyReadsMemory() || I.isStrictFP())
9617 return false;
9618
9619 SDNodeFlags Flags;
9620 Flags.copyFMF(cast<FPMathOperator>(I));
9621
9622 SDValue Tmp = getValue(I.getArgOperand(0));
9623 setValue(&I,
9624 DAG.getNode(Opcode, getCurSDLoc(), Tmp.getValueType(), Tmp, Flags));
9625 return true;
9626}
9627
9628/// See if we can lower a binary floating-point operation into an SDNode with
9629/// the specified Opcode. If so, return true and lower it. Otherwise return
9630/// false, and it will be lowered like a normal call.
9631/// The caller already checked that \p I calls the appropriate LibFunc with a
9632/// correct prototype.
9633bool SelectionDAGBuilder::visitBinaryFloatCall(const CallInst &I,
9634 unsigned Opcode) {
9635 // We already checked this call's prototype; verify it doesn't modify errno.
9636 // Do not perform optimizations for call sites that require strict
9637 // floating-point semantics.
9638 if (!I.onlyReadsMemory() || I.isStrictFP())
9639 return false;
9640
9641 SDNodeFlags Flags;
9642 Flags.copyFMF(cast<FPMathOperator>(I));
9643
9644 SDValue Tmp0 = getValue(I.getArgOperand(0));
9645 SDValue Tmp1 = getValue(I.getArgOperand(1));
9646 EVT VT = Tmp0.getValueType();
9647 setValue(&I, DAG.getNode(Opcode, getCurSDLoc(), VT, Tmp0, Tmp1, Flags));
9648 return true;
9649}
9650
9651void SelectionDAGBuilder::visitCall(const CallInst &I) {
9652 // Handle inline assembly differently.
9653 if (I.isInlineAsm()) {
9654 visitInlineAsm(I);
9655 return;
9656 }
9657
9659
9660 if (Function *F = I.getCalledFunction()) {
9661 if (F->isDeclaration()) {
9662 // Is this an LLVM intrinsic?
9663 if (unsigned IID = F->getIntrinsicID()) {
9664 visitIntrinsicCall(I, IID);
9665 return;
9666 }
9667 }
9668
9669 // Check for well-known libc/libm calls. If the function is internal, it
9670 // can't be a library call. Don't do the check if marked as nobuiltin for
9671 // some reason.
9672 // This code should not handle libcalls that are already canonicalized to
9673 // intrinsics by the middle-end.
9674 LibFunc Func;
9675 if (!I.isNoBuiltin() && !F->hasLocalLinkage() && F->hasName() &&
9676 LibInfo->getLibFunc(*F, Func) && LibInfo->hasOptimizedCodeGen(Func)) {
9677 switch (Func) {
9678 default: break;
9679 case LibFunc_bcmp:
9680 if (visitMemCmpBCmpCall(I))
9681 return;
9682 break;
9683 case LibFunc_copysign:
9684 case LibFunc_copysignf:
9685 case LibFunc_copysignl:
9686 // We already checked this call's prototype; verify it doesn't modify
9687 // errno.
9688 if (I.onlyReadsMemory()) {
9689 SDValue LHS = getValue(I.getArgOperand(0));
9690 SDValue RHS = getValue(I.getArgOperand(1));
9692 LHS.getValueType(), LHS, RHS));
9693 return;
9694 }
9695 break;
9696 case LibFunc_sin:
9697 case LibFunc_sinf:
9698 case LibFunc_sinl:
9699 if (visitUnaryFloatCall(I, ISD::FSIN))
9700 return;
9701 break;
9702 case LibFunc_cos:
9703 case LibFunc_cosf:
9704 case LibFunc_cosl:
9705 if (visitUnaryFloatCall(I, ISD::FCOS))
9706 return;
9707 break;
9708 case LibFunc_tan:
9709 case LibFunc_tanf:
9710 case LibFunc_tanl:
9711 if (visitUnaryFloatCall(I, ISD::FTAN))
9712 return;
9713 break;
9714 case LibFunc_asin:
9715 case LibFunc_asinf:
9716 case LibFunc_asinl:
9717 if (visitUnaryFloatCall(I, ISD::FASIN))
9718 return;
9719 break;
9720 case LibFunc_acos:
9721 case LibFunc_acosf:
9722 case LibFunc_acosl:
9723 if (visitUnaryFloatCall(I, ISD::FACOS))
9724 return;
9725 break;
9726 case LibFunc_atan:
9727 case LibFunc_atanf:
9728 case LibFunc_atanl:
9729 if (visitUnaryFloatCall(I, ISD::FATAN))
9730 return;
9731 break;
9732 case LibFunc_atan2:
9733 case LibFunc_atan2f:
9734 case LibFunc_atan2l:
9735 if (visitBinaryFloatCall(I, ISD::FATAN2))
9736 return;
9737 break;
9738 case LibFunc_sinh:
9739 case LibFunc_sinhf:
9740 case LibFunc_sinhl:
9741 if (visitUnaryFloatCall(I, ISD::FSINH))
9742 return;
9743 break;
9744 case LibFunc_cosh:
9745 case LibFunc_coshf:
9746 case LibFunc_coshl:
9747 if (visitUnaryFloatCall(I, ISD::FCOSH))
9748 return;
9749 break;
9750 case LibFunc_tanh:
9751 case LibFunc_tanhf:
9752 case LibFunc_tanhl:
9753 if (visitUnaryFloatCall(I, ISD::FTANH))
9754 return;
9755 break;
9756 case LibFunc_sqrt:
9757 case LibFunc_sqrtf:
9758 case LibFunc_sqrtl:
9759 case LibFunc_sqrt_finite:
9760 case LibFunc_sqrtf_finite:
9761 case LibFunc_sqrtl_finite:
9762 if (visitUnaryFloatCall(I, ISD::FSQRT))
9763 return;
9764 break;
9765 case LibFunc_log2:
9766 case LibFunc_log2f:
9767 case LibFunc_log2l:
9768 if (visitUnaryFloatCall(I, ISD::FLOG2))
9769 return;
9770 break;
9771 case LibFunc_exp2:
9772 case LibFunc_exp2f:
9773 case LibFunc_exp2l:
9774 if (visitUnaryFloatCall(I, ISD::FEXP2))
9775 return;
9776 break;
9777 case LibFunc_exp10:
9778 case LibFunc_exp10f:
9779 case LibFunc_exp10l:
9780 if (visitUnaryFloatCall(I, ISD::FEXP10))
9781 return;
9782 break;
9783 case LibFunc_ldexp:
9784 case LibFunc_ldexpf:
9785 case LibFunc_ldexpl:
9786 if (visitBinaryFloatCall(I, ISD::FLDEXP))
9787 return;
9788 break;
9789 case LibFunc_strstr:
9790 if (visitStrstrCall(I))
9791 return;
9792 break;
9793 case LibFunc_memcmp:
9794 if (visitMemCmpBCmpCall(I))
9795 return;
9796 break;
9797 case LibFunc_memccpy:
9798 if (visitMemCCpyCall(I))
9799 return;
9800 break;
9801 case LibFunc_mempcpy:
9802 if (visitMemPCpyCall(I))
9803 return;
9804 break;
9805 case LibFunc_memchr:
9806 if (visitMemChrCall(I))
9807 return;
9808 break;
9809 case LibFunc_strcpy:
9810 if (visitStrCpyCall(I, false))
9811 return;
9812 break;
9813 case LibFunc_stpcpy:
9814 if (visitStrCpyCall(I, true))
9815 return;
9816 break;
9817 case LibFunc_strcmp:
9818 if (visitStrCmpCall(I))
9819 return;
9820 break;
9821 case LibFunc_strlen:
9822 if (visitStrLenCall(I))
9823 return;
9824 break;
9825 case LibFunc_strnlen:
9826 if (visitStrNLenCall(I))
9827 return;
9828 break;
9829 }
9830 }
9831 }
9832
9833 if (I.countOperandBundlesOfType(LLVMContext::OB_ptrauth)) {
9834 LowerCallSiteWithPtrAuthBundle(cast<CallBase>(I), /*EHPadBB=*/nullptr);
9835 return;
9836 }
9837
9838 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
9839 // have to do anything here to lower funclet bundles.
9840 // CFGuardTarget bundles are lowered in LowerCallTo.
9842 I, "calls",
9847
9848 SDValue Callee = getValue(I.getCalledOperand());
9849
9850 if (I.hasDeoptState())
9851 LowerCallSiteWithDeoptBundle(&I, Callee, nullptr);
9852 else
9853 // Check if we can potentially perform a tail call. More detailed checking
9854 // is be done within LowerCallTo, after more information about the call is
9855 // known.
9856 LowerCallTo(I, Callee, I.isTailCall(), I.isMustTailCall());
9857}
9858
9860 const CallBase &CB, const BasicBlock *EHPadBB) {
9861 auto PAB = CB.getOperandBundle("ptrauth");
9862 const Value *CalleeV = CB.getCalledOperand();
9863
9864 // Gather the call ptrauth data from the operand bundle:
9865 // [ i32 <key>, i64 <discriminator> ]
9866 const auto *Key = cast<ConstantInt>(PAB->Inputs[0]);
9867 const Value *Discriminator = PAB->Inputs[1];
9868
9869 assert(Key->getType()->isIntegerTy(32) && "Invalid ptrauth key");
9870 assert(Discriminator->getType()->isIntegerTy(64) &&
9871 "Invalid ptrauth discriminator");
9872
9873 // Look through ptrauth constants to find the raw callee.
9874 // Do a direct unauthenticated call if we found it and everything matches.
9875 if (const auto *CalleeCPA = dyn_cast<ConstantPtrAuth>(CalleeV))
9876 if (CalleeCPA->isKnownCompatibleWith(Key, Discriminator,
9877 DAG.getDataLayout()))
9878 return LowerCallTo(CB, getValue(CalleeCPA->getPointer()), CB.isTailCall(),
9879 CB.isMustTailCall(), EHPadBB);
9880
9881 // Functions should never be ptrauth-called directly.
9882 assert(!isa<Function>(CalleeV) && "invalid direct ptrauth call");
9883
9884 // Otherwise, do an authenticated indirect call.
9885 TargetLowering::PtrAuthInfo PAI = {Key->getZExtValue(),
9886 getValue(Discriminator)};
9887
9888 LowerCallTo(CB, getValue(CalleeV), CB.isTailCall(), CB.isMustTailCall(),
9889 EHPadBB, &PAI);
9890}
9891
9892namespace {
9893
9894/// AsmOperandInfo - This contains information for each constraint that we are
9895/// lowering.
9896class SDISelAsmOperandInfo : public TargetLowering::AsmOperandInfo {
9897public:
9898 /// CallOperand - If this is the result output operand or a clobber
9899 /// this is null, otherwise it is the incoming operand to the CallInst.
9900 /// This gets modified as the asm is processed.
9901 SDValue CallOperand;
9902
9903 /// AssignedRegs - If this is a register or register class operand, this
9904 /// contains the set of register corresponding to the operand.
9905 RegsForValue AssignedRegs;
9906
9907 explicit SDISelAsmOperandInfo(const TargetLowering::AsmOperandInfo &info)
9908 : TargetLowering::AsmOperandInfo(info), CallOperand(nullptr, 0) {
9909 }
9910
9911 /// Whether or not this operand accesses memory
9912 bool hasMemory(const TargetLowering &TLI) const {
9913 // Indirect operand accesses access memory.
9914 if (isIndirect)
9915 return true;
9916
9917 for (const auto &Code : Codes)
9919 return true;
9920
9921 return false;
9922 }
9923};
9924
9925
9926} // end anonymous namespace
9927
9928/// Make sure that the output operand \p OpInfo and its corresponding input
9929/// operand \p MatchingOpInfo have compatible constraint types (otherwise error
9930/// out).
9931static void patchMatchingInput(const SDISelAsmOperandInfo &OpInfo,
9932 SDISelAsmOperandInfo &MatchingOpInfo,
9933 SelectionDAG &DAG) {
9934 if (OpInfo.ConstraintVT == MatchingOpInfo.ConstraintVT)
9935 return;
9936
9938 const auto &TLI = DAG.getTargetLoweringInfo();
9939
9940 std::pair<unsigned, const TargetRegisterClass *> MatchRC =
9941 TLI.getRegForInlineAsmConstraint(TRI, OpInfo.ConstraintCode,
9942 OpInfo.ConstraintVT);
9943 std::pair<unsigned, const TargetRegisterClass *> InputRC =
9944 TLI.getRegForInlineAsmConstraint(TRI, MatchingOpInfo.ConstraintCode,
9945 MatchingOpInfo.ConstraintVT);
9946 const bool OutOpIsIntOrFP =
9947 OpInfo.ConstraintVT.isInteger() || OpInfo.ConstraintVT.isFloatingPoint();
9948 const bool InOpIsIntOrFP = MatchingOpInfo.ConstraintVT.isInteger() ||
9949 MatchingOpInfo.ConstraintVT.isFloatingPoint();
9950 if ((OutOpIsIntOrFP != InOpIsIntOrFP) || (MatchRC.second != InputRC.second)) {
9951 // FIXME: error out in a more elegant fashion
9952 report_fatal_error("Unsupported asm: input constraint"
9953 " with a matching output constraint of"
9954 " incompatible type!");
9955 }
9956 MatchingOpInfo.ConstraintVT = OpInfo.ConstraintVT;
9957}
9958
9959/// Get a direct memory input to behave well as an indirect operand.
9960/// This may introduce stores, hence the need for a \p Chain.
9961/// \return The (possibly updated) chain.
9962static SDValue getAddressForMemoryInput(SDValue Chain, const SDLoc &Location,
9963 SDISelAsmOperandInfo &OpInfo,
9964 SelectionDAG &DAG) {
9965 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9966
9967 // If we don't have an indirect input, put it in the constpool if we can,
9968 // otherwise spill it to a stack slot.
9969 // TODO: This isn't quite right. We need to handle these according to
9970 // the addressing mode that the constraint wants. Also, this may take
9971 // an additional register for the computation and we don't want that
9972 // either.
9973
9974 // If the operand is a float, integer, or vector constant, spill to a
9975 // constant pool entry to get its address.
9976 const Value *OpVal = OpInfo.CallOperandVal;
9977 if (isa<ConstantFP>(OpVal) || isa<ConstantInt>(OpVal) ||
9979 OpInfo.CallOperand = DAG.getConstantPool(
9980 cast<Constant>(OpVal), TLI.getPointerTy(DAG.getDataLayout()));
9981 return Chain;
9982 }
9983
9984 // Otherwise, create a stack slot and emit a store to it before the asm.
9985 Type *Ty = OpVal->getType();
9986 auto &DL = DAG.getDataLayout();
9987 TypeSize TySize = DL.getTypeAllocSize(Ty);
9990 int StackID = 0;
9991 if (TySize.isScalable())
9992 StackID = TFI->getStackIDForScalableVectors();
9993 int SSFI = MF.getFrameInfo().CreateStackObject(TySize.getKnownMinValue(),
9994 DL.getPrefTypeAlign(Ty), false,
9995 nullptr, StackID);
9996 SDValue StackSlot = DAG.getFrameIndex(SSFI, TLI.getFrameIndexTy(DL));
9997 Chain = DAG.getTruncStore(Chain, Location, OpInfo.CallOperand, StackSlot,
9999 TLI.getMemValueType(DL, Ty));
10000 OpInfo.CallOperand = StackSlot;
10001
10002 return Chain;
10003}
10004
10005/// GetRegistersForValue - Assign registers (virtual or physical) for the
10006/// specified operand. We prefer to assign virtual registers, to allow the
10007/// register allocator to handle the assignment process. However, if the asm
10008/// uses features that we can't model on machineinstrs, we have SDISel do the
10009/// allocation. This produces generally horrible, but correct, code.
10010///
10011/// OpInfo describes the operand
10012/// RefOpInfo describes the matching operand if any, the operand otherwise
10013static std::optional<unsigned>
10015 SDISelAsmOperandInfo &OpInfo,
10016 SDISelAsmOperandInfo &RefOpInfo) {
10017 LLVMContext &Context = *DAG.getContext();
10018 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10019
10023
10024 // No work to do for memory/address operands.
10025 if (OpInfo.ConstraintType == TargetLowering::C_Memory ||
10026 OpInfo.ConstraintType == TargetLowering::C_Address)
10027 return std::nullopt;
10028
10029 // If this is a constraint for a single physreg, or a constraint for a
10030 // register class, find it.
10031 unsigned AssignedReg;
10032 const TargetRegisterClass *RC;
10033 std::tie(AssignedReg, RC) = TLI.getRegForInlineAsmConstraint(
10034 &TRI, RefOpInfo.ConstraintCode, RefOpInfo.ConstraintVT);
10035 // RC is unset only on failure. Return immediately.
10036 if (!RC)
10037 return std::nullopt;
10038
10039 // Get the actual register value type. This is important, because the user
10040 // may have asked for (e.g.) the AX register in i32 type. We need to
10041 // remember that AX is actually i16 to get the right extension.
10042 const MVT RegVT = *TRI.legalclasstypes_begin(*RC);
10043
10044 if (OpInfo.ConstraintVT != MVT::Other && RegVT != MVT::Untyped) {
10045 // If this is an FP operand in an integer register (or visa versa), or more
10046 // generally if the operand value disagrees with the register class we plan
10047 // to stick it in, fix the operand type.
10048 //
10049 // If this is an input value, the bitcast to the new type is done now.
10050 // Bitcast for output value is done at the end of visitInlineAsm().
10051 if ((OpInfo.Type == InlineAsm::isOutput ||
10052 OpInfo.Type == InlineAsm::isInput) &&
10053 !TRI.isTypeLegalForClass(*RC, OpInfo.ConstraintVT)) {
10054 // Try to convert to the first EVT that the reg class contains. If the
10055 // types are identical size, use a bitcast to convert (e.g. two differing
10056 // vector types). Note: output bitcast is done at the end of
10057 // visitInlineAsm().
10058 if (RegVT.getSizeInBits() == OpInfo.ConstraintVT.getSizeInBits()) {
10059 // Exclude indirect inputs while they are unsupported because the code
10060 // to perform the load is missing and thus OpInfo.CallOperand still
10061 // refers to the input address rather than the pointed-to value.
10062 if (OpInfo.Type == InlineAsm::isInput && !OpInfo.isIndirect)
10063 OpInfo.CallOperand =
10064 DAG.getNode(ISD::BITCAST, DL, RegVT, OpInfo.CallOperand);
10065 OpInfo.ConstraintVT = RegVT;
10066 // If the operand is an FP value and we want it in integer registers,
10067 // use the corresponding integer type. This turns an f64 value into
10068 // i64, which can be passed with two i32 values on a 32-bit machine.
10069 } else if (RegVT.isInteger() && OpInfo.ConstraintVT.isFloatingPoint()) {
10070 MVT VT = MVT::getIntegerVT(OpInfo.ConstraintVT.getSizeInBits());
10071 if (OpInfo.Type == InlineAsm::isInput)
10072 OpInfo.CallOperand =
10073 DAG.getNode(ISD::BITCAST, DL, VT, OpInfo.CallOperand);
10074 OpInfo.ConstraintVT = VT;
10075 }
10076 }
10077 }
10078
10079 // No need to allocate a matching input constraint since the constraint it's
10080 // matching to has already been allocated.
10081 if (OpInfo.isMatchingInputConstraint())
10082 return std::nullopt;
10083
10084 EVT ValueVT = OpInfo.ConstraintVT;
10085 if (OpInfo.ConstraintVT == MVT::Other)
10086 ValueVT = RegVT;
10087
10088 // Initialize NumRegs.
10089 unsigned NumRegs = 1;
10090 if (OpInfo.ConstraintVT != MVT::Other)
10091 NumRegs = TLI.getNumRegisters(Context, OpInfo.ConstraintVT, RegVT);
10092
10093 // If this is a constraint for a specific physical register, like {r17},
10094 // assign it now.
10095
10096 // If this associated to a specific register, initialize iterator to correct
10097 // place. If virtual, make sure we have enough registers
10098
10099 // Initialize iterator if necessary
10102
10103 // Do not check for single registers.
10104 if (AssignedReg) {
10105 I = std::find(I, RC->end(), AssignedReg);
10106 if (I == RC->end()) {
10107 // RC does not contain the selected register, which indicates a
10108 // mismatch between the register and the required type/bitwidth.
10109 return {AssignedReg};
10110 }
10111 }
10112
10113 for (; NumRegs; --NumRegs, ++I) {
10114 assert(I != RC->end() && "Ran out of registers to allocate!");
10115 Register R = AssignedReg ? Register(*I) : RegInfo.createVirtualRegister(RC);
10116 Regs.push_back(R);
10117 }
10118
10119 OpInfo.AssignedRegs = RegsForValue(Regs, RegVT, ValueVT);
10120 return std::nullopt;
10121}
10122
10123static unsigned
10125 const std::vector<SDValue> &AsmNodeOperands) {
10126 // Scan until we find the definition we already emitted of this operand.
10127 unsigned CurOp = InlineAsm::Op_FirstOperand;
10128 for (; OperandNo; --OperandNo) {
10129 // Advance to the next operand.
10130 unsigned OpFlag = AsmNodeOperands[CurOp]->getAsZExtVal();
10131 const InlineAsm::Flag F(OpFlag);
10132 assert(
10133 (F.isRegDefKind() || F.isRegDefEarlyClobberKind() || F.isMemKind()) &&
10134 "Skipped past definitions?");
10135 CurOp += F.getNumOperandRegisters() + 1;
10136 }
10137 return CurOp;
10138}
10139
10140namespace {
10141
10142class ExtraFlags {
10143 unsigned Flags = 0;
10144
10145public:
10146 explicit ExtraFlags(const CallBase &Call) {
10147 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
10148 if (IA->hasSideEffects())
10150 if (IA->isAlignStack())
10152 if (IA->canThrow())
10154 if (Call.isConvergent())
10156 Flags |= IA->getDialect() * InlineAsm::Extra_AsmDialect;
10157 }
10158
10159 void update(const TargetLowering::AsmOperandInfo &OpInfo) {
10160 // Ideally, we would only check against memory constraints. However, the
10161 // meaning of an Other constraint can be target-specific and we can't easily
10162 // reason about it. Therefore, be conservative and set MayLoad/MayStore
10163 // for Other constraints as well.
10166 if (OpInfo.Type == InlineAsm::isInput)
10168 else if (OpInfo.Type == InlineAsm::isOutput)
10170 else if (OpInfo.Type == InlineAsm::isClobber)
10172 }
10173 }
10174
10175 unsigned get() const { return Flags; }
10176};
10177
10178} // end anonymous namespace
10179
10180static bool isFunction(SDValue Op) {
10181 if (Op && Op.getOpcode() == ISD::GlobalAddress) {
10182 if (auto *GA = dyn_cast<GlobalAddressSDNode>(Op)) {
10183 auto Fn = dyn_cast_or_null<Function>(GA->getGlobal());
10184
10185 // In normal "call dllimport func" instruction (non-inlineasm) it force
10186 // indirect access by specifing call opcode. And usually specially print
10187 // asm with indirect symbol (i.g: "*") according to opcode. Inline asm can
10188 // not do in this way now. (In fact, this is similar with "Data Access"
10189 // action). So here we ignore dllimport function.
10190 if (Fn && !Fn->hasDLLImportStorageClass())
10191 return true;
10192 }
10193 }
10194 return false;
10195}
10196
10197/// visitInlineAsm - Handle a call to an InlineAsm object.
10198void SelectionDAGBuilder::visitInlineAsm(const CallBase &Call,
10199 const BasicBlock *EHPadBB) {
10200 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
10201
10202 /// ConstraintOperands - Information about all of the constraints.
10203 SmallVector<SDISelAsmOperandInfo, 16> ConstraintOperands;
10204
10205 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10207 DAG.getDataLayout(), DAG.getSubtarget().getRegisterInfo(), Call);
10208
10209 // First Pass: Calculate HasSideEffects and ExtraFlags (AlignStack,
10210 // AsmDialect, MayLoad, MayStore).
10211 bool HasSideEffect = IA->hasSideEffects();
10212 ExtraFlags ExtraInfo(Call);
10213
10214 for (auto &T : TargetConstraints) {
10215 ConstraintOperands.push_back(SDISelAsmOperandInfo(T));
10216 SDISelAsmOperandInfo &OpInfo = ConstraintOperands.back();
10217
10218 if (OpInfo.CallOperandVal)
10219 OpInfo.CallOperand = getValue(OpInfo.CallOperandVal);
10220
10221 if (!HasSideEffect)
10222 HasSideEffect = OpInfo.hasMemory(TLI);
10223
10224 // Determine if this InlineAsm MayLoad or MayStore based on the constraints.
10225 // FIXME: Could we compute this on OpInfo rather than T?
10226
10227 // Compute the constraint code and ConstraintType to use.
10229
10230 if (T.ConstraintType == TargetLowering::C_Immediate &&
10231 OpInfo.CallOperand && !isa<ConstantSDNode>(OpInfo.CallOperand))
10232 // We've delayed emitting a diagnostic like the "n" constraint because
10233 // inlining could cause an integer showing up.
10234 return emitInlineAsmError(Call, "constraint '" + Twine(T.ConstraintCode) +
10235 "' expects an integer constant "
10236 "expression");
10237
10238 ExtraInfo.update(T);
10239 }
10240
10241 // We won't need to flush pending loads if this asm doesn't touch
10242 // memory and is nonvolatile.
10243 SDValue Glue, Chain = (HasSideEffect) ? getRoot() : DAG.getRoot();
10244
10245 bool EmitEHLabels = isa<InvokeInst>(Call);
10246 if (EmitEHLabels) {
10247 assert(EHPadBB && "InvokeInst must have an EHPadBB");
10248 }
10249 bool IsCallBr = isa<CallBrInst>(Call);
10250
10251 if (IsCallBr || EmitEHLabels) {
10252 // If this is a callbr or invoke we need to flush pending exports since
10253 // inlineasm_br and invoke are terminators.
10254 // We need to do this before nodes are glued to the inlineasm_br node.
10255 Chain = getControlRoot();
10256 }
10257
10258 MCSymbol *BeginLabel = nullptr;
10259 if (EmitEHLabels) {
10260 Chain = lowerStartEH(Chain, EHPadBB, BeginLabel);
10261 }
10262
10263 int OpNo = -1;
10264 SmallVector<StringRef> AsmStrs;
10265 IA->collectAsmStrs(AsmStrs);
10266
10267 // Second pass over the constraints: compute which constraint option to use.
10268 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
10269 if (OpInfo.hasArg() || OpInfo.Type == InlineAsm::isOutput)
10270 OpNo++;
10271
10272 // If this is an output operand with a matching input operand, look up the
10273 // matching input. If their types mismatch, e.g. one is an integer, the
10274 // other is floating point, or their sizes are different, flag it as an
10275 // error.
10276 if (OpInfo.hasMatchingInput()) {
10277 SDISelAsmOperandInfo &Input = ConstraintOperands[OpInfo.MatchingInput];
10278 patchMatchingInput(OpInfo, Input, DAG);
10279 }
10280
10281 // Compute the constraint code and ConstraintType to use.
10282 TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
10283
10284 if ((OpInfo.ConstraintType == TargetLowering::C_Memory &&
10285 OpInfo.Type == InlineAsm::isClobber) ||
10286 OpInfo.ConstraintType == TargetLowering::C_Address)
10287 continue;
10288
10289 // In Linux PIC model, there are 4 cases about value/label addressing:
10290 //
10291 // 1: Function call or Label jmp inside the module.
10292 // 2: Data access (such as global variable, static variable) inside module.
10293 // 3: Function call or Label jmp outside the module.
10294 // 4: Data access (such as global variable) outside the module.
10295 //
10296 // Due to current llvm inline asm architecture designed to not "recognize"
10297 // the asm code, there are quite troubles for us to treat mem addressing
10298 // differently for same value/adress used in different instuctions.
10299 // For example, in pic model, call a func may in plt way or direclty
10300 // pc-related, but lea/mov a function adress may use got.
10301 //
10302 // Here we try to "recognize" function call for the case 1 and case 3 in
10303 // inline asm. And try to adjust the constraint for them.
10304 //
10305 // TODO: Due to current inline asm didn't encourage to jmp to the outsider
10306 // label, so here we don't handle jmp function label now, but we need to
10307 // enhance it (especilly in PIC model) if we meet meaningful requirements.
10308 if (OpInfo.isIndirect && isFunction(OpInfo.CallOperand) &&
10309 TLI.isInlineAsmTargetBranch(AsmStrs, OpNo) &&
10310 TM.getCodeModel() != CodeModel::Large) {
10311 OpInfo.isIndirect = false;
10312 OpInfo.ConstraintType = TargetLowering::C_Address;
10313 }
10314
10315 // If this is a memory input, and if the operand is not indirect, do what we
10316 // need to provide an address for the memory input.
10317 if (OpInfo.ConstraintType == TargetLowering::C_Memory &&
10318 !OpInfo.isIndirect) {
10319 assert((OpInfo.isMultipleAlternative ||
10320 (OpInfo.Type == InlineAsm::isInput)) &&
10321 "Can only indirectify direct input operands!");
10322
10323 // Memory operands really want the address of the value.
10324 Chain = getAddressForMemoryInput(Chain, getCurSDLoc(), OpInfo, DAG);
10325
10326 // There is no longer a Value* corresponding to this operand.
10327 OpInfo.CallOperandVal = nullptr;
10328
10329 // It is now an indirect operand.
10330 OpInfo.isIndirect = true;
10331 }
10332
10333 }
10334
10335 // AsmNodeOperands - The operands for the ISD::INLINEASM node.
10336 std::vector<SDValue> AsmNodeOperands;
10337 AsmNodeOperands.push_back(SDValue()); // reserve space for input chain
10338 AsmNodeOperands.push_back(DAG.getTargetExternalSymbol(
10339 IA->getAsmString().data(), TLI.getProgramPointerTy(DAG.getDataLayout())));
10340
10341 // If we have a !srcloc metadata node associated with it, we want to attach
10342 // this to the ultimately generated inline asm machineinstr. To do this, we
10343 // pass in the third operand as this (potentially null) inline asm MDNode.
10344 const MDNode *SrcLoc = Call.getMetadata("srcloc");
10345 AsmNodeOperands.push_back(DAG.getMDNode(SrcLoc));
10346
10347 // Remember the HasSideEffect, AlignStack, AsmDialect, MayLoad and MayStore
10348 // bits as operand 3.
10349 AsmNodeOperands.push_back(DAG.getTargetConstant(
10350 ExtraInfo.get(), getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10351
10352 // Third pass: Loop over operands to prepare DAG-level operands.. As part of
10353 // this, assign virtual and physical registers for inputs and otput.
10354 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
10355 // Assign Registers.
10356 SDISelAsmOperandInfo &RefOpInfo =
10357 OpInfo.isMatchingInputConstraint()
10358 ? ConstraintOperands[OpInfo.getMatchedOperand()]
10359 : OpInfo;
10360 const auto RegError =
10361 getRegistersForValue(DAG, getCurSDLoc(), OpInfo, RefOpInfo);
10362 if (RegError) {
10363 const MachineFunction &MF = DAG.getMachineFunction();
10364 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
10365 const char *RegName = TRI.getName(*RegError);
10366 emitInlineAsmError(Call, "register '" + Twine(RegName) +
10367 "' allocated for constraint '" +
10368 Twine(OpInfo.ConstraintCode) +
10369 "' does not match required type");
10370 return;
10371 }
10372
10373 auto DetectWriteToReservedRegister = [&]() {
10374 const MachineFunction &MF = DAG.getMachineFunction();
10375 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
10376 for (Register Reg : OpInfo.AssignedRegs.Regs) {
10377 if (Reg.isPhysical() && TRI.isInlineAsmReadOnlyReg(MF, Reg)) {
10378 const char *RegName = TRI.getName(Reg);
10379 emitInlineAsmError(Call, "write to reserved register '" +
10380 Twine(RegName) + "'");
10381 return true;
10382 }
10383 }
10384 return false;
10385 };
10386 assert((OpInfo.ConstraintType != TargetLowering::C_Address ||
10387 (OpInfo.Type == InlineAsm::isInput &&
10388 !OpInfo.isMatchingInputConstraint())) &&
10389 "Only address as input operand is allowed.");
10390
10391 switch (OpInfo.Type) {
10393 if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
10394 const InlineAsm::ConstraintCode ConstraintID =
10395 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10397 "Failed to convert memory constraint code to constraint id.");
10398
10399 // Add information to the INLINEASM node to know about this output.
10400 InlineAsm::Flag OpFlags(InlineAsm::Kind::Mem, 1);
10401 OpFlags.setMemConstraint(ConstraintID);
10402 AsmNodeOperands.push_back(DAG.getTargetConstant(OpFlags, getCurSDLoc(),
10403 MVT::i32));
10404 AsmNodeOperands.push_back(OpInfo.CallOperand);
10405 } else {
10406 // Otherwise, this outputs to a register (directly for C_Register /
10407 // C_RegisterClass, and a target-defined fashion for
10408 // C_Immediate/C_Other). Find a register that we can use.
10409 if (OpInfo.AssignedRegs.Regs.empty()) {
10410 emitInlineAsmError(
10411 Call, "couldn't allocate output register for constraint '" +
10412 Twine(OpInfo.ConstraintCode) + "'");
10413 return;
10414 }
10415
10416 if (DetectWriteToReservedRegister())
10417 return;
10418
10419 // Add information to the INLINEASM node to know that this register is
10420 // set.
10421 OpInfo.AssignedRegs.AddInlineAsmOperands(
10422 OpInfo.isEarlyClobber ? InlineAsm::Kind::RegDefEarlyClobber
10424 false, 0, getCurSDLoc(), DAG, AsmNodeOperands);
10425 }
10426 break;
10427
10428 case InlineAsm::isInput:
10429 case InlineAsm::isLabel: {
10430 SDValue InOperandVal = OpInfo.CallOperand;
10431
10432 if (OpInfo.isMatchingInputConstraint()) {
10433 // If this is required to match an output register we have already set,
10434 // just use its register.
10435 auto CurOp = findMatchingInlineAsmOperand(OpInfo.getMatchedOperand(),
10436 AsmNodeOperands);
10437 InlineAsm::Flag Flag(AsmNodeOperands[CurOp]->getAsZExtVal());
10438 if (Flag.isRegDefKind() || Flag.isRegDefEarlyClobberKind()) {
10439 if (OpInfo.isIndirect) {
10440 // This happens on gcc/testsuite/gcc.dg/pr8788-1.c
10441 emitInlineAsmError(Call, "inline asm not supported yet: "
10442 "don't know how to handle tied "
10443 "indirect register inputs");
10444 return;
10445 }
10446
10448 MachineFunction &MF = DAG.getMachineFunction();
10449 MachineRegisterInfo &MRI = MF.getRegInfo();
10450 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
10451 auto *R = cast<RegisterSDNode>(AsmNodeOperands[CurOp+1]);
10452 Register TiedReg = R->getReg();
10453 MVT RegVT = R->getSimpleValueType(0);
10454 const TargetRegisterClass *RC =
10455 TiedReg.isVirtual() ? MRI.getRegClass(TiedReg)
10456 : RegVT != MVT::Untyped ? TLI.getRegClassFor(RegVT)
10457 : TRI.getMinimalPhysRegClass(TiedReg);
10458 for (unsigned i = 0, e = Flag.getNumOperandRegisters(); i != e; ++i)
10459 Regs.push_back(MRI.createVirtualRegister(RC));
10460
10461 RegsForValue MatchedRegs(Regs, RegVT, InOperandVal.getValueType());
10462
10463 SDLoc dl = getCurSDLoc();
10464 // Use the produced MatchedRegs object to
10465 MatchedRegs.getCopyToRegs(InOperandVal, DAG, dl, Chain, &Glue, &Call);
10466 MatchedRegs.AddInlineAsmOperands(InlineAsm::Kind::RegUse, true,
10467 OpInfo.getMatchedOperand(), dl, DAG,
10468 AsmNodeOperands);
10469 break;
10470 }
10471
10472 assert(Flag.isMemKind() && "Unknown matching constraint!");
10473 assert(Flag.getNumOperandRegisters() == 1 &&
10474 "Unexpected number of operands");
10475 // Add information to the INLINEASM node to know about this input.
10476 // See InlineAsm.h isUseOperandTiedToDef.
10477 Flag.clearMemConstraint();
10478 Flag.setMatchingOp(OpInfo.getMatchedOperand());
10479 AsmNodeOperands.push_back(DAG.getTargetConstant(
10480 Flag, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10481 AsmNodeOperands.push_back(AsmNodeOperands[CurOp+1]);
10482 break;
10483 }
10484
10485 // Treat indirect 'X' constraint as memory.
10486 if (OpInfo.ConstraintType == TargetLowering::C_Other &&
10487 OpInfo.isIndirect)
10488 OpInfo.ConstraintType = TargetLowering::C_Memory;
10489
10490 if (OpInfo.ConstraintType == TargetLowering::C_Immediate ||
10491 OpInfo.ConstraintType == TargetLowering::C_Other) {
10492 std::vector<SDValue> Ops;
10493 TLI.LowerAsmOperandForConstraint(InOperandVal, OpInfo.ConstraintCode,
10494 Ops, DAG);
10495 if (Ops.empty()) {
10496 if (OpInfo.ConstraintType == TargetLowering::C_Immediate)
10497 if (isa<ConstantSDNode>(InOperandVal)) {
10498 emitInlineAsmError(Call, "value out of range for constraint '" +
10499 Twine(OpInfo.ConstraintCode) + "'");
10500 return;
10501 }
10502
10503 emitInlineAsmError(Call,
10504 "invalid operand for inline asm constraint '" +
10505 Twine(OpInfo.ConstraintCode) + "'");
10506 return;
10507 }
10508
10509 // Add information to the INLINEASM node to know about this input.
10510 InlineAsm::Flag ResOpType(InlineAsm::Kind::Imm, Ops.size());
10511 AsmNodeOperands.push_back(DAG.getTargetConstant(
10512 ResOpType, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10513 llvm::append_range(AsmNodeOperands, Ops);
10514 break;
10515 }
10516
10517 if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
10518 assert((OpInfo.isIndirect ||
10519 OpInfo.ConstraintType != TargetLowering::C_Memory) &&
10520 "Operand must be indirect to be a mem!");
10521 assert(InOperandVal.getValueType() ==
10522 TLI.getPointerTy(DAG.getDataLayout()) &&
10523 "Memory operands expect pointer values");
10524
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 input.
10531 InlineAsm::Flag ResOpType(InlineAsm::Kind::Mem, 1);
10532 ResOpType.setMemConstraint(ConstraintID);
10533 AsmNodeOperands.push_back(DAG.getTargetConstant(ResOpType,
10534 getCurSDLoc(),
10535 MVT::i32));
10536 AsmNodeOperands.push_back(InOperandVal);
10537 break;
10538 }
10539
10540 if (OpInfo.ConstraintType == TargetLowering::C_Address) {
10541 const InlineAsm::ConstraintCode ConstraintID =
10542 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10544 "Failed to convert memory constraint code to constraint id.");
10545
10546 InlineAsm::Flag ResOpType(InlineAsm::Kind::Mem, 1);
10547
10548 SDValue AsmOp = InOperandVal;
10549 if (isFunction(InOperandVal)) {
10550 auto *GA = cast<GlobalAddressSDNode>(InOperandVal);
10551 ResOpType = InlineAsm::Flag(InlineAsm::Kind::Func, 1);
10552 AsmOp = DAG.getTargetGlobalAddress(GA->getGlobal(), getCurSDLoc(),
10553 InOperandVal.getValueType(),
10554 GA->getOffset());
10555 }
10556
10557 // Add information to the INLINEASM node to know about this input.
10558 ResOpType.setMemConstraint(ConstraintID);
10559
10560 AsmNodeOperands.push_back(
10561 DAG.getTargetConstant(ResOpType, getCurSDLoc(), MVT::i32));
10562
10563 AsmNodeOperands.push_back(AsmOp);
10564 break;
10565 }
10566
10567 if (OpInfo.ConstraintType != TargetLowering::C_RegisterClass &&
10568 OpInfo.ConstraintType != TargetLowering::C_Register) {
10569 emitInlineAsmError(Call, "unknown asm constraint '" +
10570 Twine(OpInfo.ConstraintCode) + "'");
10571 return;
10572 }
10573
10574 // TODO: Support this.
10575 if (OpInfo.isIndirect) {
10576 emitInlineAsmError(
10577 Call, "Don't know how to handle indirect register inputs yet "
10578 "for constraint '" +
10579 Twine(OpInfo.ConstraintCode) + "'");
10580 return;
10581 }
10582
10583 // Copy the input into the appropriate registers.
10584 if (OpInfo.AssignedRegs.Regs.empty()) {
10585 emitInlineAsmError(Call,
10586 "couldn't allocate input reg for constraint '" +
10587 Twine(OpInfo.ConstraintCode) + "'");
10588 return;
10589 }
10590
10591 if (DetectWriteToReservedRegister())
10592 return;
10593
10594 SDLoc dl = getCurSDLoc();
10595
10596 OpInfo.AssignedRegs.getCopyToRegs(InOperandVal, DAG, dl, Chain, &Glue,
10597 &Call);
10598
10599 OpInfo.AssignedRegs.AddInlineAsmOperands(InlineAsm::Kind::RegUse, false,
10600 0, dl, DAG, AsmNodeOperands);
10601 break;
10602 }
10604 // Add the clobbered value to the operand list, so that the register
10605 // allocator is aware that the physreg got clobbered.
10606 if (!OpInfo.AssignedRegs.Regs.empty())
10608 false, 0, getCurSDLoc(), DAG,
10609 AsmNodeOperands);
10610 break;
10611 }
10612 }
10613
10614 // Finish up input operands. Set the input chain and add the flag last.
10615 AsmNodeOperands[InlineAsm::Op_InputChain] = Chain;
10616 if (Glue.getNode()) AsmNodeOperands.push_back(Glue);
10617
10618 unsigned ISDOpc = IsCallBr ? ISD::INLINEASM_BR : ISD::INLINEASM;
10619 Chain = DAG.getNode(ISDOpc, getCurSDLoc(),
10620 DAG.getVTList(MVT::Other, MVT::Glue), AsmNodeOperands);
10621 Glue = Chain.getValue(1);
10622
10623 // Do additional work to generate outputs.
10624
10625 SmallVector<EVT, 1> ResultVTs;
10626 SmallVector<SDValue, 1> ResultValues;
10627 SmallVector<SDValue, 8> OutChains;
10628
10629 llvm::Type *CallResultType = Call.getType();
10630 ArrayRef<Type *> ResultTypes;
10631 if (StructType *StructResult = dyn_cast<StructType>(CallResultType))
10632 ResultTypes = StructResult->elements();
10633 else if (!CallResultType->isVoidTy())
10634 ResultTypes = ArrayRef(CallResultType);
10635
10636 auto CurResultType = ResultTypes.begin();
10637 auto handleRegAssign = [&](SDValue V) {
10638 assert(CurResultType != ResultTypes.end() && "Unexpected value");
10639 assert((*CurResultType)->isSized() && "Unexpected unsized type");
10640 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), *CurResultType);
10641 ++CurResultType;
10642 // If the type of the inline asm call site return value is different but has
10643 // same size as the type of the asm output bitcast it. One example of this
10644 // is for vectors with different width / number of elements. This can
10645 // happen for register classes that can contain multiple different value
10646 // types. The preg or vreg allocated may not have the same VT as was
10647 // expected.
10648 //
10649 // This can also happen for a return value that disagrees with the register
10650 // class it is put in, eg. a double in a general-purpose register on a
10651 // 32-bit machine.
10652 if (ResultVT != V.getValueType() &&
10653 ResultVT.getSizeInBits() == V.getValueSizeInBits())
10654 V = DAG.getNode(ISD::BITCAST, getCurSDLoc(), ResultVT, V);
10655 else if (ResultVT != V.getValueType() && ResultVT.isInteger() &&
10656 V.getValueType().isInteger()) {
10657 // If a result value was tied to an input value, the computed result
10658 // may have a wider width than the expected result. Extract the
10659 // relevant portion.
10660 V = DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), ResultVT, V);
10661 }
10662 assert(ResultVT == V.getValueType() && "Asm result value mismatch!");
10663 ResultVTs.push_back(ResultVT);
10664 ResultValues.push_back(V);
10665 };
10666
10667 // Deal with output operands.
10668 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
10669 if (OpInfo.Type == InlineAsm::isOutput) {
10670 SDValue Val;
10671 // Skip trivial output operands.
10672 if (OpInfo.AssignedRegs.Regs.empty())
10673 continue;
10674
10675 switch (OpInfo.ConstraintType) {
10678 Val = OpInfo.AssignedRegs.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(),
10679 Chain, &Glue, &Call);
10680 break;
10683 Val = TLI.LowerAsmOutputForConstraint(Chain, Glue, getCurSDLoc(),
10684 OpInfo, DAG);
10685 break;
10687 break; // Already handled.
10689 break; // Silence warning.
10691 assert(false && "Unexpected unknown constraint");
10692 }
10693
10694 // Indirect output manifest as stores. Record output chains.
10695 if (OpInfo.isIndirect) {
10696 const Value *Ptr = OpInfo.CallOperandVal;
10697 assert(Ptr && "Expected value CallOperandVal for indirect asm operand");
10698 SDValue Store = DAG.getStore(Chain, getCurSDLoc(), Val, getValue(Ptr),
10699 MachinePointerInfo(Ptr));
10700 OutChains.push_back(Store);
10701 } else {
10702 // generate CopyFromRegs to associated registers.
10703 assert(!Call.getType()->isVoidTy() && "Bad inline asm!");
10704 if (Val.getOpcode() == ISD::MERGE_VALUES) {
10705 for (const SDValue &V : Val->op_values())
10706 handleRegAssign(V);
10707 } else
10708 handleRegAssign(Val);
10709 }
10710 }
10711 }
10712
10713 // Set results.
10714 if (!ResultValues.empty()) {
10715 assert(CurResultType == ResultTypes.end() &&
10716 "Mismatch in number of ResultTypes");
10717 assert(ResultValues.size() == ResultTypes.size() &&
10718 "Mismatch in number of output operands in asm result");
10719
10721 DAG.getVTList(ResultVTs), ResultValues);
10722 setValue(&Call, V);
10723 }
10724
10725 // Collect store chains.
10726 if (!OutChains.empty())
10727 Chain = DAG.getNode(ISD::TokenFactor, getCurSDLoc(), MVT::Other, OutChains);
10728
10729 if (EmitEHLabels) {
10730 Chain = lowerEndEH(Chain, cast<InvokeInst>(&Call), EHPadBB, BeginLabel);
10731 }
10732
10733 // Only Update Root if inline assembly has a memory effect.
10734 if (ResultValues.empty() || HasSideEffect || !OutChains.empty() || IsCallBr ||
10735 EmitEHLabels)
10736 DAG.setRoot(Chain);
10737}
10738
10739void SelectionDAGBuilder::emitInlineAsmError(const CallBase &Call,
10740 const Twine &Message) {
10741 LLVMContext &Ctx = *DAG.getContext();
10742 Ctx.diagnose(DiagnosticInfoInlineAsm(Call, Message));
10743
10744 // Make sure we leave the DAG in a valid state
10745 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10746 SmallVector<EVT, 1> ValueVTs;
10747 ComputeValueVTs(TLI, DAG.getDataLayout(), Call.getType(), ValueVTs);
10748
10749 if (ValueVTs.empty())
10750 return;
10751
10753 for (const EVT &VT : ValueVTs)
10754 Ops.push_back(DAG.getUNDEF(VT));
10755
10756 setValue(&Call, DAG.getMergeValues(Ops, getCurSDLoc()));
10757}
10758
10759void SelectionDAGBuilder::visitVAStart(const CallInst &I) {
10760 DAG.setRoot(DAG.getNode(ISD::VASTART, getCurSDLoc(),
10761 MVT::Other, getRoot(),
10762 getValue(I.getArgOperand(0)),
10763 DAG.getSrcValue(I.getArgOperand(0))));
10764}
10765
10766void SelectionDAGBuilder::visitVAArg(const VAArgInst &I) {
10767 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10768 const DataLayout &DL = DAG.getDataLayout();
10769 SDValue V = DAG.getVAArg(
10770 TLI.getMemValueType(DAG.getDataLayout(), I.getType()), getCurSDLoc(),
10771 getRoot(), getValue(I.getOperand(0)), DAG.getSrcValue(I.getOperand(0)),
10772 DL.getABITypeAlign(I.getType()).value());
10773 DAG.setRoot(V.getValue(1));
10774
10775 if (I.getType()->isPointerTy())
10776 V = DAG.getPtrExtOrTrunc(
10777 V, getCurSDLoc(), TLI.getValueType(DAG.getDataLayout(), I.getType()));
10778 setValue(&I, V);
10779}
10780
10781void SelectionDAGBuilder::visitVAEnd(const CallInst &I) {
10782 DAG.setRoot(DAG.getNode(ISD::VAEND, getCurSDLoc(),
10783 MVT::Other, getRoot(),
10784 getValue(I.getArgOperand(0)),
10785 DAG.getSrcValue(I.getArgOperand(0))));
10786}
10787
10788void SelectionDAGBuilder::visitVACopy(const CallInst &I) {
10789 DAG.setRoot(DAG.getNode(ISD::VACOPY, getCurSDLoc(),
10790 MVT::Other, getRoot(),
10791 getValue(I.getArgOperand(0)),
10792 getValue(I.getArgOperand(1)),
10793 DAG.getSrcValue(I.getArgOperand(0)),
10794 DAG.getSrcValue(I.getArgOperand(1))));
10795}
10796
10798 const Instruction &I,
10799 SDValue Op) {
10800 std::optional<ConstantRange> CR = getRange(I);
10801
10802 if (!CR || CR->isFullSet() || CR->isEmptySet() || CR->isUpperWrapped())
10803 return Op;
10804
10805 APInt Lo = CR->getUnsignedMin();
10806 if (!Lo.isMinValue())
10807 return Op;
10808
10809 APInt Hi = CR->getUnsignedMax();
10810 unsigned Bits = std::max(Hi.getActiveBits(),
10811 static_cast<unsigned>(IntegerType::MIN_INT_BITS));
10812
10813 EVT SmallVT = EVT::getIntegerVT(*DAG.getContext(), Bits);
10814
10815 SDLoc SL = getCurSDLoc();
10816
10817 SDValue ZExt = DAG.getNode(ISD::AssertZext, SL, Op.getValueType(), Op,
10818 DAG.getValueType(SmallVT));
10819 unsigned NumVals = Op.getNode()->getNumValues();
10820 if (NumVals == 1)
10821 return ZExt;
10822
10824
10825 Ops.push_back(ZExt);
10826 for (unsigned I = 1; I != NumVals; ++I)
10827 Ops.push_back(Op.getValue(I));
10828
10829 return DAG.getMergeValues(Ops, SL);
10830}
10831
10833 SelectionDAG &DAG, const Instruction &I, SDValue Op) {
10834 FPClassTest Classes = getNoFPClass(I);
10835 if (Classes == fcNone)
10836 return Op;
10837
10838 SDLoc SL = getCurSDLoc();
10839 SDValue TestConst = DAG.getTargetConstant(Classes, SDLoc(), MVT::i32);
10840
10841 if (Op.getOpcode() != ISD::MERGE_VALUES) {
10842 return DAG.getNode(ISD::AssertNoFPClass, SL, Op.getValueType(), Op,
10843 TestConst);
10844 }
10845
10846 SmallVector<SDValue, 8> Ops(Op.getNumOperands());
10847 for (unsigned I = 0, E = Ops.size(); I != E; ++I) {
10848 SDValue MergeOp = Op.getOperand(I);
10849 Ops[I] = DAG.getNode(ISD::AssertNoFPClass, SL, MergeOp.getValueType(),
10850 MergeOp, TestConst);
10851 }
10852
10853 return DAG.getMergeValues(Ops, SL);
10854}
10855
10856/// Populate a CallLowerinInfo (into \p CLI) based on the properties of
10857/// the call being lowered.
10858///
10859/// This is a helper for lowering intrinsics that follow a target calling
10860/// convention or require stack pointer adjustment. Only a subset of the
10861/// intrinsic's operands need to participate in the calling convention.
10864 unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy,
10865 AttributeSet RetAttrs, bool IsPatchPoint) {
10867 Args.reserve(NumArgs);
10868
10869 // Populate the argument list.
10870 // Attributes for args start at offset 1, after the return attribute.
10871 for (unsigned ArgI = ArgIdx, ArgE = ArgIdx + NumArgs;
10872 ArgI != ArgE; ++ArgI) {
10873 const Value *V = Call->getOperand(ArgI);
10874
10875 assert(!V->getType()->isEmptyTy() && "Empty type passed to intrinsic.");
10876
10877 TargetLowering::ArgListEntry Entry(getValue(V), V->getType());
10878 Entry.setAttributes(Call, ArgI);
10879 Args.push_back(Entry);
10880 }
10881
10883 .setChain(getRoot())
10884 .setCallee(Call->getCallingConv(), ReturnTy, Callee, std::move(Args),
10885 RetAttrs)
10886 .setDiscardResult(Call->use_empty())
10887 .setIsPatchPoint(IsPatchPoint)
10889 Call->countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0);
10890}
10891
10892/// Add a stack map intrinsic call's live variable operands to a stackmap
10893/// or patchpoint target node's operand list.
10894///
10895/// Constants are converted to TargetConstants purely as an optimization to
10896/// avoid constant materialization and register allocation.
10897///
10898/// FrameIndex operands are converted to TargetFrameIndex so that ISEL does not
10899/// generate addess computation nodes, and so FinalizeISel can convert the
10900/// TargetFrameIndex into a DirectMemRefOp StackMap location. This avoids
10901/// address materialization and register allocation, but may also be required
10902/// for correctness. If a StackMap (or PatchPoint) intrinsic directly uses an
10903/// alloca in the entry block, then the runtime may assume that the alloca's
10904/// StackMap location can be read immediately after compilation and that the
10905/// location is valid at any point during execution (this is similar to the
10906/// assumption made by the llvm.gcroot intrinsic). If the alloca's location were
10907/// only available in a register, then the runtime would need to trap when
10908/// execution reaches the StackMap in order to read the alloca's location.
10909static void addStackMapLiveVars(const CallBase &Call, unsigned StartIdx,
10911 SelectionDAGBuilder &Builder) {
10912 SelectionDAG &DAG = Builder.DAG;
10913 for (unsigned I = StartIdx; I < Call.arg_size(); I++) {
10914 SDValue Op = Builder.getValue(Call.getArgOperand(I));
10915
10916 // Things on the stack are pointer-typed, meaning that they are already
10917 // legal and can be emitted directly to target nodes.
10919 Ops.push_back(DAG.getTargetFrameIndex(FI->getIndex(), Op.getValueType()));
10920 } else {
10921 // Otherwise emit a target independent node to be legalised.
10922 Ops.push_back(Builder.getValue(Call.getArgOperand(I)));
10923 }
10924 }
10925}
10926
10927/// Lower llvm.experimental.stackmap.
10928void SelectionDAGBuilder::visitStackmap(const CallInst &CI) {
10929 // void @llvm.experimental.stackmap(i64 <id>, i32 <numShadowBytes>,
10930 // [live variables...])
10931
10932 assert(CI.getType()->isVoidTy() && "Stackmap cannot return a value.");
10933
10934 SDValue Chain, InGlue, Callee;
10936
10937 SDLoc DL = getCurSDLoc();
10939
10940 // The stackmap intrinsic only records the live variables (the arguments
10941 // passed to it) and emits NOPS (if requested). Unlike the patchpoint
10942 // intrinsic, this won't be lowered to a function call. This means we don't
10943 // have to worry about calling conventions and target specific lowering code.
10944 // Instead we perform the call lowering right here.
10945 //
10946 // chain, flag = CALLSEQ_START(chain, 0, 0)
10947 // chain, flag = STACKMAP(id, nbytes, ..., chain, flag)
10948 // chain, flag = CALLSEQ_END(chain, 0, 0, flag)
10949 //
10950 Chain = DAG.getCALLSEQ_START(getRoot(), 0, 0, DL);
10951 InGlue = Chain.getValue(1);
10952
10953 // Add the STACKMAP operands, starting with DAG house-keeping.
10954 Ops.push_back(Chain);
10955 Ops.push_back(InGlue);
10956
10957 // Add the <id>, <numShadowBytes> operands.
10958 //
10959 // These do not require legalisation, and can be emitted directly to target
10960 // constant nodes.
10962 assert(ID.getValueType() == MVT::i64);
10963 SDValue IDConst =
10964 DAG.getTargetConstant(ID->getAsZExtVal(), DL, ID.getValueType());
10965 Ops.push_back(IDConst);
10966
10967 SDValue Shad = getValue(CI.getArgOperand(1));
10968 assert(Shad.getValueType() == MVT::i32);
10969 SDValue ShadConst =
10970 DAG.getTargetConstant(Shad->getAsZExtVal(), DL, Shad.getValueType());
10971 Ops.push_back(ShadConst);
10972
10973 // Add the live variables.
10974 addStackMapLiveVars(CI, 2, DL, Ops, *this);
10975
10976 // Create the STACKMAP node.
10977 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
10978 Chain = DAG.getNode(ISD::STACKMAP, DL, NodeTys, Ops);
10979 InGlue = Chain.getValue(1);
10980
10981 Chain = DAG.getCALLSEQ_END(Chain, 0, 0, InGlue, DL);
10982
10983 // Stackmaps don't generate values, so nothing goes into the NodeMap.
10984
10985 // Set the root to the target-lowered call chain.
10986 DAG.setRoot(Chain);
10987
10988 // Inform the Frame Information that we have a stackmap in this function.
10989 FuncInfo.MF->getFrameInfo().setHasStackMap();
10990}
10991
10992/// Lower llvm.experimental.patchpoint directly to its target opcode.
10993void SelectionDAGBuilder::visitPatchpoint(const CallBase &CB,
10994 const BasicBlock *EHPadBB) {
10995 // <ty> @llvm.experimental.patchpoint.<ty>(i64 <id>,
10996 // i32 <numBytes>,
10997 // i8* <target>,
10998 // i32 <numArgs>,
10999 // [Args...],
11000 // [live variables...])
11001
11003 bool IsAnyRegCC = CC == CallingConv::AnyReg;
11004 bool HasDef = !CB.getType()->isVoidTy();
11005 SDLoc dl = getCurSDLoc();
11007
11008 // Handle immediate and symbolic callees.
11009 if (auto* ConstCallee = dyn_cast<ConstantSDNode>(Callee))
11010 Callee = DAG.getIntPtrConstant(ConstCallee->getZExtValue(), dl,
11011 /*isTarget=*/true);
11012 else if (auto* SymbolicCallee = dyn_cast<GlobalAddressSDNode>(Callee))
11013 Callee = DAG.getTargetGlobalAddress(SymbolicCallee->getGlobal(),
11014 SDLoc(SymbolicCallee),
11015 SymbolicCallee->getValueType(0));
11016
11017 // Get the real number of arguments participating in the call <numArgs>
11019 unsigned NumArgs = NArgVal->getAsZExtVal();
11020
11021 // Skip the four meta args: <id>, <numNopBytes>, <target>, <numArgs>
11022 // Intrinsics include all meta-operands up to but not including CC.
11023 unsigned NumMetaOpers = PatchPointOpers::CCPos;
11024 assert(CB.arg_size() >= NumMetaOpers + NumArgs &&
11025 "Not enough arguments provided to the patchpoint intrinsic");
11026
11027 // For AnyRegCC the arguments are lowered later on manually.
11028 unsigned NumCallArgs = IsAnyRegCC ? 0 : NumArgs;
11029 Type *ReturnTy =
11030 IsAnyRegCC ? Type::getVoidTy(*DAG.getContext()) : CB.getType();
11031
11032 TargetLowering::CallLoweringInfo CLI(DAG);
11033 populateCallLoweringInfo(CLI, &CB, NumMetaOpers, NumCallArgs, Callee,
11034 ReturnTy, CB.getAttributes().getRetAttrs(), true);
11035 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
11036
11037 SDNode *CallEnd = Result.second.getNode();
11038 if (CallEnd->getOpcode() == ISD::EH_LABEL)
11039 CallEnd = CallEnd->getOperand(0).getNode();
11040 if (HasDef && (CallEnd->getOpcode() == ISD::CopyFromReg))
11041 CallEnd = CallEnd->getOperand(0).getNode();
11042
11043 /// Get a call instruction from the call sequence chain.
11044 /// Tail calls are not allowed.
11045 assert(CallEnd->getOpcode() == ISD::CALLSEQ_END &&
11046 "Expected a callseq node.");
11047 SDNode *Call = CallEnd->getOperand(0).getNode();
11048 bool HasGlue = Call->getGluedNode();
11049
11050 // Replace the target specific call node with the patchable intrinsic.
11052
11053 // Push the chain.
11054 Ops.push_back(*(Call->op_begin()));
11055
11056 // Optionally, push the glue (if any).
11057 if (HasGlue)
11058 Ops.push_back(*(Call->op_end() - 1));
11059
11060 // Push the register mask info.
11061 if (HasGlue)
11062 Ops.push_back(*(Call->op_end() - 2));
11063 else
11064 Ops.push_back(*(Call->op_end() - 1));
11065
11066 // Add the <id> and <numBytes> constants.
11068 Ops.push_back(DAG.getTargetConstant(IDVal->getAsZExtVal(), dl, MVT::i64));
11070 Ops.push_back(DAG.getTargetConstant(NBytesVal->getAsZExtVal(), dl, MVT::i32));
11071
11072 // Add the callee.
11073 Ops.push_back(Callee);
11074
11075 // Adjust <numArgs> to account for any arguments that have been passed on the
11076 // stack instead.
11077 // Call Node: Chain, Target, {Args}, RegMask, [Glue]
11078 unsigned NumCallRegArgs = Call->getNumOperands() - (HasGlue ? 4 : 3);
11079 NumCallRegArgs = IsAnyRegCC ? NumArgs : NumCallRegArgs;
11080 Ops.push_back(DAG.getTargetConstant(NumCallRegArgs, dl, MVT::i32));
11081
11082 // Add the calling convention
11083 Ops.push_back(DAG.getTargetConstant((unsigned)CC, dl, MVT::i32));
11084
11085 // Add the arguments we omitted previously. The register allocator should
11086 // place these in any free register.
11087 if (IsAnyRegCC)
11088 for (unsigned i = NumMetaOpers, e = NumMetaOpers + NumArgs; i != e; ++i)
11089 Ops.push_back(getValue(CB.getArgOperand(i)));
11090
11091 // Push the arguments from the call instruction.
11092 SDNode::op_iterator e = HasGlue ? Call->op_end()-2 : Call->op_end()-1;
11093 Ops.append(Call->op_begin() + 2, e);
11094
11095 // Push live variables for the stack map.
11096 addStackMapLiveVars(CB, NumMetaOpers + NumArgs, dl, Ops, *this);
11097
11098 SDVTList NodeTys;
11099 if (IsAnyRegCC && HasDef) {
11100 // Create the return types based on the intrinsic definition
11101 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11102 SmallVector<EVT, 3> ValueVTs;
11103 ComputeValueVTs(TLI, DAG.getDataLayout(), CB.getType(), ValueVTs);
11104 assert(ValueVTs.size() == 1 && "Expected only one return value type.");
11105
11106 // There is always a chain and a glue type at the end
11107 ValueVTs.push_back(MVT::Other);
11108 ValueVTs.push_back(MVT::Glue);
11109 NodeTys = DAG.getVTList(ValueVTs);
11110 } else
11111 NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
11112
11113 // Replace the target specific call node with a PATCHPOINT node.
11114 SDValue PPV = DAG.getNode(ISD::PATCHPOINT, dl, NodeTys, Ops);
11115
11116 // Update the NodeMap.
11117 if (HasDef) {
11118 if (IsAnyRegCC)
11119 setValue(&CB, SDValue(PPV.getNode(), 0));
11120 else
11121 setValue(&CB, Result.first);
11122 }
11123
11124 // Fixup the consumers of the intrinsic. The chain and glue may be used in the
11125 // call sequence. Furthermore the location of the chain and glue can change
11126 // when the AnyReg calling convention is used and the intrinsic returns a
11127 // value.
11128 if (IsAnyRegCC && HasDef) {
11129 SDValue From[] = {SDValue(Call, 0), SDValue(Call, 1)};
11130 SDValue To[] = {PPV.getValue(1), PPV.getValue(2)};
11131 DAG.ReplaceAllUsesOfValuesWith(From, To, 2);
11132 } else
11133 DAG.ReplaceAllUsesWith(Call, PPV.getNode());
11134 DAG.DeleteNode(Call);
11135
11136 // Inform the Frame Information that we have a patchpoint in this function.
11137 FuncInfo.MF->getFrameInfo().setHasPatchPoint();
11138}
11139
11140void SelectionDAGBuilder::visitVectorReduce(const CallInst &I,
11141 unsigned Intrinsic) {
11142 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11143 SDValue Op1 = getValue(I.getArgOperand(0));
11144 SDValue Op2;
11145 if (I.arg_size() > 1)
11146 Op2 = getValue(I.getArgOperand(1));
11147 SDLoc dl = getCurSDLoc();
11148 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
11149 SDValue Res;
11150 SDNodeFlags SDFlags;
11151 if (auto *FPMO = dyn_cast<FPMathOperator>(&I))
11152 SDFlags.copyFMF(*FPMO);
11153
11154 switch (Intrinsic) {
11155 case Intrinsic::vector_reduce_fadd:
11156 if (SDFlags.hasAllowReassociation())
11157 Res = DAG.getNode(ISD::FADD, dl, VT, Op1,
11158 DAG.getNode(ISD::VECREDUCE_FADD, dl, VT, Op2, SDFlags),
11159 SDFlags);
11160 else
11161 Res = DAG.getNode(ISD::VECREDUCE_SEQ_FADD, dl, VT, Op1, Op2, SDFlags);
11162 break;
11163 case Intrinsic::vector_reduce_fmul:
11164 if (SDFlags.hasAllowReassociation())
11165 Res = DAG.getNode(ISD::FMUL, dl, VT, Op1,
11166 DAG.getNode(ISD::VECREDUCE_FMUL, dl, VT, Op2, SDFlags),
11167 SDFlags);
11168 else
11169 Res = DAG.getNode(ISD::VECREDUCE_SEQ_FMUL, dl, VT, Op1, Op2, SDFlags);
11170 break;
11171 case Intrinsic::vector_reduce_add:
11172 Res = DAG.getNode(ISD::VECREDUCE_ADD, dl, VT, Op1);
11173 break;
11174 case Intrinsic::vector_reduce_mul:
11175 Res = DAG.getNode(ISD::VECREDUCE_MUL, dl, VT, Op1);
11176 break;
11177 case Intrinsic::vector_reduce_and:
11178 Res = DAG.getNode(ISD::VECREDUCE_AND, dl, VT, Op1);
11179 break;
11180 case Intrinsic::vector_reduce_or:
11181 Res = DAG.getNode(ISD::VECREDUCE_OR, dl, VT, Op1);
11182 break;
11183 case Intrinsic::vector_reduce_xor:
11184 Res = DAG.getNode(ISD::VECREDUCE_XOR, dl, VT, Op1);
11185 break;
11186 case Intrinsic::vector_reduce_smax:
11187 Res = DAG.getNode(ISD::VECREDUCE_SMAX, dl, VT, Op1);
11188 break;
11189 case Intrinsic::vector_reduce_smin:
11190 Res = DAG.getNode(ISD::VECREDUCE_SMIN, dl, VT, Op1);
11191 break;
11192 case Intrinsic::vector_reduce_umax:
11193 Res = DAG.getNode(ISD::VECREDUCE_UMAX, dl, VT, Op1);
11194 break;
11195 case Intrinsic::vector_reduce_umin:
11196 Res = DAG.getNode(ISD::VECREDUCE_UMIN, dl, VT, Op1);
11197 break;
11198 case Intrinsic::vector_reduce_fmax:
11199 Res = DAG.getNode(ISD::VECREDUCE_FMAX, dl, VT, Op1, SDFlags);
11200 break;
11201 case Intrinsic::vector_reduce_fmin:
11202 Res = DAG.getNode(ISD::VECREDUCE_FMIN, dl, VT, Op1, SDFlags);
11203 break;
11204 case Intrinsic::vector_reduce_fmaximum:
11205 Res = DAG.getNode(ISD::VECREDUCE_FMAXIMUM, dl, VT, Op1, SDFlags);
11206 break;
11207 case Intrinsic::vector_reduce_fminimum:
11208 Res = DAG.getNode(ISD::VECREDUCE_FMINIMUM, dl, VT, Op1, SDFlags);
11209 break;
11210 default:
11211 llvm_unreachable("Unhandled vector reduce intrinsic");
11212 }
11213 setValue(&I, Res);
11214}
11215
11216/// Returns an AttributeList representing the attributes applied to the return
11217/// value of the given call.
11220 if (CLI.RetSExt)
11221 Attrs.push_back(Attribute::SExt);
11222 if (CLI.RetZExt)
11223 Attrs.push_back(Attribute::ZExt);
11224 if (CLI.IsInReg)
11225 Attrs.push_back(Attribute::InReg);
11226
11227 return AttributeList::get(CLI.RetTy->getContext(), AttributeList::ReturnIndex,
11228 Attrs);
11229}
11230
11231/// TargetLowering::LowerCallTo - This is the default LowerCallTo
11232/// implementation, which just calls LowerCall.
11233/// FIXME: When all targets are
11234/// migrated to using LowerCall, this hook should be integrated into SDISel.
11235std::pair<SDValue, SDValue>
11237 LLVMContext &Context = CLI.RetTy->getContext();
11238
11239 // Handle the incoming return values from the call.
11240 CLI.Ins.clear();
11241 SmallVector<Type *, 4> RetOrigTys;
11243 auto &DL = CLI.DAG.getDataLayout();
11244 ComputeValueTypes(DL, CLI.OrigRetTy, RetOrigTys, &Offsets);
11245
11246 SmallVector<EVT, 4> RetVTs;
11247 if (CLI.RetTy != CLI.OrigRetTy) {
11248 assert(RetOrigTys.size() == 1 &&
11249 "Only supported for non-aggregate returns");
11250 RetVTs.push_back(getValueType(DL, CLI.RetTy));
11251 } else {
11252 for (Type *Ty : RetOrigTys)
11253 RetVTs.push_back(getValueType(DL, Ty));
11254 }
11255
11256 if (CLI.IsPostTypeLegalization) {
11257 // If we are lowering a libcall after legalization, split the return type.
11258 SmallVector<Type *, 4> OldRetOrigTys;
11259 SmallVector<EVT, 4> OldRetVTs;
11260 SmallVector<TypeSize, 4> OldOffsets;
11261 RetOrigTys.swap(OldRetOrigTys);
11262 RetVTs.swap(OldRetVTs);
11263 Offsets.swap(OldOffsets);
11264
11265 for (size_t i = 0, e = OldRetVTs.size(); i != e; ++i) {
11266 EVT RetVT = OldRetVTs[i];
11267 uint64_t Offset = OldOffsets[i];
11268 MVT RegisterVT = getRegisterType(Context, RetVT);
11269 unsigned NumRegs = getNumRegisters(Context, RetVT);
11270 unsigned RegisterVTByteSZ = RegisterVT.getSizeInBits() / 8;
11271 RetOrigTys.append(NumRegs, OldRetOrigTys[i]);
11272 RetVTs.append(NumRegs, RegisterVT);
11273 for (unsigned j = 0; j != NumRegs; ++j)
11274 Offsets.push_back(TypeSize::getFixed(Offset + j * RegisterVTByteSZ));
11275 }
11276 }
11277
11279 GetReturnInfo(CLI.CallConv, CLI.RetTy, getReturnAttrs(CLI), Outs, *this, DL);
11280
11281 bool CanLowerReturn =
11283 CLI.IsVarArg, Outs, Context, CLI.RetTy);
11284
11285 SDValue DemoteStackSlot;
11286 int DemoteStackIdx = -100;
11287 if (!CanLowerReturn) {
11288 // FIXME: equivalent assert?
11289 // assert(!CS.hasInAllocaArgument() &&
11290 // "sret demotion is incompatible with inalloca");
11291 uint64_t TySize = DL.getTypeAllocSize(CLI.RetTy);
11292 Align Alignment = DL.getPrefTypeAlign(CLI.RetTy);
11294 DemoteStackIdx =
11295 MF.getFrameInfo().CreateStackObject(TySize, Alignment, false);
11296 Type *StackSlotPtrType = PointerType::get(Context, DL.getAllocaAddrSpace());
11297
11298 DemoteStackSlot = CLI.DAG.getFrameIndex(DemoteStackIdx, getFrameIndexTy(DL));
11299 ArgListEntry Entry(DemoteStackSlot, StackSlotPtrType);
11300 Entry.IsSRet = true;
11301 Entry.Alignment = Alignment;
11302 CLI.getArgs().insert(CLI.getArgs().begin(), Entry);
11303 CLI.NumFixedArgs += 1;
11304 CLI.getArgs()[0].IndirectType = CLI.RetTy;
11305 CLI.RetTy = CLI.OrigRetTy = Type::getVoidTy(Context);
11306
11307 // sret demotion isn't compatible with tail-calls, since the sret argument
11308 // points into the callers stack frame.
11309 CLI.IsTailCall = false;
11310 } else {
11311 bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
11312 CLI.RetTy, CLI.CallConv, CLI.IsVarArg, DL);
11313 for (unsigned I = 0, E = RetVTs.size(); I != E; ++I) {
11314 ISD::ArgFlagsTy Flags;
11315 if (NeedsRegBlock) {
11316 Flags.setInConsecutiveRegs();
11317 if (I == RetVTs.size() - 1)
11318 Flags.setInConsecutiveRegsLast();
11319 }
11320 EVT VT = RetVTs[I];
11321 MVT RegisterVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11322 unsigned NumRegs =
11323 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11324 for (unsigned i = 0; i != NumRegs; ++i) {
11325 ISD::InputArg Ret(Flags, RegisterVT, VT, RetOrigTys[I],
11327 if (CLI.RetTy->isPointerTy()) {
11328 Ret.Flags.setPointer();
11330 cast<PointerType>(CLI.RetTy)->getAddressSpace());
11331 }
11332 if (CLI.RetSExt)
11333 Ret.Flags.setSExt();
11334 if (CLI.RetZExt)
11335 Ret.Flags.setZExt();
11336 if (CLI.IsInReg)
11337 Ret.Flags.setInReg();
11338 CLI.Ins.push_back(Ret);
11339 }
11340 }
11341 }
11342
11343 // We push in swifterror return as the last element of CLI.Ins.
11344 ArgListTy &Args = CLI.getArgs();
11345 if (supportSwiftError()) {
11346 for (const ArgListEntry &Arg : Args) {
11347 if (Arg.IsSwiftError) {
11348 ISD::ArgFlagsTy Flags;
11349 Flags.setSwiftError();
11351 PointerType::getUnqual(Context),
11352 /*Used=*/true, ISD::InputArg::NoArgIndex, 0);
11353 CLI.Ins.push_back(Ret);
11354 }
11355 }
11356 }
11357
11358 // Handle all of the outgoing arguments.
11359 CLI.Outs.clear();
11360 CLI.OutVals.clear();
11361 for (unsigned i = 0, e = Args.size(); i != e; ++i) {
11362 SmallVector<Type *, 4> OrigArgTys;
11363 ComputeValueTypes(DL, Args[i].OrigTy, OrigArgTys);
11364 // FIXME: Split arguments if CLI.IsPostTypeLegalization
11365 Type *FinalType = Args[i].Ty;
11366 if (Args[i].IsByVal)
11367 FinalType = Args[i].IndirectType;
11368 bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
11369 FinalType, CLI.CallConv, CLI.IsVarArg, DL);
11370 for (unsigned Value = 0, NumValues = OrigArgTys.size(); Value != NumValues;
11371 ++Value) {
11372 Type *OrigArgTy = OrigArgTys[Value];
11373 Type *ArgTy = OrigArgTy;
11374 if (Args[i].Ty != Args[i].OrigTy) {
11375 assert(Value == 0 && "Only supported for non-aggregate arguments");
11376 ArgTy = Args[i].Ty;
11377 }
11378
11379 EVT VT = getValueType(DL, ArgTy);
11380 SDValue Op = SDValue(Args[i].Node.getNode(),
11381 Args[i].Node.getResNo() + Value);
11382 ISD::ArgFlagsTy Flags;
11383
11384 // Certain targets (such as MIPS), may have a different ABI alignment
11385 // for a type depending on the context. Give the target a chance to
11386 // specify the alignment it wants.
11387 const Align OriginalAlignment(getABIAlignmentForCallingConv(ArgTy, DL));
11388 Flags.setOrigAlign(OriginalAlignment);
11389
11390 if (i >= CLI.NumFixedArgs)
11391 Flags.setVarArg();
11392 if (ArgTy->isPointerTy()) {
11393 Flags.setPointer();
11394 Flags.setPointerAddrSpace(cast<PointerType>(ArgTy)->getAddressSpace());
11395 }
11396 if (Args[i].IsZExt)
11397 Flags.setZExt();
11398 if (Args[i].IsSExt)
11399 Flags.setSExt();
11400 if (Args[i].IsNoExt)
11401 Flags.setNoExt();
11402 if (Args[i].IsInReg) {
11403 // If we are using vectorcall calling convention, a structure that is
11404 // passed InReg - is surely an HVA
11406 isa<StructType>(FinalType)) {
11407 // The first value of a structure is marked
11408 if (0 == Value)
11409 Flags.setHvaStart();
11410 Flags.setHva();
11411 }
11412 // Set InReg Flag
11413 Flags.setInReg();
11414 }
11415 if (Args[i].IsSRet)
11416 Flags.setSRet();
11417 if (Args[i].IsSwiftSelf)
11418 Flags.setSwiftSelf();
11419 if (Args[i].IsSwiftAsync)
11420 Flags.setSwiftAsync();
11421 if (Args[i].IsSwiftError)
11422 Flags.setSwiftError();
11423 if (Args[i].IsCFGuardTarget)
11424 Flags.setCFGuardTarget();
11425 if (Args[i].IsByVal)
11426 Flags.setByVal();
11427 if (Args[i].IsByRef)
11428 Flags.setByRef();
11429 if (Args[i].IsPreallocated) {
11430 Flags.setPreallocated();
11431 // Set the byval flag for CCAssignFn callbacks that don't know about
11432 // preallocated. This way we can know how many bytes we should've
11433 // allocated and how many bytes a callee cleanup function will pop. If
11434 // we port preallocated to more targets, we'll have to add custom
11435 // preallocated handling in the various CC lowering callbacks.
11436 Flags.setByVal();
11437 }
11438 if (Args[i].IsInAlloca) {
11439 Flags.setInAlloca();
11440 // Set the byval flag for CCAssignFn callbacks that don't know about
11441 // inalloca. This way we can know how many bytes we should've allocated
11442 // and how many bytes a callee cleanup function will pop. If we port
11443 // inalloca to more targets, we'll have to add custom inalloca handling
11444 // in the various CC lowering callbacks.
11445 Flags.setByVal();
11446 }
11447 Align MemAlign;
11448 if (Args[i].IsByVal || Args[i].IsInAlloca || Args[i].IsPreallocated) {
11449 unsigned FrameSize = DL.getTypeAllocSize(Args[i].IndirectType);
11450 Flags.setByValSize(FrameSize);
11451
11452 // info is not there but there are cases it cannot get right.
11453 if (auto MA = Args[i].Alignment)
11454 MemAlign = *MA;
11455 else
11456 MemAlign = getByValTypeAlignment(Args[i].IndirectType, DL);
11457 } else if (auto MA = Args[i].Alignment) {
11458 MemAlign = *MA;
11459 } else {
11460 MemAlign = OriginalAlignment;
11461 }
11462 Flags.setMemAlign(MemAlign);
11463 if (Args[i].IsNest)
11464 Flags.setNest();
11465 if (NeedsRegBlock)
11466 Flags.setInConsecutiveRegs();
11467
11468 MVT PartVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11469 unsigned NumParts =
11470 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11471 SmallVector<SDValue, 4> Parts(NumParts);
11472 ISD::NodeType ExtendKind = ISD::ANY_EXTEND;
11473
11474 if (Args[i].IsSExt)
11475 ExtendKind = ISD::SIGN_EXTEND;
11476 else if (Args[i].IsZExt)
11477 ExtendKind = ISD::ZERO_EXTEND;
11478
11479 // Conservatively only handle 'returned' on non-vectors that can be lowered,
11480 // for now.
11481 if (Args[i].IsReturned && !Op.getValueType().isVector() &&
11483 assert((CLI.RetTy == Args[i].Ty ||
11484 (CLI.RetTy->isPointerTy() && Args[i].Ty->isPointerTy() &&
11486 Args[i].Ty->getPointerAddressSpace())) &&
11487 RetVTs.size() == NumValues && "unexpected use of 'returned'");
11488 // Before passing 'returned' to the target lowering code, ensure that
11489 // either the register MVT and the actual EVT are the same size or that
11490 // the return value and argument are extended in the same way; in these
11491 // cases it's safe to pass the argument register value unchanged as the
11492 // return register value (although it's at the target's option whether
11493 // to do so)
11494 // TODO: allow code generation to take advantage of partially preserved
11495 // registers rather than clobbering the entire register when the
11496 // parameter extension method is not compatible with the return
11497 // extension method
11498 if ((NumParts * PartVT.getSizeInBits() == VT.getSizeInBits()) ||
11499 (ExtendKind != ISD::ANY_EXTEND && CLI.RetSExt == Args[i].IsSExt &&
11500 CLI.RetZExt == Args[i].IsZExt))
11501 Flags.setReturned();
11502 }
11503
11504 getCopyToParts(CLI.DAG, CLI.DL, Op, &Parts[0], NumParts, PartVT, CLI.CB,
11505 CLI.CallConv, ExtendKind);
11506
11507 for (unsigned j = 0; j != NumParts; ++j) {
11508 // if it isn't first piece, alignment must be 1
11509 // For scalable vectors the scalable part is currently handled
11510 // by individual targets, so we just use the known minimum size here.
11511 ISD::OutputArg MyFlags(
11512 Flags, Parts[j].getValueType().getSimpleVT(), VT, OrigArgTy, i,
11513 j * Parts[j].getValueType().getStoreSize().getKnownMinValue());
11514 if (NumParts > 1 && j == 0)
11515 MyFlags.Flags.setSplit();
11516 else if (j != 0) {
11517 MyFlags.Flags.setOrigAlign(Align(1));
11518 if (j == NumParts - 1)
11519 MyFlags.Flags.setSplitEnd();
11520 }
11521
11522 CLI.Outs.push_back(MyFlags);
11523 CLI.OutVals.push_back(Parts[j]);
11524 }
11525
11526 if (NeedsRegBlock && Value == NumValues - 1)
11527 CLI.Outs[CLI.Outs.size() - 1].Flags.setInConsecutiveRegsLast();
11528 }
11529 }
11530
11532 CLI.Chain = LowerCall(CLI, InVals);
11533
11534 // Update CLI.InVals to use outside of this function.
11535 CLI.InVals = InVals;
11536
11537 // Verify that the target's LowerCall behaved as expected.
11538 assert(CLI.Chain.getNode() && CLI.Chain.getValueType() == MVT::Other &&
11539 "LowerCall didn't return a valid chain!");
11540 assert((!CLI.IsTailCall || InVals.empty()) &&
11541 "LowerCall emitted a return value for a tail call!");
11542 assert((CLI.IsTailCall || InVals.size() == CLI.Ins.size()) &&
11543 "LowerCall didn't emit the correct number of values!");
11544
11545 // For a tail call, the return value is merely live-out and there aren't
11546 // any nodes in the DAG representing it. Return a special value to
11547 // indicate that a tail call has been emitted and no more Instructions
11548 // should be processed in the current block.
11549 if (CLI.IsTailCall) {
11550 CLI.DAG.setRoot(CLI.Chain);
11551 return std::make_pair(SDValue(), SDValue());
11552 }
11553
11554#ifndef NDEBUG
11555 for (unsigned i = 0, e = CLI.Ins.size(); i != e; ++i) {
11556 assert(InVals[i].getNode() && "LowerCall emitted a null value!");
11557 assert(EVT(CLI.Ins[i].VT) == InVals[i].getValueType() &&
11558 "LowerCall emitted a value with the wrong type!");
11559 }
11560#endif
11561
11562 SmallVector<SDValue, 4> ReturnValues;
11563 if (!CanLowerReturn) {
11564 // The instruction result is the result of loading from the
11565 // hidden sret parameter.
11566 MVT PtrVT = getPointerTy(DL, DL.getAllocaAddrSpace());
11567
11568 unsigned NumValues = RetVTs.size();
11569 ReturnValues.resize(NumValues);
11570 SmallVector<SDValue, 4> Chains(NumValues);
11571
11572 // An aggregate return value cannot wrap around the address space, so
11573 // offsets to its parts don't wrap either.
11575 Align HiddenSRetAlign = MF.getFrameInfo().getObjectAlign(DemoteStackIdx);
11576 for (unsigned i = 0; i < NumValues; ++i) {
11578 DemoteStackSlot, CLI.DAG.getConstant(Offsets[i], CLI.DL, PtrVT),
11580 SDValue L = CLI.DAG.getLoad(
11581 RetVTs[i], CLI.DL, CLI.Chain, Add,
11583 DemoteStackIdx, Offsets[i]),
11584 HiddenSRetAlign);
11585 ReturnValues[i] = L;
11586 Chains[i] = L.getValue(1);
11587 }
11588
11589 CLI.Chain = CLI.DAG.getNode(ISD::TokenFactor, CLI.DL, MVT::Other, Chains);
11590 } else {
11591 // Collect the legal value parts into potentially illegal values
11592 // that correspond to the original function's return values.
11593 std::optional<ISD::NodeType> AssertOp;
11594 if (CLI.RetSExt)
11595 AssertOp = ISD::AssertSext;
11596 else if (CLI.RetZExt)
11597 AssertOp = ISD::AssertZext;
11598 unsigned CurReg = 0;
11599 for (EVT VT : RetVTs) {
11600 MVT RegisterVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11601 unsigned NumRegs =
11602 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11603
11604 ReturnValues.push_back(getCopyFromParts(
11605 CLI.DAG, CLI.DL, &InVals[CurReg], NumRegs, RegisterVT, VT, nullptr,
11606 CLI.Chain, CLI.CallConv, AssertOp));
11607 CurReg += NumRegs;
11608 }
11609
11610 // For a function returning void, there is no return value. We can't create
11611 // such a node, so we just return a null return value in that case. In
11612 // that case, nothing will actually look at the value.
11613 if (ReturnValues.empty())
11614 return std::make_pair(SDValue(), CLI.Chain);
11615 }
11616
11617 SDValue Res = CLI.DAG.getNode(ISD::MERGE_VALUES, CLI.DL,
11618 CLI.DAG.getVTList(RetVTs), ReturnValues);
11619 return std::make_pair(Res, CLI.Chain);
11620}
11621
11622/// Places new result values for the node in Results (their number
11623/// and types must exactly match those of the original return values of
11624/// the node), or leaves Results empty, which indicates that the node is not
11625/// to be custom lowered after all.
11628 SelectionDAG &DAG) const {
11629 SDValue Res = LowerOperation(SDValue(N, 0), DAG);
11630
11631 if (!Res.getNode())
11632 return;
11633
11634 // If the original node has one result, take the return value from
11635 // LowerOperation as is. It might not be result number 0.
11636 if (N->getNumValues() == 1) {
11637 Results.push_back(Res);
11638 return;
11639 }
11640
11641 // If the original node has multiple results, then the return node should
11642 // have the same number of results.
11643 assert((N->getNumValues() == Res->getNumValues()) &&
11644 "Lowering returned the wrong number of results!");
11645
11646 // Places new result values base on N result number.
11647 for (unsigned I = 0, E = N->getNumValues(); I != E; ++I)
11648 Results.push_back(Res.getValue(I));
11649}
11650
11652 llvm_unreachable("LowerOperation not implemented for this target!");
11653}
11654
11656 Register Reg,
11657 ISD::NodeType ExtendType) {
11659 assert((Op.getOpcode() != ISD::CopyFromReg ||
11660 cast<RegisterSDNode>(Op.getOperand(1))->getReg() != Reg) &&
11661 "Copy from a reg to the same reg!");
11662 assert(!Reg.isPhysical() && "Is a physreg");
11663
11664 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11665 // If this is an InlineAsm we have to match the registers required, not the
11666 // notional registers required by the type.
11667
11668 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), Reg, V->getType(),
11669 std::nullopt); // This is not an ABI copy.
11670 SDValue Chain = DAG.getEntryNode();
11671
11672 if (ExtendType == ISD::ANY_EXTEND) {
11673 auto PreferredExtendIt = FuncInfo.PreferredExtendType.find(V);
11674 if (PreferredExtendIt != FuncInfo.PreferredExtendType.end())
11675 ExtendType = PreferredExtendIt->second;
11676 }
11677 RFV.getCopyToRegs(Op, DAG, getCurSDLoc(), Chain, nullptr, V, ExtendType);
11678 PendingExports.push_back(Chain);
11679}
11680
11682
11683/// isOnlyUsedInEntryBlock - If the specified argument is only used in the
11684/// entry block, return true. This includes arguments used by switches, since
11685/// the switch may expand into multiple basic blocks.
11686static bool isOnlyUsedInEntryBlock(const Argument *A, bool FastISel) {
11687 // With FastISel active, we may be splitting blocks, so force creation
11688 // of virtual registers for all non-dead arguments.
11689 if (FastISel)
11690 return A->use_empty();
11691
11692 const BasicBlock &Entry = A->getParent()->front();
11693 for (const User *U : A->users())
11694 if (cast<Instruction>(U)->getParent() != &Entry || isa<SwitchInst>(U))
11695 return false; // Use not in entry block.
11696
11697 return true;
11698}
11699
11701 DenseMap<const Argument *,
11702 std::pair<const AllocaInst *, const StoreInst *>>;
11703
11704/// Scan the entry block of the function in FuncInfo for arguments that look
11705/// like copies into a local alloca. Record any copied arguments in
11706/// ArgCopyElisionCandidates.
11707static void
11709 FunctionLoweringInfo *FuncInfo,
11710 ArgCopyElisionMapTy &ArgCopyElisionCandidates) {
11711 // Record the state of every static alloca used in the entry block. Argument
11712 // allocas are all used in the entry block, so we need approximately as many
11713 // entries as we have arguments.
11714 enum StaticAllocaInfo { Unknown, Clobbered, Elidable };
11716 unsigned NumArgs = FuncInfo->Fn->arg_size();
11717 StaticAllocas.reserve(NumArgs * 2);
11718
11719 auto GetInfoIfStaticAlloca = [&](const Value *V) -> StaticAllocaInfo * {
11720 if (!V)
11721 return nullptr;
11722 V = V->stripPointerCasts();
11723 const auto *AI = dyn_cast<AllocaInst>(V);
11724 if (!AI || !AI->isStaticAlloca() || !FuncInfo->StaticAllocaMap.count(AI))
11725 return nullptr;
11726 auto Iter = StaticAllocas.insert({AI, Unknown});
11727 return &Iter.first->second;
11728 };
11729
11730 // Look for stores of arguments to static allocas. Look through bitcasts and
11731 // GEPs to handle type coercions, as long as the alloca is fully initialized
11732 // by the store. Any non-store use of an alloca escapes it and any subsequent
11733 // unanalyzed store might write it.
11734 // FIXME: Handle structs initialized with multiple stores.
11735 for (const Instruction &I : FuncInfo->Fn->getEntryBlock()) {
11736 // Look for stores, and handle non-store uses conservatively.
11737 const auto *SI = dyn_cast<StoreInst>(&I);
11738 if (!SI) {
11739 // We will look through cast uses, so ignore them completely.
11740 if (I.isCast())
11741 continue;
11742 // Ignore debug info and pseudo op intrinsics, they don't escape or store
11743 // to allocas.
11744 if (I.isDebugOrPseudoInst())
11745 continue;
11746 // This is an unknown instruction. Assume it escapes or writes to all
11747 // static alloca operands.
11748 for (const Use &U : I.operands()) {
11749 if (StaticAllocaInfo *Info = GetInfoIfStaticAlloca(U))
11750 *Info = StaticAllocaInfo::Clobbered;
11751 }
11752 continue;
11753 }
11754
11755 // If the stored value is a static alloca, mark it as escaped.
11756 if (StaticAllocaInfo *Info = GetInfoIfStaticAlloca(SI->getValueOperand()))
11757 *Info = StaticAllocaInfo::Clobbered;
11758
11759 // Check if the destination is a static alloca.
11760 const Value *Dst = SI->getPointerOperand()->stripPointerCasts();
11761 StaticAllocaInfo *Info = GetInfoIfStaticAlloca(Dst);
11762 if (!Info)
11763 continue;
11764 const AllocaInst *AI = cast<AllocaInst>(Dst);
11765
11766 // Skip allocas that have been initialized or clobbered.
11767 if (*Info != StaticAllocaInfo::Unknown)
11768 continue;
11769
11770 // Check if the stored value is an argument, and that this store fully
11771 // initializes the alloca.
11772 // If the argument type has padding bits we can't directly forward a pointer
11773 // as the upper bits may contain garbage.
11774 // Don't elide copies from the same argument twice.
11775 const Value *Val = SI->getValueOperand()->stripPointerCasts();
11776 const auto *Arg = dyn_cast<Argument>(Val);
11777 std::optional<TypeSize> AllocaSize = AI->getAllocationSize(DL);
11778 if (!Arg || Arg->hasPassPointeeByValueCopyAttr() ||
11779 Arg->getType()->isEmptyTy() || !AllocaSize ||
11780 DL.getTypeStoreSize(Arg->getType()) != *AllocaSize ||
11781 !DL.typeSizeEqualsStoreSize(Arg->getType()) ||
11782 ArgCopyElisionCandidates.count(Arg)) {
11783 *Info = StaticAllocaInfo::Clobbered;
11784 continue;
11785 }
11786
11787 LLVM_DEBUG(dbgs() << "Found argument copy elision candidate: " << *AI
11788 << '\n');
11789
11790 // Mark this alloca and store for argument copy elision.
11791 *Info = StaticAllocaInfo::Elidable;
11792 ArgCopyElisionCandidates.insert({Arg, {AI, SI}});
11793
11794 // Stop scanning if we've seen all arguments. This will happen early in -O0
11795 // builds, which is useful, because -O0 builds have large entry blocks and
11796 // many allocas.
11797 if (ArgCopyElisionCandidates.size() == NumArgs)
11798 break;
11799 }
11800}
11801
11802/// Try to elide argument copies from memory into a local alloca. Succeeds if
11803/// ArgVal is a load from a suitable fixed stack object.
11806 DenseMap<int, int> &ArgCopyElisionFrameIndexMap,
11807 SmallPtrSetImpl<const Instruction *> &ElidedArgCopyInstrs,
11808 ArgCopyElisionMapTy &ArgCopyElisionCandidates, const Argument &Arg,
11809 ArrayRef<SDValue> ArgVals, bool &ArgHasUses) {
11810 // Check if this is a load from a fixed stack object.
11811 auto *LNode = dyn_cast<LoadSDNode>(ArgVals[0]);
11812 if (!LNode)
11813 return;
11814 auto *FINode = dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode());
11815 if (!FINode)
11816 return;
11817
11818 // Check that the fixed stack object is the right size and alignment.
11819 // Look at the alignment that the user wrote on the alloca instead of looking
11820 // at the stack object.
11821 auto ArgCopyIter = ArgCopyElisionCandidates.find(&Arg);
11822 assert(ArgCopyIter != ArgCopyElisionCandidates.end());
11823 const AllocaInst *AI = ArgCopyIter->second.first;
11824 int FixedIndex = FINode->getIndex();
11825 int &AllocaIndex = FuncInfo.StaticAllocaMap[AI];
11826 int OldIndex = AllocaIndex;
11827 MachineFrameInfo &MFI = FuncInfo.MF->getFrameInfo();
11828 if (MFI.getObjectSize(FixedIndex) != MFI.getObjectSize(OldIndex)) {
11829 LLVM_DEBUG(
11830 dbgs() << " argument copy elision failed due to bad fixed stack "
11831 "object size\n");
11832 return;
11833 }
11834 Align RequiredAlignment = AI->getAlign();
11835 if (MFI.getObjectAlign(FixedIndex) < RequiredAlignment) {
11836 LLVM_DEBUG(dbgs() << " argument copy elision failed: alignment of alloca "
11837 "greater than stack argument alignment ("
11838 << DebugStr(RequiredAlignment) << " vs "
11839 << DebugStr(MFI.getObjectAlign(FixedIndex)) << ")\n");
11840 return;
11841 }
11842
11843 // Perform the elision. Delete the old stack object and replace its only use
11844 // in the variable info map. Mark the stack object as mutable and aliased.
11845 LLVM_DEBUG({
11846 dbgs() << "Eliding argument copy from " << Arg << " to " << *AI << '\n'
11847 << " Replacing frame index " << OldIndex << " with " << FixedIndex
11848 << '\n';
11849 });
11850 MFI.RemoveStackObject(OldIndex);
11851 MFI.setIsImmutableObjectIndex(FixedIndex, false);
11852 MFI.setIsAliasedObjectIndex(FixedIndex, true);
11853 AllocaIndex = FixedIndex;
11854 ArgCopyElisionFrameIndexMap.insert({OldIndex, FixedIndex});
11855 for (SDValue ArgVal : ArgVals)
11856 Chains.push_back(ArgVal.getValue(1));
11857
11858 // Avoid emitting code for the store implementing the copy.
11859 const StoreInst *SI = ArgCopyIter->second.second;
11860 ElidedArgCopyInstrs.insert(SI);
11861
11862 // Check for uses of the argument again so that we can avoid exporting ArgVal
11863 // if it is't used by anything other than the store.
11864 for (const Value *U : Arg.users()) {
11865 if (U != SI) {
11866 ArgHasUses = true;
11867 break;
11868 }
11869 }
11870}
11871
11872void SelectionDAGISel::LowerArguments(const Function &F) {
11873 SelectionDAG &DAG = SDB->DAG;
11874 SDLoc dl = SDB->getCurSDLoc();
11875 const DataLayout &DL = DAG.getDataLayout();
11877
11878 // In Naked functions we aren't going to save any registers.
11879 if (F.hasFnAttribute(Attribute::Naked))
11880 return;
11881
11882 if (!FuncInfo->CanLowerReturn) {
11883 // Put in an sret pointer parameter before all the other parameters.
11884 MVT ValueVT = TLI->getPointerTy(DL, DL.getAllocaAddrSpace());
11885
11886 ISD::ArgFlagsTy Flags;
11887 Flags.setSRet();
11888 MVT RegisterVT = TLI->getRegisterType(*DAG.getContext(), ValueVT);
11889 ISD::InputArg RetArg(Flags, RegisterVT, ValueVT, F.getReturnType(), true,
11891 Ins.push_back(RetArg);
11892 }
11893
11894 // Look for stores of arguments to static allocas. Mark such arguments with a
11895 // flag to ask the target to give us the memory location of that argument if
11896 // available.
11897 ArgCopyElisionMapTy ArgCopyElisionCandidates;
11899 ArgCopyElisionCandidates);
11900
11901 // Set up the incoming argument description vector.
11902 for (const Argument &Arg : F.args()) {
11903 unsigned ArgNo = Arg.getArgNo();
11905 ComputeValueTypes(DAG.getDataLayout(), Arg.getType(), Types);
11906 bool isArgValueUsed = !Arg.use_empty();
11907 Type *FinalType = Arg.getType();
11908 if (Arg.hasAttribute(Attribute::ByVal))
11909 FinalType = Arg.getParamByValType();
11910 bool NeedsRegBlock = TLI->functionArgumentNeedsConsecutiveRegisters(
11911 FinalType, F.getCallingConv(), F.isVarArg(), DL);
11912 for (unsigned Value = 0, NumValues = Types.size(); Value != NumValues;
11913 ++Value) {
11914 Type *ArgTy = Types[Value];
11915 EVT VT = TLI->getValueType(DL, ArgTy);
11916 ISD::ArgFlagsTy Flags;
11917
11918 if (ArgTy->isPointerTy()) {
11919 Flags.setPointer();
11920 Flags.setPointerAddrSpace(cast<PointerType>(ArgTy)->getAddressSpace());
11921 }
11922 if (Arg.hasAttribute(Attribute::ZExt))
11923 Flags.setZExt();
11924 if (Arg.hasAttribute(Attribute::SExt))
11925 Flags.setSExt();
11926 if (Arg.hasAttribute(Attribute::InReg)) {
11927 // If we are using vectorcall calling convention, a structure that is
11928 // passed InReg - is surely an HVA
11929 if (F.getCallingConv() == CallingConv::X86_VectorCall &&
11930 isa<StructType>(Arg.getType())) {
11931 // The first value of a structure is marked
11932 if (0 == Value)
11933 Flags.setHvaStart();
11934 Flags.setHva();
11935 }
11936 // Set InReg Flag
11937 Flags.setInReg();
11938 }
11939 if (Arg.hasAttribute(Attribute::StructRet))
11940 Flags.setSRet();
11941 if (Arg.hasAttribute(Attribute::SwiftSelf))
11942 Flags.setSwiftSelf();
11943 if (Arg.hasAttribute(Attribute::SwiftAsync))
11944 Flags.setSwiftAsync();
11945 if (Arg.hasAttribute(Attribute::SwiftError))
11946 Flags.setSwiftError();
11947 if (Arg.hasAttribute(Attribute::ByVal))
11948 Flags.setByVal();
11949 if (Arg.hasAttribute(Attribute::ByRef))
11950 Flags.setByRef();
11951 if (Arg.hasAttribute(Attribute::InAlloca)) {
11952 Flags.setInAlloca();
11953 // Set the byval flag for CCAssignFn callbacks that don't know about
11954 // inalloca. This way we can know how many bytes we should've allocated
11955 // and how many bytes a callee cleanup function will pop. If we port
11956 // inalloca to more targets, we'll have to add custom inalloca handling
11957 // in the various CC lowering callbacks.
11958 Flags.setByVal();
11959 }
11960 if (Arg.hasAttribute(Attribute::Preallocated)) {
11961 Flags.setPreallocated();
11962 // Set the byval flag for CCAssignFn callbacks that don't know about
11963 // preallocated. This way we can know how many bytes we should've
11964 // allocated and how many bytes a callee cleanup function will pop. If
11965 // we port preallocated to more targets, we'll have to add custom
11966 // preallocated handling in the various CC lowering callbacks.
11967 Flags.setByVal();
11968 }
11969
11970 // Certain targets (such as MIPS), may have a different ABI alignment
11971 // for a type depending on the context. Give the target a chance to
11972 // specify the alignment it wants.
11973 const Align OriginalAlignment(
11974 TLI->getABIAlignmentForCallingConv(ArgTy, DL));
11975 Flags.setOrigAlign(OriginalAlignment);
11976
11977 Align MemAlign;
11978 Type *ArgMemTy = nullptr;
11979 if (Flags.isByVal() || Flags.isInAlloca() || Flags.isPreallocated() ||
11980 Flags.isByRef()) {
11981 if (!ArgMemTy)
11982 ArgMemTy = Arg.getPointeeInMemoryValueType();
11983
11984 uint64_t MemSize = DL.getTypeAllocSize(ArgMemTy);
11985
11986 // For in-memory arguments, size and alignment should be passed from FE.
11987 // BE will guess if this info is not there but there are cases it cannot
11988 // get right.
11989 if (auto ParamAlign = Arg.getParamStackAlign())
11990 MemAlign = *ParamAlign;
11991 else if ((ParamAlign = Arg.getParamAlign()))
11992 MemAlign = *ParamAlign;
11993 else
11994 MemAlign = TLI->getByValTypeAlignment(ArgMemTy, DL);
11995 if (Flags.isByRef())
11996 Flags.setByRefSize(MemSize);
11997 else
11998 Flags.setByValSize(MemSize);
11999 } else if (auto ParamAlign = Arg.getParamStackAlign()) {
12000 MemAlign = *ParamAlign;
12001 } else {
12002 MemAlign = OriginalAlignment;
12003 }
12004 Flags.setMemAlign(MemAlign);
12005
12006 if (Arg.hasAttribute(Attribute::Nest))
12007 Flags.setNest();
12008 if (NeedsRegBlock)
12009 Flags.setInConsecutiveRegs();
12010 if (ArgCopyElisionCandidates.count(&Arg))
12011 Flags.setCopyElisionCandidate();
12012 if (Arg.hasAttribute(Attribute::Returned))
12013 Flags.setReturned();
12014
12015 MVT RegisterVT = TLI->getRegisterTypeForCallingConv(
12016 *CurDAG->getContext(), F.getCallingConv(), VT);
12017 unsigned NumRegs = TLI->getNumRegistersForCallingConv(
12018 *CurDAG->getContext(), F.getCallingConv(), VT);
12019 for (unsigned i = 0; i != NumRegs; ++i) {
12020 // For scalable vectors, use the minimum size; individual targets
12021 // are responsible for handling scalable vector arguments and
12022 // return values.
12023 ISD::InputArg MyFlags(
12024 Flags, RegisterVT, VT, ArgTy, isArgValueUsed, ArgNo,
12025 i * RegisterVT.getStoreSize().getKnownMinValue());
12026 if (NumRegs > 1 && i == 0)
12027 MyFlags.Flags.setSplit();
12028 // if it isn't first piece, alignment must be 1
12029 else if (i > 0) {
12030 MyFlags.Flags.setOrigAlign(Align(1));
12031 if (i == NumRegs - 1)
12032 MyFlags.Flags.setSplitEnd();
12033 }
12034 Ins.push_back(MyFlags);
12035 }
12036 if (NeedsRegBlock && Value == NumValues - 1)
12037 Ins[Ins.size() - 1].Flags.setInConsecutiveRegsLast();
12038 }
12039 }
12040
12041 // Call the target to set up the argument values.
12043 SDValue NewRoot = TLI->LowerFormalArguments(
12044 DAG.getRoot(), F.getCallingConv(), F.isVarArg(), Ins, dl, DAG, InVals);
12045
12046 // Verify that the target's LowerFormalArguments behaved as expected.
12047 assert(NewRoot.getNode() && NewRoot.getValueType() == MVT::Other &&
12048 "LowerFormalArguments didn't return a valid chain!");
12049 assert(InVals.size() == Ins.size() &&
12050 "LowerFormalArguments didn't emit the correct number of values!");
12051 LLVM_DEBUG({
12052 for (unsigned i = 0, e = Ins.size(); i != e; ++i) {
12053 assert(InVals[i].getNode() &&
12054 "LowerFormalArguments emitted a null value!");
12055 assert(EVT(Ins[i].VT) == InVals[i].getValueType() &&
12056 "LowerFormalArguments emitted a value with the wrong type!");
12057 }
12058 });
12059
12060 // Update the DAG with the new chain value resulting from argument lowering.
12061 DAG.setRoot(NewRoot);
12062
12063 // Set up the argument values.
12064 unsigned i = 0;
12065 if (!FuncInfo->CanLowerReturn) {
12066 // Create a virtual register for the sret pointer, and put in a copy
12067 // from the sret argument into it.
12068 MVT VT = TLI->getPointerTy(DL, DL.getAllocaAddrSpace());
12069 MVT RegVT = TLI->getRegisterType(*CurDAG->getContext(), VT);
12070 std::optional<ISD::NodeType> AssertOp;
12071 SDValue ArgValue =
12072 getCopyFromParts(DAG, dl, &InVals[0], 1, RegVT, VT, nullptr, NewRoot,
12073 F.getCallingConv(), AssertOp);
12074
12075 MachineFunction& MF = SDB->DAG.getMachineFunction();
12076 MachineRegisterInfo& RegInfo = MF.getRegInfo();
12077 Register SRetReg =
12078 RegInfo.createVirtualRegister(TLI->getRegClassFor(RegVT));
12079 FuncInfo->DemoteRegister = SRetReg;
12080 NewRoot =
12081 SDB->DAG.getCopyToReg(NewRoot, SDB->getCurSDLoc(), SRetReg, ArgValue);
12082 DAG.setRoot(NewRoot);
12083
12084 // i indexes lowered arguments. Bump it past the hidden sret argument.
12085 ++i;
12086 }
12087
12089 DenseMap<int, int> ArgCopyElisionFrameIndexMap;
12090 for (const Argument &Arg : F.args()) {
12091 SmallVector<SDValue, 4> ArgValues;
12092 SmallVector<EVT, 4> ValueVTs;
12093 ComputeValueVTs(*TLI, DAG.getDataLayout(), Arg.getType(), ValueVTs);
12094 unsigned NumValues = ValueVTs.size();
12095 if (NumValues == 0)
12096 continue;
12097
12098 bool ArgHasUses = !Arg.use_empty();
12099
12100 // Elide the copying store if the target loaded this argument from a
12101 // suitable fixed stack object.
12102 if (Ins[i].Flags.isCopyElisionCandidate()) {
12103 unsigned NumParts = 0;
12104 for (EVT VT : ValueVTs)
12105 NumParts += TLI->getNumRegistersForCallingConv(*CurDAG->getContext(),
12106 F.getCallingConv(), VT);
12107
12108 tryToElideArgumentCopy(*FuncInfo, Chains, ArgCopyElisionFrameIndexMap,
12109 ElidedArgCopyInstrs, ArgCopyElisionCandidates, Arg,
12110 ArrayRef(&InVals[i], NumParts), ArgHasUses);
12111 }
12112
12113 // If this argument is unused then remember its value. It is used to generate
12114 // debugging information.
12115 bool isSwiftErrorArg =
12116 TLI->supportSwiftError() &&
12117 Arg.hasAttribute(Attribute::SwiftError);
12118 if (!ArgHasUses && !isSwiftErrorArg) {
12119 SDB->setUnusedArgValue(&Arg, InVals[i]);
12120
12121 // Also remember any frame index for use in FastISel.
12122 if (FrameIndexSDNode *FI =
12124 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12125 }
12126
12127 for (unsigned Val = 0; Val != NumValues; ++Val) {
12128 EVT VT = ValueVTs[Val];
12129 MVT PartVT = TLI->getRegisterTypeForCallingConv(*CurDAG->getContext(),
12130 F.getCallingConv(), VT);
12131 unsigned NumParts = TLI->getNumRegistersForCallingConv(
12132 *CurDAG->getContext(), F.getCallingConv(), VT);
12133
12134 // Even an apparent 'unused' swifterror argument needs to be returned. So
12135 // we do generate a copy for it that can be used on return from the
12136 // function.
12137 if (ArgHasUses || isSwiftErrorArg) {
12138 std::optional<ISD::NodeType> AssertOp;
12139 if (Arg.hasAttribute(Attribute::SExt))
12140 AssertOp = ISD::AssertSext;
12141 else if (Arg.hasAttribute(Attribute::ZExt))
12142 AssertOp = ISD::AssertZext;
12143
12144 SDValue OutVal =
12145 getCopyFromParts(DAG, dl, &InVals[i], NumParts, PartVT, VT, nullptr,
12146 NewRoot, F.getCallingConv(), AssertOp);
12147
12148 FPClassTest NoFPClass = Arg.getNoFPClass();
12149 if (NoFPClass != fcNone) {
12150 SDValue SDNoFPClass = DAG.getTargetConstant(
12151 static_cast<uint64_t>(NoFPClass), dl, MVT::i32);
12152 OutVal = DAG.getNode(ISD::AssertNoFPClass, dl, OutVal.getValueType(),
12153 OutVal, SDNoFPClass);
12154 }
12155 ArgValues.push_back(OutVal);
12156 }
12157
12158 i += NumParts;
12159 }
12160
12161 // We don't need to do anything else for unused arguments.
12162 if (ArgValues.empty())
12163 continue;
12164
12165 // Note down frame index.
12166 if (FrameIndexSDNode *FI =
12167 dyn_cast<FrameIndexSDNode>(ArgValues[0].getNode()))
12168 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12169
12170 SDValue Res = DAG.getMergeValues(ArrayRef(ArgValues.data(), NumValues),
12171 SDB->getCurSDLoc());
12172
12173 SDB->setValue(&Arg, Res);
12174 if (!TM.Options.EnableFastISel && Res.getOpcode() == ISD::BUILD_PAIR) {
12175 // We want to associate the argument with the frame index, among
12176 // involved operands, that correspond to the lowest address. The
12177 // getCopyFromParts function, called earlier, is swapping the order of
12178 // the operands to BUILD_PAIR depending on endianness. The result of
12179 // that swapping is that the least significant bits of the argument will
12180 // be in the first operand of the BUILD_PAIR node, and the most
12181 // significant bits will be in the second operand.
12182 unsigned LowAddressOp = DAG.getDataLayout().isBigEndian() ? 1 : 0;
12183 if (LoadSDNode *LNode =
12184 dyn_cast<LoadSDNode>(Res.getOperand(LowAddressOp).getNode()))
12185 if (FrameIndexSDNode *FI =
12186 dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
12187 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12188 }
12189
12190 // Analyses past this point are naive and don't expect an assertion.
12191 if (Res.getOpcode() == ISD::AssertZext)
12192 Res = Res.getOperand(0);
12193
12194 // Update the SwiftErrorVRegDefMap.
12195 if (Res.getOpcode() == ISD::CopyFromReg && isSwiftErrorArg) {
12196 Register Reg = cast<RegisterSDNode>(Res.getOperand(1))->getReg();
12197 if (Reg.isVirtual())
12198 SwiftError->setCurrentVReg(FuncInfo->MBB, SwiftError->getFunctionArg(),
12199 Reg);
12200 }
12201
12202 // If this argument is live outside of the entry block, insert a copy from
12203 // wherever we got it to the vreg that other BB's will reference it as.
12204 if (Res.getOpcode() == ISD::CopyFromReg) {
12205 // If we can, though, try to skip creating an unnecessary vreg.
12206 // FIXME: This isn't very clean... it would be nice to make this more
12207 // general.
12208 Register Reg = cast<RegisterSDNode>(Res.getOperand(1))->getReg();
12209 if (Reg.isVirtual()) {
12210 FuncInfo->ValueMap[&Arg] = Reg;
12211 continue;
12212 }
12213 }
12214 if (!isOnlyUsedInEntryBlock(&Arg, TM.Options.EnableFastISel)) {
12215 FuncInfo->InitializeRegForValue(&Arg);
12216 SDB->CopyToExportRegsIfNeeded(&Arg);
12217 }
12218 }
12219
12220 if (!Chains.empty()) {
12221 Chains.push_back(NewRoot);
12222 NewRoot = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chains);
12223 }
12224
12225 DAG.setRoot(NewRoot);
12226
12227 assert(i == InVals.size() && "Argument register count mismatch!");
12228
12229 // If any argument copy elisions occurred and we have debug info, update the
12230 // stale frame indices used in the dbg.declare variable info table.
12231 if (!ArgCopyElisionFrameIndexMap.empty()) {
12232 for (MachineFunction::VariableDbgInfo &VI :
12233 MF->getInStackSlotVariableDbgInfo()) {
12234 auto I = ArgCopyElisionFrameIndexMap.find(VI.getStackSlot());
12235 if (I != ArgCopyElisionFrameIndexMap.end())
12236 VI.updateStackSlot(I->second);
12237 }
12238 }
12239
12240 // Finally, if the target has anything special to do, allow it to do so.
12242}
12243
12244/// Handle PHI nodes in successor blocks. Emit code into the SelectionDAG to
12245/// ensure constants are generated when needed. Remember the virtual registers
12246/// that need to be added to the Machine PHI nodes as input. We cannot just
12247/// directly add them, because expansion might result in multiple MBB's for one
12248/// BB. As such, the start of the BB might correspond to a different MBB than
12249/// the end.
12250void
12251SelectionDAGBuilder::HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) {
12252 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12253
12254 SmallPtrSet<MachineBasicBlock *, 4> SuccsHandled;
12255
12256 // Check PHI nodes in successors that expect a value to be available from this
12257 // block.
12258 for (const BasicBlock *SuccBB : successors(LLVMBB->getTerminator())) {
12259 if (!isa<PHINode>(SuccBB->begin())) continue;
12260 MachineBasicBlock *SuccMBB = FuncInfo.getMBB(SuccBB);
12261
12262 // If this terminator has multiple identical successors (common for
12263 // switches), only handle each succ once.
12264 if (!SuccsHandled.insert(SuccMBB).second)
12265 continue;
12266
12268
12269 // At this point we know that there is a 1-1 correspondence between LLVM PHI
12270 // nodes and Machine PHI nodes, but the incoming operands have not been
12271 // emitted yet.
12272 for (const PHINode &PN : SuccBB->phis()) {
12273 // Ignore dead phi's.
12274 if (PN.use_empty())
12275 continue;
12276
12277 // Skip empty types
12278 if (PN.getType()->isEmptyTy())
12279 continue;
12280
12281 Register Reg;
12282 const Value *PHIOp = PN.getIncomingValueForBlock(LLVMBB);
12283
12284 if (const auto *C = dyn_cast<Constant>(PHIOp)) {
12285 Register &RegOut = ConstantsOut[C];
12286 if (!RegOut) {
12287 RegOut = FuncInfo.CreateRegs(&PN);
12288 // We need to zero/sign extend ConstantInt phi operands to match
12289 // assumptions in FunctionLoweringInfo::ComputePHILiveOutRegInfo.
12290 ISD::NodeType ExtendType = ISD::ANY_EXTEND;
12291 if (auto *CI = dyn_cast<ConstantInt>(C))
12292 ExtendType = TLI.signExtendConstant(CI) ? ISD::SIGN_EXTEND
12294 CopyValueToVirtualRegister(C, RegOut, ExtendType);
12295 }
12296 Reg = RegOut;
12297 } else {
12299 FuncInfo.ValueMap.find(PHIOp);
12300 if (I != FuncInfo.ValueMap.end())
12301 Reg = I->second;
12302 else {
12303 assert(isa<AllocaInst>(PHIOp) &&
12304 FuncInfo.StaticAllocaMap.count(cast<AllocaInst>(PHIOp)) &&
12305 "Didn't codegen value into a register!??");
12306 Reg = FuncInfo.CreateRegs(&PN);
12308 }
12309 }
12310
12311 // Remember that this register needs to added to the machine PHI node as
12312 // the input for this MBB.
12313 SmallVector<EVT, 4> ValueVTs;
12314 ComputeValueVTs(TLI, DAG.getDataLayout(), PN.getType(), ValueVTs);
12315 for (EVT VT : ValueVTs) {
12316 const unsigned NumRegisters = TLI.getNumRegisters(*DAG.getContext(), VT);
12317 for (unsigned i = 0; i != NumRegisters; ++i)
12318 FuncInfo.PHINodesToUpdate.emplace_back(&*MBBI++, Reg + i);
12319 Reg += NumRegisters;
12320 }
12321 }
12322 }
12323
12324 ConstantsOut.clear();
12325}
12326
12327MachineBasicBlock *SelectionDAGBuilder::NextBlock(MachineBasicBlock *MBB) {
12329 if (++I == FuncInfo.MF->end())
12330 return nullptr;
12331 return &*I;
12332}
12333
12334/// During lowering new call nodes can be created (such as memset, etc.).
12335/// Those will become new roots of the current DAG, but complications arise
12336/// when they are tail calls. In such cases, the call lowering will update
12337/// the root, but the builder still needs to know that a tail call has been
12338/// lowered in order to avoid generating an additional return.
12339void SelectionDAGBuilder::updateDAGForMaybeTailCall(SDValue MaybeTC) {
12340 // If the node is null, we do have a tail call.
12341 if (MaybeTC.getNode() != nullptr)
12342 DAG.setRoot(MaybeTC);
12343 else
12344 HasTailCall = true;
12345}
12346
12347void SelectionDAGBuilder::lowerWorkItem(SwitchWorkListItem W, Value *Cond,
12348 MachineBasicBlock *SwitchMBB,
12349 MachineBasicBlock *DefaultMBB) {
12350 MachineFunction *CurMF = FuncInfo.MF;
12351 MachineBasicBlock *NextMBB = nullptr;
12353 if (++BBI != FuncInfo.MF->end())
12354 NextMBB = &*BBI;
12355
12356 unsigned Size = W.LastCluster - W.FirstCluster + 1;
12357
12358 BranchProbabilityInfo *BPI = FuncInfo.BPI;
12359
12360 if (Size == 2 && W.MBB == SwitchMBB) {
12361 // If any two of the cases has the same destination, and if one value
12362 // is the same as the other, but has one bit unset that the other has set,
12363 // use bit manipulation to do two compares at once. For example:
12364 // "if (X == 6 || X == 4)" -> "if ((X|2) == 6)"
12365 // TODO: This could be extended to merge any 2 cases in switches with 3
12366 // cases.
12367 // TODO: Handle cases where W.CaseBB != SwitchBB.
12368 CaseCluster &Small = *W.FirstCluster;
12369 CaseCluster &Big = *W.LastCluster;
12370
12371 if (Small.Low == Small.High && Big.Low == Big.High &&
12372 Small.MBB == Big.MBB) {
12373 const APInt &SmallValue = Small.Low->getValue();
12374 const APInt &BigValue = Big.Low->getValue();
12375
12376 // Check that there is only one bit different.
12377 APInt CommonBit = BigValue ^ SmallValue;
12378 if (CommonBit.isPowerOf2()) {
12379 SDValue CondLHS = getValue(Cond);
12380 EVT VT = CondLHS.getValueType();
12381 SDLoc DL = getCurSDLoc();
12382
12383 SDValue Or = DAG.getNode(ISD::OR, DL, VT, CondLHS,
12384 DAG.getConstant(CommonBit, DL, VT));
12385 SDValue Cond = DAG.getSetCC(
12386 DL, MVT::i1, Or, DAG.getConstant(BigValue | SmallValue, DL, VT),
12387 ISD::SETEQ);
12388
12389 // Update successor info.
12390 // Both Small and Big will jump to Small.BB, so we sum up the
12391 // probabilities.
12392 addSuccessorWithProb(SwitchMBB, Small.MBB, Small.Prob + Big.Prob);
12393 if (BPI)
12394 addSuccessorWithProb(
12395 SwitchMBB, DefaultMBB,
12396 // The default destination is the first successor in IR.
12397 BPI->getEdgeProbability(SwitchMBB->getBasicBlock(), (unsigned)0));
12398 else
12399 addSuccessorWithProb(SwitchMBB, DefaultMBB);
12400
12401 // Insert the true branch.
12402 SDValue BrCond =
12403 DAG.getNode(ISD::BRCOND, DL, MVT::Other, getControlRoot(), Cond,
12404 DAG.getBasicBlock(Small.MBB));
12405 // Insert the false branch.
12406 BrCond = DAG.getNode(ISD::BR, DL, MVT::Other, BrCond,
12407 DAG.getBasicBlock(DefaultMBB));
12408
12409 DAG.setRoot(BrCond);
12410 return;
12411 }
12412 }
12413 }
12414
12415 if (TM.getOptLevel() != CodeGenOptLevel::None) {
12416 // Here, we order cases by probability so the most likely case will be
12417 // checked first. However, two clusters can have the same probability in
12418 // which case their relative ordering is non-deterministic. So we use Low
12419 // as a tie-breaker as clusters are guaranteed to never overlap.
12420 llvm::sort(W.FirstCluster, W.LastCluster + 1,
12421 [](const CaseCluster &a, const CaseCluster &b) {
12422 return a.Prob != b.Prob ?
12423 a.Prob > b.Prob :
12424 a.Low->getValue().slt(b.Low->getValue());
12425 });
12426
12427 // Rearrange the case blocks so that the last one falls through if possible
12428 // without changing the order of probabilities.
12429 for (CaseClusterIt I = W.LastCluster; I > W.FirstCluster; ) {
12430 --I;
12431 if (I->Prob > W.LastCluster->Prob)
12432 break;
12433 if (I->Kind == CC_Range && I->MBB == NextMBB) {
12434 std::swap(*I, *W.LastCluster);
12435 break;
12436 }
12437 }
12438 }
12439
12440 // Compute total probability.
12441 BranchProbability DefaultProb = W.DefaultProb;
12442 BranchProbability UnhandledProbs = DefaultProb;
12443 for (CaseClusterIt I = W.FirstCluster; I <= W.LastCluster; ++I)
12444 UnhandledProbs += I->Prob;
12445
12446 MachineBasicBlock *CurMBB = W.MBB;
12447 for (CaseClusterIt I = W.FirstCluster, E = W.LastCluster; I <= E; ++I) {
12448 bool FallthroughUnreachable = false;
12449 MachineBasicBlock *Fallthrough;
12450 if (I == W.LastCluster) {
12451 // For the last cluster, fall through to the default destination.
12452 Fallthrough = DefaultMBB;
12453 FallthroughUnreachable = isa<UnreachableInst>(
12454 DefaultMBB->getBasicBlock()->getFirstNonPHIOrDbg());
12455 } else {
12456 Fallthrough = CurMF->CreateMachineBasicBlock(CurMBB->getBasicBlock());
12457 CurMF->insert(BBI, Fallthrough);
12458 // Put Cond in a virtual register to make it available from the new blocks.
12460 }
12461 UnhandledProbs -= I->Prob;
12462
12463 switch (I->Kind) {
12464 case CC_JumpTable: {
12465 // FIXME: Optimize away range check based on pivot comparisons.
12466 JumpTableHeader *JTH = &SL->JTCases[I->JTCasesIndex].first;
12467 SwitchCG::JumpTable *JT = &SL->JTCases[I->JTCasesIndex].second;
12468
12469 // The jump block hasn't been inserted yet; insert it here.
12470 MachineBasicBlock *JumpMBB = JT->MBB;
12471 CurMF->insert(BBI, JumpMBB);
12472
12473 auto JumpProb = I->Prob;
12474 auto FallthroughProb = UnhandledProbs;
12475
12476 // If the default statement is a target of the jump table, we evenly
12477 // distribute the default probability to successors of CurMBB. Also
12478 // update the probability on the edge from JumpMBB to Fallthrough.
12479 for (MachineBasicBlock::succ_iterator SI = JumpMBB->succ_begin(),
12480 SE = JumpMBB->succ_end();
12481 SI != SE; ++SI) {
12482 if (*SI == DefaultMBB) {
12483 JumpProb += DefaultProb / 2;
12484 FallthroughProb -= DefaultProb / 2;
12485 JumpMBB->setSuccProbability(SI, DefaultProb / 2);
12486 JumpMBB->normalizeSuccProbs();
12487 break;
12488 }
12489 }
12490
12491 // If the default clause is unreachable, propagate that knowledge into
12492 // JTH->FallthroughUnreachable which will use it to suppress the range
12493 // check.
12494 //
12495 // However, don't do this if we're doing branch target enforcement,
12496 // because a table branch _without_ a range check can be a tempting JOP
12497 // gadget - out-of-bounds inputs that are impossible in correct
12498 // execution become possible again if an attacker can influence the
12499 // control flow. So if an attacker doesn't already have a BTI bypass
12500 // available, we don't want them to be able to get one out of this
12501 // table branch.
12502 if (FallthroughUnreachable) {
12503 Function &CurFunc = CurMF->getFunction();
12504 if (!CurFunc.hasFnAttribute("branch-target-enforcement"))
12505 JTH->FallthroughUnreachable = true;
12506 }
12507
12508 if (!JTH->FallthroughUnreachable)
12509 addSuccessorWithProb(CurMBB, Fallthrough, FallthroughProb);
12510 addSuccessorWithProb(CurMBB, JumpMBB, JumpProb);
12511 CurMBB->normalizeSuccProbs();
12512
12513 // The jump table header will be inserted in our current block, do the
12514 // range check, and fall through to our fallthrough block.
12515 JTH->HeaderBB = CurMBB;
12516 JT->Default = Fallthrough; // FIXME: Move Default to JumpTableHeader.
12517
12518 // If we're in the right place, emit the jump table header right now.
12519 if (CurMBB == SwitchMBB) {
12520 visitJumpTableHeader(*JT, *JTH, SwitchMBB);
12521 JTH->Emitted = true;
12522 }
12523 break;
12524 }
12525 case CC_BitTests: {
12526 // FIXME: Optimize away range check based on pivot comparisons.
12527 BitTestBlock *BTB = &SL->BitTestCases[I->BTCasesIndex];
12528
12529 // The bit test blocks haven't been inserted yet; insert them here.
12530 for (BitTestCase &BTC : BTB->Cases)
12531 CurMF->insert(BBI, BTC.ThisBB);
12532
12533 // Fill in fields of the BitTestBlock.
12534 BTB->Parent = CurMBB;
12535 BTB->Default = Fallthrough;
12536
12537 BTB->DefaultProb = UnhandledProbs;
12538 // If the cases in bit test don't form a contiguous range, we evenly
12539 // distribute the probability on the edge to Fallthrough to two
12540 // successors of CurMBB.
12541 if (!BTB->ContiguousRange) {
12542 BTB->Prob += DefaultProb / 2;
12543 BTB->DefaultProb -= DefaultProb / 2;
12544 }
12545
12546 if (FallthroughUnreachable)
12547 BTB->FallthroughUnreachable = true;
12548
12549 // If we're in the right place, emit the bit test header right now.
12550 if (CurMBB == SwitchMBB) {
12551 visitBitTestHeader(*BTB, SwitchMBB);
12552 BTB->Emitted = true;
12553 }
12554 break;
12555 }
12556 case CC_Range: {
12557 const Value *RHS, *LHS, *MHS;
12558 ISD::CondCode CC;
12559 if (I->Low == I->High) {
12560 // Check Cond == I->Low.
12561 CC = ISD::SETEQ;
12562 LHS = Cond;
12563 RHS=I->Low;
12564 MHS = nullptr;
12565 } else {
12566 // Check I->Low <= Cond <= I->High.
12567 CC = ISD::SETLE;
12568 LHS = I->Low;
12569 MHS = Cond;
12570 RHS = I->High;
12571 }
12572
12573 // If Fallthrough is unreachable, fold away the comparison.
12574 if (FallthroughUnreachable)
12575 CC = ISD::SETTRUE;
12576
12577 // The false probability is the sum of all unhandled cases.
12578 CaseBlock CB(CC, LHS, RHS, MHS, I->MBB, Fallthrough, CurMBB,
12579 getCurSDLoc(), I->Prob, UnhandledProbs);
12580
12581 if (CurMBB == SwitchMBB)
12582 visitSwitchCase(CB, SwitchMBB);
12583 else
12584 SL->SwitchCases.push_back(CB);
12585
12586 break;
12587 }
12588 }
12589 CurMBB = Fallthrough;
12590 }
12591}
12592
12593void SelectionDAGBuilder::splitWorkItem(SwitchWorkList &WorkList,
12594 const SwitchWorkListItem &W,
12595 Value *Cond,
12596 MachineBasicBlock *SwitchMBB) {
12597 assert(W.FirstCluster->Low->getValue().slt(W.LastCluster->Low->getValue()) &&
12598 "Clusters not sorted?");
12599 assert(W.LastCluster - W.FirstCluster + 1 >= 2 && "Too small to split!");
12600
12601 auto [LastLeft, FirstRight, LeftProb, RightProb] =
12602 SL->computeSplitWorkItemInfo(W);
12603
12604 // Use the first element on the right as pivot since we will make less-than
12605 // comparisons against it.
12606 CaseClusterIt PivotCluster = FirstRight;
12607 assert(PivotCluster > W.FirstCluster);
12608 assert(PivotCluster <= W.LastCluster);
12609
12610 CaseClusterIt FirstLeft = W.FirstCluster;
12611 CaseClusterIt LastRight = W.LastCluster;
12612
12613 const ConstantInt *Pivot = PivotCluster->Low;
12614
12615 // New blocks will be inserted immediately after the current one.
12617 ++BBI;
12618
12619 // We will branch to the LHS if Value < Pivot. If LHS is a single cluster,
12620 // we can branch to its destination directly if it's squeezed exactly in
12621 // between the known lower bound and Pivot - 1.
12622 MachineBasicBlock *LeftMBB;
12623 if (FirstLeft == LastLeft && FirstLeft->Kind == CC_Range &&
12624 FirstLeft->Low == W.GE &&
12625 (FirstLeft->High->getValue() + 1LL) == Pivot->getValue()) {
12626 LeftMBB = FirstLeft->MBB;
12627 } else {
12628 LeftMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
12629 FuncInfo.MF->insert(BBI, LeftMBB);
12630 WorkList.push_back(
12631 {LeftMBB, FirstLeft, LastLeft, W.GE, Pivot, W.DefaultProb / 2});
12632 // Put Cond in a virtual register to make it available from the new blocks.
12634 }
12635
12636 // Similarly, we will branch to the RHS if Value >= Pivot. If RHS is a
12637 // single cluster, RHS.Low == Pivot, and we can branch to its destination
12638 // directly if RHS.High equals the current upper bound.
12639 MachineBasicBlock *RightMBB;
12640 if (FirstRight == LastRight && FirstRight->Kind == CC_Range &&
12641 W.LT && (FirstRight->High->getValue() + 1ULL) == W.LT->getValue()) {
12642 RightMBB = FirstRight->MBB;
12643 } else {
12644 RightMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
12645 FuncInfo.MF->insert(BBI, RightMBB);
12646 WorkList.push_back(
12647 {RightMBB, FirstRight, LastRight, Pivot, W.LT, W.DefaultProb / 2});
12648 // Put Cond in a virtual register to make it available from the new blocks.
12650 }
12651
12652 // Create the CaseBlock record that will be used to lower the branch.
12653 CaseBlock CB(ISD::SETLT, Cond, Pivot, nullptr, LeftMBB, RightMBB, W.MBB,
12654 getCurSDLoc(), LeftProb, RightProb);
12655
12656 if (W.MBB == SwitchMBB)
12657 visitSwitchCase(CB, SwitchMBB);
12658 else
12659 SL->SwitchCases.push_back(CB);
12660}
12661
12662// Scale CaseProb after peeling a case with the probablity of PeeledCaseProb
12663// from the swith statement.
12665 BranchProbability PeeledCaseProb) {
12666 if (PeeledCaseProb == BranchProbability::getOne())
12668 BranchProbability SwitchProb = PeeledCaseProb.getCompl();
12669
12670 uint32_t Numerator = CaseProb.getNumerator();
12671 uint32_t Denominator = SwitchProb.scale(CaseProb.getDenominator());
12672 return BranchProbability(Numerator, std::max(Numerator, Denominator));
12673}
12674
12675// Try to peel the top probability case if it exceeds the threshold.
12676// Return current MachineBasicBlock for the switch statement if the peeling
12677// does not occur.
12678// If the peeling is performed, return the newly created MachineBasicBlock
12679// for the peeled switch statement. Also update Clusters to remove the peeled
12680// case. PeeledCaseProb is the BranchProbability for the peeled case.
12681MachineBasicBlock *SelectionDAGBuilder::peelDominantCaseCluster(
12682 const SwitchInst &SI, CaseClusterVector &Clusters,
12683 BranchProbability &PeeledCaseProb) {
12684 MachineBasicBlock *SwitchMBB = FuncInfo.MBB;
12685 // Don't perform if there is only one cluster or optimizing for size.
12686 if (SwitchPeelThreshold > 100 || !FuncInfo.BPI || Clusters.size() < 2 ||
12687 TM.getOptLevel() == CodeGenOptLevel::None ||
12688 SwitchMBB->getParent()->getFunction().hasMinSize())
12689 return SwitchMBB;
12690
12691 BranchProbability TopCaseProb = BranchProbability(SwitchPeelThreshold, 100);
12692 unsigned PeeledCaseIndex = 0;
12693 bool SwitchPeeled = false;
12694 for (unsigned Index = 0; Index < Clusters.size(); ++Index) {
12695 CaseCluster &CC = Clusters[Index];
12696 if (CC.Prob < TopCaseProb)
12697 continue;
12698 TopCaseProb = CC.Prob;
12699 PeeledCaseIndex = Index;
12700 SwitchPeeled = true;
12701 }
12702 if (!SwitchPeeled)
12703 return SwitchMBB;
12704
12705 LLVM_DEBUG(dbgs() << "Peeled one top case in switch stmt, prob: "
12706 << TopCaseProb << "\n");
12707
12708 // Record the MBB for the peeled switch statement.
12709 MachineFunction::iterator BBI(SwitchMBB);
12710 ++BBI;
12711 MachineBasicBlock *PeeledSwitchMBB =
12712 FuncInfo.MF->CreateMachineBasicBlock(SwitchMBB->getBasicBlock());
12713 FuncInfo.MF->insert(BBI, PeeledSwitchMBB);
12714
12715 ExportFromCurrentBlock(SI.getCondition());
12716 auto PeeledCaseIt = Clusters.begin() + PeeledCaseIndex;
12717 SwitchWorkListItem W = {SwitchMBB, PeeledCaseIt, PeeledCaseIt,
12718 nullptr, nullptr, TopCaseProb.getCompl()};
12719 lowerWorkItem(W, SI.getCondition(), SwitchMBB, PeeledSwitchMBB);
12720
12721 Clusters.erase(PeeledCaseIt);
12722 for (CaseCluster &CC : Clusters) {
12723 LLVM_DEBUG(
12724 dbgs() << "Scale the probablity for one cluster, before scaling: "
12725 << CC.Prob << "\n");
12726 CC.Prob = scaleCaseProbality(CC.Prob, TopCaseProb);
12727 LLVM_DEBUG(dbgs() << "After scaling: " << CC.Prob << "\n");
12728 }
12729 PeeledCaseProb = TopCaseProb;
12730 return PeeledSwitchMBB;
12731}
12732
12733void SelectionDAGBuilder::visitSwitch(const SwitchInst &SI) {
12734 // Extract cases from the switch.
12735 BranchProbabilityInfo *BPI = FuncInfo.BPI;
12736 CaseClusterVector Clusters;
12737 Clusters.reserve(SI.getNumCases());
12738 for (auto I : SI.cases()) {
12739 MachineBasicBlock *Succ = FuncInfo.getMBB(I.getCaseSuccessor());
12740 const ConstantInt *CaseVal = I.getCaseValue();
12741 BranchProbability Prob =
12742 BPI ? BPI->getEdgeProbability(SI.getParent(), I.getSuccessorIndex())
12743 : BranchProbability(1, SI.getNumCases() + 1);
12744 Clusters.push_back(CaseCluster::range(CaseVal, CaseVal, Succ, Prob));
12745 }
12746
12747 MachineBasicBlock *DefaultMBB = FuncInfo.getMBB(SI.getDefaultDest());
12748
12749 // Cluster adjacent cases with the same destination. We do this at all
12750 // optimization levels because it's cheap to do and will make codegen faster
12751 // if there are many clusters.
12752 sortAndRangeify(Clusters);
12753
12754 // The branch probablity of the peeled case.
12755 BranchProbability PeeledCaseProb = BranchProbability::getZero();
12756 MachineBasicBlock *PeeledSwitchMBB =
12757 peelDominantCaseCluster(SI, Clusters, PeeledCaseProb);
12758
12759 // If there is only the default destination, jump there directly.
12760 MachineBasicBlock *SwitchMBB = FuncInfo.MBB;
12761 if (Clusters.empty()) {
12762 assert(PeeledSwitchMBB == SwitchMBB);
12763 SwitchMBB->addSuccessor(DefaultMBB);
12764 if (DefaultMBB != NextBlock(SwitchMBB)) {
12765 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
12766 getControlRoot(), DAG.getBasicBlock(DefaultMBB)));
12767 }
12768 return;
12769 }
12770
12771 SL->findJumpTables(Clusters, &SI, getCurSDLoc(), DefaultMBB, DAG.getPSI(),
12772 DAG.getBFI());
12773 SL->findBitTestClusters(Clusters, &SI);
12774
12775 LLVM_DEBUG({
12776 dbgs() << "Case clusters: ";
12777 for (const CaseCluster &C : Clusters) {
12778 if (C.Kind == CC_JumpTable)
12779 dbgs() << "JT:";
12780 if (C.Kind == CC_BitTests)
12781 dbgs() << "BT:";
12782
12783 C.Low->getValue().print(dbgs(), true);
12784 if (C.Low != C.High) {
12785 dbgs() << '-';
12786 C.High->getValue().print(dbgs(), true);
12787 }
12788 dbgs() << ' ';
12789 }
12790 dbgs() << '\n';
12791 });
12792
12793 assert(!Clusters.empty());
12794 SwitchWorkList WorkList;
12795 CaseClusterIt First = Clusters.begin();
12796 CaseClusterIt Last = Clusters.end() - 1;
12797 auto DefaultProb = getEdgeProbability(PeeledSwitchMBB, DefaultMBB);
12798 // Scale the branchprobability for DefaultMBB if the peel occurs and
12799 // DefaultMBB is not replaced.
12800 if (PeeledCaseProb != BranchProbability::getZero() &&
12801 DefaultMBB == FuncInfo.getMBB(SI.getDefaultDest()))
12802 DefaultProb = scaleCaseProbality(DefaultProb, PeeledCaseProb);
12803 WorkList.push_back(
12804 {PeeledSwitchMBB, First, Last, nullptr, nullptr, DefaultProb});
12805
12806 while (!WorkList.empty()) {
12807 SwitchWorkListItem W = WorkList.pop_back_val();
12808 unsigned NumClusters = W.LastCluster - W.FirstCluster + 1;
12809
12810 if (NumClusters > 3 && TM.getOptLevel() != CodeGenOptLevel::None &&
12811 !DefaultMBB->getParent()->getFunction().hasMinSize()) {
12812 // For optimized builds, lower large range as a balanced binary tree.
12813 splitWorkItem(WorkList, W, SI.getCondition(), SwitchMBB);
12814 continue;
12815 }
12816
12817 lowerWorkItem(W, SI.getCondition(), SwitchMBB, DefaultMBB);
12818 }
12819}
12820
12821void SelectionDAGBuilder::visitStepVector(const CallInst &I) {
12822 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12823 auto DL = getCurSDLoc();
12824 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12825 setValue(&I, DAG.getStepVector(DL, ResultVT));
12826}
12827
12828void SelectionDAGBuilder::visitVectorReverse(const CallInst &I) {
12829 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12830 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12831
12832 SDLoc DL = getCurSDLoc();
12833 SDValue V = getValue(I.getOperand(0));
12834 assert(VT == V.getValueType() && "Malformed vector.reverse!");
12835
12836 if (VT.isScalableVector()) {
12837 setValue(&I, DAG.getNode(ISD::VECTOR_REVERSE, DL, VT, V));
12838 return;
12839 }
12840
12841 // Use VECTOR_SHUFFLE for the fixed-length vector
12842 // to maintain existing behavior.
12843 SmallVector<int, 8> Mask;
12844 unsigned NumElts = VT.getVectorMinNumElements();
12845 for (unsigned i = 0; i != NumElts; ++i)
12846 Mask.push_back(NumElts - 1 - i);
12847
12848 setValue(&I, DAG.getVectorShuffle(VT, DL, V, DAG.getUNDEF(VT), Mask));
12849}
12850
12851void SelectionDAGBuilder::visitVectorDeinterleave(const CallInst &I,
12852 unsigned Factor) {
12853 auto DL = getCurSDLoc();
12854 SDValue InVec = getValue(I.getOperand(0));
12855
12856 SmallVector<EVT, 4> ValueVTs;
12857 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
12858 ValueVTs);
12859
12860 EVT OutVT = ValueVTs[0];
12861 unsigned OutNumElts = OutVT.getVectorMinNumElements();
12862
12863 SmallVector<SDValue, 4> SubVecs(Factor);
12864 for (unsigned i = 0; i != Factor; ++i) {
12865 assert(ValueVTs[i] == OutVT && "Expected VTs to be the same");
12866 SubVecs[i] = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, OutVT, InVec,
12867 DAG.getVectorIdxConstant(OutNumElts * i, DL));
12868 }
12869
12870 // Use VECTOR_SHUFFLE for fixed-length vectors with factor of 2 to benefit
12871 // from existing legalisation and combines.
12872 if (OutVT.isFixedLengthVector() && Factor == 2) {
12873 SDValue Even = DAG.getVectorShuffle(OutVT, DL, SubVecs[0], SubVecs[1],
12874 createStrideMask(0, 2, OutNumElts));
12875 SDValue Odd = DAG.getVectorShuffle(OutVT, DL, SubVecs[0], SubVecs[1],
12876 createStrideMask(1, 2, OutNumElts));
12877 SDValue Res = DAG.getMergeValues({Even, Odd}, getCurSDLoc());
12878 setValue(&I, Res);
12879 return;
12880 }
12881
12882 SDValue Res = DAG.getNode(ISD::VECTOR_DEINTERLEAVE, DL,
12883 DAG.getVTList(ValueVTs), SubVecs);
12884 setValue(&I, Res);
12885}
12886
12887void SelectionDAGBuilder::visitVectorInterleave(const CallInst &I,
12888 unsigned Factor) {
12889 auto DL = getCurSDLoc();
12890 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12891 EVT InVT = getValue(I.getOperand(0)).getValueType();
12892 EVT OutVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12893
12894 SmallVector<SDValue, 8> InVecs(Factor);
12895 for (unsigned i = 0; i < Factor; ++i) {
12896 InVecs[i] = getValue(I.getOperand(i));
12897 assert(InVecs[i].getValueType() == InVecs[0].getValueType() &&
12898 "Expected VTs to be the same");
12899 }
12900
12901 // Use VECTOR_SHUFFLE for fixed-length vectors with factor of 2 to benefit
12902 // from existing legalisation and combines.
12903 if (OutVT.isFixedLengthVector() && Factor == 2) {
12904 unsigned NumElts = InVT.getVectorMinNumElements();
12905 SDValue V = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, InVecs);
12906 setValue(&I, DAG.getVectorShuffle(OutVT, DL, V, DAG.getUNDEF(OutVT),
12907 createInterleaveMask(NumElts, 2)));
12908 return;
12909 }
12910
12911 SmallVector<EVT, 8> ValueVTs(Factor, InVT);
12912 SDValue Res =
12913 DAG.getNode(ISD::VECTOR_INTERLEAVE, DL, DAG.getVTList(ValueVTs), InVecs);
12914
12916 for (unsigned i = 0; i < Factor; ++i)
12917 Results[i] = Res.getValue(i);
12918
12919 Res = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, Results);
12920 setValue(&I, Res);
12921}
12922
12923void SelectionDAGBuilder::visitFreeze(const FreezeInst &I) {
12924 SmallVector<EVT, 4> ValueVTs;
12925 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
12926 ValueVTs);
12927 unsigned NumValues = ValueVTs.size();
12928 if (NumValues == 0) return;
12929
12930 SmallVector<SDValue, 4> Values(NumValues);
12931 SDValue Op = getValue(I.getOperand(0));
12932
12933 for (unsigned i = 0; i != NumValues; ++i)
12934 Values[i] = DAG.getNode(ISD::FREEZE, getCurSDLoc(), ValueVTs[i],
12935 SDValue(Op.getNode(), Op.getResNo() + i));
12936
12938 DAG.getVTList(ValueVTs), Values));
12939}
12940
12941void SelectionDAGBuilder::visitVectorSplice(const CallInst &I) {
12942 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12943 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12944
12945 SDLoc DL = getCurSDLoc();
12946 SDValue V1 = getValue(I.getOperand(0));
12947 SDValue V2 = getValue(I.getOperand(1));
12948 const bool IsLeft = I.getIntrinsicID() == Intrinsic::vector_splice_left;
12949
12950 // VECTOR_SHUFFLE doesn't support a scalable or non-constant mask.
12951 if (VT.isScalableVector() || !isa<ConstantInt>(I.getOperand(2))) {
12952 SDValue Offset = DAG.getZExtOrTrunc(
12953 getValue(I.getOperand(2)), DL, TLI.getVectorIdxTy(DAG.getDataLayout()));
12954 setValue(&I, DAG.getNode(IsLeft ? ISD::VECTOR_SPLICE_LEFT
12956 DL, VT, V1, V2, Offset));
12957 return;
12958 }
12959 uint64_t Imm = cast<ConstantInt>(I.getOperand(2))->getZExtValue();
12960
12961 unsigned NumElts = VT.getVectorNumElements();
12962
12963 uint64_t Idx = IsLeft ? Imm : NumElts - Imm;
12964
12965 // Use VECTOR_SHUFFLE to maintain original behaviour for fixed-length vectors.
12966 SmallVector<int, 8> Mask;
12967 for (unsigned i = 0; i < NumElts; ++i)
12968 Mask.push_back(Idx + i);
12969 setValue(&I, DAG.getVectorShuffle(VT, DL, V1, V2, Mask));
12970}
12971
12972// Consider the following MIR after SelectionDAG, which produces output in
12973// phyregs in the first case or virtregs in the second case.
12974//
12975// INLINEASM_BR ..., implicit-def $ebx, ..., implicit-def $edx
12976// %5:gr32 = COPY $ebx
12977// %6:gr32 = COPY $edx
12978// %1:gr32 = COPY %6:gr32
12979// %0:gr32 = COPY %5:gr32
12980//
12981// INLINEASM_BR ..., def %5:gr32, ..., def %6:gr32
12982// %1:gr32 = COPY %6:gr32
12983// %0:gr32 = COPY %5:gr32
12984//
12985// Given %0, we'd like to return $ebx in the first case and %5 in the second.
12986// Given %1, we'd like to return $edx in the first case and %6 in the second.
12987//
12988// If a callbr has outputs, it will have a single mapping in FuncInfo.ValueMap
12989// to a single virtreg (such as %0). The remaining outputs monotonically
12990// increase in virtreg number from there. If a callbr has no outputs, then it
12991// should not have a corresponding callbr landingpad; in fact, the callbr
12992// landingpad would not even be able to refer to such a callbr.
12995 // There is definitely at least one copy.
12996 assert(MI->getOpcode() == TargetOpcode::COPY &&
12997 "start of copy chain MUST be COPY");
12998 Reg = MI->getOperand(1).getReg();
12999
13000 // If the copied register in the first copy must be virtual.
13001 assert(Reg.isVirtual() && "expected COPY of virtual register");
13002 MI = MRI.def_begin(Reg)->getParent();
13003
13004 // There may be an optional second copy.
13005 if (MI->getOpcode() == TargetOpcode::COPY) {
13006 assert(Reg.isVirtual() && "expected COPY of virtual register");
13007 Reg = MI->getOperand(1).getReg();
13008 assert(Reg.isPhysical() && "expected COPY of physical register");
13009 } else {
13010 // The start of the chain must be an INLINEASM_BR.
13011 assert(MI->getOpcode() == TargetOpcode::INLINEASM_BR &&
13012 "end of copy chain MUST be INLINEASM_BR");
13013 }
13014
13015 return Reg;
13016}
13017
13018// We must do this walk rather than the simpler
13019// setValue(&I, getCopyFromRegs(CBR, CBR->getType()));
13020// otherwise we will end up with copies of virtregs only valid along direct
13021// edges.
13022void SelectionDAGBuilder::visitCallBrLandingPad(const CallInst &I) {
13023 SmallVector<EVT, 8> ResultVTs;
13024 SmallVector<SDValue, 8> ResultValues;
13025 const auto *CBR =
13026 cast<CallBrInst>(I.getParent()->getUniquePredecessor()->getTerminator());
13027
13028 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
13029 const TargetRegisterInfo *TRI = DAG.getSubtarget().getRegisterInfo();
13030 MachineRegisterInfo &MRI = DAG.getMachineFunction().getRegInfo();
13031
13032 Register InitialDef = FuncInfo.ValueMap[CBR];
13033 SDValue Chain = DAG.getRoot();
13034
13035 // Re-parse the asm constraints string.
13036 TargetLowering::AsmOperandInfoVector TargetConstraints =
13037 TLI.ParseConstraints(DAG.getDataLayout(), TRI, *CBR);
13038 for (auto &T : TargetConstraints) {
13039 SDISelAsmOperandInfo OpInfo(T);
13040 if (OpInfo.Type != InlineAsm::isOutput)
13041 continue;
13042
13043 // Pencil in OpInfo.ConstraintType and OpInfo.ConstraintVT based on the
13044 // individual constraint.
13045 TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
13046
13047 switch (OpInfo.ConstraintType) {
13050 // Fill in OpInfo.AssignedRegs.Regs.
13051 getRegistersForValue(DAG, getCurSDLoc(), OpInfo, OpInfo);
13052
13053 // getRegistersForValue may produce 1 to many registers based on whether
13054 // the OpInfo.ConstraintVT is legal on the target or not.
13055 for (Register &Reg : OpInfo.AssignedRegs.Regs) {
13056 Register OriginalDef = FollowCopyChain(MRI, InitialDef++);
13057 if (OriginalDef.isPhysical())
13058 FuncInfo.MBB->addLiveIn(OriginalDef);
13059 // Update the assigned registers to use the original defs.
13060 Reg = OriginalDef;
13061 }
13062
13063 SDValue V = OpInfo.AssignedRegs.getCopyFromRegs(
13064 DAG, FuncInfo, getCurSDLoc(), Chain, nullptr, CBR);
13065 ResultValues.push_back(V);
13066 ResultVTs.push_back(OpInfo.ConstraintVT);
13067 break;
13068 }
13070 SDValue Flag;
13071 SDValue V = TLI.LowerAsmOutputForConstraint(Chain, Flag, getCurSDLoc(),
13072 OpInfo, DAG);
13073 ++InitialDef;
13074 ResultValues.push_back(V);
13075 ResultVTs.push_back(OpInfo.ConstraintVT);
13076 break;
13077 }
13078 default:
13079 break;
13080 }
13081 }
13083 DAG.getVTList(ResultVTs), ResultValues);
13084 setValue(&I, V);
13085}
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)
This file implements the BitVector class.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
dxil translate DXIL Translate Metadata
static AttributeList getReturnAttrs(FastISel::CallLoweringInfo &CLI)
Returns an AttributeList representing the attributes applied to the return value of the given call.
Definition FastISel.cpp:942
#define Check(C,...)
static Value * getCondition(Instruction *I)
Hexagon Common GEP
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Module.h This file contains the declarations for the Module class.
static void getRegistersForValue(MachineFunction &MF, MachineIRBuilder &MIRBuilder, GISelAsmOperandInfo &OpInfo, GISelAsmOperandInfo &RefOpInfo)
Assign virtual/physical registers for the specified register operand.
This file defines an InstructionCost class that is used when calculating the cost of an instruction,...
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define RegName(no)
lazy value info
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Machine Check Debug Module
static bool isUndef(const MachineInstr &MI)
Register Reg
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
static const Function * getCalledFunction(const Value *V)
This file provides utility analysis objects describing memory locations.
This file provides utility for Memory Model Relaxation Annotations (MMRAs).
This file contains the declarations for metadata subclasses.
Type::TypeID TypeID
#define T
#define T1
static MCRegister getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
static unsigned getAddressSpace(const Value *V, unsigned MaxLookup)
MachineInstr unsigned OpIdx
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t High
uint64_t IntrinsicInst * II
OptimizedStructLayoutField Field
#define P(N)
if(PassOpts->AAPipeline)
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
static Type * getValueType(Value *V)
Returns the type of the given value/instruction V.
This file contains some templates that are useful if you are working with the STL at all.
static bool hasOnlySelectUsers(const Value *Cond)
static SDValue getLoadStackGuard(SelectionDAG &DAG, const SDLoc &DL, SDValue &Chain)
Create a LOAD_STACK_GUARD node, and let it carry the target specific global variable if there exists ...
static bool getUniformBase(const Value *Ptr, SDValue &Base, SDValue &Index, SDValue &Scale, SelectionDAGBuilder *SDB, const BasicBlock *CurBB, uint64_t ElemSize)
static void failForInvalidBundles(const CallBase &I, StringRef Name, ArrayRef< uint32_t > AllowedBundles)
static void addStackMapLiveVars(const CallBase &Call, unsigned StartIdx, const SDLoc &DL, SmallVectorImpl< SDValue > &Ops, SelectionDAGBuilder &Builder)
Add a stack map intrinsic call's live variable operands to a stackmap or patchpoint target node's ope...
static const unsigned MaxParallelChains
static SDValue expandPow(const SDLoc &dl, SDValue LHS, SDValue RHS, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
visitPow - Lower a pow intrinsic.
static const CallBase * FindPreallocatedCall(const Value *PreallocatedSetup)
Given a @llvm.call.preallocated.setup, return the corresponding preallocated call.
static cl::opt< unsigned > SwitchPeelThreshold("switch-peel-threshold", cl::Hidden, cl::init(66), cl::desc("Set the case probability threshold for peeling the case from a " "switch statement. A value greater than 100 will void this " "optimization"))
static cl::opt< bool > InsertAssertAlign("insert-assert-align", cl::init(true), cl::desc("Insert the experimental `assertalign` node."), cl::ReallyHidden)
static unsigned getISDForVPIntrinsic(const VPIntrinsic &VPIntrin)
static bool handleDanglingVariadicDebugInfo(SelectionDAG &DAG, DILocalVariable *Variable, DebugLoc DL, unsigned Order, SmallVectorImpl< Value * > &Values, DIExpression *Expression)
static unsigned findMatchingInlineAsmOperand(unsigned OperandNo, const std::vector< SDValue > &AsmNodeOperands)
static void patchMatchingInput(const SDISelAsmOperandInfo &OpInfo, SDISelAsmOperandInfo &MatchingOpInfo, SelectionDAG &DAG)
Make sure that the output operand OpInfo and its corresponding input operand MatchingOpInfo have comp...
static void findUnwindDestinations(FunctionLoweringInfo &FuncInfo, const BasicBlock *EHPadBB, BranchProbability Prob, SmallVectorImpl< std::pair< MachineBasicBlock *, BranchProbability > > &UnwindDests)
When an invoke or a cleanupret unwinds to the next EH pad, there are many places it could ultimately ...
static unsigned FixedPointIntrinsicToOpcode(unsigned Intrinsic)
static BranchProbability scaleCaseProbality(BranchProbability CaseProb, BranchProbability PeeledCaseProb)
static SDValue expandExp2(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandExp2 - Lower an exp2 intrinsic.
static SDValue expandDivFix(unsigned Opcode, const SDLoc &DL, SDValue LHS, SDValue RHS, SDValue Scale, SelectionDAG &DAG, const TargetLowering &TLI)
static SDValue getF32Constant(SelectionDAG &DAG, unsigned Flt, const SDLoc &dl)
getF32Constant - Get 32-bit floating point constant.
static SDValue widenVectorToPartType(SelectionDAG &DAG, SDValue Val, const SDLoc &DL, EVT PartVT)
static SDValue expandLog10(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandLog10 - Lower a log10 intrinsic.
DenseMap< const Argument *, std::pair< const AllocaInst *, const StoreInst * > > ArgCopyElisionMapTy
static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &dl, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, const Value *V, std::optional< CallingConv::ID > CallConv)
getCopyToPartsVector - Create a series of nodes that contain the specified value split into legal par...
static void getUnderlyingArgRegs(SmallVectorImpl< std::pair< Register, TypeSize > > &Regs, const SDValue &N)
static void getCopyToParts(SelectionDAG &DAG, const SDLoc &DL, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, const Value *V, std::optional< CallingConv::ID > CallConv=std::nullopt, ISD::NodeType ExtendKind=ISD::ANY_EXTEND)
getCopyToParts - Create a series of nodes that contain the specified value split into legal parts.
static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT, SelectionDAGBuilder &Builder)
static SDValue expandLog2(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandLog2 - Lower a log2 intrinsic.
static SDValue getAddressForMemoryInput(SDValue Chain, const SDLoc &Location, SDISelAsmOperandInfo &OpInfo, SelectionDAG &DAG)
Get a direct memory input to behave well as an indirect operand.
static bool isOnlyUsedInEntryBlock(const Argument *A, bool FastISel)
isOnlyUsedInEntryBlock - If the specified argument is only used in the entry block,...
static void diagnosePossiblyInvalidConstraint(LLVMContext &Ctx, const Value *V, const Twine &ErrMsg)
static bool collectInstructionDeps(SmallMapVector< const Instruction *, bool, 8 > *Deps, const Value *V, SmallMapVector< const Instruction *, bool, 8 > *Necessary=nullptr, unsigned Depth=0)
static void findArgumentCopyElisionCandidates(const DataLayout &DL, FunctionLoweringInfo *FuncInfo, ArgCopyElisionMapTy &ArgCopyElisionCandidates)
Scan the entry block of the function in FuncInfo for arguments that look like copies into a local all...
static bool isFunction(SDValue Op)
static SDValue GetExponent(SelectionDAG &DAG, SDValue Op, const TargetLowering &TLI, const SDLoc &dl)
GetExponent - Get the exponent:
static Register FollowCopyChain(MachineRegisterInfo &MRI, Register Reg)
static SDValue ExpandPowI(const SDLoc &DL, SDValue LHS, SDValue RHS, SelectionDAG &DAG)
ExpandPowI - Expand a llvm.powi intrinsic.
static SDValue expandLog(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandLog - Lower a log intrinsic.
static SDValue getCopyFromParts(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V, SDValue InChain, std::optional< CallingConv::ID > CC=std::nullopt, std::optional< ISD::NodeType > AssertOp=std::nullopt)
getCopyFromParts - Create a value that contains the specified legal parts combined into the value the...
static SDValue getLimitedPrecisionExp2(SDValue t0, const SDLoc &dl, SelectionDAG &DAG)
static SDValue GetSignificand(SelectionDAG &DAG, SDValue Op, const SDLoc &dl)
GetSignificand - Get the significand and build it into a floating-point number with exponent of 1:
static SDValue expandExp(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandExp - Lower an exp intrinsic.
static const MDNode * getRangeMetadata(const Instruction &I)
static cl::opt< unsigned, true > LimitFPPrecision("limit-float-precision", cl::desc("Generate low-precision inline sequences " "for some float libcalls"), cl::location(LimitFloatPrecision), cl::Hidden, cl::init(0))
static void tryToElideArgumentCopy(FunctionLoweringInfo &FuncInfo, SmallVectorImpl< SDValue > &Chains, DenseMap< int, int > &ArgCopyElisionFrameIndexMap, SmallPtrSetImpl< const Instruction * > &ElidedArgCopyInstrs, ArgCopyElisionMapTy &ArgCopyElisionCandidates, const Argument &Arg, ArrayRef< SDValue > ArgVals, bool &ArgHasUses)
Try to elide argument copies from memory into a local alloca.
static unsigned LimitFloatPrecision
LimitFloatPrecision - Generate low-precision inline sequences for some float libcalls (6,...
static SDValue getCopyFromPartsVector(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V, SDValue InChain, std::optional< CallingConv::ID > CC)
getCopyFromPartsVector - Create a value that contains the specified legal parts combined into the val...
static bool InBlock(const Value *V, const BasicBlock *BB)
static FPClassTest getNoFPClass(const Instruction &I)
static LLVM_ATTRIBUTE_ALWAYS_INLINE MVT::SimpleValueType getSimpleVT(const uint8_t *MatcherTable, size_t &MatcherIndex)
getSimpleVT - Decode a value in MatcherTable, if it's a VBR encoded value, use GetVBR to decode it.
This file defines the SmallPtrSet class.
This file contains some functions that are useful when dealing with strings.
#define LLVM_DEBUG(...)
Definition Debug.h:114
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
This pass exposes codegen information to IR-level passes.
uint16_t RegSizeInBits(const MCRegisterInfo &MRI, MCRegister RegNo)
Value * RHS
Value * LHS
static const fltSemantics & IEEEsingle()
Definition APFloat.h:296
static LLVM_ABI Semantics SemanticsToEnum(const llvm::fltSemantics &Sem)
Definition APFloat.cpp:145
static LLVM_ABI const fltSemantics * getArbitraryFPSemantics(StringRef Format)
Returns the fltSemantics for a given arbitrary FP format string, or nullptr if invalid.
Definition APFloat.cpp:6089
Class for arbitrary precision integers.
Definition APInt.h:78
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:335
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:441
an instruction to allocate memory on the stack
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
LLVM_ABI std::optional< TypeSize > getAllocationSize(const DataLayout &DL) const
Get allocation size in bytes.
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
LLVM_ABI bool hasAttribute(Attribute::AttrKind Kind) const
Check if an argument has a given attribute.
Definition Function.cpp:338
unsigned getArgNo() const
Return the index of this formal argument in its containing function.
Definition Argument.h:50
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator end() const
Definition ArrayRef.h:131
size_t size() const
size - Get the array size.
Definition ArrayRef.h:142
iterator begin() const
Definition ArrayRef.h:130
bool empty() const
empty - Check if the array is empty.
Definition ArrayRef.h:137
A cache of @llvm.assume calls within a function.
An instruction that atomically checks whether a specified value is in a memory location,...
an instruction that atomically reads a memory location, combines it with another value,...
@ Add
*p = old + v
@ FAdd
*p = old + v
@ USubCond
Subtract only if no unsigned overflow.
@ FMinimum
*p = minimum(old, v) minimum matches the behavior of llvm.minimum.
@ Min
*p = old <signed v ? old : v
@ Sub
*p = old - v
@ And
*p = old & v
@ Xor
*p = old ^ v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ FMaximum
*p = maximum(old, v) maximum matches the behavior of llvm.maximum.
@ FSub
*p = old - v
@ UIncWrap
Increment one up to a maximum value.
@ Max
*p = old >signed v ? old : v
@ UMin
*p = old <unsigned v ? old : v
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
@ UMax
*p = old >unsigned v ? old : v
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
@ Nand
*p = ~(old & v)
This class holds the attributes for a particular argument, parameter, function, or return value.
Definition Attributes.h:407
LLVM Basic Block Representation.
Definition BasicBlock.h:62
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
InstListType::const_iterator const_iterator
Definition BasicBlock.h:171
LLVM_ABI bool isEntryBlock() const
Return true if this is the entry block of the containing function.
LLVM_ABI InstListType::const_iterator getFirstNonPHIOrDbg(bool SkipPseudoOp=true) const
Returns a pointer to the first instruction in this block that is not a PHINode or a debug intrinsic,...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
Definition BasicBlock.h:233
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
This class represents a no-op cast from one type to another.
The address of a basic block.
Definition Constants.h:904
Conditional or Unconditional Branch instruction.
Analysis providing branch probability information.
LLVM_ABI BranchProbability getEdgeProbability(const BasicBlock *Src, unsigned IndexInSuccessors) const
Get an edge's probability, relative to other out-edges of the Src.
LLVM_ABI bool isEdgeHot(const BasicBlock *Src, const BasicBlock *Dst) const
Test if an edge is hot relative to other out-edges of the Src.
static uint32_t getDenominator()
static BranchProbability getOne()
static BranchProbability getUnknown()
uint32_t getNumerator() const
LLVM_ABI uint64_t scale(uint64_t Num) const
Scale a large integer.
BranchProbability getCompl() const
static BranchProbability getZero()
static void normalizeProbabilities(ProbabilityIter Begin, ProbabilityIter End)
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
std::optional< OperandBundleUse > getOperandBundle(StringRef Name) const
Return an operand bundle by name, if present.
CallingConv::ID getCallingConv() const
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
LLVM_ABI bool isMustTailCall() const
Tests if this call site must be tail call optimized.
LLVM_ABI bool isIndirectCall() const
Return true if the callsite is an indirect call.
unsigned countOperandBundlesOfType(StringRef Name) const
Return the number of operand bundles with the tag Name attached to this instruction.
Value * getCalledOperand() const
Value * getArgOperand(unsigned i) const
User::op_iterator arg_end()
Return the iterator pointing to the end of the argument list.
bool isConvergent() const
Determine if the invoke is convergent.
FunctionType * getFunctionType() const
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
LLVM_ABI bool isTailCall() const
Tests if this call site is marked as a tail call.
CallBr instruction, tracking function calls that may not return control but instead transfer it to a ...
This class represents a function call, abstracting a target machine's calling convention.
This class is the base class for the comparison instructions.
Definition InstrTypes.h:664
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:676
Conditional Branch instruction.
ConstantDataSequential - A vector or array constant whose element type is a simple 1/2/4/8-byte integ...
Definition Constants.h:598
A constant value that is initialized with an expression using other constant values.
Definition Constants.h:1130
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:282
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:1037
uint64_t getZExtValue() const
Constant Vector Declarations.
Definition Constants.h:522
This is an important base class in LLVM.
Definition Constant.h:43
This is the common base class for constrained floating point intrinsics.
LLVM_ABI std::optional< fp::ExceptionBehavior > getExceptionBehavior() const
LLVM_ABI unsigned getNonMetadataArgCount() const
DWARF expression.
LLVM_ABI bool isEntryValue() const
Check if the expression consists of exactly one entry value operand.
static bool fragmentsOverlap(const FragmentInfo &A, const FragmentInfo &B)
Check if fragments overlap between a pair of FragmentInfos.
static LLVM_ABI DIExpression * appendOpsToArg(const DIExpression *Expr, ArrayRef< uint64_t > Ops, unsigned ArgNo, bool StackValue=false)
Create a copy of Expr by appending the given list of Ops to each instance of the operand DW_OP_LLVM_a...
static LLVM_ABI std::optional< FragmentInfo > getFragmentInfo(expr_op_iterator Start, expr_op_iterator End)
Retrieve the details of this fragment expression.
LLVM_ABI uint64_t getNumLocationOperands() const
Return the number of unique location operands referred to (via DW_OP_LLVM_arg) in this expression; th...
static LLVM_ABI std::optional< DIExpression * > createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits)
Create a DIExpression to describe one part of an aggregate variable that is fragmented across multipl...
static LLVM_ABI const DIExpression * convertToUndefExpression(const DIExpression *Expr)
Removes all elements from Expr that do not apply to an undef debug value, which includes every operat...
static LLVM_ABI DIExpression * prepend(const DIExpression *Expr, uint8_t Flags, int64_t Offset=0)
Prepend DIExpr with a deref and offset operation and optionally turn it into a stack value or/and an ...
static LLVM_ABI DIExpression * prependOpcodes(const DIExpression *Expr, SmallVectorImpl< uint64_t > &Ops, bool StackValue=false, bool EntryValue=false)
Prepend DIExpr with the given opcodes and optionally turn it into a stack value.
Base class for variables.
LLVM_ABI std::optional< uint64_t > getSizeInBits() const
Determines the size of the variable's type.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
bool isBigEndian() const
Definition DataLayout.h:216
Records a position in IR for a source label (DILabel).
Base class for non-instruction debug metadata records that have positions within IR.
DebugLoc getDebugLoc() const
Record of a variable value-assignment, aka a non instruction representation of the dbg....
LLVM_ABI Value * getVariableLocationOp(unsigned OpIdx) const
DIExpression * getExpression() const
DILocalVariable * getVariable() const
LLVM_ABI iterator_range< location_op_iterator > location_ops() const
Get the locations corresponding to the variable referenced by the debug info intrinsic.
A debug info location.
Definition DebugLoc.h:123
LLVM_ABI DILocation * getInlinedAt() const
Definition DebugLoc.cpp:67
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:178
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
Definition DenseMap.h:74
bool empty() const
Definition DenseMap.h:109
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT, true > const_iterator
Definition DenseMap.h:75
iterator end()
Definition DenseMap.h:81
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:241
void reserve(size_type NumEntries)
Grow the densemap so that it can contain at least NumEntries items before resizing again.
Definition DenseMap.h:114
Diagnostic information for inline asm reporting.
static constexpr ElementCount getFixed(ScalarTy MinVal)
Definition TypeSize.h:309
static constexpr ElementCount get(ScalarTy MinVal, bool Scalable)
Definition TypeSize.h:315
constexpr bool isScalar() const
Exactly one element.
Definition TypeSize.h:320
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
Class representing an expression and its matching format.
This instruction extracts a struct member or array element value from an aggregate value.
This instruction compares its operands according to the predicate given to the constructor.
This is a fast-path instruction selection class that generates poor code and doesn't support illegal ...
Definition FastISel.h:66
bool allowReassoc() const
Flag queries.
Definition FMF.h:67
An instruction for ordering other memory operations.
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
Definition Type.cpp:802
This class represents a freeze function that returns random concrete value if an operand is either a ...
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
BranchProbabilityInfo * BPI
MachineBasicBlock * getMBB(const BasicBlock *BB) const
DenseMap< const AllocaInst *, int > StaticAllocaMap
StaticAllocaMap - Keep track of frame indices for fixed sized allocas in the entry block.
const LiveOutInfo * GetLiveOutRegInfo(Register Reg)
GetLiveOutRegInfo - Gets LiveOutInfo for a register, returning NULL if the register is a PHI destinat...
MachineBasicBlock * MBB
MBB - The current block.
Class to represent function types.
unsigned getNumParams() const
Return the number of fixed parameters this function type requires.
Type * getParamType(unsigned i) const
Parameter type accessors.
Type * getReturnType() const
Data structure describing the variable locations in a function.
const BasicBlock & getEntryBlock() const
Definition Function.h:809
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Definition Function.h:211
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
Definition Function.h:246
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition Function.h:711
bool hasParamAttribute(unsigned ArgNo, Attribute::AttrKind Kind) const
check if an attributes is in the list of attributes.
Definition Function.cpp:741
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
Definition Function.h:272
Constant * getPersonalityFn() const
Get the personality function associated with this function.
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:354
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
Definition Function.h:251
size_t arg_size() const
Definition Function.h:901
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:729
Garbage collection metadata for a single function.
Definition GCMetadata.h:80
bool hasNoUnsignedSignedWrap() const
bool hasNoUnsignedWrap() const
bool isInBounds() const
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
bool hasDLLImportStorageClass() const
Module * getParent()
Get the module that this global value is contained inside of...
This instruction compares its operands according to the predicate given to the constructor.
Indirect Branch Instruction.
This instruction inserts a struct field of array element value into an aggregate value.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
LLVM_ABI FastMathFlags getFastMathFlags() const LLVM_READONLY
Convenience function for getting all the fast-math flags, which must be an operator which supports th...
LLVM_ABI AAMDNodes getAAMetadata() const
Returns the AA metadata for this instruction.
@ MIN_INT_BITS
Minimum number of bits that can be specified.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
Invoke instruction.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
LLVM_ABI void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
The landingpad instruction holds all of the information necessary to generate correct exception handl...
A helper class to return the specified delimiter string after the first invocation of operator String...
An instruction for reading from memory.
static LocationSize precise(uint64_t Value)
static constexpr LocationSize beforeOrAfterPointer()
Any location before or after the base pointer (but still within the underlying object).
LLVM_ABI MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
LLVM_ABI MCSymbol * getOrCreateFrameAllocSymbol(const Twine &FuncName, unsigned Idx)
Gets a symbol that will be defined to the final stack offset of a local variable after codegen.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
Metadata node.
Definition Metadata.h:1080
Machine Value Type.
@ INVALID_SIMPLE_VALUE_TYPE
uint64_t getScalarSizeInBits() const
unsigned getVectorNumElements() const
bool isVector() const
Return true if this is a vector value type.
bool isInteger() const
Return true if this is an integer or a vector integer type.
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
ElementCount getVectorElementCount() const
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
bool bitsGE(MVT VT) const
Return true if this has no less bits than VT.
bool isScalarInteger() const
Return true if this is an integer, not including vectors.
static MVT getVectorVT(MVT VT, unsigned NumElements)
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
static MVT getIntegerVT(unsigned BitWidth)
void normalizeSuccProbs()
Normalize probabilities of all successors so that the sum of them becomes one.
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
LLVM_ABI void setSuccProbability(succ_iterator I, BranchProbability Prob)
Set successor probability of a given iterator.
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
SmallVectorImpl< MachineBasicBlock * >::iterator succ_iterator
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
void setIsEHContTarget(bool V=true)
Indicates if this is a target of Windows EH Continuation Guard.
void setIsEHFuncletEntry(bool V=true)
Indicates if this is the entry block of an EH funclet.
MachineInstrBundleIterator< MachineInstr > iterator
void setIsEHScopeEntry(bool V=true)
Indicates if this is the entry block of an EH scope, i.e., the block that that used to have a catchpa...
void setMachineBlockAddressTaken()
Set this block to indicate that its address is used as something other than the target of a terminato...
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
void setIsImmutableObjectIndex(int ObjectIdx, bool IsImmutable)
Marks the immutability of an object.
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
bool hasOpaqueSPAdjustment() const
Returns true if the function contains opaque dynamic stack adjustments.
int getStackProtectorIndex() const
Return the index for the stack protector object.
void setIsAliasedObjectIndex(int ObjectIdx, bool IsAliased)
Set "maybe pointed to by an LLVM IR value" for an object.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
void RemoveStackObject(int ObjectIdx)
Remove or mark dead a statically sized stack object.
void setFunctionContextIndex(int I)
const WinEHFuncInfo * getWinEHFuncInfo() const
getWinEHFuncInfo - Return information about how the current function uses Windows exception handling.
bool useDebugInstrRef() const
Returns true if the function's variable locations are tracked with instruction referencing.
void setCallSiteBeginLabel(MCSymbol *BeginLabel, unsigned Site)
Map the begin label for a call site.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, Align base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MCContext & getContext() const
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
void addCodeViewAnnotation(MCSymbol *Label, MDNode *MD)
Record annotations associated with a particular label.
Function & getFunction()
Return the LLVM function that this machine code represents.
BasicBlockListType::iterator iterator
void setHasEHContTarget(bool V)
void addInvoke(MachineBasicBlock *LandingPad, MCSymbol *BeginLabel, MCSymbol *EndLabel)
Provide the begin and end labels of an invoke style call and associate it with a try landing pad bloc...
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineInstr - Allocate a new MachineInstr.
void insert(iterator MBBI, MachineBasicBlock *MBB)
const MachineInstrBuilder & addSym(MCSymbol *Sym, unsigned char TargetFlags=0) const
const MachineInstrBuilder & addFrameIndex(int Idx) const
Representation of each machine instruction.
A description of a memory reference used in the backend.
Flags
Flags values. These may be or'd together.
@ MOVolatile
The memory access is volatile.
@ MODereferenceable
The memory access is dereferenceable (i.e., doesn't trap).
@ MOLoad
The memory access reads data.
@ MONonTemporal
The memory access is non-temporal.
@ MOInvariant
The memory access always returns the same value (or traps).
@ MOStore
The memory access writes data.
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
static MachineOperand CreateReg(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false, bool isRenamable=false)
static MachineOperand CreateFI(int Idx)
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
def_iterator def_begin(Register RegNo) const
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
LLVM_ABI MCRegister getLiveInPhysReg(Register VReg) const
getLiveInPhysReg - If VReg is a live-in virtual register, return the corresponding live-in physical r...
An SDNode that represents everything that will be needed to construct a MachineInstr.
bool contains(const KeyT &Key) const
Definition MapVector.h:146
std::pair< iterator, bool > try_emplace(const KeyT &Key, Ts &&...Args)
Definition MapVector.h:116
static MemoryLocation getAfter(const Value *Ptr, const AAMDNodes &AATags=AAMDNodes())
Return a location that may access any location after Ptr, while remaining within the underlying objec...
Metadata wrapper in the Value hierarchy.
Definition Metadata.h:184
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:79
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Definition Register.h:83
Resume the propagation of an exception.
Return a value (possibly void), from a function.
Holds the information from a dbg_label node through SDISel.
static SDDbgOperand fromNode(SDNode *Node, unsigned ResNo)
static SDDbgOperand fromFrameIdx(unsigned FrameIdx)
static SDDbgOperand fromVReg(Register VReg)
static SDDbgOperand fromConst(const Value *Const)
Holds the information from a dbg_value node through SDISel.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
iterator_range< value_op_iterator > op_values() const
unsigned getIROrder() const
Return the node ordering.
uint64_t getAsZExtVal() const
Helper method returns the zero-extended integer value of a ConstantSDNode.
unsigned getNumValues() const
Return the number of values defined/returned by this operator.
const SDValue & getOperand(unsigned Num) const
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDNode * getNode() const
get the SDNode which holds the desired result
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
TypeSize getValueSizeInBits() const
Returns the size of the value in bits.
const SDValue & getOperand(unsigned i) const
unsigned getResNo() const
get the index which selects a specific result in the SDNode
MVT getSimpleValueType() const
Return the simple ValueType of the referenced return value.
unsigned getOpcode() const
SelectionDAGBuilder - This is the common target-independent lowering implementation that is parameter...
SDValue getValue(const Value *V)
getValue - Return an SDValue for the given Value.
DenseMap< const Constant *, Register > ConstantsOut
void addDanglingDebugInfo(SmallVectorImpl< Value * > &Values, DILocalVariable *Var, DIExpression *Expr, bool IsVariadic, DebugLoc DL, unsigned Order)
Register a dbg_value which relies on a Value which we have not yet seen.
void visitDbgInfo(const Instruction &I)
void clearDanglingDebugInfo()
Clear the dangling debug information map.
void LowerCallTo(const CallBase &CB, SDValue Callee, bool IsTailCall, bool IsMustTailCall, const BasicBlock *EHPadBB=nullptr, const TargetLowering::PtrAuthInfo *PAI=nullptr)
void clear()
Clear out the current SelectionDAG and the associated state and prepare this SelectionDAGBuilder obje...
void visitBitTestHeader(SwitchCG::BitTestBlock &B, MachineBasicBlock *SwitchBB)
visitBitTestHeader - This function emits necessary code to produce value suitable for "bit tests"
void LowerStatepoint(const GCStatepointInst &I, const BasicBlock *EHPadBB=nullptr)
std::unique_ptr< SDAGSwitchLowering > SL
SDValue lowerRangeToAssertZExt(SelectionDAG &DAG, const Instruction &I, SDValue Op)
bool HasTailCall
This is set to true if a call in the current block has been translated as a tail call.
bool ShouldEmitAsBranches(const std::vector< SwitchCG::CaseBlock > &Cases)
If the set of cases should be emitted as a series of branches, return true.
void EmitBranchForMergedCondition(const Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB, BranchProbability TProb, BranchProbability FProb, bool InvertCond)
EmitBranchForMergedCondition - Helper method for FindMergedConditions.
void LowerDeoptimizeCall(const CallInst *CI)
void LowerCallSiteWithDeoptBundle(const CallBase *Call, SDValue Callee, const BasicBlock *EHPadBB)
SwiftErrorValueTracking & SwiftError
Information about the swifterror values used throughout the function.
SDValue getNonRegisterValue(const Value *V)
getNonRegisterValue - Return an SDValue for the given Value, but don't look in FuncInfo....
const TargetTransformInfo * TTI
DenseMap< MachineBasicBlock *, SmallVector< unsigned, 4 > > LPadToCallSiteMap
Map a landing pad to the call site indexes.
SDValue lowerNoFPClassToAssertNoFPClass(SelectionDAG &DAG, const Instruction &I, SDValue Op)
void handleDebugDeclare(Value *Address, DILocalVariable *Variable, DIExpression *Expression, DebugLoc DL)
bool shouldKeepJumpConditionsTogether(const FunctionLoweringInfo &FuncInfo, const BranchInst &I, Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs, TargetLoweringBase::CondMergingParams Params) const
StatepointLoweringState StatepointLowering
State used while lowering a statepoint sequence (gc_statepoint, gc_relocate, and gc_result).
void visitBitTestCase(SwitchCG::BitTestBlock &BB, MachineBasicBlock *NextMBB, BranchProbability BranchProbToNext, Register Reg, SwitchCG::BitTestCase &B, MachineBasicBlock *SwitchBB)
visitBitTestCase - this function produces one "bit test"
bool canTailCall(const CallBase &CB) const
void populateCallLoweringInfo(TargetLowering::CallLoweringInfo &CLI, const CallBase *Call, unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy, AttributeSet RetAttrs, bool IsPatchPoint)
Populate a CallLowerinInfo (into CLI) based on the properties of the call being lowered.
void CopyValueToVirtualRegister(const Value *V, Register Reg, ISD::NodeType ExtendType=ISD::ANY_EXTEND)
void salvageUnresolvedDbgValue(const Value *V, DanglingDebugInfo &DDI)
For the given dangling debuginfo record, perform last-ditch efforts to resolve the debuginfo to somet...
SmallVector< SDValue, 8 > PendingLoads
Loads are not emitted to the program immediately.
GCFunctionInfo * GFI
Garbage collection metadata for the function.
void init(GCFunctionInfo *gfi, BatchAAResults *BatchAA, AssumptionCache *AC, const TargetLibraryInfo *li, const TargetTransformInfo &TTI)
SDValue getRoot()
Similar to getMemoryRoot, but also flushes PendingConstrainedFP(Strict) items.
void ExportFromCurrentBlock(const Value *V)
ExportFromCurrentBlock - If this condition isn't known to be exported from the current basic block,...
void resolveOrClearDbgInfo()
Evict any dangling debug information, attempting to salvage it first.
std::pair< SDValue, SDValue > lowerInvokable(TargetLowering::CallLoweringInfo &CLI, const BasicBlock *EHPadBB=nullptr)
SDValue getMemoryRoot()
Return the current virtual root of the Selection DAG, flushing any PendingLoad items.
void resolveDanglingDebugInfo(const Value *V, SDValue Val)
If we saw an earlier dbg_value referring to V, generate the debug data structures now that we've seen...
void visit(const Instruction &I)
void dropDanglingDebugInfo(const DILocalVariable *Variable, const DIExpression *Expr)
If we have dangling debug info that describes Variable, or an overlapping part of variable considerin...
SDValue getCopyFromRegs(const Value *V, Type *Ty)
If there was virtual register allocated for the value V emit CopyFromReg of the specified type Ty.
void CopyToExportRegsIfNeeded(const Value *V)
CopyToExportRegsIfNeeded - If the given value has virtual registers created for it,...
void handleKillDebugValue(DILocalVariable *Var, DIExpression *Expr, DebugLoc DbgLoc, unsigned Order)
Create a record for a kill location debug intrinsic.
void visitJumpTable(SwitchCG::JumpTable &JT)
visitJumpTable - Emit JumpTable node in the current MBB
SDValue getFPOperationRoot(fp::ExceptionBehavior EB)
Return the current virtual root of the Selection DAG, flushing PendingConstrainedFP or PendingConstra...
void visitJumpTableHeader(SwitchCG::JumpTable &JT, SwitchCG::JumpTableHeader &JTH, MachineBasicBlock *SwitchBB)
visitJumpTableHeader - This function emits necessary code to produce index in the JumpTable from swit...
void LowerCallSiteWithPtrAuthBundle(const CallBase &CB, const BasicBlock *EHPadBB)
static const unsigned LowestSDNodeOrder
Lowest valid SDNodeOrder.
FunctionLoweringInfo & FuncInfo
Information about the function as a whole.
void setValue(const Value *V, SDValue NewN)
void FindMergedConditions(const Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB, Instruction::BinaryOps Opc, BranchProbability TProb, BranchProbability FProb, bool InvertCond)
const TargetLibraryInfo * LibInfo
bool isExportableFromCurrentBlock(const Value *V, const BasicBlock *FromBB)
void visitSPDescriptorParent(StackProtectorDescriptor &SPD, MachineBasicBlock *ParentBB)
Codegen a new tail for a stack protector check ParentMBB which has had its tail spliced into a stack ...
bool handleDebugValue(ArrayRef< const Value * > Values, DILocalVariable *Var, DIExpression *Expr, DebugLoc DbgLoc, unsigned Order, bool IsVariadic)
For a given list of Values, attempt to create and record a SDDbgValue in the SelectionDAG.
SDValue getControlRoot()
Similar to getRoot, but instead of flushing all the PendingLoad items, flush all the PendingExports (...
void UpdateSplitBlock(MachineBasicBlock *First, MachineBasicBlock *Last)
When an MBB was split during scheduling, update the references that need to refer to the last resulti...
SDValue getValueImpl(const Value *V)
getValueImpl - Helper function for getValue and getNonRegisterValue.
void visitSwitchCase(SwitchCG::CaseBlock &CB, MachineBasicBlock *SwitchBB)
visitSwitchCase - Emits the necessary code to represent a single node in the binary search tree resul...
void visitSPDescriptorFailure(StackProtectorDescriptor &SPD)
Codegen the failure basic block for a stack protector check.
std::unique_ptr< FunctionLoweringInfo > FuncInfo
SmallPtrSet< const Instruction *, 4 > ElidedArgCopyInstrs
const TargetLowering * TLI
MachineRegisterInfo * RegInfo
std::unique_ptr< SwiftErrorValueTracking > SwiftError
virtual void emitFunctionEntryCode()
std::unique_ptr< SelectionDAGBuilder > SDB
virtual std::pair< SDValue, SDValue > EmitTargetCodeForMemccpy(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, SDValue C, SDValue Size, const CallInst *CI) const
Emit target-specific code that performs a memccpy, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrnlen(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src, SDValue MaxLength, MachinePointerInfo SrcPtrInfo) const
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrlen(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src, const CallInst *CI) const
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrstr(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, const CallInst *CI) const
Emit target-specific code that performs a strstr, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForMemchr(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Src, SDValue Char, SDValue Length, MachinePointerInfo SrcPtrInfo) const
Emit target-specific code that performs a memchr, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrcmp(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, MachinePointerInfo Op1PtrInfo, MachinePointerInfo Op2PtrInfo, const CallInst *CI) const
Emit target-specific code that performs a strcmp, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForMemcmp(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, SDValue Op3, const CallInst *CI) const
Emit target-specific code that performs a memcmp/bcmp, in cases where that is faster than a libcall.
virtual SDValue EmitTargetCodeForSetTag(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Addr, SDValue Size, MachinePointerInfo DstPtrInfo, bool ZeroData) const
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrcpy(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dest, SDValue Src, MachinePointerInfo DestPtrInfo, MachinePointerInfo SrcPtrInfo, bool isStpcpy, const CallInst *CI) const
Emit target-specific code that performs a strcpy or stpcpy, in cases where that is faster than a libc...
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
SDValue getExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT, unsigned Opcode)
Convert Op, which must be of integer type, to the integer type VT, by either any/sign/zero-extending ...
const SDValue & getRoot() const
Return the root tag of the SelectionDAG.
const TargetSubtargetInfo & getSubtarget() const
SDValue getCopyToReg(SDValue Chain, const SDLoc &dl, Register Reg, SDValue N)
LLVM_ABI SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
LLVM_ABI SDValue getShiftAmountConstant(uint64_t Val, EVT VT, const SDLoc &DL)
LLVM_ABI MachineSDNode * getMachineNode(unsigned Opcode, const SDLoc &dl, EVT VT)
These are used for target selectors to create a new node with specified return type(s),...
LLVM_ABI void ExtractVectorElements(SDValue Op, SmallVectorImpl< SDValue > &Args, unsigned Start=0, unsigned Count=0, EVT EltVT=EVT())
Append the extracted elements from Start to Count out of the vector Op in Args.
LLVM_ABI SDValue getConstantPool(const Constant *C, EVT VT, MaybeAlign Align=std::nullopt, int Offs=0, bool isT=false, unsigned TargetFlags=0)
LLVM_ABI SDValue getConstantFP(double Val, const SDLoc &DL, EVT VT, bool isTarget=false)
Create a ConstantFPSDNode wrapping a constant value.
LLVM_ABI SDValue getRegister(Register Reg, EVT VT)
LLVM_ABI SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr)
Loads are not normal binary operators: their result type is not determined by their operands,...
LLVM_ABI Align getEVTAlign(EVT MemoryVT) const
Compute the default alignment value for the given type.
LLVM_ABI bool shouldOptForSize() const
const TargetLowering & getTargetLoweringInfo() const
static constexpr unsigned MaxRecursionDepth
LLVM_ABI void AddDbgValue(SDDbgValue *DB, bool isParameter)
Add a dbg_value SDNode.
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Ops)
Return an ISD::BUILD_VECTOR node.
LLVM_ABI SDValue getBitcast(EVT VT, SDValue V)
Return a bitcast using the SDLoc of the value operand, and casting to the provided type.
LLVM_ABI SDDbgValue * getDbgValueList(DIVariable *Var, DIExpression *Expr, ArrayRef< SDDbgOperand > Locs, ArrayRef< SDNode * > Dependencies, bool IsIndirect, const DebugLoc &DL, unsigned O, bool IsVariadic)
Creates a SDDbgValue node from a list of locations.
SDValue getCopyFromReg(SDValue Chain, const SDLoc &dl, Register Reg, EVT VT)
LLVM_ABI void setNodeMemRefs(MachineSDNode *N, ArrayRef< MachineMemOperand * > NewMemRefs)
Mutate the specified machine node's memory references to the provided list.
const DataLayout & getDataLayout() const
SDValue getTargetFrameIndex(int FI, EVT VT)
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getMemBasePlusOffset(SDValue Base, TypeSize Offset, const SDLoc &DL, const SDNodeFlags Flags=SDNodeFlags())
Returns sum of the base pointer and offset.
LLVM_ABI SDValue getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
LLVM_ABI SDValue getBasicBlock(MachineBasicBlock *MBB)
LLVM_ABI SDValue getPtrExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either truncating it or perform...
LLVM_ABI SDValue getAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either any-extending or truncat...
const LibcallLoweringInfo & getLibcalls() const
LLVM_ABI SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI SDValue getValueType(EVT)
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
LLVM_ABI SDValue getFPExtendOrRound(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of float type, to the float type VT, by either extending or rounding (by tr...
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
LLVM_ABI SDValue getVectorIdxConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
MachineFunction & getMachineFunction() const
LLVM_ABI SDValue getFrameIndex(int FI, EVT VT, bool isTarget=false)
LLVM_ABI SDValue getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either zero-extending or trunca...
LLVMContext * getContext() const
const SDValue & setRoot(SDValue N)
Set the current root tag of the SelectionDAG.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void swap(SmallVectorImpl &RHS)
void resize(size_type N)
void push_back(const T &Elt)
pointer data()
Return a pointer to the vector's buffer, even if empty().
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Encapsulates all of the information needed to generate a stack protector check, and signals to isel w...
MachineBasicBlock * getSuccessMBB()
MachineBasicBlock * getFailureMBB()
MachineBasicBlock * getParentMBB()
bool shouldEmitFunctionBasedCheckStackProtector() const
An instruction for storing to memory.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:140
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:137
Multiway switch.
Information about stack frame layout on the target.
virtual TargetStackID::Value getStackIDForScalableVectors() const
Returns the StackID that scalable vectors should be associated with.
Provides information about what library functions are available for the current target.
virtual Align getByValTypeAlignment(Type *Ty, const DataLayout &DL) const
Returns the desired alignment for ByVal or InAlloca aggregate function arguments in the caller parame...
virtual bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF, EVT) const
Return true if an FMA operation is faster than a pair of fmul and fadd instructions.
EVT getMemValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Function * getSSPStackGuardCheck(const Module &M, const LibcallLoweringInfo &Libcalls) const
If the target has a standard stack protection check function that performs validation and error handl...
EVT getValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Return the EVT corresponding to this LLVM type.
LegalizeAction
This enum indicates whether operations are valid for a target, and if not, what action should be used...
virtual bool useStackGuardXorFP() const
If this function returns true, stack protection checks should XOR the frame pointer (or whichever poi...
virtual const TargetRegisterClass * getRegClassFor(MVT VT, bool isDivergent=false) const
Return the register class that should be used for the specified value type.
virtual bool isLegalScaleForGatherScatter(uint64_t Scale, uint64_t ElemSize) const
virtual bool isSExtCheaperThanZExt(EVT FromTy, EVT ToTy) const
Return true if sign-extension from FromTy to ToTy is cheaper than zero-extension.
MVT getVectorIdxTy(const DataLayout &DL) const
Returns the type to be used for the index operand of: ISD::INSERT_VECTOR_ELT, ISD::EXTRACT_VECTOR_ELT...
virtual unsigned getNumRegistersForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain targets require unusual breakdowns of certain types.
virtual bool isZExtFree(Type *FromTy, Type *ToTy) const
Return true if any actual instruction that defines a value of type FromTy implicitly zero-extends the...
virtual MVT getRegisterTypeForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain combinations of ABIs, Targets and features require that types are legal for some operations a...
virtual unsigned getNumRegisters(LLVMContext &Context, EVT VT, std::optional< MVT > RegisterVT=std::nullopt) const
Return the number of registers that this ValueType will eventually require.
unsigned getBitWidthForCttzElements(Type *RetTy, ElementCount EC, bool ZeroIsPoison, const ConstantRange *VScaleRange) const
Return the minimum number of bits required to hold the maximum possible number of trailing zero vecto...
virtual bool shouldExtendGSIndex(EVT VT, EVT &EltTy) const
Returns true if the index type for a masked gather/scatter requires extending.
virtual unsigned getVectorTypeBreakdownForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const
Certain targets such as MIPS require that some types such as vectors are always broken down into scal...
Register getStackPointerRegisterToSaveRestore() const
If a physical register, this specifies the register that llvm.savestack/llvm.restorestack should save...
LegalizeAction getFixedPointOperationAction(unsigned Op, EVT VT, unsigned Scale) const
Some fixed point operations may be natively supported by the target but only for specific scales.
MachineMemOperand::Flags getAtomicMemOperandFlags(const Instruction &AI, const DataLayout &DL) const
virtual bool allowsMisalignedMemoryAccesses(EVT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *=nullptr) const
Determine if the target supports unaligned memory accesses.
bool isOperationCustom(unsigned Op, EVT VT) const
Return true if the operation uses custom lowering, regardless of whether the type is legal or not.
bool hasBigEndianPartOrdering(EVT VT, const DataLayout &DL) const
When splitting a value of the specified type into parts, does the Lo or Hi part come first?
EVT getShiftAmountTy(EVT LHSTy, const DataLayout &DL) const
Returns the type for the shift amount of a shift opcode.
virtual Align getABIAlignmentForCallingConv(Type *ArgTy, const DataLayout &DL) const
Certain targets have context sensitive alignment requirements, where one type has the alignment requi...
MachineMemOperand::Flags getVPIntrinsicMemOperandFlags(const VPIntrinsic &VPIntrin) const
virtual bool shouldExpandGetActiveLaneMask(EVT VT, EVT OpVT) const
Return true if the @llvm.get.active.lane.mask intrinsic should be expanded using generic code in Sele...
virtual EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const
Return the ValueType of the result of SETCC operations.
MachineMemOperand::Flags getLoadMemOperandFlags(const LoadInst &LI, const DataLayout &DL, AssumptionCache *AC=nullptr, const TargetLibraryInfo *LibInfo=nullptr) const
virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
MVT getProgramPointerTy(const DataLayout &DL) const
Return the type for code pointers, which is determined by the program address space specified through...
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
bool isOperationLegal(unsigned Op, EVT VT) const
Return true if the specified operation is legal on this target.
virtual bool shouldExpandVectorMatch(EVT VT, unsigned SearchSize) const
Return true if the @llvm.experimental.vector.match intrinsic should be expanded for vector type ‘VT’ ...
virtual bool isProfitableToCombineMinNumMaxNum(EVT VT) const
virtual MVT getFenceOperandTy(const DataLayout &DL) const
Return the type for operands of fence.
virtual bool shouldExpandGetVectorLength(EVT CountVT, unsigned VF, bool IsScalable) const
bool isOperationLegalOrCustom(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal with custom lower...
virtual MVT hasFastEqualityCompare(unsigned NumBits) const
Return the preferred operand type if the target has a quick way to compare integer values of the give...
MachineMemOperand::Flags getStoreMemOperandFlags(const StoreInst &SI, const DataLayout &DL) const
virtual void getTgtMemIntrinsic(SmallVectorImpl< IntrinsicInfo > &Infos, const CallBase &I, MachineFunction &MF, unsigned Intrinsic) const
Given an intrinsic, checks if on the target the intrinsic will need to map to a MemIntrinsicNode (tou...
virtual bool shouldExpandCttzElements(EVT VT) const
Return true if the @llvm.experimental.cttz.elts intrinsic should be expanded using generic code in Se...
virtual bool signExtendConstant(const ConstantInt *C) const
Return true if this constant should be sign extended when promoting to a larger type.
virtual Value * getSDagStackGuard(const Module &M, const LibcallLoweringInfo &Libcalls) const
Return the variable that's previously inserted by insertSSPDeclarations, if any, otherwise return nul...
LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const
Return how we should legalize values of this type, either it is already legal (return 'Legal') or we ...
virtual Register getExceptionPointerRegister(const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception address on entry to an ...
bool supportsUnalignedAtomics() const
Whether the target supports unaligned atomic operations.
std::vector< ArgListEntry > ArgListTy
bool isBeneficialToExpandPowI(int64_t Exponent, bool OptForSize) const
Return true if it is beneficial to expand an @llvm.powi.
MVT getFrameIndexTy(const DataLayout &DL) const
Return the type for frame index, which is determined by the alloca address space specified through th...
virtual Register getExceptionSelectorRegister(const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception typeid on entry to a la...
virtual MVT getPointerMemTy(const DataLayout &DL, uint32_t AS=0) const
Return the in-memory pointer type for the given address space, defaults to the pointer type from the ...
MVT getRegisterType(MVT VT) const
Return the type of registers that this ValueType will eventually require.
unsigned getVectorTypeBreakdown(LLVMContext &Context, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const
Vector types are broken down into some number of legal first class types.
virtual MVT getVPExplicitVectorLengthTy() const
Returns the type to be used for the EVL/AVL operand of VP nodes: ISD::VP_ADD, ISD::VP_SUB,...
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
virtual bool supportKCFIBundles() const
Return true if the target supports kcfi operand bundles.
virtual bool supportPtrAuthBundles() const
Return true if the target supports ptrauth operand bundles.
virtual bool supportSwiftError() const
Return true if the target supports swifterror attribute.
virtual SDValue visitMaskedLoad(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, MachineMemOperand *MMO, SDValue &NewLoad, SDValue Ptr, SDValue PassThru, SDValue Mask) const
virtual SDValue emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val, const SDLoc &DL) const
virtual EVT getTypeForExtReturn(LLVMContext &Context, EVT VT, ISD::NodeType) const
Return the type that should be used to zero or sign extend a zeroext/signext integer return value.
virtual InlineAsm::ConstraintCode getInlineAsmMemConstraint(StringRef ConstraintCode) const
std::vector< AsmOperandInfo > AsmOperandInfoVector
SDValue expandIS_FPCLASS(EVT ResultVT, SDValue Op, FPClassTest Test, SDNodeFlags Flags, const SDLoc &DL, SelectionDAG &DAG) const
Expand check for floating point class.
virtual SDValue prepareVolatileOrAtomicLoad(SDValue Chain, const SDLoc &DL, SelectionDAG &DAG) const
This callback is used to prepare for a volatile or atomic load.
virtual ConstraintType getConstraintType(StringRef Constraint) const
Given a constraint, return the type of constraint it is for this target.
virtual bool splitValueIntoRegisterParts(SelectionDAG &DAG, const SDLoc &DL, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, std::optional< CallingConv::ID > CC) const
Target-specific splitting of values into parts that fit a register storing a legal type.
virtual SDValue joinRegisterPartsIntoValue(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, std::optional< CallingConv::ID > CC) const
Target-specific combining of register parts into its original value.
virtual SDValue LowerCall(CallLoweringInfo &, SmallVectorImpl< SDValue > &) const
This hook must be implemented to lower calls into the specified DAG.
std::pair< SDValue, SDValue > LowerCallTo(CallLoweringInfo &CLI) const
This function lowers an abstract call to a function into an actual call.
virtual SDValue LowerAsmOutputForConstraint(SDValue &Chain, SDValue &Glue, const SDLoc &DL, const AsmOperandInfo &OpInfo, SelectionDAG &DAG) const
virtual std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const
Given a physical register constraint (e.g.
virtual AsmOperandInfoVector ParseConstraints(const DataLayout &DL, const TargetRegisterInfo *TRI, const CallBase &Call) const
Split up the constraint string from the inline assembly value into the specific constraints and their...
virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const
This callback is invoked for operations that are unsupported by the target, which are registered to u...
virtual bool functionArgumentNeedsConsecutiveRegisters(Type *Ty, CallingConv::ID CallConv, bool isVarArg, const DataLayout &DL) const
For some targets, an LLVM struct type must be broken down into multiple simple types,...
virtual void ComputeConstraintToUse(AsmOperandInfo &OpInfo, SDValue Op, SelectionDAG *DAG=nullptr) const
Determines the constraint code and constraint type to use for the specific AsmOperandInfo,...
virtual void CollectTargetIntrinsicOperands(const CallInst &I, SmallVectorImpl< SDValue > &Ops, SelectionDAG &DAG) const
virtual SDValue visitMaskedStore(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, MachineMemOperand *MMO, SDValue Ptr, SDValue Val, SDValue Mask) const
virtual bool useLoadStackGuardNode(const Module &M) const
If this function returns true, SelectionDAGBuilder emits a LOAD_STACK_GUARD node when it is lowering ...
virtual void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint, std::vector< SDValue > &Ops, SelectionDAG &DAG) const
Lower the specified operand into the Ops vector.
std::pair< SDValue, SDValue > makeLibCall(SelectionDAG &DAG, RTLIB::LibcallImpl LibcallImpl, EVT RetVT, ArrayRef< SDValue > Ops, MakeLibCallOptions CallOptions, const SDLoc &dl, SDValue Chain=SDValue()) const
Returns a pair of (return value, chain).
virtual void LowerOperationWrapper(SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG) const
This callback is invoked by the type legalizer to legalize nodes with an illegal operand type but leg...
virtual bool isInlineAsmTargetBranch(const SmallVectorImpl< StringRef > &AsmStrs, unsigned OpNo) const
On x86, return true if the operand with index OpNo is a CALL or JUMP instruction, which can use eithe...
virtual MVT getJumpTableRegTy(const DataLayout &DL) const
virtual bool CanLowerReturn(CallingConv::ID, MachineFunction &, bool, const SmallVectorImpl< ISD::OutputArg > &, LLVMContext &, const Type *RetTy) const
This hook should be implemented to check whether the return values described by the Outs array can fi...
CodeGenOptLevel getOptLevel() const
Returns the optimization level: None, Less, Default, or Aggressive.
unsigned NoTrapAfterNoreturn
Do not emit a trap instruction for 'unreachable' IR instructions behind noreturn calls,...
unsigned TrapUnreachable
Emit target-specific trap instruction for 'unreachable' IR instructions.
unsigned getID() const
Return the register class ID number.
iterator begin() const
begin/end - Return all of the registers in this class.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
@ TCK_Latency
The latency of instruction.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:343
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
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:273
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:267
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:280
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:352
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:128
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:293
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:240
bool isTokenTy() const
Return true if this is 'token'.
Definition Type.h:234
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
Definition Type.cpp:300
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Definition Type.h:225
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:139
Unconditional Branch instruction.
This function has undefined behavior.
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
op_iterator op_begin()
Definition User.h:259
Value * getOperand(unsigned i) const
Definition User.h:207
unsigned getNumOperands() const
Definition User.h:229
op_iterator op_end()
Definition User.h:261
This class represents the va_arg llvm instruction, which returns an argument of the specified type gi...
LLVM_ABI CmpInst::Predicate getPredicate() const
This is the common base class for vector predication intrinsics.
static LLVM_ABI std::optional< unsigned > getVectorLengthParamPos(Intrinsic::ID IntrinsicID)
LLVM_ABI MaybeAlign getPointerAlignment() const
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:440
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:259
iterator_range< user_iterator > users()
Definition Value.h:427
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:713
bool use_empty() const
Definition Value.h:347
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
Base class of all SIMD vector types.
Type * getElementType() const
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:230
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
const ParentTy * getParent() const
Definition ilist_node.h:34
A raw_ostream that writes to an std::string.
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char SymbolName[]
Key for Kernel::Metadata::mSymbolName.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
Definition CallingConv.h:60
@ AMDGPU_CS_Chain
Used on AMDGPUs to give the middle-end more control over argument placement.
@ X86_VectorCall
MSVC calling convention that passes vectors and vector aggregates in SSE registers.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:41
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition ISDOpcodes.h:261
@ STACKRESTORE
STACKRESTORE has two operands, an input chain and a pointer to restore to it returns an output chain.
@ STACKSAVE
STACKSAVE - STACKSAVE has one operand, an input chain.
@ CTLZ_ZERO_UNDEF
Definition ISDOpcodes.h:788
@ CONVERGENCECTRL_ANCHOR
The llvm.experimental.convergence.* intrinsics.
@ STRICT_FSETCC
STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used for floating-point operands only.
Definition ISDOpcodes.h:511
@ DELETED_NODE
DELETED_NODE - This is an illegal value that is used to catch errors.
Definition ISDOpcodes.h:45
@ SET_FPENV
Sets the current floating-point environment.
@ LOOP_DEPENDENCE_RAW_MASK
@ VECREDUCE_SEQ_FADD
Generic reduction nodes.
@ COND_LOOP
COND_LOOP is a conditional branch to self, used for implementing efficient conditional traps.
@ EH_SJLJ_LONGJMP
OUTCHAIN = EH_SJLJ_LONGJMP(INCHAIN, buffer) This corresponds to the eh.sjlj.longjmp intrinsic.
Definition ISDOpcodes.h:168
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition ISDOpcodes.h:600
@ STACKADDRESS
STACKADDRESS - Represents the llvm.stackaddress intrinsic.
Definition ISDOpcodes.h:127
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:779
@ SMULFIX
RESULT = [US]MULFIX(LHS, RHS, SCALE) - Perform fixed point multiplication on 2 integers with the same...
Definition ISDOpcodes.h:394
@ VAEND
VAEND, VASTART - VAEND and VASTART have three operands: an input chain, pointer, and a SRCVALUE.
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, val, ptr) This corresponds to "store atomic" instruction.
@ RESET_FPENV
Set floating-point environment to default state.
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:264
@ SMULFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
Definition ISDOpcodes.h:400
@ SET_FPMODE
Sets the current dynamic floating-point control modes.
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:853
@ ATOMIC_LOAD_USUB_COND
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:518
@ VECTOR_FIND_LAST_ACTIVE
Finds the index of the last active mask element Operands: Mask.
@ FMODF
FMODF - Decomposes the operand into integral and fractional parts, each having the same type and sign...
@ FATAN2
FATAN2 - atan2, inspired by libm.
@ FSINCOSPI
FSINCOSPI - Compute both the sine and cosine times pi more accurately than FSINCOS(pi*x),...
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition ISDOpcodes.h:220
@ EH_SJLJ_SETUP_DISPATCH
OUTCHAIN = EH_SJLJ_SETUP_DISPATCH(INCHAIN) The target initializes the dispatch table here.
Definition ISDOpcodes.h:172
@ GlobalAddress
Definition ISDOpcodes.h:88
@ ATOMIC_CMP_SWAP_WITH_SUCCESS
Val, Success, OUTCHAIN = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) N.b.
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
Definition ISDOpcodes.h:880
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition ISDOpcodes.h:584
@ VECREDUCE_FMAX
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:417
@ VECREDUCE_FMAXIMUM
FMINIMUM/FMAXIMUM nodes propatate NaNs and signed zeroes using the llvm.minimum and llvm....
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
Definition ISDOpcodes.h:747
@ ATOMIC_FENCE
OUTCHAIN = ATOMIC_FENCE(INCHAIN, ordering, scope) This corresponds to the fence instruction.
@ RESET_FPMODE
Sets default dynamic floating-point control modes.
@ FMULADD
FMULADD - Performs a * b + c, with, or without, intermediate rounding.
Definition ISDOpcodes.h:528
@ FPTRUNC_ROUND
FPTRUNC_ROUND - This corresponds to the fptrunc_round intrinsic.
Definition ISDOpcodes.h:515
@ FAKE_USE
FAKE_USE represents a use of the operand but does not do anything.
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
Definition ISDOpcodes.h:993
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
Definition ISDOpcodes.h:254
@ CLMUL
Carry-less multiplication operations.
Definition ISDOpcodes.h:774
@ INIT_TRAMPOLINE
INIT_TRAMPOLINE - This corresponds to the init_trampoline intrinsic.
@ FLDEXP
FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
@ SDIVFIX
RESULT = [US]DIVFIX(LHS, RHS, SCALE) - Perform fixed point division on 2 integers with the same width...
Definition ISDOpcodes.h:407
@ CONVERT_FROM_ARBITRARY_FP
CONVERT_FROM_ARBITRARY_FP - This operator converts from an arbitrary floating-point represented as an...
@ EH_LABEL
EH_LABEL - Represents a label in mid basic block used to track locations needed for debug and excepti...
@ ATOMIC_LOAD_USUB_SAT
@ EH_RETURN
OUTCHAIN = EH_RETURN(INCHAIN, OFFSET, HANDLER) - This node represents 'eh_return' gcc dwarf builtin,...
Definition ISDOpcodes.h:156
@ ANNOTATION_LABEL
ANNOTATION_LABEL - Represents a mid basic block label used by annotations.
@ SET_ROUNDING
Set rounding mode.
Definition ISDOpcodes.h:975
@ CONVERGENCECTRL_GLUE
This does not correspond to any convergence control intrinsic.
@ PARTIAL_REDUCE_UMLA
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:844
@ PREALLOCATED_SETUP
PREALLOCATED_SETUP - This has 2 operands: an input chain and a SRCVALUE with the preallocated call Va...
@ READSTEADYCOUNTER
READSTEADYCOUNTER - This corresponds to the readfixedcounter intrinsic.
@ ADDROFRETURNADDR
ADDROFRETURNADDR - Represents the llvm.addressofreturnaddress intrinsic.
Definition ISDOpcodes.h:117
@ CONVERGENCECTRL_ENTRY
@ BR
Control flow instructions. These all have token chains.
@ VECREDUCE_FADD
These reductions have relaxed evaluation order semantics, and have a single vector operand.
@ CTTZ_ZERO_UNDEF
Bit counting operators with an undefined result for zero inputs.
Definition ISDOpcodes.h:787
@ PARTIAL_REDUCE_FMLA
@ PREFETCH
PREFETCH - This corresponds to a prefetch intrinsic.
@ FSINCOS
FSINCOS - Compute both fsin and fcos as a single operation.
@ SSUBO
Same for subtraction.
Definition ISDOpcodes.h:352
@ PREALLOCATED_ARG
PREALLOCATED_ARG - This has 3 operands: an input chain, a SRCVALUE with the preallocated call Value,...
@ BRIND
BRIND - Indirect branch.
@ BR_JT
BR_JT - Jumptable branch.
@ VECTOR_INTERLEAVE
VECTOR_INTERLEAVE(VEC1, VEC2, ...) - Returns N vectors from N input vectors, where N is the factor to...
Definition ISDOpcodes.h:635
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition ISDOpcodes.h:541
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
Definition ISDOpcodes.h:548
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition ISDOpcodes.h:374
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:796
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
Definition ISDOpcodes.h:247
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition ISDOpcodes.h:672
@ VACOPY
VACOPY - VACOPY has 5 operands: an input chain, a destination pointer, a source pointer,...
@ GET_ACTIVE_LANE_MASK
GET_ACTIVE_LANE_MASK - this corrosponds to the llvm.get.active.lane.mask intrinsic.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition ISDOpcodes.h:230
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition ISDOpcodes.h:348
@ ARITH_FENCE
ARITH_FENCE - This corresponds to a arithmetic fence intrinsic.
@ VECREDUCE_ADD
Integer reductions may have a result type larger than the vector element type.
@ GET_ROUNDING
Returns current rounding mode: -1 Undefined 0 Round to 0 1 Round to nearest, ties to even 2 Round to ...
Definition ISDOpcodes.h:970
@ CLEANUPRET
CLEANUPRET - Represents a return from a cleanup block funclet.
@ ATOMIC_LOAD_FMAXIMUM
@ GET_FPMODE
Reads the current dynamic floating-point control modes.
@ GET_FPENV
Gets the current floating-point environment.
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:765
@ AssertNoFPClass
AssertNoFPClass - These nodes record if a register contains a float value that is known to be not som...
Definition ISDOpcodes.h:78
@ PtrAuthGlobalAddress
A ptrauth constant.
Definition ISDOpcodes.h:100
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition ISDOpcodes.h:614
@ EntryToken
EntryToken - This is the marker used to indicate the start of a region.
Definition ISDOpcodes.h:48
@ READ_REGISTER
READ_REGISTER, WRITE_REGISTER - This node represents llvm.register on the DAG, which implements the n...
Definition ISDOpcodes.h:139
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition ISDOpcodes.h:576
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:850
@ DEBUGTRAP
DEBUGTRAP - Trap intended to get the attention of a debugger.
@ VSCALE
VSCALE(IMM) - Returns the runtime scaling factor used to calculate the number of elements within a sc...
@ LOCAL_RECOVER
LOCAL_RECOVER - Represents the llvm.localrecover intrinsic.
Definition ISDOpcodes.h:135
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum maximum on two values, following IEEE-754 definition...
@ UBSANTRAP
UBSANTRAP - Trap with an immediate describing the kind of sanitizer failure.
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
Definition ISDOpcodes.h:386
@ PATCHPOINT
The llvm.experimental.patchpoint.
@ SMULO
Same for multiplication.
Definition ISDOpcodes.h:356
@ ATOMIC_LOAD_FMINIMUM
@ DYNAMIC_STACKALLOC
DYNAMIC_STACKALLOC - Allocate some number of bytes on the stack aligned to a specified boundary.
@ VECTOR_SPLICE_LEFT
VECTOR_SPLICE_LEFT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1, VEC2) left by OFFSET elements an...
Definition ISDOpcodes.h:653
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:727
@ VECTOR_REVERSE
VECTOR_REVERSE(VECTOR) - Returns a vector, of the same type as VECTOR, whose elements are shuffled us...
Definition ISDOpcodes.h:640
@ SDIVFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
Definition ISDOpcodes.h:413
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:978
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition ISDOpcodes.h:805
@ PCMARKER
PCMARKER - This corresponds to the pcmarker intrinsic.
@ INLINEASM_BR
INLINEASM_BR - Branching version of inline asm. Used by asm-goto.
@ EH_DWARF_CFA
EH_DWARF_CFA - This node represents the pointer to the DWARF Canonical Frame Address (CFA),...
Definition ISDOpcodes.h:150
@ FRAMEADDR
FRAMEADDR, RETURNADDR - These nodes represent llvm.frameaddress and llvm.returnaddress on the DAG.
Definition ISDOpcodes.h:110
@ ATOMIC_LOAD_UDEC_WRAP
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition ISDOpcodes.h:500
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:926
@ READCYCLECOUNTER
READCYCLECOUNTER - This corresponds to the readcyclecounter intrinsic.
@ RELOC_NONE
Issue a no-op relocation against a given symbol at the current location.
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:739
@ TRAP
TRAP - Trapping instruction.
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition ISDOpcodes.h:205
@ SCMP
[US]CMP - 3-way comparison of signed or unsigned integers.
Definition ISDOpcodes.h:735
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1,VEC2) right by OFFSET elements a...
Definition ISDOpcodes.h:657
@ STRICT_FADD
Constrained versions of the binary floating point operators.
Definition ISDOpcodes.h:427
@ STACKMAP
The llvm.experimental.stackmap intrinsic.
@ FREEZE
FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or is evaluated to UNDEF),...
Definition ISDOpcodes.h:241
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition ISDOpcodes.h:565
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:53
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition ISDOpcodes.h:959
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
Definition ISDOpcodes.h:699
@ SPONENTRY
SPONENTRY - Represents the llvm.sponentry intrinsic.
Definition ISDOpcodes.h:122
@ CLEAR_CACHE
llvm.clear_cache intrinsic Operands: Input Chain, Start Addres, End Address Outputs: Output Chain
@ CONVERGENCECTRL_LOOP
@ INLINEASM
INLINEASM - Represents an inline asm block.
@ FP_TO_SINT_SAT
FP_TO_[US]INT_SAT - Convert floating point value in operand 0 to a signed or unsigned scalar integer ...
Definition ISDOpcodes.h:945
@ VECREDUCE_FMINIMUM
@ EH_SJLJ_SETJMP
RESULT, OUTCHAIN = EH_SJLJ_SETJMP(INCHAIN, buffer) This corresponds to the eh.sjlj....
Definition ISDOpcodes.h:162
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:856
@ BRCOND
BRCOND - Conditional branch.
@ VECREDUCE_SEQ_FMUL
@ CATCHRET
CATCHRET - Represents a return from a catch block funclet.
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition ISDOpcodes.h:62
@ ATOMIC_LOAD_UINC_WRAP
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition ISDOpcodes.h:534
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition ISDOpcodes.h:365
@ VECTOR_DEINTERLEAVE
VECTOR_DEINTERLEAVE(VEC1, VEC2, ...) - Returns N vectors from N input vectors, where N is the factor ...
Definition ISDOpcodes.h:624
@ GET_DYNAMIC_AREA_OFFSET
GET_DYNAMIC_AREA_OFFSET - get offset from native SP to the address of the most recent dynamic alloca.
@ FMINIMUMNUM
FMINIMUMNUM/FMAXIMUMNUM - minimumnum/maximumnum that is same with FMINNUM_IEEE and FMAXNUM_IEEE besid...
@ ADJUST_TRAMPOLINE
ADJUST_TRAMPOLINE - This corresponds to the adjust_trampoline intrinsic.
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition ISDOpcodes.h:213
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:556
@ LOOP_DEPENDENCE_WAR_MASK
The llvm.loop.dependence.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM.
Flag
These should be considered private to the implementation of the MCInstrDesc class.
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
bool match(Val *V, const Pattern &P)
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
TwoOps_match< Val_t, Idx_t, Instruction::ExtractElement > m_ExtractElt(const Val_t &Val, const Idx_t &Idx)
Matches ExtractElementInst.
IntrinsicID_match m_VScale()
Matches a call to llvm.vscale().
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
Offsets
Offsets in bytes from the start of the input buffer.
std::pair< JumpTableHeader, JumpTable > JumpTableBlock
void sortAndRangeify(CaseClusterVector &Clusters)
Sort Clusters and merge adjacent cases.
std::vector< CaseCluster > CaseClusterVector
@ CC_Range
A cluster of adjacent case labels with the same destination, or just one case.
@ CC_JumpTable
A cluster of cases suitable for jump table lowering.
@ CC_BitTests
A cluster of cases suitable for bit test lowering.
SmallVector< SwitchWorkListItem, 4 > SwitchWorkList
CaseClusterVector::iterator CaseClusterIt
initializer< Ty > init(const Ty &Val)
LocationClass< Ty > location(Ty &L)
@ DW_OP_LLVM_arg
Only used in LLVM metadata.
Definition Dwarf.h:149
ExceptionBehavior
Exception behavior used for floating point operations.
Definition FPEnv.h:39
@ ebStrict
This corresponds to "fpexcept.strict".
Definition FPEnv.h:42
@ ebMayTrap
This corresponds to "fpexcept.maytrap".
Definition FPEnv.h:41
@ ebIgnore
This corresponds to "fpexcept.ignore".
Definition FPEnv.h:40
constexpr float log2ef
Definition MathExtras.h:51
constexpr double e
constexpr float ln2f
Definition MathExtras.h:49
NodeAddr< FuncNode * > Func
Definition RDFGraph.h:393
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
Definition Threading.h:280
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition MathExtras.h:344
@ Offset
Definition DWP.cpp:532
@ Length
Definition DWP.cpp:532
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred)
getICmpCondCode - Return the ISD condition code corresponding to the given LLVM IR integer condition ...
Definition Analysis.cpp:237
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
Definition STLExtras.h:1669
LLVM_ABI void GetReturnInfo(CallingConv::ID CC, Type *ReturnType, AttributeList attr, SmallVectorImpl< ISD::OutputArg > &Outs, const TargetLowering &TLI, const DataLayout &DL)
Given an LLVM IR type and return type attributes, compute the return value EVTs and flags,...
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
LLVM_ABI bool isOnlyUsedInZeroEqualityComparison(const Instruction *CxtI)
void ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, Type *Ty, SmallVectorImpl< EVT > &ValueVTs, SmallVectorImpl< EVT > *MemVTs=nullptr, SmallVectorImpl< TypeSize > *Offsets=nullptr, TypeSize StartingOffset=TypeSize::getZero())
ComputeValueVTs - Given an LLVM IR type, compute a sequence of EVTs that represent all the individual...
Definition Analysis.cpp:119
LLVM_ABI SDValue peekThroughBitcasts(SDValue V)
Return the non-bitcasted source operand of V if it exists.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
@ Done
Definition Threading.h:60
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition bit.h:293
LLVM_ABI void diagnoseDontCall(const CallInst &CI)
auto successors(const MachineBasicBlock *BB)
bool isIntOrFPConstant(SDValue V)
Return true if V is either a integer or FP constant.
static ConstantRange getRange(Value *Op, SCCPSolver &Solver, const SmallPtrSetImpl< Value * > &InsertedValues)
Helper for getting ranges from Solver.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2208
Value * GetPointerBaseWithConstantOffset(Value *Ptr, int64_t &Offset, const DataLayout &DL, bool AllowNonInbounds=true)
Analyze the specified pointer to see if it can be expressed as a base pointer plus a constant offset.
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition MathExtras.h:243
auto cast_or_null(const Y &Val)
Definition Casting.h:714
constexpr T alignDown(U Value, V Align, W Skew=0)
Returns the largest unsigned integer less than or equal to Value and is Skew mod Align.
Definition MathExtras.h:546
gep_type_iterator gep_type_end(const User *GEP)
constexpr auto equal_to(T &&Arg)
Functor variant of std::equal_to that can be used as a UnaryPredicate in functional algorithms like a...
Definition STLExtras.h:2173
constexpr int popcount(T Value) noexcept
Count the number of set bits in a value.
Definition bit.h:154
LLVM_ABI ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
detail::concat_range< ValueT, RangeTs... > concat(RangeTs &&...Ranges)
Returns a concatenated range across two or more ranges.
Definition STLExtras.h:1152
bool isScopedEHPersonality(EHPersonality Pers)
Returns true if this personality uses scope-style EH IR instructions: catchswitch,...
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition bit.h:202
void ComputeValueTypes(const DataLayout &DL, Type *Ty, SmallVectorImpl< Type * > &Types, SmallVectorImpl< TypeSize > *Offsets=nullptr, TypeSize StartingOffset=TypeSize::getZero())
Given an LLVM IR type, compute non-aggregate subtypes.
Definition Analysis.cpp:72
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
LLVM_ABI llvm::SmallVector< int, 16 > createStrideMask(unsigned Start, unsigned Stride, unsigned VF)
Create a stride shuffle mask.
@ SPF_ABS
Floating point maxnum.
@ SPF_NABS
Absolute value.
@ SPF_FMAXNUM
Floating point minnum.
@ SPF_UMIN
Signed minimum.
@ SPF_UMAX
Signed maximum.
@ SPF_SMAX
Unsigned minimum.
@ SPF_FMINNUM
Unsigned maximum.
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
detail::zippy< detail::zip_first, T, U, Args... > zip_first(T &&t, U &&u, Args &&...args)
zip iterator that, for the sake of efficiency, assumes the first iteratee to be the shortest.
Definition STLExtras.h:854
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1636
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI SelectPatternResult matchSelectPattern(Value *V, Value *&LHS, Value *&RHS, Instruction::CastOps *CastOp=nullptr, unsigned Depth=0)
Pattern match integer [SU]MIN, [SU]MAX and ABS idioms, returning the kind and providing the out param...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
generic_gep_type_iterator<> gep_type_iterator
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
auto succ_size(const MachineBasicBlock *BB)
bool hasSingleElement(ContainerTy &&C)
Returns true if the given container only contains a single element.
Definition STLExtras.h:300
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
ISD::CondCode getFCmpCondCode(FCmpInst::Predicate Pred)
getFCmpCondCode - Return the ISD condition code corresponding to the given LLVM IR floating-point con...
Definition Analysis.cpp:203
LLVM_ABI EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
LLVM_ABI Value * salvageDebugInfoImpl(Instruction &I, uint64_t CurrentLocOps, SmallVectorImpl< uint64_t > &Ops, SmallVectorImpl< Value * > &AdditionalValues)
Definition Local.cpp:2292
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Global
Append to llvm.global_dtors.
AtomicOrdering
Atomic ordering for LLVM's memory model.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
bool isFuncletEHPersonality(EHPersonality Pers)
Returns true if this is a personality function that invokes handler funclets (which must return to it...
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:189
LLVM_ABI bool isAssignmentTrackingEnabled(const Module &M)
Return true if assignment tracking is enabled for module M.
LLVM_ABI llvm::SmallVector< int, 16 > createInterleaveMask(unsigned VF, unsigned NumVecs)
Create an interleave shuffle mask.
@ UMin
Unsigned integer min implemented in terms of select(cmp()).
@ Or
Bitwise or logical OR of integers.
@ Mul
Product of integers.
@ And
Bitwise or logical AND of integers.
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:144
@ SPNB_RETURNS_NAN
NaN behavior not applicable.
@ SPNB_RETURNS_OTHER
Given one NaN input, returns the NaN.
@ SPNB_RETURNS_ANY
Given one NaN input, returns the non-NaN.
bool isInTailCallPosition(const CallBase &Call, const TargetMachine &TM, bool ReturnsFirstArg=false)
Test if the given instruction is in a position to be optimized with a tail-call.
Definition Analysis.cpp:539
DWARFExpression::Operation Op
ISD::CondCode getFCmpCodeWithoutNaN(ISD::CondCode CC)
getFCmpCodeWithoutNaN - Given an ISD condition code comparing floats, return the equivalent code if w...
Definition Analysis.cpp:225
ArrayRef(const T &OneElt) -> ArrayRef< T >
bool isAsynchronousEHPersonality(EHPersonality Pers)
Returns true if this personality function catches asynchronous exceptions.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isKnownNeverNaN(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the floating-point scalar value is not a NaN or if the floating-point vector value has...
LLVM_ABI std::optional< RoundingMode > convertStrToRoundingMode(StringRef)
Returns a valid RoundingMode enumerator when given a string that is valid as input in constrained int...
Definition FPEnv.cpp:25
gep_type_iterator gep_type_begin(const User *GEP)
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
Definition STLExtras.h:2192
GlobalValue * ExtractTypeInfo(Value *V)
ExtractTypeInfo - Returns the type info, possibly bitcast, encoded in V.
Definition Analysis.cpp:181
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:201
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
Definition STLExtras.h:2166
LLVM_ABI Constant * ConstantFoldLoadFromConstPtr(Constant *C, Type *Ty, APInt Offset, const DataLayout &DL)
Return the value that a load from C with offset Offset would produce if it is constant and determinab...
unsigned ComputeLinearIndex(Type *Ty, const unsigned *Indices, const unsigned *IndicesEnd, unsigned CurIndex=0)
Compute the linearized index of a member in a nested aggregate/struct/array.
Definition Analysis.cpp:33
T bit_floor(T Value)
Returns the largest integral power of two no greater than Value if Value is nonzero.
Definition bit.h:330
@ Default
The result values are uniform if and only if all operands are uniform.
Definition Uniformity.h:20
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:872
#define N
#define NC
Definition regutils.h:42
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:77
Extended Value Type.
Definition ValueTypes.h:35
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
Definition ValueTypes.h:403
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
Definition ValueTypes.h:70
uint64_t getScalarStoreSize() const
Definition ValueTypes.h:410
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition ValueTypes.h:292
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:308
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition ValueTypes.h:155
ElementCount getVectorElementCount() const
Definition ValueTypes.h:358
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:381
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition ValueTypes.h:367
uint64_t getScalarSizeInBits() const
Definition ValueTypes.h:393
static LLVM_ABI EVT getEVT(Type *Ty, bool HandleUnknown=false)
Return the value type corresponding to the specified type.
EVT changeVectorElementType(LLVMContext &Context, EVT EltVT) const
Return a VT for a vector type whose attributes match ourselves with the exception of the element type...
Definition ValueTypes.h:98
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:324
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition ValueTypes.h:61
bool isRISCVVectorTuple() const
Return true if this is a vector value type.
Definition ValueTypes.h:187
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
Definition ValueTypes.h:389
bool isFixedLengthVector() const
Definition ValueTypes.h:189
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:176
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition ValueTypes.h:331
bool bitsGE(EVT VT) const
Return true if this has no less bits than VT.
Definition ValueTypes.h:300
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
Definition ValueTypes.h:182
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:336
EVT changeElementType(LLVMContext &Context, EVT EltVT) const
Return a VT for a type whose attributes match ourselves with the exception of the element type that i...
Definition ValueTypes.h:121
bool isScalarInteger() const
Return true if this is an integer, but not a vector.
Definition ValueTypes.h:165
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition ValueTypes.h:344
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition ValueTypes.h:160
void setPointerAddrSpace(unsigned AS)
InputArg - This struct carries flags and type information about a single incoming (formal) argument o...
static const unsigned NoArgIndex
Sentinel value for implicit machine-level input arguments.
OutputArg - This struct carries flags and a value for a single outgoing (actual) argument or outgoing...
ConstraintPrefix Type
Type - The basic type of the constraint: input/output/clobber/label.
Definition InlineAsm.h:128
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
Definition KnownBits.h:264
This class contains a discriminated union of information about pointers in memory operands,...
static LLVM_ABI MachinePointerInfo getUnknownStack(MachineFunction &MF)
Stack memory without other information.
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
A lightweight accessor for an operand bundle meant to be passed around by value.
This struct represents the registers (physical or virtual) that a particular set of values is assigne...
SmallVector< std::pair< Register, TypeSize >, 4 > getRegsAndSizes() const
Return a list of registers and their sizes.
RegsForValue()=default
SmallVector< unsigned, 4 > RegCount
This list holds the number of registers for each value.
SmallVector< EVT, 4 > ValueVTs
The value types of the values, which may not be legal, and may need be promoted or synthesized from o...
SmallVector< Register, 4 > Regs
This list holds the registers assigned to the values.
void AddInlineAsmOperands(InlineAsm::Kind Code, bool HasMatching, unsigned MatchingIdx, const SDLoc &dl, SelectionDAG &DAG, std::vector< SDValue > &Ops) const
Add this value to the specified inlineasm node operand list.
SDValue getCopyFromRegs(SelectionDAG &DAG, FunctionLoweringInfo &FuncInfo, const SDLoc &dl, SDValue &Chain, SDValue *Glue, const Value *V=nullptr) const
Emit a series of CopyFromReg nodes that copies from this value and returns the result as a ValueVTs v...
SmallVector< MVT, 4 > RegVTs
The value types of the registers.
void getCopyToRegs(SDValue Val, SelectionDAG &DAG, const SDLoc &dl, SDValue &Chain, SDValue *Glue, const Value *V=nullptr, ISD::NodeType PreferredExtendType=ISD::ANY_EXTEND) const
Emit a series of CopyToReg nodes that copies the specified value into the registers specified by this...
std::optional< CallingConv::ID > CallConv
Records if this value needs to be treated in an ABI dependant manner, different to normal type legali...
bool occupiesMultipleRegs() const
Check if the total RegCount is greater than one.
These are IR-level optimization flags that may be propagated to SDNodes.
void copyFMF(const FPMathOperator &FPMO)
Propagate the fast-math-flags from an IR FPMathOperator.
void setUnpredictable(bool b)
bool hasAllowReassociation() const
void setNoUnsignedWrap(bool b)
void setNoSignedWrap(bool b)
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
A MapVector that performs no allocations if smaller than a certain size.
Definition MapVector.h:276
This structure is used to communicate between SelectionDAGBuilder and SDISel for the code generation ...
SDLoc DL
The debug location of the instruction this CaseBlock was produced from.
static CaseCluster range(const ConstantInt *Low, const ConstantInt *High, MachineBasicBlock *MBB, BranchProbability Prob)
Register Reg
The virtual register containing the index of the jump table entry to jump to.
MachineBasicBlock * Default
The MBB of the default bb, which is a successor of the range check MBB.
unsigned JTI
The JumpTableIndex for this jump table in the function.
MachineBasicBlock * MBB
The MBB into which to emit the code for the indirect jump.
std::optional< SDLoc > SL
The debug location of the instruction this JumpTable was produced from.
This contains information for each constraint that we are lowering.
TargetLowering::ConstraintType ConstraintType
Information about the constraint code, e.g.
This structure contains all information that is necessary for lowering calls.
CallLoweringInfo & setConvergent(bool Value=true)
CallLoweringInfo & setDeactivationSymbol(GlobalValue *Sym)
CallLoweringInfo & setCFIType(const ConstantInt *Type)
SmallVector< ISD::InputArg, 32 > Ins
Type * OrigRetTy
Original unlegalized return type.
CallLoweringInfo & setDiscardResult(bool Value=true)
CallLoweringInfo & setIsPatchPoint(bool Value=true)
CallLoweringInfo & setDebugLoc(const SDLoc &dl)
CallLoweringInfo & setTailCall(bool Value=true)
CallLoweringInfo & setIsPreallocated(bool Value=true)
CallLoweringInfo & setConvergenceControlToken(SDValue Token)
SmallVector< ISD::OutputArg, 32 > Outs
Type * RetTy
Same as OrigRetTy, or partially legalized for soft float libcalls.
CallLoweringInfo & setChain(SDValue InChain)
CallLoweringInfo & setPtrAuth(PtrAuthInfo Value)
CallLoweringInfo & setCallee(CallingConv::ID CC, Type *ResultType, SDValue Target, ArgListTy &&ArgsList, AttributeSet ResultAttrs={})
This structure is used to pass arguments to makeLibCall function.
MakeLibCallOptions & setDiscardResult(bool Value=true)
This structure contains the information necessary for lowering pointer-authenticating indirect calls.
void addIPToStateRange(const InvokeInst *II, MCSymbol *InvokeBegin, MCSymbol *InvokeEnd)