LLVM 23.0.0git
SelectionDAGBuilder.cpp
Go to the documentation of this file.
1//===- SelectionDAGBuilder.cpp - Selection-DAG building -------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This implements routines for translating from LLVM IR into SelectionDAG IR.
10//
11//===----------------------------------------------------------------------===//
12
13#include "SelectionDAGBuilder.h"
14#include "SDNodeDbgValue.h"
15#include "llvm/ADT/APFloat.h"
16#include "llvm/ADT/APInt.h"
17#include "llvm/ADT/BitVector.h"
18#include "llvm/ADT/STLExtras.h"
21#include "llvm/ADT/StringRef.h"
22#include "llvm/ADT/Twine.h"
26#include "llvm/Analysis/Loads.h"
58#include "llvm/IR/Argument.h"
59#include "llvm/IR/Attributes.h"
60#include "llvm/IR/BasicBlock.h"
61#include "llvm/IR/CFG.h"
62#include "llvm/IR/CallingConv.h"
63#include "llvm/IR/Constant.h"
65#include "llvm/IR/Constants.h"
66#include "llvm/IR/DataLayout.h"
67#include "llvm/IR/DebugInfo.h"
72#include "llvm/IR/Function.h"
74#include "llvm/IR/InlineAsm.h"
75#include "llvm/IR/InstrTypes.h"
78#include "llvm/IR/Intrinsics.h"
79#include "llvm/IR/IntrinsicsAArch64.h"
80#include "llvm/IR/IntrinsicsAMDGPU.h"
81#include "llvm/IR/IntrinsicsWebAssembly.h"
82#include "llvm/IR/LLVMContext.h"
84#include "llvm/IR/Metadata.h"
85#include "llvm/IR/Module.h"
86#include "llvm/IR/Operator.h"
88#include "llvm/IR/Statepoint.h"
89#include "llvm/IR/Type.h"
90#include "llvm/IR/User.h"
91#include "llvm/IR/Value.h"
92#include "llvm/MC/MCContext.h"
97#include "llvm/Support/Debug.h"
105#include <cstddef>
106#include <limits>
107#include <optional>
108#include <tuple>
109
110using namespace llvm;
111using namespace PatternMatch;
112using namespace SwitchCG;
113
114#define DEBUG_TYPE "isel"
115
116/// LimitFloatPrecision - Generate low-precision inline sequences for
117/// some float libcalls (6, 8 or 12 bits).
118static unsigned LimitFloatPrecision;
119
120static cl::opt<bool>
121 InsertAssertAlign("insert-assert-align", cl::init(true),
122 cl::desc("Insert the experimental `assertalign` node."),
124
126 LimitFPPrecision("limit-float-precision",
127 cl::desc("Generate low-precision inline sequences "
128 "for some float libcalls"),
130 cl::init(0));
131
133 "switch-peel-threshold", cl::Hidden, cl::init(66),
134 cl::desc("Set the case probability threshold for peeling the case from a "
135 "switch statement. A value greater than 100 will void this "
136 "optimization"));
137
138// Limit the width of DAG chains. This is important in general to prevent
139// DAG-based analysis from blowing up. For example, alias analysis and
140// load clustering may not complete in reasonable time. It is difficult to
141// recognize and avoid this situation within each individual analysis, and
142// future analyses are likely to have the same behavior. Limiting DAG width is
143// the safe approach and will be especially important with global DAGs.
144//
145// MaxParallelChains default is arbitrarily high to avoid affecting
146// optimization, but could be lowered to improve compile time. Any ld-ld-st-st
147// sequence over this should have been converted to llvm.memcpy by the
148// frontend. It is easy to induce this behavior with .ll code such as:
149// %buffer = alloca [4096 x i8]
150// %data = load [4096 x i8]* %argPtr
151// store [4096 x i8] %data, [4096 x i8]* %buffer
152static const unsigned MaxParallelChains = 64;
153
155 const SDValue *Parts, unsigned NumParts,
156 MVT PartVT, EVT ValueVT, const Value *V,
157 SDValue InChain,
158 std::optional<CallingConv::ID> CC);
159
160/// getCopyFromParts - Create a value that contains the specified legal parts
161/// combined into the value they represent. If the parts combine to a type
162/// larger than ValueVT then AssertOp can be used to specify whether the extra
163/// bits are known to be zero (ISD::AssertZext) or sign extended from ValueVT
164/// (ISD::AssertSext).
165static SDValue
166getCopyFromParts(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts,
167 unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V,
168 SDValue InChain,
169 std::optional<CallingConv::ID> CC = std::nullopt,
170 std::optional<ISD::NodeType> AssertOp = std::nullopt) {
171 // Let the target assemble the parts if it wants to
172 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
173 if (SDValue Val = TLI.joinRegisterPartsIntoValue(DAG, DL, Parts, NumParts,
174 PartVT, ValueVT, CC))
175 return Val;
176
177 if (ValueVT.isVector())
178 return getCopyFromPartsVector(DAG, DL, Parts, NumParts, PartVT, ValueVT, V,
179 InChain, CC);
180
181 assert(NumParts > 0 && "No parts to assemble!");
182 SDValue Val = Parts[0];
183
184 if (NumParts > 1) {
185 // Assemble the value from multiple parts.
186 if (ValueVT.isInteger()) {
187 unsigned PartBits = PartVT.getSizeInBits();
188 unsigned ValueBits = ValueVT.getSizeInBits();
189
190 // Assemble the power of 2 part.
191 unsigned RoundParts = llvm::bit_floor(NumParts);
192 unsigned RoundBits = PartBits * RoundParts;
193 EVT RoundVT = RoundBits == ValueBits ?
194 ValueVT : EVT::getIntegerVT(*DAG.getContext(), RoundBits);
195 SDValue Lo, Hi;
196
197 EVT HalfVT = EVT::getIntegerVT(*DAG.getContext(), RoundBits/2);
198
199 if (RoundParts > 2) {
200 Lo = getCopyFromParts(DAG, DL, Parts, RoundParts / 2, PartVT, HalfVT, V,
201 InChain);
202 Hi = getCopyFromParts(DAG, DL, Parts + RoundParts / 2, RoundParts / 2,
203 PartVT, HalfVT, V, InChain);
204 } else {
205 Lo = DAG.getNode(ISD::BITCAST, DL, HalfVT, Parts[0]);
206 Hi = DAG.getNode(ISD::BITCAST, DL, HalfVT, Parts[1]);
207 }
208
209 if (DAG.getDataLayout().isBigEndian())
210 std::swap(Lo, Hi);
211
212 Val = DAG.getNode(ISD::BUILD_PAIR, DL, RoundVT, Lo, Hi);
213
214 if (RoundParts < NumParts) {
215 // Assemble the trailing non-power-of-2 part.
216 unsigned OddParts = NumParts - RoundParts;
217 EVT OddVT = EVT::getIntegerVT(*DAG.getContext(), OddParts * PartBits);
218 Hi = getCopyFromParts(DAG, DL, Parts + RoundParts, OddParts, PartVT,
219 OddVT, V, InChain, CC);
220
221 // Combine the round and odd parts.
222 Lo = Val;
223 if (DAG.getDataLayout().isBigEndian())
224 std::swap(Lo, Hi);
225 EVT TotalVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
226 Hi = DAG.getNode(ISD::ANY_EXTEND, DL, TotalVT, Hi);
227 Hi = DAG.getNode(
228 ISD::SHL, DL, TotalVT, Hi,
229 DAG.getShiftAmountConstant(Lo.getValueSizeInBits(), TotalVT, DL));
230 Lo = DAG.getNode(ISD::ZERO_EXTEND, DL, TotalVT, Lo);
231 Val = DAG.getNode(ISD::OR, DL, TotalVT, Lo, Hi);
232 }
233 } else if (PartVT.isFloatingPoint()) {
234 // FP split into multiple FP parts (for ppcf128)
235 assert(ValueVT == EVT(MVT::ppcf128) && PartVT == MVT::f64 &&
236 "Unexpected split");
237 SDValue Lo, Hi;
238 Lo = DAG.getNode(ISD::BITCAST, DL, EVT(MVT::f64), Parts[0]);
239 Hi = DAG.getNode(ISD::BITCAST, DL, EVT(MVT::f64), Parts[1]);
240 if (TLI.hasBigEndianPartOrdering(ValueVT, DAG.getDataLayout()))
241 std::swap(Lo, Hi);
242 Val = DAG.getNode(ISD::BUILD_PAIR, DL, ValueVT, Lo, Hi);
243 } else {
244 // FP split into integer parts (soft fp)
245 assert(ValueVT.isFloatingPoint() && PartVT.isInteger() &&
246 !PartVT.isVector() && "Unexpected split");
247 EVT IntVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
248 Val = getCopyFromParts(DAG, DL, Parts, NumParts, PartVT, IntVT, V,
249 InChain, CC);
250 }
251 }
252
253 // There is now one part, held in Val. Correct it to match ValueVT.
254 // PartEVT is the type of the register class that holds the value.
255 // ValueVT is the type of the inline asm operation.
256 EVT PartEVT = Val.getValueType();
257
258 if (PartEVT == ValueVT)
259 return Val;
260
261 if (PartEVT.isInteger() && ValueVT.isFloatingPoint() &&
262 ValueVT.bitsLT(PartEVT)) {
263 // For an FP value in an integer part, we need to truncate to the right
264 // width first.
265 PartEVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
266 Val = DAG.getNode(ISD::TRUNCATE, DL, PartEVT, Val);
267 }
268
269 // Handle types that have the same size.
270 if (PartEVT.getSizeInBits() == ValueVT.getSizeInBits())
271 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
272
273 // Handle types with different sizes.
274 if (PartEVT.isInteger() && ValueVT.isInteger()) {
275 if (ValueVT.bitsLT(PartEVT)) {
276 // For a truncate, see if we have any information to
277 // indicate whether the truncated bits will always be
278 // zero or sign-extension.
279 if (AssertOp)
280 Val = DAG.getNode(*AssertOp, DL, PartEVT, Val,
281 DAG.getValueType(ValueVT));
282 return DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
283 }
284 return DAG.getNode(ISD::ANY_EXTEND, DL, ValueVT, Val);
285 }
286
287 if (PartEVT.isFloatingPoint() && ValueVT.isFloatingPoint()) {
288 // FP_ROUND's are always exact here.
289 if (ValueVT.bitsLT(Val.getValueType())) {
290
291 SDValue NoChange =
293
294 if (DAG.getMachineFunction().getFunction().getAttributes().hasFnAttr(
295 llvm::Attribute::StrictFP)) {
296 return DAG.getNode(ISD::STRICT_FP_ROUND, DL,
297 DAG.getVTList(ValueVT, MVT::Other), InChain, Val,
298 NoChange);
299 }
300
301 return DAG.getNode(ISD::FP_ROUND, DL, ValueVT, Val, NoChange);
302 }
303
304 return DAG.getNode(ISD::FP_EXTEND, DL, ValueVT, Val);
305 }
306
307 // Handle MMX to a narrower integer type by bitcasting MMX to integer and
308 // then truncating.
309 if (PartEVT == MVT::x86mmx && ValueVT.isInteger() &&
310 ValueVT.bitsLT(PartEVT)) {
311 Val = DAG.getNode(ISD::BITCAST, DL, MVT::i64, Val);
312 return DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
313 }
314
315 report_fatal_error("Unknown mismatch in getCopyFromParts!");
316}
317
319 const Twine &ErrMsg) {
321 if (!I)
322 return Ctx.emitError(ErrMsg);
323
324 if (const CallInst *CI = dyn_cast<CallInst>(I))
325 if (CI->isInlineAsm()) {
326 return Ctx.diagnose(DiagnosticInfoInlineAsm(
327 *CI, ErrMsg + ", possible invalid constraint for vector type"));
328 }
329
330 return Ctx.emitError(I, ErrMsg);
331}
332
333/// getCopyFromPartsVector - Create a value that contains the specified legal
334/// parts combined into the value they represent. If the parts combine to a
335/// type larger than ValueVT then AssertOp can be used to specify whether the
336/// extra bits are known to be zero (ISD::AssertZext) or sign extended from
337/// ValueVT (ISD::AssertSext).
339 const SDValue *Parts, unsigned NumParts,
340 MVT PartVT, EVT ValueVT, const Value *V,
341 SDValue InChain,
342 std::optional<CallingConv::ID> CallConv) {
343 assert(ValueVT.isVector() && "Not a vector value");
344 assert(NumParts > 0 && "No parts to assemble!");
345 const bool IsABIRegCopy = CallConv.has_value();
346
347 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
348 SDValue Val = Parts[0];
349
350 // Handle a multi-element vector.
351 if (NumParts > 1) {
352 EVT IntermediateVT;
353 MVT RegisterVT;
354 unsigned NumIntermediates;
355 unsigned NumRegs;
356
357 if (IsABIRegCopy) {
359 *DAG.getContext(), *CallConv, ValueVT, IntermediateVT,
360 NumIntermediates, RegisterVT);
361 } else {
362 NumRegs =
363 TLI.getVectorTypeBreakdown(*DAG.getContext(), ValueVT, IntermediateVT,
364 NumIntermediates, RegisterVT);
365 }
366
367 assert(NumRegs == NumParts && "Part count doesn't match vector breakdown!");
368 NumParts = NumRegs; // Silence a compiler warning.
369 assert(RegisterVT == PartVT && "Part type doesn't match vector breakdown!");
370 assert(RegisterVT.getSizeInBits() ==
371 Parts[0].getSimpleValueType().getSizeInBits() &&
372 "Part type sizes don't match!");
373
374 // Assemble the parts into intermediate operands.
375 SmallVector<SDValue, 8> Ops(NumIntermediates);
376 if (NumIntermediates == NumParts) {
377 // If the register was not expanded, truncate or copy the value,
378 // as appropriate.
379 for (unsigned i = 0; i != NumParts; ++i)
380 Ops[i] = getCopyFromParts(DAG, DL, &Parts[i], 1, PartVT, IntermediateVT,
381 V, InChain, CallConv);
382 } else if (NumParts > 0) {
383 // If the intermediate type was expanded, build the intermediate
384 // operands from the parts.
385 assert(NumParts % NumIntermediates == 0 &&
386 "Must expand into a divisible number of parts!");
387 unsigned Factor = NumParts / NumIntermediates;
388 for (unsigned i = 0; i != NumIntermediates; ++i)
389 Ops[i] = getCopyFromParts(DAG, DL, &Parts[i * Factor], Factor, PartVT,
390 IntermediateVT, V, InChain, CallConv);
391 }
392
393 // Build a vector with BUILD_VECTOR or CONCAT_VECTORS from the
394 // intermediate operands.
395 EVT BuiltVectorTy =
396 IntermediateVT.isVector()
398 *DAG.getContext(), IntermediateVT.getScalarType(),
399 IntermediateVT.getVectorElementCount() * NumParts)
401 IntermediateVT.getScalarType(),
402 NumIntermediates);
403 Val = DAG.getNode(IntermediateVT.isVector() ? ISD::CONCAT_VECTORS
405 DL, BuiltVectorTy, Ops);
406 }
407
408 // There is now one part, held in Val. Correct it to match ValueVT.
409 EVT PartEVT = Val.getValueType();
410
411 if (PartEVT == ValueVT)
412 return Val;
413
414 if (PartEVT.isVector()) {
415 // Vector/Vector bitcast.
416 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits())
417 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
418
419 // If the parts vector has more elements than the value vector, then we
420 // have a vector widening case (e.g. <2 x float> -> <4 x float>).
421 // Extract the elements we want.
422 if (PartEVT.getVectorElementCount() != ValueVT.getVectorElementCount()) {
425 (PartEVT.getVectorElementCount().isScalable() ==
426 ValueVT.getVectorElementCount().isScalable()) &&
427 "Cannot narrow, it would be a lossy transformation");
428 PartEVT =
430 ValueVT.getVectorElementCount());
431 Val = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, PartEVT, Val,
432 DAG.getVectorIdxConstant(0, DL));
433 if (PartEVT == ValueVT)
434 return Val;
435 if (PartEVT.isInteger() && ValueVT.isFloatingPoint())
436 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
437
438 // Vector/Vector bitcast (e.g. <2 x bfloat> -> <2 x half>).
439 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits())
440 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
441 }
442
443 // Promoted vector extract
444 return DAG.getAnyExtOrTrunc(Val, DL, ValueVT);
445 }
446
447 // Trivial bitcast if the types are the same size and the destination
448 // vector type is legal.
449 if (PartEVT.getSizeInBits() == ValueVT.getSizeInBits() &&
450 TLI.isTypeLegal(ValueVT))
451 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
452
453 if (ValueVT.getVectorNumElements() != 1) {
454 // Certain ABIs require that vectors are passed as integers. For vectors
455 // are the same size, this is an obvious bitcast.
456 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits()) {
457 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
458 } else if (ValueVT.bitsLT(PartEVT)) {
459 const uint64_t ValueSize = ValueVT.getFixedSizeInBits();
460 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
461 // Drop the extra bits.
462 Val = DAG.getNode(ISD::TRUNCATE, DL, IntermediateType, Val);
463 return DAG.getBitcast(ValueVT, Val);
464 }
465
467 *DAG.getContext(), V, "non-trivial scalar-to-vector conversion");
468 return DAG.getUNDEF(ValueVT);
469 }
470
471 // Handle cases such as i8 -> <1 x i1>
472 EVT ValueSVT = ValueVT.getVectorElementType();
473 if (ValueVT.getVectorNumElements() == 1 && ValueSVT != PartEVT) {
474 unsigned ValueSize = ValueSVT.getSizeInBits();
475 if (ValueSize == PartEVT.getSizeInBits()) {
476 Val = DAG.getNode(ISD::BITCAST, DL, ValueSVT, Val);
477 } else if (ValueSVT.isFloatingPoint() && PartEVT.isInteger()) {
478 // It's possible a scalar floating point type gets softened to integer and
479 // then promoted to a larger integer. If PartEVT is the larger integer
480 // we need to truncate it and then bitcast to the FP type.
481 assert(ValueSVT.bitsLT(PartEVT) && "Unexpected types");
482 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
483 Val = DAG.getNode(ISD::TRUNCATE, DL, IntermediateType, Val);
484 Val = DAG.getBitcast(ValueSVT, Val);
485 } else {
486 Val = ValueVT.isFloatingPoint()
487 ? DAG.getFPExtendOrRound(Val, DL, ValueSVT)
488 : DAG.getAnyExtOrTrunc(Val, DL, ValueSVT);
489 }
490 }
491
492 return DAG.getBuildVector(ValueVT, DL, Val);
493}
494
495static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &dl,
496 SDValue Val, SDValue *Parts, unsigned NumParts,
497 MVT PartVT, const Value *V,
498 std::optional<CallingConv::ID> CallConv);
499
500/// getCopyToParts - Create a series of nodes that contain the specified value
501/// split into legal parts. If the parts contain more bits than Val, then, for
502/// integers, ExtendKind can be used to specify how to generate the extra bits.
503static void
505 unsigned NumParts, MVT PartVT, const Value *V,
506 std::optional<CallingConv::ID> CallConv = std::nullopt,
507 ISD::NodeType ExtendKind = ISD::ANY_EXTEND) {
508 // Let the target split the parts if it wants to
509 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
510 if (TLI.splitValueIntoRegisterParts(DAG, DL, Val, Parts, NumParts, PartVT,
511 CallConv))
512 return;
513 EVT ValueVT = Val.getValueType();
514
515 // Handle the vector case separately.
516 if (ValueVT.isVector())
517 return getCopyToPartsVector(DAG, DL, Val, Parts, NumParts, PartVT, V,
518 CallConv);
519
520 unsigned OrigNumParts = NumParts;
522 "Copying to an illegal type!");
523
524 if (NumParts == 0)
525 return;
526
527 assert(!ValueVT.isVector() && "Vector case handled elsewhere");
528 EVT PartEVT = PartVT;
529 if (PartEVT == ValueVT) {
530 assert(NumParts == 1 && "No-op copy with multiple parts!");
531 Parts[0] = Val;
532 return;
533 }
534
535 unsigned PartBits = PartVT.getSizeInBits();
536 if (NumParts * PartBits > ValueVT.getSizeInBits()) {
537 // If the parts cover more bits than the value has, promote the value.
538 if (PartVT.isFloatingPoint() && ValueVT.isFloatingPoint()) {
539 assert(NumParts == 1 && "Do not know what to promote to!");
540 Val = DAG.getNode(ISD::FP_EXTEND, DL, PartVT, Val);
541 } else {
542 if (ValueVT.isFloatingPoint()) {
543 // FP values need to be bitcast, then extended if they are being put
544 // into a larger container.
545 ValueVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
546 Val = DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
547 }
548 assert((PartVT.isInteger() || PartVT == MVT::x86mmx) &&
549 ValueVT.isInteger() &&
550 "Unknown mismatch!");
551 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
552 Val = DAG.getNode(ExtendKind, DL, ValueVT, Val);
553 if (PartVT == MVT::x86mmx)
554 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
555 }
556 } else if (PartBits == ValueVT.getSizeInBits()) {
557 // Different types of the same size.
558 assert(NumParts == 1 && PartEVT != ValueVT);
559 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
560 } else if (NumParts * PartBits < ValueVT.getSizeInBits()) {
561 // If the parts cover less bits than value has, truncate the value.
562 assert((PartVT.isInteger() || PartVT == MVT::x86mmx) &&
563 ValueVT.isInteger() &&
564 "Unknown mismatch!");
565 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
566 Val = DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
567 if (PartVT == MVT::x86mmx)
568 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
569 }
570
571 // The value may have changed - recompute ValueVT.
572 ValueVT = Val.getValueType();
573 assert(NumParts * PartBits == ValueVT.getSizeInBits() &&
574 "Failed to tile the value with PartVT!");
575
576 if (NumParts == 1) {
577 if (PartEVT != ValueVT) {
579 "scalar-to-vector conversion failed");
580 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
581 }
582
583 Parts[0] = Val;
584 return;
585 }
586
587 // Expand the value into multiple parts.
588 if (NumParts & (NumParts - 1)) {
589 // The number of parts is not a power of 2. Split off and copy the tail.
590 assert(PartVT.isInteger() && ValueVT.isInteger() &&
591 "Do not know what to expand to!");
592 unsigned RoundParts = llvm::bit_floor(NumParts);
593 unsigned RoundBits = RoundParts * PartBits;
594 unsigned OddParts = NumParts - RoundParts;
595 SDValue OddVal = DAG.getNode(ISD::SRL, DL, ValueVT, Val,
596 DAG.getShiftAmountConstant(RoundBits, ValueVT, DL));
597
598 getCopyToParts(DAG, DL, OddVal, Parts + RoundParts, OddParts, PartVT, V,
599 CallConv);
600
601 if (DAG.getDataLayout().isBigEndian())
602 // The odd parts were reversed by getCopyToParts - unreverse them.
603 std::reverse(Parts + RoundParts, Parts + NumParts);
604
605 NumParts = RoundParts;
606 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
607 Val = DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
608 }
609
610 // The number of parts is a power of 2. Repeatedly bisect the value using
611 // EXTRACT_ELEMENT.
612 Parts[0] = DAG.getNode(ISD::BITCAST, DL,
614 ValueVT.getSizeInBits()),
615 Val);
616
617 for (unsigned StepSize = NumParts; StepSize > 1; StepSize /= 2) {
618 for (unsigned i = 0; i < NumParts; i += StepSize) {
619 unsigned ThisBits = StepSize * PartBits / 2;
620 EVT ThisVT = EVT::getIntegerVT(*DAG.getContext(), ThisBits);
621 SDValue &Part0 = Parts[i];
622 SDValue &Part1 = Parts[i+StepSize/2];
623
624 Part1 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL,
625 ThisVT, Part0, DAG.getIntPtrConstant(1, DL));
626 Part0 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL,
627 ThisVT, Part0, DAG.getIntPtrConstant(0, DL));
628
629 if (ThisBits == PartBits && ThisVT != PartVT) {
630 Part0 = DAG.getNode(ISD::BITCAST, DL, PartVT, Part0);
631 Part1 = DAG.getNode(ISD::BITCAST, DL, PartVT, Part1);
632 }
633 }
634 }
635
636 if (DAG.getDataLayout().isBigEndian())
637 std::reverse(Parts, Parts + OrigNumParts);
638}
639
641 const SDLoc &DL, EVT PartVT) {
642 if (!PartVT.isVector())
643 return SDValue();
644
645 EVT ValueVT = Val.getValueType();
646 EVT PartEVT = PartVT.getVectorElementType();
647 EVT ValueEVT = ValueVT.getVectorElementType();
648 ElementCount PartNumElts = PartVT.getVectorElementCount();
649 ElementCount ValueNumElts = ValueVT.getVectorElementCount();
650
651 // We only support widening vectors with equivalent element types and
652 // fixed/scalable properties. If a target needs to widen a fixed-length type
653 // to a scalable one, it should be possible to use INSERT_SUBVECTOR below.
654 if (ElementCount::isKnownLE(PartNumElts, ValueNumElts) ||
655 PartNumElts.isScalable() != ValueNumElts.isScalable())
656 return SDValue();
657
658 // Have a try for bf16 because some targets share its ABI with fp16.
659 if (ValueEVT == MVT::bf16 && PartEVT == MVT::f16) {
661 "Cannot widen to illegal type");
662 Val = DAG.getNode(
664 ValueVT.changeVectorElementType(*DAG.getContext(), MVT::f16), Val);
665 } else if (PartEVT != ValueEVT) {
666 return SDValue();
667 }
668
669 // Widening a scalable vector to another scalable vector is done by inserting
670 // the vector into a larger undef one.
671 if (PartNumElts.isScalable())
672 return DAG.getNode(ISD::INSERT_SUBVECTOR, DL, PartVT, DAG.getUNDEF(PartVT),
673 Val, DAG.getVectorIdxConstant(0, DL));
674
675 // Vector widening case, e.g. <2 x float> -> <4 x float>. Shuffle in
676 // undef elements.
678 DAG.ExtractVectorElements(Val, Ops);
679 SDValue EltUndef = DAG.getUNDEF(PartEVT);
680 Ops.append((PartNumElts - ValueNumElts).getFixedValue(), EltUndef);
681
682 // FIXME: Use CONCAT for 2x -> 4x.
683 return DAG.getBuildVector(PartVT, DL, Ops);
684}
685
686/// getCopyToPartsVector - Create a series of nodes that contain the specified
687/// value split into legal parts.
688static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &DL,
689 SDValue Val, SDValue *Parts, unsigned NumParts,
690 MVT PartVT, const Value *V,
691 std::optional<CallingConv::ID> CallConv) {
692 EVT ValueVT = Val.getValueType();
693 assert(ValueVT.isVector() && "Not a vector");
694 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
695 const bool IsABIRegCopy = CallConv.has_value();
696
697 if (NumParts == 1) {
698 EVT PartEVT = PartVT;
699 if (PartEVT == ValueVT) {
700 // Nothing to do.
701 } else if (PartVT.getSizeInBits() == ValueVT.getSizeInBits()) {
702 // Bitconvert vector->vector case.
703 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
704 } else if (SDValue Widened = widenVectorToPartType(DAG, Val, DL, PartVT)) {
705 Val = Widened;
706 } else if (PartVT.isVector() &&
708 ValueVT.getVectorElementType()) &&
709 PartEVT.getVectorElementCount() ==
710 ValueVT.getVectorElementCount()) {
711
712 // Promoted vector extract
713 Val = DAG.getAnyExtOrTrunc(Val, DL, PartVT);
714 } else if (PartEVT.isVector() &&
715 PartEVT.getVectorElementType() !=
716 ValueVT.getVectorElementType() &&
717 TLI.getTypeAction(*DAG.getContext(), ValueVT) ==
719 // Combination of widening and promotion.
720 EVT WidenVT =
722 PartVT.getVectorElementCount());
723 SDValue Widened = widenVectorToPartType(DAG, Val, DL, WidenVT);
724 Val = DAG.getAnyExtOrTrunc(Widened, DL, PartVT);
725 } else {
726 // Don't extract an integer from a float vector. This can happen if the
727 // FP type gets softened to integer and then promoted. The promotion
728 // prevents it from being picked up by the earlier bitcast case.
729 if (ValueVT.getVectorElementCount().isScalar() &&
730 (!ValueVT.isFloatingPoint() || !PartVT.isInteger())) {
731 // If we reach this condition and PartVT is FP, this means that
732 // ValueVT is also FP and both have a different size, otherwise we
733 // would have bitcasted them. Producing an EXTRACT_VECTOR_ELT here
734 // would be invalid since that would mean the smaller FP type has to
735 // be extended to the larger one.
736 if (PartVT.isFloatingPoint()) {
737 Val = DAG.getBitcast(ValueVT.getScalarType(), Val);
738 Val = DAG.getNode(ISD::FP_EXTEND, DL, PartVT, Val);
739 } else
740 Val = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, PartVT, Val,
741 DAG.getVectorIdxConstant(0, DL));
742 } else {
743 uint64_t ValueSize = ValueVT.getFixedSizeInBits();
744 assert(PartVT.getFixedSizeInBits() > ValueSize &&
745 "lossy conversion of vector to scalar type");
746 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
747 Val = DAG.getBitcast(IntermediateType, Val);
748 Val = DAG.getAnyExtOrTrunc(Val, DL, PartVT);
749 }
750 }
751
752 assert(Val.getValueType() == PartVT && "Unexpected vector part value type");
753 Parts[0] = Val;
754 return;
755 }
756
757 // Handle a multi-element vector.
758 EVT IntermediateVT;
759 MVT RegisterVT;
760 unsigned NumIntermediates;
761 unsigned NumRegs;
762 if (IsABIRegCopy) {
764 *DAG.getContext(), *CallConv, ValueVT, IntermediateVT, NumIntermediates,
765 RegisterVT);
766 } else {
767 NumRegs =
768 TLI.getVectorTypeBreakdown(*DAG.getContext(), ValueVT, IntermediateVT,
769 NumIntermediates, RegisterVT);
770 }
771
772 assert(NumRegs == NumParts && "Part count doesn't match vector breakdown!");
773 NumParts = NumRegs; // Silence a compiler warning.
774 assert(RegisterVT == PartVT && "Part type doesn't match vector breakdown!");
775
776 assert(IntermediateVT.isScalableVector() == ValueVT.isScalableVector() &&
777 "Mixing scalable and fixed vectors when copying in parts");
778
779 std::optional<ElementCount> DestEltCnt;
780
781 if (IntermediateVT.isVector())
782 DestEltCnt = IntermediateVT.getVectorElementCount() * NumIntermediates;
783 else
784 DestEltCnt = ElementCount::getFixed(NumIntermediates);
785
786 EVT BuiltVectorTy = EVT::getVectorVT(
787 *DAG.getContext(), IntermediateVT.getScalarType(), *DestEltCnt);
788
789 if (ValueVT == BuiltVectorTy) {
790 // Nothing to do.
791 } else if (ValueVT.getSizeInBits() == BuiltVectorTy.getSizeInBits()) {
792 // Bitconvert vector->vector case.
793 Val = DAG.getNode(ISD::BITCAST, DL, BuiltVectorTy, Val);
794 } else {
795 if (BuiltVectorTy.getVectorElementType().bitsGT(
796 ValueVT.getVectorElementType())) {
797 // Integer promotion.
798 ValueVT = EVT::getVectorVT(*DAG.getContext(),
799 BuiltVectorTy.getVectorElementType(),
800 ValueVT.getVectorElementCount());
801 Val = DAG.getNode(ISD::ANY_EXTEND, DL, ValueVT, Val);
802 }
803
804 if (SDValue Widened = widenVectorToPartType(DAG, Val, DL, BuiltVectorTy)) {
805 Val = Widened;
806 }
807 }
808
809 assert(Val.getValueType() == BuiltVectorTy && "Unexpected vector value type");
810
811 // Split the vector into intermediate operands.
812 SmallVector<SDValue, 8> Ops(NumIntermediates);
813 for (unsigned i = 0; i != NumIntermediates; ++i) {
814 if (IntermediateVT.isVector()) {
815 // This does something sensible for scalable vectors - see the
816 // definition of EXTRACT_SUBVECTOR for further details.
817 unsigned IntermediateNumElts = IntermediateVT.getVectorMinNumElements();
818 Ops[i] =
819 DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, IntermediateVT, Val,
820 DAG.getVectorIdxConstant(i * IntermediateNumElts, DL));
821 } else {
822 Ops[i] = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, IntermediateVT, Val,
823 DAG.getVectorIdxConstant(i, DL));
824 }
825 }
826
827 // Split the intermediate operands into legal parts.
828 if (NumParts == NumIntermediates) {
829 // If the register was not expanded, promote or copy the value,
830 // as appropriate.
831 for (unsigned i = 0; i != NumParts; ++i)
832 getCopyToParts(DAG, DL, Ops[i], &Parts[i], 1, PartVT, V, CallConv);
833 } else if (NumParts > 0) {
834 // If the intermediate type was expanded, split each the value into
835 // legal parts.
836 assert(NumIntermediates != 0 && "division by zero");
837 assert(NumParts % NumIntermediates == 0 &&
838 "Must expand into a divisible number of parts!");
839 unsigned Factor = NumParts / NumIntermediates;
840 for (unsigned i = 0; i != NumIntermediates; ++i)
841 getCopyToParts(DAG, DL, Ops[i], &Parts[i * Factor], Factor, PartVT, V,
842 CallConv);
843 }
844}
845
846static void failForInvalidBundles(const CallBase &I, StringRef Name,
847 ArrayRef<uint32_t> AllowedBundles) {
848 if (I.hasOperandBundlesOtherThan(AllowedBundles)) {
849 ListSeparator LS;
850 std::string Error;
852 for (unsigned i = 0, e = I.getNumOperandBundles(); i != e; ++i) {
853 OperandBundleUse U = I.getOperandBundleAt(i);
854 if (!is_contained(AllowedBundles, U.getTagID()))
855 OS << LS << U.getTagName();
856 }
858 Twine("cannot lower ", Name)
859 .concat(Twine(" with arbitrary operand bundles: ", Error)));
860 }
861}
862
864 EVT valuevt, std::optional<CallingConv::ID> CC)
865 : ValueVTs(1, valuevt), RegVTs(1, regvt), Regs(regs),
866 RegCount(1, regs.size()), CallConv(CC) {}
867
869 const DataLayout &DL, Register Reg, Type *Ty,
870 std::optional<CallingConv::ID> CC) {
871 ComputeValueVTs(TLI, DL, Ty, ValueVTs);
872
873 CallConv = CC;
874
875 for (EVT ValueVT : ValueVTs) {
876 unsigned NumRegs =
878 ? TLI.getNumRegistersForCallingConv(Context, *CC, ValueVT)
879 : TLI.getNumRegisters(Context, ValueVT);
880 MVT RegisterVT =
882 ? TLI.getRegisterTypeForCallingConv(Context, *CC, ValueVT)
883 : TLI.getRegisterType(Context, ValueVT);
884 for (unsigned i = 0; i != NumRegs; ++i)
885 Regs.push_back(Reg + i);
886 RegVTs.push_back(RegisterVT);
887 RegCount.push_back(NumRegs);
888 Reg = Reg.id() + NumRegs;
889 }
890}
891
893 FunctionLoweringInfo &FuncInfo,
894 const SDLoc &dl, SDValue &Chain,
895 SDValue *Glue, const Value *V) const {
896 // A Value with type {} or [0 x %t] needs no registers.
897 if (ValueVTs.empty())
898 return SDValue();
899
900 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
901
902 // Assemble the legal parts into the final values.
903 SmallVector<SDValue, 4> Values(ValueVTs.size());
905 for (unsigned Value = 0, Part = 0, e = ValueVTs.size(); Value != e; ++Value) {
906 // Copy the legal parts from the registers.
907 EVT ValueVT = ValueVTs[Value];
908 unsigned NumRegs = RegCount[Value];
909 MVT RegisterVT = isABIMangled()
911 *DAG.getContext(), *CallConv, RegVTs[Value])
912 : RegVTs[Value];
913
914 Parts.resize(NumRegs);
915 for (unsigned i = 0; i != NumRegs; ++i) {
916 SDValue P;
917 if (!Glue) {
918 P = DAG.getCopyFromReg(Chain, dl, Regs[Part+i], RegisterVT);
919 } else {
920 P = DAG.getCopyFromReg(Chain, dl, Regs[Part+i], RegisterVT, *Glue);
921 *Glue = P.getValue(2);
922 }
923
924 Chain = P.getValue(1);
925 Parts[i] = P;
926
927 // If the source register was virtual and if we know something about it,
928 // add an assert node.
929 if (!Regs[Part + i].isVirtual() || !RegisterVT.isInteger())
930 continue;
931
933 FuncInfo.GetLiveOutRegInfo(Regs[Part+i]);
934 if (!LOI)
935 continue;
936
937 unsigned RegSize = RegisterVT.getScalarSizeInBits();
938 unsigned NumSignBits = LOI->NumSignBits;
939 unsigned NumZeroBits = LOI->Known.countMinLeadingZeros();
940
941 if (NumZeroBits == RegSize) {
942 // The current value is a zero.
943 // Explicitly express that as it would be easier for
944 // optimizations to kick in.
945 Parts[i] = DAG.getConstant(0, dl, RegisterVT);
946 continue;
947 }
948
949 // FIXME: We capture more information than the dag can represent. For
950 // now, just use the tightest assertzext/assertsext possible.
951 bool isSExt;
952 EVT FromVT(MVT::Other);
953 if (NumZeroBits) {
954 FromVT = EVT::getIntegerVT(*DAG.getContext(), RegSize - NumZeroBits);
955 isSExt = false;
956 } else if (NumSignBits > 1) {
957 FromVT =
958 EVT::getIntegerVT(*DAG.getContext(), RegSize - NumSignBits + 1);
959 isSExt = true;
960 } else {
961 continue;
962 }
963 // Add an assertion node.
964 assert(FromVT != MVT::Other);
965 Parts[i] = DAG.getNode(isSExt ? ISD::AssertSext : ISD::AssertZext, dl,
966 RegisterVT, P, DAG.getValueType(FromVT));
967 }
968
969 Values[Value] = getCopyFromParts(DAG, dl, Parts.begin(), NumRegs,
970 RegisterVT, ValueVT, V, Chain, CallConv);
971 Part += NumRegs;
972 Parts.clear();
973 }
974
975 return DAG.getNode(ISD::MERGE_VALUES, dl, DAG.getVTList(ValueVTs), Values);
976}
977
979 const SDLoc &dl, SDValue &Chain, SDValue *Glue,
980 const Value *V,
981 ISD::NodeType PreferredExtendType) const {
982 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
983 ISD::NodeType ExtendKind = PreferredExtendType;
984
985 // Get the list of the values's legal parts.
986 unsigned NumRegs = Regs.size();
987 SmallVector<SDValue, 8> Parts(NumRegs);
988 for (unsigned Value = 0, Part = 0, e = ValueVTs.size(); Value != e; ++Value) {
989 unsigned NumParts = RegCount[Value];
990
991 MVT RegisterVT = isABIMangled()
993 *DAG.getContext(), *CallConv, RegVTs[Value])
994 : RegVTs[Value];
995
996 if (ExtendKind == ISD::ANY_EXTEND && TLI.isZExtFree(Val, RegisterVT))
997 ExtendKind = ISD::ZERO_EXTEND;
998
999 getCopyToParts(DAG, dl, Val.getValue(Val.getResNo() + Value), &Parts[Part],
1000 NumParts, RegisterVT, V, CallConv, ExtendKind);
1001 Part += NumParts;
1002 }
1003
1004 // Copy the parts into the registers.
1005 SmallVector<SDValue, 8> Chains(NumRegs);
1006 for (unsigned i = 0; i != NumRegs; ++i) {
1007 SDValue Part;
1008 if (!Glue) {
1009 Part = DAG.getCopyToReg(Chain, dl, Regs[i], Parts[i]);
1010 } else {
1011 Part = DAG.getCopyToReg(Chain, dl, Regs[i], Parts[i], *Glue);
1012 *Glue = Part.getValue(1);
1013 }
1014
1015 Chains[i] = Part.getValue(0);
1016 }
1017
1018 if (NumRegs == 1 || Glue)
1019 // If NumRegs > 1 && Glue is used then the use of the last CopyToReg is
1020 // flagged to it. That is the CopyToReg nodes and the user are considered
1021 // a single scheduling unit. If we create a TokenFactor and return it as
1022 // chain, then the TokenFactor is both a predecessor (operand) of the
1023 // user as well as a successor (the TF operands are flagged to the user).
1024 // c1, f1 = CopyToReg
1025 // c2, f2 = CopyToReg
1026 // c3 = TokenFactor c1, c2
1027 // ...
1028 // = op c3, ..., f2
1029 Chain = Chains[NumRegs-1];
1030 else
1031 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chains);
1032}
1033
1035 unsigned MatchingIdx, const SDLoc &dl,
1036 SelectionDAG &DAG,
1037 std::vector<SDValue> &Ops) const {
1038 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1039
1040 InlineAsm::Flag Flag(Code, Regs.size());
1041 if (HasMatching)
1042 Flag.setMatchingOp(MatchingIdx);
1043 else if (!Regs.empty() && Regs.front().isVirtual()) {
1044 // Put the register class of the virtual registers in the flag word. That
1045 // way, later passes can recompute register class constraints for inline
1046 // assembly as well as normal instructions.
1047 // Don't do this for tied operands that can use the regclass information
1048 // from the def.
1050 const TargetRegisterClass *RC = MRI.getRegClass(Regs.front());
1051 Flag.setRegClass(RC->getID());
1052 }
1053
1054 SDValue Res = DAG.getTargetConstant(Flag, dl, MVT::i32);
1055 Ops.push_back(Res);
1056
1057 if (Code == InlineAsm::Kind::Clobber) {
1058 // Clobbers should always have a 1:1 mapping with registers, and may
1059 // reference registers that have illegal (e.g. vector) types. Hence, we
1060 // shouldn't try to apply any sort of splitting logic to them.
1061 assert(Regs.size() == RegVTs.size() && Regs.size() == ValueVTs.size() &&
1062 "No 1:1 mapping from clobbers to regs?");
1064 (void)SP;
1065 for (unsigned I = 0, E = ValueVTs.size(); I != E; ++I) {
1066 Ops.push_back(DAG.getRegister(Regs[I], RegVTs[I]));
1067 assert(
1068 (Regs[I] != SP ||
1070 "If we clobbered the stack pointer, MFI should know about it.");
1071 }
1072 return;
1073 }
1074
1075 for (unsigned Value = 0, Reg = 0, e = ValueVTs.size(); Value != e; ++Value) {
1076 MVT RegisterVT = RegVTs[Value];
1077 unsigned NumRegs = TLI.getNumRegisters(*DAG.getContext(), ValueVTs[Value],
1078 RegisterVT);
1079 for (unsigned i = 0; i != NumRegs; ++i) {
1080 assert(Reg < Regs.size() && "Mismatch in # registers expected");
1081 Register TheReg = Regs[Reg++];
1082 Ops.push_back(DAG.getRegister(TheReg, RegisterVT));
1083 }
1084 }
1085}
1086
1090 unsigned I = 0;
1091 for (auto CountAndVT : zip_first(RegCount, RegVTs)) {
1092 unsigned RegCount = std::get<0>(CountAndVT);
1093 MVT RegisterVT = std::get<1>(CountAndVT);
1094 TypeSize RegisterSize = RegisterVT.getSizeInBits();
1095 for (unsigned E = I + RegCount; I != E; ++I)
1096 OutVec.push_back(std::make_pair(Regs[I], RegisterSize));
1097 }
1098 return OutVec;
1099}
1100
1102 AssumptionCache *ac, const TargetLibraryInfo *li,
1103 const TargetTransformInfo &TTI) {
1104 BatchAA = aa;
1105 AC = ac;
1106 GFI = gfi;
1107 LibInfo = li;
1108 Context = DAG.getContext();
1109 LPadToCallSiteMap.clear();
1110 this->TTI = &TTI;
1111 SL->init(DAG.getTargetLoweringInfo(), TM, DAG.getDataLayout());
1112 AssignmentTrackingEnabled = isAssignmentTrackingEnabled(
1113 *DAG.getMachineFunction().getFunction().getParent());
1114}
1115
1117 NodeMap.clear();
1118 UnusedArgNodeMap.clear();
1119 PendingLoads.clear();
1120 PendingExports.clear();
1121 PendingConstrainedFP.clear();
1122 PendingConstrainedFPStrict.clear();
1123 CurInst = nullptr;
1124 HasTailCall = false;
1125 SDNodeOrder = LowestSDNodeOrder;
1126 StatepointLowering.clear();
1127}
1128
1130 DanglingDebugInfoMap.clear();
1131}
1132
1133// Update DAG root to include dependencies on Pending chains.
1134SDValue SelectionDAGBuilder::updateRoot(SmallVectorImpl<SDValue> &Pending) {
1135 SDValue Root = DAG.getRoot();
1136
1137 if (Pending.empty())
1138 return Root;
1139
1140 // Add current root to PendingChains, unless we already indirectly
1141 // depend on it.
1142 if (Root.getOpcode() != ISD::EntryToken) {
1143 unsigned i = 0, e = Pending.size();
1144 for (; i != e; ++i) {
1145 assert(Pending[i].getNode()->getNumOperands() > 1);
1146 if (Pending[i].getNode()->getOperand(0) == Root)
1147 break; // Don't add the root if we already indirectly depend on it.
1148 }
1149
1150 if (i == e)
1151 Pending.push_back(Root);
1152 }
1153
1154 if (Pending.size() == 1)
1155 Root = Pending[0];
1156 else
1157 Root = DAG.getTokenFactor(getCurSDLoc(), Pending);
1158
1159 DAG.setRoot(Root);
1160 Pending.clear();
1161 return Root;
1162}
1163
1167
1169 // If the new exception behavior differs from that of the pending
1170 // ones, chain up them and update the root.
1171 switch (EB) {
1174 // Floating-point exceptions produced by such operations are not intended
1175 // to be observed, so the sequence of these operations does not need to be
1176 // preserved.
1177 //
1178 // They however must not be mixed with the instructions that have strict
1179 // exception behavior. Placing an operation with 'ebIgnore' behavior between
1180 // 'ebStrict' operations could distort the observed exception behavior.
1181 if (!PendingConstrainedFPStrict.empty()) {
1182 assert(PendingConstrainedFP.empty());
1183 updateRoot(PendingConstrainedFPStrict);
1184 }
1185 break;
1187 // Floating-point exception produced by these operations may be observed, so
1188 // they must be correctly chained. If trapping on FP exceptions is
1189 // disabled, the exceptions can be observed only by functions that read
1190 // exception flags, like 'llvm.get_fpenv' or 'fetestexcept'. It means that
1191 // the order of operations is not significant between barriers.
1192 //
1193 // If trapping is enabled, each operation becomes an implicit observation
1194 // point, so the operations must be sequenced according their original
1195 // source order.
1196 if (!PendingConstrainedFP.empty()) {
1197 assert(PendingConstrainedFPStrict.empty());
1198 updateRoot(PendingConstrainedFP);
1199 }
1200 // TODO: Add support for trapping-enabled scenarios.
1201 }
1202 return DAG.getRoot();
1203}
1204
1206 // Chain up all pending constrained intrinsics together with all
1207 // pending loads, by simply appending them to PendingLoads and
1208 // then calling getMemoryRoot().
1209 PendingLoads.reserve(PendingLoads.size() +
1210 PendingConstrainedFP.size() +
1211 PendingConstrainedFPStrict.size());
1212 PendingLoads.append(PendingConstrainedFP.begin(),
1213 PendingConstrainedFP.end());
1214 PendingLoads.append(PendingConstrainedFPStrict.begin(),
1215 PendingConstrainedFPStrict.end());
1216 PendingConstrainedFP.clear();
1217 PendingConstrainedFPStrict.clear();
1218 return getMemoryRoot();
1219}
1220
1222 // We need to emit pending fpexcept.strict constrained intrinsics,
1223 // so append them to the PendingExports list.
1224 PendingExports.append(PendingConstrainedFPStrict.begin(),
1225 PendingConstrainedFPStrict.end());
1226 PendingConstrainedFPStrict.clear();
1227 return updateRoot(PendingExports);
1228}
1229
1231 DILocalVariable *Variable,
1233 DebugLoc DL) {
1234 assert(Variable && "Missing variable");
1235
1236 // Check if address has undef value.
1237 if (!Address || isa<UndefValue>(Address) ||
1238 (Address->use_empty() && !isa<Argument>(Address))) {
1239 LLVM_DEBUG(
1240 dbgs()
1241 << "dbg_declare: Dropping debug info (bad/undef/unused-arg address)\n");
1242 return;
1243 }
1244
1245 bool IsParameter = Variable->isParameter() || isa<Argument>(Address);
1246
1247 SDValue &N = NodeMap[Address];
1248 if (!N.getNode() && isa<Argument>(Address))
1249 // Check unused arguments map.
1250 N = UnusedArgNodeMap[Address];
1251 SDDbgValue *SDV;
1252 if (N.getNode()) {
1253 if (const BitCastInst *BCI = dyn_cast<BitCastInst>(Address))
1254 Address = BCI->getOperand(0);
1255 // Parameters are handled specially.
1256 auto *FINode = dyn_cast<FrameIndexSDNode>(N.getNode());
1257 if (IsParameter && FINode) {
1258 // Byval parameter. We have a frame index at this point.
1259 SDV = DAG.getFrameIndexDbgValue(Variable, Expression, FINode->getIndex(),
1260 /*IsIndirect*/ true, DL, SDNodeOrder);
1261 } else if (isa<Argument>(Address)) {
1262 // Address is an argument, so try to emit its dbg value using
1263 // virtual register info from the FuncInfo.ValueMap.
1264 EmitFuncArgumentDbgValue(Address, Variable, Expression, DL,
1265 FuncArgumentDbgValueKind::Declare, N);
1266 return;
1267 } else {
1268 SDV = DAG.getDbgValue(Variable, Expression, N.getNode(), N.getResNo(),
1269 true, DL, SDNodeOrder);
1270 }
1271 DAG.AddDbgValue(SDV, IsParameter);
1272 } else {
1273 // If Address is an argument then try to emit its dbg value using
1274 // virtual register info from the FuncInfo.ValueMap.
1275 if (!EmitFuncArgumentDbgValue(Address, Variable, Expression, DL,
1276 FuncArgumentDbgValueKind::Declare, N)) {
1277 LLVM_DEBUG(dbgs() << "dbg_declare: Dropping debug info"
1278 << " (could not emit func-arg dbg_value)\n");
1279 }
1280 }
1281}
1282
1284 // Add SDDbgValue nodes for any var locs here. Do so before updating
1285 // SDNodeOrder, as this mapping is {Inst -> Locs BEFORE Inst}.
1286 if (FunctionVarLocs const *FnVarLocs = DAG.getFunctionVarLocs()) {
1287 // Add SDDbgValue nodes for any var locs here. Do so before updating
1288 // SDNodeOrder, as this mapping is {Inst -> Locs BEFORE Inst}.
1289 for (auto It = FnVarLocs->locs_begin(&I), End = FnVarLocs->locs_end(&I);
1290 It != End; ++It) {
1291 auto *Var = FnVarLocs->getDILocalVariable(It->VariableID);
1292 dropDanglingDebugInfo(Var, It->Expr);
1293 if (It->Values.isKillLocation(It->Expr)) {
1294 handleKillDebugValue(Var, It->Expr, It->DL, SDNodeOrder);
1295 continue;
1296 }
1297 SmallVector<Value *> Values(It->Values.location_ops());
1298 if (!handleDebugValue(Values, Var, It->Expr, It->DL, SDNodeOrder,
1299 It->Values.hasArgList())) {
1300 SmallVector<Value *, 4> Vals(It->Values.location_ops());
1302 FnVarLocs->getDILocalVariable(It->VariableID),
1303 It->Expr, Vals.size() > 1, It->DL, SDNodeOrder);
1304 }
1305 }
1306 }
1307
1308 // We must skip DbgVariableRecords if they've already been processed above as
1309 // we have just emitted the debug values resulting from assignment tracking
1310 // analysis, making any existing DbgVariableRecords redundant (and probably
1311 // less correct). We still need to process DbgLabelRecords. This does sink
1312 // DbgLabelRecords to the bottom of the group of debug records. That sholdn't
1313 // be important as it does so deterministcally and ordering between
1314 // DbgLabelRecords and DbgVariableRecords is immaterial (other than for MIR/IR
1315 // printing).
1316 bool SkipDbgVariableRecords = DAG.getFunctionVarLocs();
1317 // Is there is any debug-info attached to this instruction, in the form of
1318 // DbgRecord non-instruction debug-info records.
1319 for (DbgRecord &DR : I.getDbgRecordRange()) {
1320 if (DbgLabelRecord *DLR = dyn_cast<DbgLabelRecord>(&DR)) {
1321 assert(DLR->getLabel() && "Missing label");
1322 SDDbgLabel *SDV =
1323 DAG.getDbgLabel(DLR->getLabel(), DLR->getDebugLoc(), SDNodeOrder);
1324 DAG.AddDbgLabel(SDV);
1325 continue;
1326 }
1327
1328 if (SkipDbgVariableRecords)
1329 continue;
1331 DILocalVariable *Variable = DVR.getVariable();
1334
1336 if (FuncInfo.PreprocessedDVRDeclares.contains(&DVR))
1337 continue;
1338 LLVM_DEBUG(dbgs() << "SelectionDAG visiting dbg_declare: " << DVR
1339 << "\n");
1341 DVR.getDebugLoc());
1342 continue;
1343 }
1344
1345 // A DbgVariableRecord with no locations is a kill location.
1347 if (Values.empty()) {
1349 SDNodeOrder);
1350 continue;
1351 }
1352
1353 // A DbgVariableRecord with an undef or absent location is also a kill
1354 // location.
1355 if (llvm::any_of(Values,
1356 [](Value *V) { return !V || isa<UndefValue>(V); })) {
1358 SDNodeOrder);
1359 continue;
1360 }
1361
1362 bool IsVariadic = DVR.hasArgList();
1363 if (!handleDebugValue(Values, Variable, Expression, DVR.getDebugLoc(),
1364 SDNodeOrder, IsVariadic)) {
1365 addDanglingDebugInfo(Values, Variable, Expression, IsVariadic,
1366 DVR.getDebugLoc(), SDNodeOrder);
1367 }
1368 }
1369}
1370
1372 visitDbgInfo(I);
1373
1374 // Set up outgoing PHI node register values before emitting the terminator.
1375 if (I.isTerminator()) {
1376 HandlePHINodesInSuccessorBlocks(I.getParent());
1377 }
1378
1379 ++SDNodeOrder;
1380 CurInst = &I;
1381
1382 // Set inserted listener only if required.
1383 bool NodeInserted = false;
1384 std::unique_ptr<SelectionDAG::DAGNodeInsertedListener> InsertedListener;
1385 MDNode *PCSectionsMD = I.getMetadata(LLVMContext::MD_pcsections);
1386 MDNode *MMRA = I.getMetadata(LLVMContext::MD_mmra);
1387 if (PCSectionsMD || MMRA) {
1388 InsertedListener = std::make_unique<SelectionDAG::DAGNodeInsertedListener>(
1389 DAG, [&](SDNode *) { NodeInserted = true; });
1390 }
1391
1392 visit(I.getOpcode(), I);
1393
1394 if (!I.isTerminator() && !HasTailCall &&
1395 !isa<GCStatepointInst>(I)) // statepoints handle their exports internally
1397
1398 // Handle metadata.
1399 if (PCSectionsMD || MMRA) {
1400 auto It = NodeMap.find(&I);
1401 if (It != NodeMap.end()) {
1402 if (PCSectionsMD)
1403 DAG.addPCSections(It->second.getNode(), PCSectionsMD);
1404 if (MMRA)
1405 DAG.addMMRAMetadata(It->second.getNode(), MMRA);
1406 } else if (NodeInserted) {
1407 // This should not happen; if it does, don't let it go unnoticed so we can
1408 // fix it. Relevant visit*() function is probably missing a setValue().
1409 errs() << "warning: loosing !pcsections and/or !mmra metadata ["
1410 << I.getModule()->getName() << "]\n";
1411 LLVM_DEBUG(I.dump());
1412 assert(false);
1413 }
1414 }
1415
1416 CurInst = nullptr;
1417}
1418
1419void SelectionDAGBuilder::visitPHI(const PHINode &) {
1420 llvm_unreachable("SelectionDAGBuilder shouldn't visit PHI nodes!");
1421}
1422
1423void SelectionDAGBuilder::visit(unsigned Opcode, const User &I) {
1424 // Note: this doesn't use InstVisitor, because it has to work with
1425 // ConstantExpr's in addition to instructions.
1426 switch (Opcode) {
1427 default: llvm_unreachable("Unknown instruction type encountered!");
1428 // Build the switch statement using the Instruction.def file.
1429#define HANDLE_INST(NUM, OPCODE, CLASS) \
1430 case Instruction::OPCODE: visit##OPCODE((const CLASS&)I); break;
1431#include "llvm/IR/Instruction.def"
1432 }
1433}
1434
1436 DILocalVariable *Variable,
1437 DebugLoc DL, unsigned Order,
1440 // For variadic dbg_values we will now insert poison.
1441 // FIXME: We can potentially recover these!
1443 for (const Value *V : Values) {
1444 auto *Poison = PoisonValue::get(V->getType());
1446 }
1447 SDDbgValue *SDV = DAG.getDbgValueList(Variable, Expression, Locs, {},
1448 /*IsIndirect=*/false, DL, Order,
1449 /*IsVariadic=*/true);
1450 DAG.AddDbgValue(SDV, /*isParameter=*/false);
1451 return true;
1452}
1453
1455 DILocalVariable *Var,
1456 DIExpression *Expr,
1457 bool IsVariadic, DebugLoc DL,
1458 unsigned Order) {
1459 if (IsVariadic) {
1460 handleDanglingVariadicDebugInfo(DAG, Var, DL, Order, Values, Expr);
1461 return;
1462 }
1463 // TODO: Dangling debug info will eventually either be resolved or produce
1464 // a poison DBG_VALUE. However in the resolution case, a gap may appear
1465 // between the original dbg.value location and its resolved DBG_VALUE,
1466 // which we should ideally fill with an extra poison DBG_VALUE.
1467 assert(Values.size() == 1);
1468 DanglingDebugInfoMap[Values[0]].emplace_back(Var, Expr, DL, Order);
1469}
1470
1472 const DIExpression *Expr) {
1473 auto isMatchingDbgValue = [&](DanglingDebugInfo &DDI) {
1474 DIVariable *DanglingVariable = DDI.getVariable();
1475 DIExpression *DanglingExpr = DDI.getExpression();
1476 if (DanglingVariable == Variable && Expr->fragmentsOverlap(DanglingExpr)) {
1477 LLVM_DEBUG(dbgs() << "Dropping dangling debug info for "
1478 << printDDI(nullptr, DDI) << "\n");
1479 return true;
1480 }
1481 return false;
1482 };
1483
1484 for (auto &DDIMI : DanglingDebugInfoMap) {
1485 DanglingDebugInfoVector &DDIV = DDIMI.second;
1486
1487 // If debug info is to be dropped, run it through final checks to see
1488 // whether it can be salvaged.
1489 for (auto &DDI : DDIV)
1490 if (isMatchingDbgValue(DDI))
1491 salvageUnresolvedDbgValue(DDIMI.first, DDI);
1492
1493 erase_if(DDIV, isMatchingDbgValue);
1494 }
1495}
1496
1497// resolveDanglingDebugInfo - if we saw an earlier dbg_value referring to V,
1498// generate the debug data structures now that we've seen its definition.
1500 SDValue Val) {
1501 auto DanglingDbgInfoIt = DanglingDebugInfoMap.find(V);
1502 if (DanglingDbgInfoIt == DanglingDebugInfoMap.end())
1503 return;
1504
1505 DanglingDebugInfoVector &DDIV = DanglingDbgInfoIt->second;
1506 for (auto &DDI : DDIV) {
1507 DebugLoc DL = DDI.getDebugLoc();
1508 unsigned DbgSDNodeOrder = DDI.getSDNodeOrder();
1509 DILocalVariable *Variable = DDI.getVariable();
1510 DIExpression *Expr = DDI.getExpression();
1511 assert(Variable->isValidLocationForIntrinsic(DL) &&
1512 "Expected inlined-at fields to agree");
1513 SDDbgValue *SDV;
1514 if (Val.getNode()) {
1515 // FIXME: I doubt that it is correct to resolve a dangling DbgValue as a
1516 // FuncArgumentDbgValue (it would be hoisted to the function entry, and if
1517 // we couldn't resolve it directly when examining the DbgValue intrinsic
1518 // in the first place we should not be more successful here). Unless we
1519 // have some test case that prove this to be correct we should avoid
1520 // calling EmitFuncArgumentDbgValue here.
1521 unsigned ValSDNodeOrder = Val.getNode()->getIROrder();
1522 if (!EmitFuncArgumentDbgValue(V, Variable, Expr, DL,
1523 FuncArgumentDbgValueKind::Value, Val)) {
1524 LLVM_DEBUG(dbgs() << "Resolve dangling debug info for "
1525 << printDDI(V, DDI) << "\n");
1526 LLVM_DEBUG(dbgs() << " By mapping to:\n "; Val.dump());
1527 // Increase the SDNodeOrder for the DbgValue here to make sure it is
1528 // inserted after the definition of Val when emitting the instructions
1529 // after ISel. An alternative could be to teach
1530 // ScheduleDAGSDNodes::EmitSchedule to delay the insertion properly.
1531 LLVM_DEBUG(if (ValSDNodeOrder > DbgSDNodeOrder) dbgs()
1532 << "changing SDNodeOrder from " << DbgSDNodeOrder << " to "
1533 << ValSDNodeOrder << "\n");
1534 SDV = getDbgValue(Val, Variable, Expr, DL,
1535 std::max(DbgSDNodeOrder, ValSDNodeOrder));
1536 DAG.AddDbgValue(SDV, false);
1537 } else
1538 LLVM_DEBUG(dbgs() << "Resolved dangling debug info for "
1539 << printDDI(V, DDI)
1540 << " in EmitFuncArgumentDbgValue\n");
1541 } else {
1542 LLVM_DEBUG(dbgs() << "Dropping debug info for " << printDDI(V, DDI)
1543 << "\n");
1544 auto Poison = PoisonValue::get(V->getType());
1545 auto SDV =
1546 DAG.getConstantDbgValue(Variable, Expr, Poison, DL, DbgSDNodeOrder);
1547 DAG.AddDbgValue(SDV, false);
1548 }
1549 }
1550 DDIV.clear();
1551}
1552
1554 DanglingDebugInfo &DDI) {
1555 // TODO: For the variadic implementation, instead of only checking the fail
1556 // state of `handleDebugValue`, we need know specifically which values were
1557 // invalid, so that we attempt to salvage only those values when processing
1558 // a DIArgList.
1559 const Value *OrigV = V;
1560 DILocalVariable *Var = DDI.getVariable();
1561 DIExpression *Expr = DDI.getExpression();
1562 DebugLoc DL = DDI.getDebugLoc();
1563 unsigned SDOrder = DDI.getSDNodeOrder();
1564
1565 // Currently we consider only dbg.value intrinsics -- we tell the salvager
1566 // that DW_OP_stack_value is desired.
1567 bool StackValue = true;
1568
1569 // Can this Value can be encoded without any further work?
1570 if (handleDebugValue(V, Var, Expr, DL, SDOrder, /*IsVariadic=*/false))
1571 return;
1572
1573 // Attempt to salvage back through as many instructions as possible. Bail if
1574 // a non-instruction is seen, such as a constant expression or global
1575 // variable. FIXME: Further work could recover those too.
1576 while (isa<Instruction>(V)) {
1577 const Instruction &VAsInst = *cast<const Instruction>(V);
1578 // Temporary "0", awaiting real implementation.
1580 SmallVector<Value *, 4> AdditionalValues;
1581 V = salvageDebugInfoImpl(const_cast<Instruction &>(VAsInst),
1582 Expr->getNumLocationOperands(), Ops,
1583 AdditionalValues);
1584 // If we cannot salvage any further, and haven't yet found a suitable debug
1585 // expression, bail out.
1586 if (!V)
1587 break;
1588
1589 // TODO: If AdditionalValues isn't empty, then the salvage can only be
1590 // represented with a DBG_VALUE_LIST, so we give up. When we have support
1591 // here for variadic dbg_values, remove that condition.
1592 if (!AdditionalValues.empty())
1593 break;
1594
1595 // New value and expr now represent this debuginfo.
1596 Expr = DIExpression::appendOpsToArg(Expr, Ops, 0, StackValue);
1597
1598 // Some kind of simplification occurred: check whether the operand of the
1599 // salvaged debug expression can be encoded in this DAG.
1600 if (handleDebugValue(V, Var, Expr, DL, SDOrder, /*IsVariadic=*/false)) {
1601 LLVM_DEBUG(
1602 dbgs() << "Salvaged debug location info for:\n " << *Var << "\n"
1603 << *OrigV << "\nBy stripping back to:\n " << *V << "\n");
1604 return;
1605 }
1606 }
1607
1608 // This was the final opportunity to salvage this debug information, and it
1609 // couldn't be done. Place a poison DBG_VALUE at this location to terminate
1610 // any earlier variable location.
1611 assert(OrigV && "V shouldn't be null");
1612 auto *Poison = PoisonValue::get(OrigV->getType());
1613 auto *SDV = DAG.getConstantDbgValue(Var, Expr, Poison, DL, SDNodeOrder);
1614 DAG.AddDbgValue(SDV, false);
1615 LLVM_DEBUG(dbgs() << "Dropping debug value info for:\n "
1616 << printDDI(OrigV, DDI) << "\n");
1617}
1618
1620 DIExpression *Expr,
1621 DebugLoc DbgLoc,
1622 unsigned Order) {
1626 handleDebugValue(Poison, Var, NewExpr, DbgLoc, Order,
1627 /*IsVariadic*/ false);
1628}
1629
1631 DILocalVariable *Var,
1632 DIExpression *Expr, DebugLoc DbgLoc,
1633 unsigned Order, bool IsVariadic) {
1634 if (Values.empty())
1635 return true;
1636
1637 // Filter EntryValue locations out early.
1638 if (visitEntryValueDbgValue(Values, Var, Expr, DbgLoc))
1639 return true;
1640
1641 SmallVector<SDDbgOperand> LocationOps;
1642 SmallVector<SDNode *> Dependencies;
1643 for (const Value *V : Values) {
1644 // Constant value.
1647 LocationOps.emplace_back(SDDbgOperand::fromConst(V));
1648 continue;
1649 }
1650
1651 // Look through IntToPtr constants.
1652 if (auto *CE = dyn_cast<ConstantExpr>(V))
1653 if (CE->getOpcode() == Instruction::IntToPtr) {
1654 LocationOps.emplace_back(SDDbgOperand::fromConst(CE->getOperand(0)));
1655 continue;
1656 }
1657
1658 // If the Value is a frame index, we can create a FrameIndex debug value
1659 // without relying on the DAG at all.
1660 if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
1661 auto SI = FuncInfo.StaticAllocaMap.find(AI);
1662 if (SI != FuncInfo.StaticAllocaMap.end()) {
1663 LocationOps.emplace_back(SDDbgOperand::fromFrameIdx(SI->second));
1664 continue;
1665 }
1666 }
1667
1668 // Do not use getValue() in here; we don't want to generate code at
1669 // this point if it hasn't been done yet.
1670 SDValue N = NodeMap[V];
1671 if (!N.getNode() && isa<Argument>(V)) // Check unused arguments map.
1672 N = UnusedArgNodeMap[V];
1673
1674 if (N.getNode()) {
1675 // Only emit func arg dbg value for non-variadic dbg.values for now.
1676 if (!IsVariadic &&
1677 EmitFuncArgumentDbgValue(V, Var, Expr, DbgLoc,
1678 FuncArgumentDbgValueKind::Value, N))
1679 return true;
1680 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(N.getNode())) {
1681 // Construct a FrameIndexDbgValue for FrameIndexSDNodes so we can
1682 // describe stack slot locations.
1683 //
1684 // Consider "int x = 0; int *px = &x;". There are two kinds of
1685 // interesting debug values here after optimization:
1686 //
1687 // dbg.value(i32* %px, !"int *px", !DIExpression()), and
1688 // dbg.value(i32* %px, !"int x", !DIExpression(DW_OP_deref))
1689 //
1690 // Both describe the direct values of their associated variables.
1691 Dependencies.push_back(N.getNode());
1692 LocationOps.emplace_back(SDDbgOperand::fromFrameIdx(FISDN->getIndex()));
1693 continue;
1694 }
1695 LocationOps.emplace_back(
1696 SDDbgOperand::fromNode(N.getNode(), N.getResNo()));
1697 continue;
1698 }
1699
1700 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1701 // Special rules apply for the first dbg.values of parameter variables in a
1702 // function. Identify them by the fact they reference Argument Values, that
1703 // they're parameters, and they are parameters of the current function. We
1704 // need to let them dangle until they get an SDNode.
1705 bool IsParamOfFunc =
1706 isa<Argument>(V) && Var->isParameter() && !DbgLoc.getInlinedAt();
1707 if (IsParamOfFunc)
1708 return false;
1709
1710 // The value is not used in this block yet (or it would have an SDNode).
1711 // We still want the value to appear for the user if possible -- if it has
1712 // an associated VReg, we can refer to that instead.
1713 auto VMI = FuncInfo.ValueMap.find(V);
1714 if (VMI != FuncInfo.ValueMap.end()) {
1715 Register Reg = VMI->second;
1716 // If this is a PHI node, it may be split up into several MI PHI nodes
1717 // (in FunctionLoweringInfo::set).
1718 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), Reg,
1719 V->getType(), std::nullopt);
1720 if (RFV.occupiesMultipleRegs()) {
1721 // FIXME: We could potentially support variadic dbg_values here.
1722 if (IsVariadic)
1723 return false;
1724 unsigned Offset = 0;
1725 unsigned BitsToDescribe = 0;
1726 if (auto VarSize = Var->getSizeInBits())
1727 BitsToDescribe = *VarSize;
1728 if (auto Fragment = Expr->getFragmentInfo())
1729 BitsToDescribe = Fragment->SizeInBits;
1730 for (const auto &RegAndSize : RFV.getRegsAndSizes()) {
1731 // Bail out if all bits are described already.
1732 if (Offset >= BitsToDescribe)
1733 break;
1734 // TODO: handle scalable vectors.
1735 unsigned RegisterSize = RegAndSize.second;
1736 unsigned FragmentSize = (Offset + RegisterSize > BitsToDescribe)
1737 ? BitsToDescribe - Offset
1738 : RegisterSize;
1739 auto FragmentExpr = DIExpression::createFragmentExpression(
1740 Expr, Offset, FragmentSize);
1741 if (!FragmentExpr)
1742 continue;
1743 SDDbgValue *SDV = DAG.getVRegDbgValue(
1744 Var, *FragmentExpr, RegAndSize.first, false, DbgLoc, Order);
1745 DAG.AddDbgValue(SDV, false);
1746 Offset += RegisterSize;
1747 }
1748 return true;
1749 }
1750 // We can use simple vreg locations for variadic dbg_values as well.
1751 LocationOps.emplace_back(SDDbgOperand::fromVReg(Reg));
1752 continue;
1753 }
1754 // We failed to create a SDDbgOperand for V.
1755 return false;
1756 }
1757
1758 // We have created a SDDbgOperand for each Value in Values.
1759 assert(!LocationOps.empty());
1760 SDDbgValue *SDV =
1761 DAG.getDbgValueList(Var, Expr, LocationOps, Dependencies,
1762 /*IsIndirect=*/false, DbgLoc, Order, IsVariadic);
1763 DAG.AddDbgValue(SDV, /*isParameter=*/false);
1764 return true;
1765}
1766
1768 // Try to fixup any remaining dangling debug info -- and drop it if we can't.
1769 for (auto &Pair : DanglingDebugInfoMap)
1770 for (auto &DDI : Pair.second)
1771 salvageUnresolvedDbgValue(const_cast<Value *>(Pair.first), DDI);
1773}
1774
1775/// getCopyFromRegs - If there was virtual register allocated for the value V
1776/// emit CopyFromReg of the specified type Ty. Return empty SDValue() otherwise.
1779 SDValue Result;
1780
1781 if (It != FuncInfo.ValueMap.end()) {
1782 Register InReg = It->second;
1783
1784 RegsForValue RFV(*DAG.getContext(), DAG.getTargetLoweringInfo(),
1785 DAG.getDataLayout(), InReg, Ty,
1786 std::nullopt); // This is not an ABI copy.
1787 SDValue Chain = DAG.getEntryNode();
1788 Result = RFV.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(), Chain, nullptr,
1789 V);
1790 resolveDanglingDebugInfo(V, Result);
1791 }
1792
1793 return Result;
1794}
1795
1796/// getValue - Return an SDValue for the given Value.
1798 // If we already have an SDValue for this value, use it. It's important
1799 // to do this first, so that we don't create a CopyFromReg if we already
1800 // have a regular SDValue.
1801 SDValue &N = NodeMap[V];
1802 if (N.getNode()) return N;
1803
1804 // If there's a virtual register allocated and initialized for this
1805 // value, use it.
1806 if (SDValue copyFromReg = getCopyFromRegs(V, V->getType()))
1807 return copyFromReg;
1808
1809 // Otherwise create a new SDValue and remember it.
1810 SDValue Val = getValueImpl(V);
1811 NodeMap[V] = Val;
1813 return Val;
1814}
1815
1816/// getNonRegisterValue - Return an SDValue for the given Value, but
1817/// don't look in FuncInfo.ValueMap for a virtual register.
1819 // If we already have an SDValue for this value, use it.
1820 SDValue &N = NodeMap[V];
1821 if (N.getNode()) {
1822 if (isIntOrFPConstant(N)) {
1823 // Remove the debug location from the node as the node is about to be used
1824 // in a location which may differ from the original debug location. This
1825 // is relevant to Constant and ConstantFP nodes because they can appear
1826 // as constant expressions inside PHI nodes.
1827 N->setDebugLoc(DebugLoc());
1828 }
1829 return N;
1830 }
1831
1832 // Otherwise create a new SDValue and remember it.
1833 SDValue Val = getValueImpl(V);
1834 NodeMap[V] = Val;
1836 return Val;
1837}
1838
1839/// getValueImpl - Helper function for getValue and getNonRegisterValue.
1840/// Create an SDValue for the given value.
1842 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1843
1844 if (const Constant *C = dyn_cast<Constant>(V)) {
1845 EVT VT = TLI.getValueType(DAG.getDataLayout(), V->getType(), true);
1846
1847 if (const ConstantInt *CI = dyn_cast<ConstantInt>(C)) {
1848 SDLoc DL = getCurSDLoc();
1849
1850 // DAG.getConstant() may attempt to legalise the vector constant which can
1851 // significantly change the combines applied to the DAG. To reduce the
1852 // divergence when enabling ConstantInt based vectors we try to construct
1853 // the DAG in the same way as shufflevector based splats. TODO: The
1854 // divergence sometimes leads to better optimisations. Ideally we should
1855 // prevent DAG.getConstant() from legalising too early but there are some
1856 // degradations preventing this.
1857 if (VT.isScalableVector())
1858 return DAG.getNode(
1859 ISD::SPLAT_VECTOR, DL, VT,
1860 DAG.getConstant(CI->getValue(), DL, VT.getVectorElementType()));
1861 if (VT.isFixedLengthVector())
1862 return DAG.getSplatBuildVector(
1863 VT, DL,
1864 DAG.getConstant(CI->getValue(), DL, VT.getVectorElementType()));
1865 return DAG.getConstant(*CI, DL, VT);
1866 }
1867
1868 if (const ConstantByte *CB = dyn_cast<ConstantByte>(C))
1869 return DAG.getConstant(CB->getValue(), getCurSDLoc(), VT);
1870
1871 if (const GlobalValue *GV = dyn_cast<GlobalValue>(C))
1872 return DAG.getGlobalAddress(GV, getCurSDLoc(), VT);
1873
1874 if (const ConstantPtrAuth *CPA = dyn_cast<ConstantPtrAuth>(C)) {
1875 return DAG.getNode(ISD::PtrAuthGlobalAddress, getCurSDLoc(), VT,
1876 getValue(CPA->getPointer()), getValue(CPA->getKey()),
1877 getValue(CPA->getAddrDiscriminator()),
1878 getValue(CPA->getDiscriminator()));
1879 }
1880
1882 return DAG.getConstant(0, getCurSDLoc(), VT);
1883
1884 if (match(C, m_VScale()))
1885 return DAG.getVScale(getCurSDLoc(), VT, APInt(VT.getSizeInBits(), 1));
1886
1887 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C))
1888 return DAG.getConstantFP(*CFP, getCurSDLoc(), VT);
1889
1890 if (isa<UndefValue>(C) && !V->getType()->isAggregateType())
1891 return isa<PoisonValue>(C) ? DAG.getPOISON(VT) : DAG.getUNDEF(VT);
1892
1893 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
1894 visit(CE->getOpcode(), *CE);
1895 SDValue N1 = NodeMap[V];
1896 assert(N1.getNode() && "visit didn't populate the NodeMap!");
1897 return N1;
1898 }
1899
1901 SmallVector<SDValue, 4> Constants;
1902 for (const Use &U : C->operands()) {
1903 SDNode *Val = getValue(U).getNode();
1904 // If the operand is an empty aggregate, there are no values.
1905 if (!Val) continue;
1906 // Add each leaf value from the operand to the Constants list
1907 // to form a flattened list of all the values.
1908 for (unsigned i = 0, e = Val->getNumValues(); i != e; ++i)
1909 Constants.push_back(SDValue(Val, i));
1910 }
1911
1912 return DAG.getMergeValues(Constants, getCurSDLoc());
1913 }
1914
1915 if (const ConstantDataSequential *CDS =
1918 for (uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i) {
1919 SDNode *Val = getValue(CDS->getElementAsConstant(i)).getNode();
1920 // Add each leaf value from the operand to the Constants list
1921 // to form a flattened list of all the values.
1922 for (unsigned i = 0, e = Val->getNumValues(); i != e; ++i)
1923 Ops.push_back(SDValue(Val, i));
1924 }
1925
1926 if (isa<ArrayType>(CDS->getType()))
1927 return DAG.getMergeValues(Ops, getCurSDLoc());
1928 return DAG.getBuildVector(VT, getCurSDLoc(), Ops);
1929 }
1930
1931 if (C->getType()->isStructTy() || C->getType()->isArrayTy()) {
1933 "Unknown struct or array constant!");
1934
1935 SmallVector<EVT, 4> ValueVTs;
1936 ComputeValueVTs(TLI, DAG.getDataLayout(), C->getType(), ValueVTs);
1937 unsigned NumElts = ValueVTs.size();
1938 if (NumElts == 0)
1939 return SDValue(); // empty struct
1940 SmallVector<SDValue, 4> Constants(NumElts);
1941 for (unsigned i = 0; i != NumElts; ++i) {
1942 EVT EltVT = ValueVTs[i];
1943 if (isa<UndefValue>(C))
1944 Constants[i] = DAG.getUNDEF(EltVT);
1945 else if (EltVT.isFloatingPoint())
1946 Constants[i] = DAG.getConstantFP(0, getCurSDLoc(), EltVT);
1947 else
1948 Constants[i] = DAG.getConstant(0, getCurSDLoc(), EltVT);
1949 }
1950
1951 return DAG.getMergeValues(Constants, getCurSDLoc());
1952 }
1953
1954 if (const BlockAddress *BA = dyn_cast<BlockAddress>(C))
1955 return DAG.getBlockAddress(BA, VT);
1956
1957 if (const auto *Equiv = dyn_cast<DSOLocalEquivalent>(C))
1958 return getValue(Equiv->getGlobalValue());
1959
1960 if (const auto *NC = dyn_cast<NoCFIValue>(C))
1961 return getValue(NC->getGlobalValue());
1962
1963 if (VT == MVT::aarch64svcount) {
1964 assert(C->isNullValue() && "Can only zero this target type!");
1965 return DAG.getNode(ISD::BITCAST, getCurSDLoc(), VT,
1966 DAG.getConstant(0, getCurSDLoc(), MVT::nxv16i1));
1967 }
1968
1969 if (VT.isRISCVVectorTuple()) {
1970 assert(C->isNullValue() && "Can only zero this target type!");
1971 return DAG.getNode(
1973 DAG.getNode(
1975 EVT::getVectorVT(*DAG.getContext(), MVT::i8,
1976 VT.getSizeInBits().getKnownMinValue() / 8, true),
1977 DAG.getConstant(0, getCurSDLoc(), MVT::getIntegerVT(8))));
1978 }
1979
1980 VectorType *VecTy = cast<VectorType>(V->getType());
1981
1982 // Now that we know the number and type of the elements, get that number of
1983 // elements into the Ops array based on what kind of constant it is.
1984 if (const ConstantVector *CV = dyn_cast<ConstantVector>(C)) {
1986 unsigned NumElements = cast<FixedVectorType>(VecTy)->getNumElements();
1987 for (unsigned i = 0; i != NumElements; ++i)
1988 Ops.push_back(getValue(CV->getOperand(i)));
1989
1990 return DAG.getBuildVector(VT, getCurSDLoc(), Ops);
1991 }
1992
1994 EVT EltVT =
1995 TLI.getValueType(DAG.getDataLayout(), VecTy->getElementType());
1996
1997 SDValue Op;
1998 if (EltVT.isFloatingPoint())
1999 Op = DAG.getConstantFP(0, getCurSDLoc(), EltVT);
2000 else
2001 Op = DAG.getConstant(0, getCurSDLoc(), EltVT);
2002
2003 return DAG.getSplat(VT, getCurSDLoc(), Op);
2004 }
2005
2006 llvm_unreachable("Unknown vector constant");
2007 }
2008
2009 // If this is a static alloca, generate it as the frameindex instead of
2010 // computation.
2011 if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
2013 FuncInfo.StaticAllocaMap.find(AI);
2014 if (SI != FuncInfo.StaticAllocaMap.end())
2015 return DAG.getFrameIndex(
2016 SI->second, TLI.getValueType(DAG.getDataLayout(), AI->getType()));
2017 }
2018
2019 // If this is an instruction which fast-isel has deferred, select it now.
2020 if (const Instruction *Inst = dyn_cast<Instruction>(V)) {
2021 Register InReg = FuncInfo.InitializeRegForValue(Inst);
2022 RegsForValue RFV(*DAG.getContext(), TLI, DAG.getDataLayout(), InReg,
2023 Inst->getType(), std::nullopt);
2024 SDValue Chain = DAG.getEntryNode();
2025 return RFV.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(), Chain, nullptr, V);
2026 }
2027
2028 if (const MetadataAsValue *MD = dyn_cast<MetadataAsValue>(V))
2029 return DAG.getMDNode(cast<MDNode>(MD->getMetadata()));
2030
2031 if (const auto *BB = dyn_cast<BasicBlock>(V))
2032 return DAG.getBasicBlock(FuncInfo.getMBB(BB));
2033
2034 llvm_unreachable("Can't get register for value!");
2035}
2036
2037void SelectionDAGBuilder::visitCatchPad(const CatchPadInst &I) {
2039 bool IsMSVCCXX = Pers == EHPersonality::MSVC_CXX;
2040 bool IsCoreCLR = Pers == EHPersonality::CoreCLR;
2041 bool IsSEH = isAsynchronousEHPersonality(Pers);
2042 MachineBasicBlock *CatchPadMBB = FuncInfo.MBB;
2043 if (IsSEH) {
2044 // For SEH, EHCont Guard needs to know that this catchpad is a target.
2045 CatchPadMBB->setIsEHContTarget(true);
2047 } else
2048 CatchPadMBB->setIsEHScopeEntry();
2049 // In MSVC C++ and CoreCLR, catchblocks are funclets and need prologues.
2050 if (IsMSVCCXX || IsCoreCLR)
2051 CatchPadMBB->setIsEHFuncletEntry();
2052}
2053
2054void SelectionDAGBuilder::visitCatchRet(const CatchReturnInst &I) {
2055 // Update machine-CFG edge.
2056 MachineBasicBlock *TargetMBB = FuncInfo.getMBB(I.getSuccessor());
2057 FuncInfo.MBB->addSuccessor(TargetMBB);
2058
2059 auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn());
2060 bool IsSEH = isAsynchronousEHPersonality(Pers);
2061 if (IsSEH) {
2062 // If this is not a fall-through branch or optimizations are switched off,
2063 // emit the branch.
2064 if (TargetMBB != NextBlock(FuncInfo.MBB) ||
2065 TM.getOptLevel() == CodeGenOptLevel::None)
2066 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
2067 getControlRoot(), DAG.getBasicBlock(TargetMBB)));
2068 return;
2069 }
2070
2071 // For non-SEH, EHCont Guard needs to know that this catchret is a target.
2072 TargetMBB->setIsEHContTarget(true);
2073 DAG.getMachineFunction().setHasEHContTarget(true);
2074
2075 // Figure out the funclet membership for the catchret's successor.
2076 // This will be used by the FuncletLayout pass to determine how to order the
2077 // BB's.
2078 // A 'catchret' returns to the outer scope's color.
2079 Value *ParentPad = I.getCatchSwitchParentPad();
2080 const BasicBlock *SuccessorColor;
2081 if (isa<ConstantTokenNone>(ParentPad))
2082 SuccessorColor = &FuncInfo.Fn->getEntryBlock();
2083 else
2084 SuccessorColor = cast<Instruction>(ParentPad)->getParent();
2085 assert(SuccessorColor && "No parent funclet for catchret!");
2086 MachineBasicBlock *SuccessorColorMBB = FuncInfo.getMBB(SuccessorColor);
2087 assert(SuccessorColorMBB && "No MBB for SuccessorColor!");
2088
2089 // Create the terminator node.
2090 SDValue Ret = DAG.getNode(ISD::CATCHRET, getCurSDLoc(), MVT::Other,
2091 getControlRoot(), DAG.getBasicBlock(TargetMBB),
2092 DAG.getBasicBlock(SuccessorColorMBB));
2093 DAG.setRoot(Ret);
2094}
2095
2096void SelectionDAGBuilder::visitCleanupPad(const CleanupPadInst &CPI) {
2097 // Don't emit any special code for the cleanuppad instruction. It just marks
2098 // the start of an EH scope/funclet.
2099 FuncInfo.MBB->setIsEHScopeEntry();
2100 auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn());
2101 if (Pers != EHPersonality::Wasm_CXX) {
2102 FuncInfo.MBB->setIsEHFuncletEntry();
2103 FuncInfo.MBB->setIsCleanupFuncletEntry();
2104 }
2105}
2106
2107/// When an invoke or a cleanupret unwinds to the next EH pad, there are
2108/// many places it could ultimately go. In the IR, we have a single unwind
2109/// destination, but in the machine CFG, we enumerate all the possible blocks.
2110/// This function skips over imaginary basic blocks that hold catchswitch
2111/// instructions, and finds all the "real" machine
2112/// basic block destinations. As those destinations may not be successors of
2113/// EHPadBB, here we also calculate the edge probability to those destinations.
2114/// The passed-in Prob is the edge probability to EHPadBB.
2116 FunctionLoweringInfo &FuncInfo, const BasicBlock *EHPadBB,
2117 BranchProbability Prob,
2118 SmallVectorImpl<std::pair<MachineBasicBlock *, BranchProbability>>
2119 &UnwindDests) {
2120 EHPersonality Personality =
2122 bool IsMSVCCXX = Personality == EHPersonality::MSVC_CXX;
2123 bool IsCoreCLR = Personality == EHPersonality::CoreCLR;
2124 bool IsWasmCXX = Personality == EHPersonality::Wasm_CXX;
2125 bool IsSEH = isAsynchronousEHPersonality(Personality);
2126
2127 while (EHPadBB) {
2129 BasicBlock *NewEHPadBB = nullptr;
2130 if (isa<LandingPadInst>(Pad)) {
2131 // Stop on landingpads. They are not funclets.
2132 UnwindDests.emplace_back(FuncInfo.getMBB(EHPadBB), Prob);
2133 break;
2134 } else if (isa<CleanupPadInst>(Pad)) {
2135 // Stop on cleanup pads. Cleanups are always funclet entries for all known
2136 // personalities except Wasm. And in Wasm this becomes a catch_all(_ref),
2137 // which always catches an exception.
2138 UnwindDests.emplace_back(FuncInfo.getMBB(EHPadBB), Prob);
2139 UnwindDests.back().first->setIsEHScopeEntry();
2140 // In Wasm, EH scopes are not funclets
2141 if (!IsWasmCXX)
2142 UnwindDests.back().first->setIsEHFuncletEntry();
2143 break;
2144 } else if (const auto *CatchSwitch = dyn_cast<CatchSwitchInst>(Pad)) {
2145 // Add the catchpad handlers to the possible destinations.
2146 for (const BasicBlock *CatchPadBB : CatchSwitch->handlers()) {
2147 UnwindDests.emplace_back(FuncInfo.getMBB(CatchPadBB), Prob);
2148 // For MSVC++ and the CLR, catchblocks are funclets and need prologues.
2149 if (IsMSVCCXX || IsCoreCLR)
2150 UnwindDests.back().first->setIsEHFuncletEntry();
2151 if (!IsSEH)
2152 UnwindDests.back().first->setIsEHScopeEntry();
2153 }
2154 NewEHPadBB = CatchSwitch->getUnwindDest();
2155 } else {
2156 continue;
2157 }
2158
2159 BranchProbabilityInfo *BPI = FuncInfo.BPI;
2160 if (BPI && NewEHPadBB)
2161 Prob *= BPI->getEdgeProbability(EHPadBB, NewEHPadBB);
2162 EHPadBB = NewEHPadBB;
2163 }
2164}
2165
2166void SelectionDAGBuilder::visitCleanupRet(const CleanupReturnInst &I) {
2167 // Update successor info.
2169 auto UnwindDest = I.getUnwindDest();
2170 BranchProbabilityInfo *BPI = FuncInfo.BPI;
2171 BranchProbability UnwindDestProb =
2172 (BPI && UnwindDest)
2173 ? BPI->getEdgeProbability(FuncInfo.MBB->getBasicBlock(), UnwindDest)
2175 findUnwindDestinations(FuncInfo, UnwindDest, UnwindDestProb, UnwindDests);
2176 for (auto &UnwindDest : UnwindDests) {
2177 UnwindDest.first->setIsEHPad();
2178 addSuccessorWithProb(FuncInfo.MBB, UnwindDest.first, UnwindDest.second);
2179 }
2180 FuncInfo.MBB->normalizeSuccProbs();
2181
2182 // Create the terminator node.
2183 MachineBasicBlock *CleanupPadMBB =
2184 FuncInfo.getMBB(I.getCleanupPad()->getParent());
2185 SDValue Ret = DAG.getNode(ISD::CLEANUPRET, getCurSDLoc(), MVT::Other,
2186 getControlRoot(), DAG.getBasicBlock(CleanupPadMBB));
2187 DAG.setRoot(Ret);
2188}
2189
2190void SelectionDAGBuilder::visitCatchSwitch(const CatchSwitchInst &CSI) {
2191 report_fatal_error("visitCatchSwitch not yet implemented!");
2192}
2193
2194void SelectionDAGBuilder::visitRet(const ReturnInst &I) {
2195 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
2196 auto &DL = DAG.getDataLayout();
2197 SDValue Chain = getControlRoot();
2200
2201 // Calls to @llvm.experimental.deoptimize don't generate a return value, so
2202 // lower
2203 //
2204 // %val = call <ty> @llvm.experimental.deoptimize()
2205 // ret <ty> %val
2206 //
2207 // differently.
2208 if (I.getParent()->getTerminatingDeoptimizeCall()) {
2210 return;
2211 }
2212
2213 if (!FuncInfo.CanLowerReturn) {
2214 Register DemoteReg = FuncInfo.DemoteRegister;
2215
2216 // Emit a store of the return value through the virtual register.
2217 // Leave Outs empty so that LowerReturn won't try to load return
2218 // registers the usual way.
2219 MVT PtrValueVT = TLI.getPointerTy(DL, DL.getAllocaAddrSpace());
2220 SDValue RetPtr =
2221 DAG.getCopyFromReg(Chain, getCurSDLoc(), DemoteReg, PtrValueVT);
2222 SDValue RetOp = getValue(I.getOperand(0));
2223
2224 SmallVector<EVT, 4> ValueVTs, MemVTs;
2225 SmallVector<uint64_t, 4> Offsets;
2226 ComputeValueVTs(TLI, DL, I.getOperand(0)->getType(), ValueVTs, &MemVTs,
2227 &Offsets, 0);
2228 unsigned NumValues = ValueVTs.size();
2229
2230 SmallVector<SDValue, 4> Chains(NumValues);
2231 Align BaseAlign = DL.getPrefTypeAlign(I.getOperand(0)->getType());
2232 for (unsigned i = 0; i != NumValues; ++i) {
2233 // An aggregate return value cannot wrap around the address space, so
2234 // offsets to its parts don't wrap either.
2235 SDValue Ptr = DAG.getObjectPtrOffset(getCurSDLoc(), RetPtr,
2236 TypeSize::getFixed(Offsets[i]));
2237
2238 SDValue Val = RetOp.getValue(RetOp.getResNo() + i);
2239 if (MemVTs[i] != ValueVTs[i])
2240 Val = DAG.getPtrExtOrTrunc(Val, getCurSDLoc(), MemVTs[i]);
2241 Chains[i] = DAG.getStore(
2242 Chain, getCurSDLoc(), Val,
2243 // FIXME: better loc info would be nice.
2244 Ptr, MachinePointerInfo::getUnknownStack(DAG.getMachineFunction()),
2245 commonAlignment(BaseAlign, Offsets[i]));
2246 }
2247
2248 Chain = DAG.getNode(ISD::TokenFactor, getCurSDLoc(),
2249 MVT::Other, Chains);
2250 } else if (I.getNumOperands() != 0) {
2252 ComputeValueTypes(DL, I.getOperand(0)->getType(), Types);
2253 unsigned NumValues = Types.size();
2254 if (NumValues) {
2255 SDValue RetOp = getValue(I.getOperand(0));
2256
2257 const Function *F = I.getParent()->getParent();
2258
2259 bool NeedsRegBlock = TLI.functionArgumentNeedsConsecutiveRegisters(
2260 I.getOperand(0)->getType(), F->getCallingConv(),
2261 /*IsVarArg*/ false, DL);
2262
2263 ISD::NodeType ExtendKind = ISD::ANY_EXTEND;
2264 if (F->getAttributes().hasRetAttr(Attribute::SExt))
2265 ExtendKind = ISD::SIGN_EXTEND;
2266 else if (F->getAttributes().hasRetAttr(Attribute::ZExt))
2267 ExtendKind = ISD::ZERO_EXTEND;
2268
2269 LLVMContext &Context = F->getContext();
2270 bool RetInReg = F->getAttributes().hasRetAttr(Attribute::InReg);
2271
2272 for (unsigned j = 0; j != NumValues; ++j) {
2273 EVT VT = TLI.getValueType(DL, Types[j]);
2274
2275 if (ExtendKind != ISD::ANY_EXTEND && VT.isInteger())
2276 VT = TLI.getTypeForExtReturn(Context, VT, ExtendKind);
2277
2278 CallingConv::ID CC = F->getCallingConv();
2279
2280 unsigned NumParts = TLI.getNumRegistersForCallingConv(Context, CC, VT);
2281 MVT PartVT = TLI.getRegisterTypeForCallingConv(Context, CC, VT);
2282 SmallVector<SDValue, 4> Parts(NumParts);
2284 SDValue(RetOp.getNode(), RetOp.getResNo() + j),
2285 &Parts[0], NumParts, PartVT, &I, CC, ExtendKind);
2286
2287 // 'inreg' on function refers to return value
2288 ISD::ArgFlagsTy Flags = ISD::ArgFlagsTy();
2289 if (RetInReg)
2290 Flags.setInReg();
2291
2292 if (I.getOperand(0)->getType()->isPointerTy()) {
2293 Flags.setPointer();
2294 Flags.setPointerAddrSpace(
2295 cast<PointerType>(I.getOperand(0)->getType())->getAddressSpace());
2296 }
2297
2298 if (NeedsRegBlock) {
2299 Flags.setInConsecutiveRegs();
2300 if (j == NumValues - 1)
2301 Flags.setInConsecutiveRegsLast();
2302 }
2303
2304 // Propagate extension type if any
2305 if (ExtendKind == ISD::SIGN_EXTEND)
2306 Flags.setSExt();
2307 else if (ExtendKind == ISD::ZERO_EXTEND)
2308 Flags.setZExt();
2309 else if (F->getAttributes().hasRetAttr(Attribute::NoExt))
2310 Flags.setNoExt();
2311
2312 for (unsigned i = 0; i < NumParts; ++i) {
2313 Outs.push_back(ISD::OutputArg(Flags,
2314 Parts[i].getValueType().getSimpleVT(),
2315 VT, Types[j], 0, 0));
2316 OutVals.push_back(Parts[i]);
2317 }
2318 }
2319 }
2320 }
2321
2322 // Push in swifterror virtual register as the last element of Outs. This makes
2323 // sure swifterror virtual register will be returned in the swifterror
2324 // physical register.
2325 const Function *F = I.getParent()->getParent();
2326 if (TLI.supportSwiftError() &&
2327 F->getAttributes().hasAttrSomewhere(Attribute::SwiftError)) {
2328 assert(SwiftError.getFunctionArg() && "Need a swift error argument");
2329 ISD::ArgFlagsTy Flags = ISD::ArgFlagsTy();
2330 Flags.setSwiftError();
2331 Outs.push_back(ISD::OutputArg(Flags, /*vt=*/TLI.getPointerTy(DL),
2332 /*argvt=*/EVT(TLI.getPointerTy(DL)),
2333 PointerType::getUnqual(*DAG.getContext()),
2334 /*origidx=*/1, /*partOffs=*/0));
2335 // Create SDNode for the swifterror virtual register.
2336 OutVals.push_back(
2337 DAG.getRegister(SwiftError.getOrCreateVRegUseAt(
2338 &I, FuncInfo.MBB, SwiftError.getFunctionArg()),
2339 EVT(TLI.getPointerTy(DL))));
2340 }
2341
2342 bool isVarArg = DAG.getMachineFunction().getFunction().isVarArg();
2343 CallingConv::ID CallConv =
2344 DAG.getMachineFunction().getFunction().getCallingConv();
2345 Chain = DAG.getTargetLoweringInfo().LowerReturn(
2346 Chain, CallConv, isVarArg, Outs, OutVals, getCurSDLoc(), DAG);
2347
2348 // Verify that the target's LowerReturn behaved as expected.
2349 assert(Chain.getNode() && Chain.getValueType() == MVT::Other &&
2350 "LowerReturn didn't return a valid chain!");
2351
2352 // Update the DAG with the new chain value resulting from return lowering.
2353 DAG.setRoot(Chain);
2354}
2355
2356/// CopyToExportRegsIfNeeded - If the given value has virtual registers
2357/// created for it, emit nodes to copy the value into the virtual
2358/// registers.
2360 // Skip empty types
2361 if (V->getType()->isEmptyTy())
2362 return;
2363
2365 if (VMI != FuncInfo.ValueMap.end()) {
2366 assert((!V->use_empty() || isa<CallBrInst>(V)) &&
2367 "Unused value assigned virtual registers!");
2368 CopyValueToVirtualRegister(V, VMI->second);
2369 }
2370}
2371
2372/// ExportFromCurrentBlock - If this condition isn't known to be exported from
2373/// the current basic block, add it to ValueMap now so that we'll get a
2374/// CopyTo/FromReg.
2376 // No need to export constants.
2377 if (!isa<Instruction>(V) && !isa<Argument>(V)) return;
2378
2379 // Already exported?
2380 if (FuncInfo.isExportedInst(V)) return;
2381
2382 Register Reg = FuncInfo.InitializeRegForValue(V);
2384}
2385
2387 const BasicBlock *FromBB) {
2388 // The operands of the setcc have to be in this block. We don't know
2389 // how to export them from some other block.
2390 if (const Instruction *VI = dyn_cast<Instruction>(V)) {
2391 // Can export from current BB.
2392 if (VI->getParent() == FromBB)
2393 return true;
2394
2395 // Is already exported, noop.
2396 return FuncInfo.isExportedInst(V);
2397 }
2398
2399 // If this is an argument, we can export it if the BB is the entry block or
2400 // if it is already exported.
2401 if (isa<Argument>(V)) {
2402 if (FromBB->isEntryBlock())
2403 return true;
2404
2405 // Otherwise, can only export this if it is already exported.
2406 return FuncInfo.isExportedInst(V);
2407 }
2408
2409 // Otherwise, constants can always be exported.
2410 return true;
2411}
2412
2413/// Return branch probability calculated by BranchProbabilityInfo for IR blocks.
2415SelectionDAGBuilder::getEdgeProbability(const MachineBasicBlock *Src,
2416 const MachineBasicBlock *Dst) const {
2418 const BasicBlock *SrcBB = Src->getBasicBlock();
2419 const BasicBlock *DstBB = Dst->getBasicBlock();
2420 if (!BPI) {
2421 // If BPI is not available, set the default probability as 1 / N, where N is
2422 // the number of successors.
2423 auto SuccSize = std::max<uint32_t>(succ_size(SrcBB), 1);
2424 return BranchProbability(1, SuccSize);
2425 }
2426 return BPI->getEdgeProbability(SrcBB, DstBB);
2427}
2428
2429void SelectionDAGBuilder::addSuccessorWithProb(MachineBasicBlock *Src,
2430 MachineBasicBlock *Dst,
2431 BranchProbability Prob) {
2432 if (!FuncInfo.BPI)
2433 Src->addSuccessorWithoutProb(Dst);
2434 else {
2435 if (Prob.isUnknown())
2436 Prob = getEdgeProbability(Src, Dst);
2437 Src->addSuccessor(Dst, Prob);
2438 }
2439}
2440
2441static bool InBlock(const Value *V, const BasicBlock *BB) {
2442 if (const Instruction *I = dyn_cast<Instruction>(V))
2443 return I->getParent() == BB;
2444 return true;
2445}
2446
2447/// EmitBranchForMergedCondition - Helper method for FindMergedConditions.
2448/// This function emits a branch and is used at the leaves of an OR or an
2449/// AND operator tree.
2450void
2453 MachineBasicBlock *FBB,
2454 MachineBasicBlock *CurBB,
2455 MachineBasicBlock *SwitchBB,
2456 BranchProbability TProb,
2457 BranchProbability FProb,
2458 bool InvertCond) {
2459 const BasicBlock *BB = CurBB->getBasicBlock();
2460
2461 // If the leaf of the tree is a comparison, merge the condition into
2462 // the caseblock.
2463 if (const CmpInst *BOp = dyn_cast<CmpInst>(Cond)) {
2464 // The operands of the cmp have to be in this block. We don't know
2465 // how to export them from some other block. If this is the first block
2466 // of the sequence, no exporting is needed.
2467 if (CurBB == SwitchBB ||
2468 (isExportableFromCurrentBlock(BOp->getOperand(0), BB) &&
2469 isExportableFromCurrentBlock(BOp->getOperand(1), BB))) {
2470 ISD::CondCode Condition;
2471 if (const ICmpInst *IC = dyn_cast<ICmpInst>(Cond)) {
2472 ICmpInst::Predicate Pred =
2473 InvertCond ? IC->getInversePredicate() : IC->getPredicate();
2474 Condition = getICmpCondCode(Pred);
2475 } else {
2476 const FCmpInst *FC = cast<FCmpInst>(Cond);
2477 FCmpInst::Predicate Pred =
2478 InvertCond ? FC->getInversePredicate() : FC->getPredicate();
2479 Condition = getFCmpCondCode(Pred);
2480 if (FC->hasNoNaNs() ||
2481 (isKnownNeverNaN(FC->getOperand(0),
2482 SimplifyQuery(DAG.getDataLayout(), FC)) &&
2483 isKnownNeverNaN(FC->getOperand(1),
2484 SimplifyQuery(DAG.getDataLayout(), FC))))
2485 Condition = getFCmpCodeWithoutNaN(Condition);
2486 }
2487
2488 CaseBlock CB(Condition, BOp->getOperand(0), BOp->getOperand(1), nullptr,
2489 TBB, FBB, CurBB, getCurSDLoc(), TProb, FProb);
2490 SL->SwitchCases.push_back(CB);
2491 return;
2492 }
2493 }
2494
2495 // Create a CaseBlock record representing this branch.
2496 ISD::CondCode Opc = InvertCond ? ISD::SETNE : ISD::SETEQ;
2497 CaseBlock CB(Opc, Cond, ConstantInt::getTrue(*DAG.getContext()),
2498 nullptr, TBB, FBB, CurBB, getCurSDLoc(), TProb, FProb);
2499 SL->SwitchCases.push_back(CB);
2500}
2501
2502// Collect dependencies on V recursively. This is used for the cost analysis in
2503// `shouldKeepJumpConditionsTogether`.
2507 unsigned Depth = 0) {
2508 // Return false if we have an incomplete count.
2510 return false;
2511
2512 auto *I = dyn_cast<Instruction>(V);
2513 if (I == nullptr)
2514 return true;
2515
2516 if (Necessary != nullptr) {
2517 // This instruction is necessary for the other side of the condition so
2518 // don't count it.
2519 if (Necessary->contains(I))
2520 return true;
2521 }
2522
2523 // Already added this dep.
2524 if (!Deps->try_emplace(I, false).second)
2525 return true;
2526
2527 for (unsigned OpIdx = 0, E = I->getNumOperands(); OpIdx < E; ++OpIdx)
2528 if (!collectInstructionDeps(Deps, I->getOperand(OpIdx), Necessary,
2529 Depth + 1))
2530 return false;
2531 return true;
2532}
2533
2536 Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs,
2538 if (Params.BaseCost < 0)
2539 return false;
2540
2541 // Baseline cost.
2542 InstructionCost CostThresh = Params.BaseCost;
2543
2544 BranchProbabilityInfo *BPI = nullptr;
2545 if (Params.LikelyBias || Params.UnlikelyBias)
2546 BPI = FuncInfo.BPI;
2547 if (BPI != nullptr) {
2548 // See if we are either likely to get an early out or compute both lhs/rhs
2549 // of the condition.
2550 BasicBlock *IfFalse = I.getSuccessor(0);
2551 BasicBlock *IfTrue = I.getSuccessor(1);
2552
2553 std::optional<bool> Likely;
2554 if (BPI->isEdgeHot(I.getParent(), IfTrue))
2555 Likely = true;
2556 else if (BPI->isEdgeHot(I.getParent(), IfFalse))
2557 Likely = false;
2558
2559 if (Likely) {
2560 if (Opc == (*Likely ? Instruction::And : Instruction::Or))
2561 // Its likely we will have to compute both lhs and rhs of condition
2562 CostThresh += Params.LikelyBias;
2563 else {
2564 if (Params.UnlikelyBias < 0)
2565 return false;
2566 // Its likely we will get an early out.
2567 CostThresh -= Params.UnlikelyBias;
2568 }
2569 }
2570 }
2571
2572 if (CostThresh <= 0)
2573 return false;
2574
2575 // Collect "all" instructions that lhs condition is dependent on.
2576 // Use map for stable iteration (to avoid non-determanism of iteration of
2577 // SmallPtrSet). The `bool` value is just a dummy.
2579 collectInstructionDeps(&LhsDeps, Lhs);
2580 // Collect "all" instructions that rhs condition is dependent on AND are
2581 // dependencies of lhs. This gives us an estimate on which instructions we
2582 // stand to save by splitting the condition.
2583 if (!collectInstructionDeps(&RhsDeps, Rhs, &LhsDeps))
2584 return false;
2585 // Add the compare instruction itself unless its a dependency on the LHS.
2586 if (const auto *RhsI = dyn_cast<Instruction>(Rhs))
2587 if (!LhsDeps.contains(RhsI))
2588 RhsDeps.try_emplace(RhsI, false);
2589
2590 InstructionCost CostOfIncluding = 0;
2591 // See if this instruction will need to computed independently of whether RHS
2592 // is.
2593 Value *BrCond = I.getCondition();
2594 auto ShouldCountInsn = [&RhsDeps, &BrCond](const Instruction *Ins) {
2595 for (const auto *U : Ins->users()) {
2596 // If user is independent of RHS calculation we don't need to count it.
2597 if (auto *UIns = dyn_cast<Instruction>(U))
2598 if (UIns != BrCond && !RhsDeps.contains(UIns))
2599 return false;
2600 }
2601 return true;
2602 };
2603
2604 // Prune instructions from RHS Deps that are dependencies of unrelated
2605 // instructions. The value (SelectionDAG::MaxRecursionDepth) is fairly
2606 // arbitrary and just meant to cap the how much time we spend in the pruning
2607 // loop. Its highly unlikely to come into affect.
2608 const unsigned MaxPruneIters = SelectionDAG::MaxRecursionDepth;
2609 // Stop after a certain point. No incorrectness from including too many
2610 // instructions.
2611 for (unsigned PruneIters = 0; PruneIters < MaxPruneIters; ++PruneIters) {
2612 const Instruction *ToDrop = nullptr;
2613 for (const auto &InsPair : RhsDeps) {
2614 if (!ShouldCountInsn(InsPair.first)) {
2615 ToDrop = InsPair.first;
2616 break;
2617 }
2618 }
2619 if (ToDrop == nullptr)
2620 break;
2621 RhsDeps.erase(ToDrop);
2622 }
2623
2624 for (const auto &InsPair : RhsDeps) {
2625 // Finally accumulate latency that we can only attribute to computing the
2626 // RHS condition. Use latency because we are essentially trying to calculate
2627 // the cost of the dependency chain.
2628 // Possible TODO: We could try to estimate ILP and make this more precise.
2629 CostOfIncluding += TTI->getInstructionCost(
2630 InsPair.first, TargetTransformInfo::TCK_Latency);
2631
2632 if (CostOfIncluding > CostThresh)
2633 return false;
2634 }
2635 return true;
2636}
2637
2640 MachineBasicBlock *FBB,
2641 MachineBasicBlock *CurBB,
2642 MachineBasicBlock *SwitchBB,
2644 BranchProbability TProb,
2645 BranchProbability FProb,
2646 bool InvertCond) {
2647 // Skip over not part of the tree and remember to invert op and operands at
2648 // next level.
2649 Value *NotCond;
2650 if (match(Cond, m_OneUse(m_Not(m_Value(NotCond)))) &&
2651 InBlock(NotCond, CurBB->getBasicBlock())) {
2652 FindMergedConditions(NotCond, TBB, FBB, CurBB, SwitchBB, Opc, TProb, FProb,
2653 !InvertCond);
2654 return;
2655 }
2656
2658 const Value *BOpOp0, *BOpOp1;
2659 // Compute the effective opcode for Cond, taking into account whether it needs
2660 // to be inverted, e.g.
2661 // and (not (or A, B)), C
2662 // gets lowered as
2663 // and (and (not A, not B), C)
2665 if (BOp) {
2666 BOpc = match(BOp, m_LogicalAnd(m_Value(BOpOp0), m_Value(BOpOp1)))
2667 ? Instruction::And
2668 : (match(BOp, m_LogicalOr(m_Value(BOpOp0), m_Value(BOpOp1)))
2669 ? Instruction::Or
2671 if (InvertCond) {
2672 if (BOpc == Instruction::And)
2673 BOpc = Instruction::Or;
2674 else if (BOpc == Instruction::Or)
2675 BOpc = Instruction::And;
2676 }
2677 }
2678
2679 // If this node is not part of the or/and tree, emit it as a branch.
2680 // Note that all nodes in the tree should have same opcode.
2681 bool BOpIsInOrAndTree = BOpc && BOpc == Opc && BOp->hasOneUse();
2682 if (!BOpIsInOrAndTree || BOp->getParent() != CurBB->getBasicBlock() ||
2683 !InBlock(BOpOp0, CurBB->getBasicBlock()) ||
2684 !InBlock(BOpOp1, CurBB->getBasicBlock())) {
2685 EmitBranchForMergedCondition(Cond, TBB, FBB, CurBB, SwitchBB,
2686 TProb, FProb, InvertCond);
2687 return;
2688 }
2689
2690 // Create TmpBB after CurBB.
2691 MachineFunction::iterator BBI(CurBB);
2692 MachineFunction &MF = DAG.getMachineFunction();
2694 CurBB->getParent()->insert(++BBI, TmpBB);
2695
2696 if (Opc == Instruction::Or) {
2697 // Codegen X | Y as:
2698 // BB1:
2699 // jmp_if_X TBB
2700 // jmp TmpBB
2701 // TmpBB:
2702 // jmp_if_Y TBB
2703 // jmp FBB
2704 //
2705
2706 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
2707 // The requirement is that
2708 // TrueProb for BB1 + (FalseProb for BB1 * TrueProb for TmpBB)
2709 // = TrueProb for original BB.
2710 // Assuming the original probabilities are A and B, one choice is to set
2711 // BB1's probabilities to A/2 and A/2+B, and set TmpBB's probabilities to
2712 // A/(1+B) and 2B/(1+B). This choice assumes that
2713 // TrueProb for BB1 == FalseProb for BB1 * TrueProb for TmpBB.
2714 // Another choice is to assume TrueProb for BB1 equals to TrueProb for
2715 // TmpBB, but the math is more complicated.
2716
2717 auto NewTrueProb = TProb / 2;
2718 auto NewFalseProb = TProb / 2 + FProb;
2719 // Emit the LHS condition.
2720 FindMergedConditions(BOpOp0, TBB, TmpBB, CurBB, SwitchBB, Opc, NewTrueProb,
2721 NewFalseProb, InvertCond);
2722
2723 // Normalize A/2 and B to get A/(1+B) and 2B/(1+B).
2724 SmallVector<BranchProbability, 2> Probs{TProb / 2, FProb};
2726 // Emit the RHS condition into TmpBB.
2727 FindMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
2728 Probs[1], InvertCond);
2729 } else {
2730 assert(Opc == Instruction::And && "Unknown merge op!");
2731 // Codegen X & Y as:
2732 // BB1:
2733 // jmp_if_X TmpBB
2734 // jmp FBB
2735 // TmpBB:
2736 // jmp_if_Y TBB
2737 // jmp FBB
2738 //
2739 // This requires creation of TmpBB after CurBB.
2740
2741 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
2742 // The requirement is that
2743 // FalseProb for BB1 + (TrueProb for BB1 * FalseProb for TmpBB)
2744 // = FalseProb for original BB.
2745 // Assuming the original probabilities are A and B, one choice is to set
2746 // BB1's probabilities to A+B/2 and B/2, and set TmpBB's probabilities to
2747 // 2A/(1+A) and B/(1+A). This choice assumes that FalseProb for BB1 ==
2748 // TrueProb for BB1 * FalseProb for TmpBB.
2749
2750 auto NewTrueProb = TProb + FProb / 2;
2751 auto NewFalseProb = FProb / 2;
2752 // Emit the LHS condition.
2753 FindMergedConditions(BOpOp0, TmpBB, FBB, CurBB, SwitchBB, Opc, NewTrueProb,
2754 NewFalseProb, InvertCond);
2755
2756 // Normalize A and B/2 to get 2A/(1+A) and B/(1+A).
2757 SmallVector<BranchProbability, 2> Probs{TProb, FProb / 2};
2759 // Emit the RHS condition into TmpBB.
2760 FindMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
2761 Probs[1], InvertCond);
2762 }
2763}
2764
2765/// If the set of cases should be emitted as a series of branches, return true.
2766/// If we should emit this as a bunch of and/or'd together conditions, return
2767/// false.
2768bool
2769SelectionDAGBuilder::ShouldEmitAsBranches(const std::vector<CaseBlock> &Cases) {
2770 if (Cases.size() != 2) return true;
2771
2772 // If this is two comparisons of the same values or'd or and'd together, they
2773 // will get folded into a single comparison, so don't emit two blocks.
2774 if ((Cases[0].CmpLHS == Cases[1].CmpLHS &&
2775 Cases[0].CmpRHS == Cases[1].CmpRHS) ||
2776 (Cases[0].CmpRHS == Cases[1].CmpLHS &&
2777 Cases[0].CmpLHS == Cases[1].CmpRHS)) {
2778 return false;
2779 }
2780
2781 // Handle: (X != null) | (Y != null) --> (X|Y) != 0
2782 // Handle: (X == null) & (Y == null) --> (X|Y) == 0
2783 if (Cases[0].CmpRHS == Cases[1].CmpRHS &&
2784 Cases[0].CC == Cases[1].CC &&
2785 isa<Constant>(Cases[0].CmpRHS) &&
2786 cast<Constant>(Cases[0].CmpRHS)->isNullValue()) {
2787 if (Cases[0].CC == ISD::SETEQ && Cases[0].TrueBB == Cases[1].ThisBB)
2788 return false;
2789 if (Cases[0].CC == ISD::SETNE && Cases[0].FalseBB == Cases[1].ThisBB)
2790 return false;
2791 }
2792
2793 return true;
2794}
2795
2796void SelectionDAGBuilder::visitUncondBr(const UncondBrInst &I) {
2798
2799 MachineBasicBlock *Succ0MBB = FuncInfo.getMBB(I.getSuccessor(0));
2800
2801 // Update machine-CFG edges.
2802 BrMBB->addSuccessor(Succ0MBB);
2803
2804 // If this is not a fall-through branch or optimizations are switched off,
2805 // emit the branch.
2806 if (Succ0MBB != NextBlock(BrMBB) ||
2808 auto Br = DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other, getControlRoot(),
2809 DAG.getBasicBlock(Succ0MBB));
2810 setValue(&I, Br);
2811 DAG.setRoot(Br);
2812 }
2813}
2814
2815void SelectionDAGBuilder::visitCondBr(const CondBrInst &I) {
2816 MachineBasicBlock *BrMBB = FuncInfo.MBB;
2817
2818 MachineBasicBlock *Succ0MBB = FuncInfo.getMBB(I.getSuccessor(0));
2819
2820 // If this condition is one of the special cases we handle, do special stuff
2821 // now.
2822 const Value *CondVal = I.getCondition();
2823 MachineBasicBlock *Succ1MBB = FuncInfo.getMBB(I.getSuccessor(1));
2824
2825 // If this is a series of conditions that are or'd or and'd together, emit
2826 // this as a sequence of branches instead of setcc's with and/or operations.
2827 // As long as jumps are not expensive (exceptions for multi-use logic ops,
2828 // unpredictable branches, and vector extracts because those jumps are likely
2829 // expensive for any target), this should improve performance.
2830 // For example, instead of something like:
2831 // cmp A, B
2832 // C = seteq
2833 // cmp D, E
2834 // F = setle
2835 // or C, F
2836 // jnz foo
2837 // Emit:
2838 // cmp A, B
2839 // je foo
2840 // cmp D, E
2841 // jle foo
2842 bool IsUnpredictable = I.hasMetadata(LLVMContext::MD_unpredictable);
2843 const Instruction *BOp = dyn_cast<Instruction>(CondVal);
2844 if (!DAG.getTargetLoweringInfo().isJumpExpensive() && BOp &&
2845 BOp->hasOneUse() && !IsUnpredictable) {
2846 Value *Vec;
2847 const Value *BOp0, *BOp1;
2849 if (match(BOp, m_LogicalAnd(m_Value(BOp0), m_Value(BOp1))))
2850 Opcode = Instruction::And;
2851 else if (match(BOp, m_LogicalOr(m_Value(BOp0), m_Value(BOp1))))
2852 Opcode = Instruction::Or;
2853
2854 if (Opcode &&
2855 !(match(BOp0, m_ExtractElt(m_Value(Vec), m_Value())) &&
2856 match(BOp1, m_ExtractElt(m_Specific(Vec), m_Value()))) &&
2858 FuncInfo, I, Opcode, BOp0, BOp1,
2859 DAG.getTargetLoweringInfo().getJumpConditionMergingParams(
2860 Opcode, BOp0, BOp1))) {
2861 FindMergedConditions(BOp, Succ0MBB, Succ1MBB, BrMBB, BrMBB, Opcode,
2862 getEdgeProbability(BrMBB, Succ0MBB),
2863 getEdgeProbability(BrMBB, Succ1MBB),
2864 /*InvertCond=*/false);
2865 // If the compares in later blocks need to use values not currently
2866 // exported from this block, export them now. This block should always
2867 // be the first entry.
2868 assert(SL->SwitchCases[0].ThisBB == BrMBB && "Unexpected lowering!");
2869
2870 // Allow some cases to be rejected.
2871 if (ShouldEmitAsBranches(SL->SwitchCases)) {
2872 for (unsigned i = 1, e = SL->SwitchCases.size(); i != e; ++i) {
2873 ExportFromCurrentBlock(SL->SwitchCases[i].CmpLHS);
2874 ExportFromCurrentBlock(SL->SwitchCases[i].CmpRHS);
2875 }
2876
2877 // Emit the branch for this block.
2878 visitSwitchCase(SL->SwitchCases[0], BrMBB);
2879 SL->SwitchCases.erase(SL->SwitchCases.begin());
2880 return;
2881 }
2882
2883 // Okay, we decided not to do this, remove any inserted MBB's and clear
2884 // SwitchCases.
2885 for (unsigned i = 1, e = SL->SwitchCases.size(); i != e; ++i)
2886 FuncInfo.MF->erase(SL->SwitchCases[i].ThisBB);
2887
2888 SL->SwitchCases.clear();
2889 }
2890 }
2891
2892 // Create a CaseBlock record representing this branch.
2893 CaseBlock CB(ISD::SETEQ, CondVal, ConstantInt::getTrue(*DAG.getContext()),
2894 nullptr, Succ0MBB, Succ1MBB, BrMBB, getCurSDLoc(),
2896 IsUnpredictable);
2897
2898 // Use visitSwitchCase to actually insert the fast branch sequence for this
2899 // cond branch.
2900 visitSwitchCase(CB, BrMBB);
2901}
2902
2903/// visitSwitchCase - Emits the necessary code to represent a single node in
2904/// the binary search tree resulting from lowering a switch instruction.
2906 MachineBasicBlock *SwitchBB) {
2907 SDValue Cond;
2908 SDValue CondLHS = getValue(CB.CmpLHS);
2909 SDLoc dl = CB.DL;
2910
2911 if (CB.CC == ISD::SETTRUE) {
2912 // Branch or fall through to TrueBB.
2913 addSuccessorWithProb(SwitchBB, CB.TrueBB, CB.TrueProb);
2914 SwitchBB->normalizeSuccProbs();
2915 if (CB.TrueBB != NextBlock(SwitchBB)) {
2916 DAG.setRoot(DAG.getNode(ISD::BR, dl, MVT::Other, getControlRoot(),
2917 DAG.getBasicBlock(CB.TrueBB)));
2918 }
2919 return;
2920 }
2921
2922 auto &TLI = DAG.getTargetLoweringInfo();
2923 EVT MemVT = TLI.getMemValueType(DAG.getDataLayout(), CB.CmpLHS->getType());
2924
2925 // Build the setcc now.
2926 if (!CB.CmpMHS) {
2927 // Fold "(X == true)" to X and "(X == false)" to !X to
2928 // handle common cases produced by branch lowering.
2929 if (CB.CmpRHS == ConstantInt::getTrue(*DAG.getContext()) &&
2930 CB.CC == ISD::SETEQ)
2931 Cond = CondLHS;
2932 else if (CB.CmpRHS == ConstantInt::getFalse(*DAG.getContext()) &&
2933 CB.CC == ISD::SETEQ) {
2934 SDValue True = DAG.getConstant(1, dl, CondLHS.getValueType());
2935 Cond = DAG.getNode(ISD::XOR, dl, CondLHS.getValueType(), CondLHS, True);
2936 } else {
2937 SDValue CondRHS = getValue(CB.CmpRHS);
2938
2939 // If a pointer's DAG type is larger than its memory type then the DAG
2940 // values are zero-extended. This breaks signed comparisons so truncate
2941 // back to the underlying type before doing the compare.
2942 if (CondLHS.getValueType() != MemVT) {
2943 CondLHS = DAG.getPtrExtOrTrunc(CondLHS, getCurSDLoc(), MemVT);
2944 CondRHS = DAG.getPtrExtOrTrunc(CondRHS, getCurSDLoc(), MemVT);
2945 }
2946 Cond = DAG.getSetCC(dl, MVT::i1, CondLHS, CondRHS, CB.CC);
2947 }
2948 } else {
2949 assert(CB.CC == ISD::SETLE && "Can handle only LE ranges now");
2950
2951 const APInt& Low = cast<ConstantInt>(CB.CmpLHS)->getValue();
2952 const APInt& High = cast<ConstantInt>(CB.CmpRHS)->getValue();
2953
2954 SDValue CmpOp = getValue(CB.CmpMHS);
2955 EVT VT = CmpOp.getValueType();
2956
2957 if (cast<ConstantInt>(CB.CmpLHS)->isMinValue(true)) {
2958 Cond = DAG.getSetCC(dl, MVT::i1, CmpOp, DAG.getConstant(High, dl, VT),
2959 ISD::SETLE);
2960 } else {
2961 SDValue SUB = DAG.getNode(ISD::SUB, dl,
2962 VT, CmpOp, DAG.getConstant(Low, dl, VT));
2963 Cond = DAG.getSetCC(dl, MVT::i1, SUB,
2964 DAG.getConstant(High-Low, dl, VT), ISD::SETULE);
2965 }
2966 }
2967
2968 // Update successor info
2969 addSuccessorWithProb(SwitchBB, CB.TrueBB, CB.TrueProb);
2970 // TrueBB and FalseBB are always different unless the incoming IR is
2971 // degenerate. This only happens when running llc on weird IR.
2972 if (CB.TrueBB != CB.FalseBB)
2973 addSuccessorWithProb(SwitchBB, CB.FalseBB, CB.FalseProb);
2974 SwitchBB->normalizeSuccProbs();
2975
2976 // If the lhs block is the next block, invert the condition so that we can
2977 // fall through to the lhs instead of the rhs block.
2978 if (CB.TrueBB == NextBlock(SwitchBB)) {
2979 std::swap(CB.TrueBB, CB.FalseBB);
2980 SDValue True = DAG.getConstant(1, dl, Cond.getValueType());
2981 Cond = DAG.getNode(ISD::XOR, dl, Cond.getValueType(), Cond, True);
2982 }
2983
2984 SDNodeFlags Flags;
2986 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl, MVT::Other, getControlRoot(),
2987 Cond, DAG.getBasicBlock(CB.TrueBB), Flags);
2988
2989 setValue(CurInst, BrCond);
2990
2991 // Insert the false branch. Do this even if it's a fall through branch,
2992 // this makes it easier to do DAG optimizations which require inverting
2993 // the branch condition.
2994 BrCond = DAG.getNode(ISD::BR, dl, MVT::Other, BrCond,
2995 DAG.getBasicBlock(CB.FalseBB));
2996
2997 DAG.setRoot(BrCond);
2998}
2999
3000/// visitJumpTable - Emit JumpTable node in the current MBB
3002 // Emit the code for the jump table
3003 assert(JT.SL && "Should set SDLoc for SelectionDAG!");
3004 assert(JT.Reg && "Should lower JT Header first!");
3005 EVT PTy = DAG.getTargetLoweringInfo().getJumpTableRegTy(DAG.getDataLayout());
3006 SDValue Index = DAG.getCopyFromReg(getControlRoot(), *JT.SL, JT.Reg, PTy);
3007 SDValue Table = DAG.getJumpTable(JT.JTI, PTy);
3008 SDValue BrJumpTable = DAG.getNode(ISD::BR_JT, *JT.SL, MVT::Other,
3009 Index.getValue(1), Table, Index);
3010 DAG.setRoot(BrJumpTable);
3011}
3012
3013/// visitJumpTableHeader - This function emits necessary code to produce index
3014/// in the JumpTable from switch case.
3016 JumpTableHeader &JTH,
3017 MachineBasicBlock *SwitchBB) {
3018 assert(JT.SL && "Should set SDLoc for SelectionDAG!");
3019 const SDLoc &dl = *JT.SL;
3020
3021 // Subtract the lowest switch case value from the value being switched on.
3022 SDValue SwitchOp = getValue(JTH.SValue);
3023 EVT VT = SwitchOp.getValueType();
3024 SDValue Sub = DAG.getNode(ISD::SUB, dl, VT, SwitchOp,
3025 DAG.getConstant(JTH.First, dl, VT));
3026
3027 // The SDNode we just created, which holds the value being switched on minus
3028 // the smallest case value, needs to be copied to a virtual register so it
3029 // can be used as an index into the jump table in a subsequent basic block.
3030 // This value may be smaller or larger than the target's pointer type, and
3031 // therefore require extension or truncating.
3032 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3033 SwitchOp =
3034 DAG.getZExtOrTrunc(Sub, dl, TLI.getJumpTableRegTy(DAG.getDataLayout()));
3035
3036 Register JumpTableReg =
3037 FuncInfo.CreateReg(TLI.getJumpTableRegTy(DAG.getDataLayout()));
3038 SDValue CopyTo =
3039 DAG.getCopyToReg(getControlRoot(), dl, JumpTableReg, SwitchOp);
3040 JT.Reg = JumpTableReg;
3041
3042 if (!JTH.FallthroughUnreachable) {
3043 // Emit the range check for the jump table, and branch to the default block
3044 // for the switch statement if the value being switched on exceeds the
3045 // largest case in the switch.
3046 SDValue CMP = DAG.getSetCC(
3047 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
3048 Sub.getValueType()),
3049 Sub, DAG.getConstant(JTH.Last - JTH.First, dl, VT), ISD::SETUGT);
3050
3051 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl,
3052 MVT::Other, CopyTo, CMP,
3053 DAG.getBasicBlock(JT.Default));
3054
3055 // Avoid emitting unnecessary branches to the next block.
3056 if (JT.MBB != NextBlock(SwitchBB))
3057 BrCond = DAG.getNode(ISD::BR, dl, MVT::Other, BrCond,
3058 DAG.getBasicBlock(JT.MBB));
3059
3060 DAG.setRoot(BrCond);
3061 } else {
3062 // Avoid emitting unnecessary branches to the next block.
3063 if (JT.MBB != NextBlock(SwitchBB))
3064 DAG.setRoot(DAG.getNode(ISD::BR, dl, MVT::Other, CopyTo,
3065 DAG.getBasicBlock(JT.MBB)));
3066 else
3067 DAG.setRoot(CopyTo);
3068 }
3069}
3070
3071/// Create a LOAD_STACK_GUARD node, and let it carry the target specific global
3072/// variable if there exists one.
3074 SDValue &Chain) {
3075 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3076 EVT PtrTy = TLI.getPointerTy(DAG.getDataLayout());
3077 EVT PtrMemTy = TLI.getPointerMemTy(DAG.getDataLayout());
3079 Value *Global =
3082 DAG.getMachineNode(TargetOpcode::LOAD_STACK_GUARD, DL, PtrTy, Chain);
3083 if (Global) {
3084 MachinePointerInfo MPInfo(Global);
3088 MPInfo, Flags, PtrTy.getSizeInBits() / 8, DAG.getEVTAlign(PtrTy));
3089 DAG.setNodeMemRefs(Node, {MemRef});
3090 }
3091 if (PtrTy != PtrMemTy)
3092 return DAG.getPtrExtOrTrunc(SDValue(Node, 0), DL, PtrMemTy);
3093 return SDValue(Node, 0);
3094}
3095
3096/// Codegen a new tail for a stack protector check ParentMBB which has had its
3097/// tail spliced into a stack protector check success bb.
3098///
3099/// For a high level explanation of how this fits into the stack protector
3100/// generation see the comment on the declaration of class
3101/// StackProtectorDescriptor.
3103 MachineBasicBlock *ParentBB) {
3104
3105 // First create the loads to the guard/stack slot for the comparison.
3106 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3107 auto &DL = DAG.getDataLayout();
3108 EVT PtrTy = TLI.getFrameIndexTy(DL);
3109 EVT PtrMemTy = TLI.getPointerMemTy(DL, DL.getAllocaAddrSpace());
3110
3111 MachineFrameInfo &MFI = ParentBB->getParent()->getFrameInfo();
3112 int FI = MFI.getStackProtectorIndex();
3113
3114 SDValue Guard;
3115 SDLoc dl = getCurSDLoc();
3116 SDValue StackSlotPtr = DAG.getFrameIndex(FI, PtrTy);
3117 const Module &M = *ParentBB->getParent()->getFunction().getParent();
3118 Align Align = DL.getPrefTypeAlign(
3119 PointerType::get(M.getContext(), DL.getAllocaAddrSpace()));
3120
3121 // Generate code to load the content of the guard slot.
3122 SDValue GuardVal = DAG.getLoad(
3123 PtrMemTy, dl, DAG.getEntryNode(), StackSlotPtr,
3124 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI), Align,
3126
3127 if (TLI.useStackGuardXorFP())
3128 GuardVal = TLI.emitStackGuardXorFP(DAG, GuardVal, dl);
3129
3130 // If we're using function-based instrumentation, call the guard check
3131 // function
3133 // Get the guard check function from the target and verify it exists since
3134 // we're using function-based instrumentation
3135 const Function *GuardCheckFn =
3136 TLI.getSSPStackGuardCheck(M, DAG.getLibcalls());
3137 assert(GuardCheckFn && "Guard check function is null");
3138
3139 // The target provides a guard check function to validate the guard value.
3140 // Generate a call to that function with the content of the guard slot as
3141 // argument.
3142 FunctionType *FnTy = GuardCheckFn->getFunctionType();
3143 assert(FnTy->getNumParams() == 1 && "Invalid function signature");
3144
3146 TargetLowering::ArgListEntry Entry(GuardVal, FnTy->getParamType(0));
3147 if (GuardCheckFn->hasParamAttribute(0, Attribute::AttrKind::InReg))
3148 Entry.IsInReg = true;
3149 Args.push_back(Entry);
3150
3153 .setChain(DAG.getEntryNode())
3154 .setCallee(GuardCheckFn->getCallingConv(), FnTy->getReturnType(),
3155 getValue(GuardCheckFn), std::move(Args));
3156
3157 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
3158 DAG.setRoot(Result.second);
3159 return;
3160 }
3161
3162 // If useLoadStackGuardNode returns true, generate LOAD_STACK_GUARD.
3163 // Otherwise, emit a volatile load to retrieve the stack guard value.
3164 SDValue Chain = DAG.getEntryNode();
3165 if (TLI.useLoadStackGuardNode(M)) {
3166 Guard = getLoadStackGuard(DAG, dl, Chain);
3167 } else {
3168 if (const Value *IRGuard = TLI.getSDagStackGuard(M, DAG.getLibcalls())) {
3169 SDValue GuardPtr = getValue(IRGuard);
3170 Guard = DAG.getLoad(PtrMemTy, dl, Chain, GuardPtr,
3171 MachinePointerInfo(IRGuard, 0), Align,
3173 } else {
3174 LLVMContext &Ctx = *DAG.getContext();
3175 Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
3176 Guard = DAG.getPOISON(PtrMemTy);
3177 }
3178 }
3179
3180 // Perform the comparison via a getsetcc.
3181 SDValue Cmp = DAG.getSetCC(
3182 dl, TLI.getSetCCResultType(DL, *DAG.getContext(), Guard.getValueType()),
3183 Guard, GuardVal, ISD::SETNE);
3184
3185 // If the guard/stackslot do not equal, branch to failure MBB.
3186 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl, MVT::Other, getControlRoot(),
3187 Cmp, DAG.getBasicBlock(SPD.getFailureMBB()));
3188 // Otherwise branch to success MBB.
3189 SDValue Br = DAG.getNode(ISD::BR, dl,
3190 MVT::Other, BrCond,
3191 DAG.getBasicBlock(SPD.getSuccessMBB()));
3192
3193 DAG.setRoot(Br);
3194}
3195
3196/// Codegen the failure basic block for a stack protector check.
3197///
3198/// A failure stack protector machine basic block consists simply of a call to
3199/// __stack_chk_fail().
3200///
3201/// For a high level explanation of how this fits into the stack protector
3202/// generation see the comment on the declaration of class
3203/// StackProtectorDescriptor.
3206
3207 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3208 MachineBasicBlock *ParentBB = SPD.getParentMBB();
3209 const Module &M = *ParentBB->getParent()->getFunction().getParent();
3210 SDValue Chain;
3211
3212 // For -Oz builds with a guard check function, we use function-based
3213 // instrumentation. Otherwise, if we have a guard check function, we call it
3214 // in the failure block.
3215 auto *GuardCheckFn = TLI.getSSPStackGuardCheck(M, DAG.getLibcalls());
3216 if (GuardCheckFn && !SPD.shouldEmitFunctionBasedCheckStackProtector()) {
3217 // First create the loads to the guard/stack slot for the comparison.
3218 auto &DL = DAG.getDataLayout();
3219 EVT PtrTy = TLI.getFrameIndexTy(DL);
3220 EVT PtrMemTy = TLI.getPointerMemTy(DL, DL.getAllocaAddrSpace());
3221
3222 MachineFrameInfo &MFI = ParentBB->getParent()->getFrameInfo();
3223 int FI = MFI.getStackProtectorIndex();
3224
3225 SDLoc dl = getCurSDLoc();
3226 SDValue StackSlotPtr = DAG.getFrameIndex(FI, PtrTy);
3227 Align Align = DL.getPrefTypeAlign(
3228 PointerType::get(M.getContext(), DL.getAllocaAddrSpace()));
3229
3230 // Generate code to load the content of the guard slot.
3231 SDValue GuardVal = DAG.getLoad(
3232 PtrMemTy, dl, DAG.getEntryNode(), StackSlotPtr,
3233 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI), Align,
3235
3236 if (TLI.useStackGuardXorFP())
3237 GuardVal = TLI.emitStackGuardXorFP(DAG, GuardVal, dl);
3238
3239 // The target provides a guard check function to validate the guard value.
3240 // Generate a call to that function with the content of the guard slot as
3241 // argument.
3242 FunctionType *FnTy = GuardCheckFn->getFunctionType();
3243 assert(FnTy->getNumParams() == 1 && "Invalid function signature");
3244
3246 TargetLowering::ArgListEntry Entry(GuardVal, FnTy->getParamType(0));
3247 if (GuardCheckFn->hasParamAttribute(0, Attribute::AttrKind::InReg))
3248 Entry.IsInReg = true;
3249 Args.push_back(Entry);
3250
3253 .setChain(DAG.getEntryNode())
3254 .setCallee(GuardCheckFn->getCallingConv(), FnTy->getReturnType(),
3255 getValue(GuardCheckFn), std::move(Args));
3256
3257 Chain = TLI.LowerCallTo(CLI).second;
3258 } else {
3260 CallOptions.setDiscardResult(true);
3261 Chain = TLI.makeLibCall(DAG, RTLIB::STACKPROTECTOR_CHECK_FAIL, MVT::isVoid,
3262 {}, CallOptions, getCurSDLoc())
3263 .second;
3264 }
3265
3266 // Emit a trap instruction if we are required to do so.
3267 const TargetOptions &TargetOpts = DAG.getTarget().Options;
3268 if (TargetOpts.TrapUnreachable && !TargetOpts.NoTrapAfterNoreturn)
3269 Chain = DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, Chain);
3270
3271 DAG.setRoot(Chain);
3272}
3273
3274/// visitBitTestHeader - This function emits necessary code to produce value
3275/// suitable for "bit tests"
3277 MachineBasicBlock *SwitchBB) {
3278 SDLoc dl = getCurSDLoc();
3279
3280 // Subtract the minimum value.
3281 SDValue SwitchOp = getValue(B.SValue);
3282 EVT VT = SwitchOp.getValueType();
3283 SDValue RangeSub =
3284 DAG.getNode(ISD::SUB, dl, VT, SwitchOp, DAG.getConstant(B.First, dl, VT));
3285
3286 // Determine the type of the test operands.
3287 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3288 bool UsePtrType = false;
3289 if (!TLI.isTypeLegal(VT)) {
3290 UsePtrType = true;
3291 } else {
3292 for (const BitTestCase &Case : B.Cases)
3293 if (!isUIntN(VT.getSizeInBits(), Case.Mask)) {
3294 // Switch table case range are encoded into series of masks.
3295 // Just use pointer type, it's guaranteed to fit.
3296 UsePtrType = true;
3297 break;
3298 }
3299 }
3300 SDValue Sub = RangeSub;
3301 if (UsePtrType) {
3302 VT = TLI.getPointerTy(DAG.getDataLayout());
3303 Sub = DAG.getZExtOrTrunc(Sub, dl, VT);
3304 }
3305
3306 B.RegVT = VT.getSimpleVT();
3307 B.Reg = FuncInfo.CreateReg(B.RegVT);
3308 SDValue CopyTo = DAG.getCopyToReg(getControlRoot(), dl, B.Reg, Sub);
3309
3310 MachineBasicBlock* MBB = B.Cases[0].ThisBB;
3311
3312 if (!B.FallthroughUnreachable)
3313 addSuccessorWithProb(SwitchBB, B.Default, B.DefaultProb);
3314 addSuccessorWithProb(SwitchBB, MBB, B.Prob);
3315 SwitchBB->normalizeSuccProbs();
3316
3317 SDValue Root = CopyTo;
3318 if (!B.FallthroughUnreachable) {
3319 // Conditional branch to the default block.
3320 SDValue RangeCmp = DAG.getSetCC(dl,
3321 TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
3322 RangeSub.getValueType()),
3323 RangeSub, DAG.getConstant(B.Range, dl, RangeSub.getValueType()),
3324 ISD::SETUGT);
3325
3326 Root = DAG.getNode(ISD::BRCOND, dl, MVT::Other, Root, RangeCmp,
3327 DAG.getBasicBlock(B.Default));
3328 }
3329
3330 // Avoid emitting unnecessary branches to the next block.
3331 if (MBB != NextBlock(SwitchBB))
3332 Root = DAG.getNode(ISD::BR, dl, MVT::Other, Root, DAG.getBasicBlock(MBB));
3333
3334 DAG.setRoot(Root);
3335}
3336
3337/// visitBitTestCase - this function produces one "bit test"
3339 MachineBasicBlock *NextMBB,
3340 BranchProbability BranchProbToNext,
3341 Register Reg, BitTestCase &B,
3342 MachineBasicBlock *SwitchBB) {
3343 SDLoc dl = getCurSDLoc();
3344 MVT VT = BB.RegVT;
3345 SDValue ShiftOp = DAG.getCopyFromReg(getControlRoot(), dl, Reg, VT);
3346 SDValue Cmp;
3347 unsigned PopCount = llvm::popcount(B.Mask);
3348 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3349 if (PopCount == 1) {
3350 // Testing for a single bit; just compare the shift count with what it
3351 // would need to be to shift a 1 bit in that position.
3352 Cmp = DAG.getSetCC(
3353 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3354 ShiftOp, DAG.getConstant(llvm::countr_zero(B.Mask), dl, VT),
3355 ISD::SETEQ);
3356 } else if (PopCount == BB.Range) {
3357 // There is only one zero bit in the range, test for it directly.
3358 Cmp = DAG.getSetCC(
3359 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3360 ShiftOp, DAG.getConstant(llvm::countr_one(B.Mask), dl, VT), ISD::SETNE);
3361 } else {
3362 // Make desired shift
3363 SDValue SwitchVal = DAG.getNode(ISD::SHL, dl, VT,
3364 DAG.getConstant(1, dl, VT), ShiftOp);
3365
3366 // Emit bit tests and jumps
3367 SDValue AndOp = DAG.getNode(ISD::AND, dl,
3368 VT, SwitchVal, DAG.getConstant(B.Mask, dl, VT));
3369 Cmp = DAG.getSetCC(
3370 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3371 AndOp, DAG.getConstant(0, dl, VT), ISD::SETNE);
3372 }
3373
3374 // The branch probability from SwitchBB to B.TargetBB is B.ExtraProb.
3375 addSuccessorWithProb(SwitchBB, B.TargetBB, B.ExtraProb);
3376 // The branch probability from SwitchBB to NextMBB is BranchProbToNext.
3377 addSuccessorWithProb(SwitchBB, NextMBB, BranchProbToNext);
3378 // It is not guaranteed that the sum of B.ExtraProb and BranchProbToNext is
3379 // one as they are relative probabilities (and thus work more like weights),
3380 // and hence we need to normalize them to let the sum of them become one.
3381 SwitchBB->normalizeSuccProbs();
3382
3383 SDValue BrAnd = DAG.getNode(ISD::BRCOND, dl,
3384 MVT::Other, getControlRoot(),
3385 Cmp, DAG.getBasicBlock(B.TargetBB));
3386
3387 // Avoid emitting unnecessary branches to the next block.
3388 if (NextMBB != NextBlock(SwitchBB))
3389 BrAnd = DAG.getNode(ISD::BR, dl, MVT::Other, BrAnd,
3390 DAG.getBasicBlock(NextMBB));
3391
3392 DAG.setRoot(BrAnd);
3393}
3394
3395void SelectionDAGBuilder::visitInvoke(const InvokeInst &I) {
3396 MachineBasicBlock *InvokeMBB = FuncInfo.MBB;
3397
3398 // Retrieve successors. Look through artificial IR level blocks like
3399 // catchswitch for successors.
3400 MachineBasicBlock *Return = FuncInfo.getMBB(I.getSuccessor(0));
3401 const BasicBlock *EHPadBB = I.getSuccessor(1);
3402 MachineBasicBlock *EHPadMBB = FuncInfo.getMBB(EHPadBB);
3403
3404 // Deopt and ptrauth bundles are lowered in helper functions, and we don't
3405 // have to do anything here to lower funclet bundles.
3406 failForInvalidBundles(I, "invokes",
3412
3413 const Value *Callee(I.getCalledOperand());
3414 const Function *Fn = dyn_cast<Function>(Callee);
3415 if (isa<InlineAsm>(Callee))
3416 visitInlineAsm(I, EHPadBB);
3417 else if (Fn && Fn->isIntrinsic()) {
3418 switch (Fn->getIntrinsicID()) {
3419 default:
3420 llvm_unreachable("Cannot invoke this intrinsic");
3421 case Intrinsic::donothing:
3422 // Ignore invokes to @llvm.donothing: jump directly to the next BB.
3423 case Intrinsic::seh_try_begin:
3424 case Intrinsic::seh_scope_begin:
3425 case Intrinsic::seh_try_end:
3426 case Intrinsic::seh_scope_end:
3427 if (EHPadMBB)
3428 // a block referenced by EH table
3429 // so dtor-funclet not removed by opts
3430 EHPadMBB->setMachineBlockAddressTaken();
3431 break;
3432 case Intrinsic::experimental_patchpoint_void:
3433 case Intrinsic::experimental_patchpoint:
3434 visitPatchpoint(I, EHPadBB);
3435 break;
3436 case Intrinsic::experimental_gc_statepoint:
3438 break;
3439 // wasm_throw, wasm_rethrow: This is usually done in visitTargetIntrinsic,
3440 // but these intrinsics are special because they can be invoked, so we
3441 // manually lower it to a DAG node here.
3442 case Intrinsic::wasm_throw: {
3444 std::array<SDValue, 4> Ops = {
3445 getControlRoot(), // inchain for the terminator node
3446 DAG.getTargetConstant(Intrinsic::wasm_throw, getCurSDLoc(),
3448 getValue(I.getArgOperand(0)), // tag
3449 getValue(I.getArgOperand(1)) // thrown value
3450 };
3451 SDVTList VTs = DAG.getVTList(ArrayRef<EVT>({MVT::Other})); // outchain
3452 DAG.setRoot(DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops));
3453 break;
3454 }
3455 case Intrinsic::wasm_rethrow: {
3456 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3457 std::array<SDValue, 2> Ops = {
3458 getControlRoot(), // inchain for the terminator node
3459 DAG.getTargetConstant(Intrinsic::wasm_rethrow, getCurSDLoc(),
3460 TLI.getPointerTy(DAG.getDataLayout()))};
3461 SDVTList VTs = DAG.getVTList(ArrayRef<EVT>({MVT::Other})); // outchain
3462 DAG.setRoot(DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops));
3463 break;
3464 }
3465 }
3466 } else if (I.hasDeoptState()) {
3467 // Currently we do not lower any intrinsic calls with deopt operand bundles.
3468 // Eventually we will support lowering the @llvm.experimental.deoptimize
3469 // intrinsic, and right now there are no plans to support other intrinsics
3470 // with deopt state.
3471 LowerCallSiteWithDeoptBundle(&I, getValue(Callee), EHPadBB);
3472 } else if (I.countOperandBundlesOfType(LLVMContext::OB_ptrauth)) {
3474 } else {
3475 LowerCallTo(I, getValue(Callee), false, false, EHPadBB);
3476 }
3477
3478 // If the value of the invoke is used outside of its defining block, make it
3479 // available as a virtual register.
3480 // We already took care of the exported value for the statepoint instruction
3481 // during call to the LowerStatepoint.
3482 if (!isa<GCStatepointInst>(I)) {
3484 }
3485
3487 BranchProbabilityInfo *BPI = FuncInfo.BPI;
3488 BranchProbability EHPadBBProb =
3489 BPI ? BPI->getEdgeProbability(InvokeMBB->getBasicBlock(), EHPadBB)
3491 findUnwindDestinations(FuncInfo, EHPadBB, EHPadBBProb, UnwindDests);
3492
3493 // Update successor info.
3494 addSuccessorWithProb(InvokeMBB, Return);
3495 for (auto &UnwindDest : UnwindDests) {
3496 UnwindDest.first->setIsEHPad();
3497 addSuccessorWithProb(InvokeMBB, UnwindDest.first, UnwindDest.second);
3498 }
3499 InvokeMBB->normalizeSuccProbs();
3500
3501 // Drop into normal successor.
3502 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other, getControlRoot(),
3503 DAG.getBasicBlock(Return)));
3504}
3505
3506/// The intrinsics currently supported by callbr are implicit control flow
3507/// intrinsics such as amdgcn.kill.
3508/// - they should be called (no "dontcall-" attributes)
3509/// - they do not touch memory on the target (= !TLI.getTgtMemIntrinsic())
3510/// - they do not need custom argument handling (no
3511/// TLI.CollectTargetIntrinsicOperands())
3512void SelectionDAGBuilder::visitCallBrIntrinsic(const CallBrInst &I) {
3513#ifndef NDEBUG
3515 DAG.getTargetLoweringInfo().getTgtMemIntrinsic(
3516 Infos, I, DAG.getMachineFunction(), I.getIntrinsicID());
3517 assert(Infos.empty() && "Intrinsic touches memory");
3518#endif
3519
3520 auto [HasChain, OnlyLoad] = getTargetIntrinsicCallProperties(I);
3521
3523 getTargetIntrinsicOperands(I, HasChain, OnlyLoad);
3524 SDVTList VTs = getTargetIntrinsicVTList(I, HasChain);
3525
3526 // Create the node.
3527 SDValue Result =
3528 getTargetNonMemIntrinsicNode(*I.getType(), HasChain, Ops, VTs);
3529 Result = handleTargetIntrinsicRet(I, HasChain, OnlyLoad, Result);
3530
3531 setValue(&I, Result);
3532}
3533
3534void SelectionDAGBuilder::visitCallBr(const CallBrInst &I) {
3535 MachineBasicBlock *CallBrMBB = FuncInfo.MBB;
3536
3537 if (I.isInlineAsm()) {
3538 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
3539 // have to do anything here to lower funclet bundles.
3540 failForInvalidBundles(I, "callbrs",
3542 visitInlineAsm(I);
3543 } else {
3544 assert(!I.hasOperandBundles() &&
3545 "Can't have operand bundles for intrinsics");
3546 visitCallBrIntrinsic(I);
3547 }
3549
3550 // Retrieve successors.
3551 SmallPtrSet<BasicBlock *, 8> Dests;
3552 Dests.insert(I.getDefaultDest());
3553 MachineBasicBlock *Return = FuncInfo.getMBB(I.getDefaultDest());
3554
3555 // Update successor info.
3556 addSuccessorWithProb(CallBrMBB, Return, BranchProbability::getOne());
3557 // TODO: For most of the cases where there is an intrinsic callbr, we're
3558 // having exactly one indirect target, which will be unreachable. As soon as
3559 // this changes, we might need to enhance
3560 // Target->setIsInlineAsmBrIndirectTarget or add something similar for
3561 // intrinsic indirect branches.
3562 if (I.isInlineAsm()) {
3563 for (BasicBlock *Dest : I.getIndirectDests()) {
3564 MachineBasicBlock *Target = FuncInfo.getMBB(Dest);
3565 Target->setIsInlineAsmBrIndirectTarget();
3566 // If we introduce a type of asm goto statement that is permitted to use
3567 // an indirect call instruction to jump to its labels, then we should add
3568 // a call to Target->setMachineBlockAddressTaken() here, to mark the
3569 // target block as requiring a BTI.
3570
3571 Target->setLabelMustBeEmitted();
3572 // Don't add duplicate machine successors.
3573 if (Dests.insert(Dest).second)
3574 addSuccessorWithProb(CallBrMBB, Target, BranchProbability::getZero());
3575 }
3576 }
3577 CallBrMBB->normalizeSuccProbs();
3578
3579 // Drop into default successor.
3580 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(),
3581 MVT::Other, getControlRoot(),
3582 DAG.getBasicBlock(Return)));
3583}
3584
3585void SelectionDAGBuilder::visitResume(const ResumeInst &RI) {
3586 llvm_unreachable("SelectionDAGBuilder shouldn't visit resume instructions!");
3587}
3588
3589void SelectionDAGBuilder::visitLandingPad(const LandingPadInst &LP) {
3590 assert(FuncInfo.MBB->isEHPad() &&
3591 "Call to landingpad not in landing pad!");
3592
3593 // If there aren't registers to copy the values into (e.g., during SjLj
3594 // exceptions), then don't bother to create these DAG nodes.
3595 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3596 const Constant *PersonalityFn = FuncInfo.Fn->getPersonalityFn();
3597 if (TLI.getExceptionPointerRegister(PersonalityFn) == 0 &&
3598 TLI.getExceptionSelectorRegister(PersonalityFn) == 0)
3599 return;
3600
3601 // If landingpad's return type is token type, we don't create DAG nodes
3602 // for its exception pointer and selector value. The extraction of exception
3603 // pointer or selector value from token type landingpads is not currently
3604 // supported.
3605 if (LP.getType()->isTokenTy())
3606 return;
3607
3608 SmallVector<EVT, 2> ValueVTs;
3609 SDLoc dl = getCurSDLoc();
3610 ComputeValueVTs(TLI, DAG.getDataLayout(), LP.getType(), ValueVTs);
3611 assert(ValueVTs.size() == 2 && "Only two-valued landingpads are supported");
3612
3613 // Get the two live-in registers as SDValues. The physregs have already been
3614 // copied into virtual registers.
3615 SDValue Ops[2];
3616 if (FuncInfo.ExceptionPointerVirtReg) {
3617 Ops[0] = DAG.getZExtOrTrunc(
3618 DAG.getCopyFromReg(DAG.getEntryNode(), dl,
3619 FuncInfo.ExceptionPointerVirtReg,
3620 TLI.getPointerTy(DAG.getDataLayout())),
3621 dl, ValueVTs[0]);
3622 } else {
3623 Ops[0] = DAG.getConstant(0, dl, TLI.getPointerTy(DAG.getDataLayout()));
3624 }
3625 Ops[1] = DAG.getZExtOrTrunc(
3626 DAG.getCopyFromReg(DAG.getEntryNode(), dl,
3627 FuncInfo.ExceptionSelectorVirtReg,
3628 TLI.getPointerTy(DAG.getDataLayout())),
3629 dl, ValueVTs[1]);
3630
3631 // Merge into one.
3632 SDValue Res = DAG.getNode(ISD::MERGE_VALUES, dl,
3633 DAG.getVTList(ValueVTs), Ops);
3634 setValue(&LP, Res);
3635}
3636
3639 // Update JTCases.
3640 for (JumpTableBlock &JTB : SL->JTCases)
3641 if (JTB.first.HeaderBB == First)
3642 JTB.first.HeaderBB = Last;
3643
3644 // Update BitTestCases.
3645 for (BitTestBlock &BTB : SL->BitTestCases)
3646 if (BTB.Parent == First)
3647 BTB.Parent = Last;
3648}
3649
3650void SelectionDAGBuilder::visitIndirectBr(const IndirectBrInst &I) {
3651 MachineBasicBlock *IndirectBrMBB = FuncInfo.MBB;
3652
3653 // Update machine-CFG edges with unique successors.
3655 for (unsigned i = 0, e = I.getNumSuccessors(); i != e; ++i) {
3656 BasicBlock *BB = I.getSuccessor(i);
3657 bool Inserted = Done.insert(BB).second;
3658 if (!Inserted)
3659 continue;
3660
3661 MachineBasicBlock *Succ = FuncInfo.getMBB(BB);
3662 addSuccessorWithProb(IndirectBrMBB, Succ);
3663 }
3664 IndirectBrMBB->normalizeSuccProbs();
3665
3667 MVT::Other, getControlRoot(),
3668 getValue(I.getAddress())));
3669}
3670
3671void SelectionDAGBuilder::visitUnreachable(const UnreachableInst &I) {
3672 if (!I.shouldLowerToTrap(DAG.getTarget().Options.TrapUnreachable,
3673 DAG.getTarget().Options.NoTrapAfterNoreturn))
3674 return;
3675
3676 DAG.setRoot(DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, DAG.getRoot()));
3677}
3678
3679void SelectionDAGBuilder::visitUnary(const User &I, unsigned Opcode) {
3680 SDNodeFlags Flags;
3681 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3682 Flags.copyFMF(*FPOp);
3683
3684 SDValue Op = getValue(I.getOperand(0));
3685 SDValue UnNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op.getValueType(),
3686 Op, Flags);
3687 setValue(&I, UnNodeValue);
3688}
3689
3690void SelectionDAGBuilder::visitBinary(const User &I, unsigned Opcode) {
3691 SDNodeFlags Flags;
3692 if (auto *OFBinOp = dyn_cast<OverflowingBinaryOperator>(&I)) {
3693 Flags.setNoSignedWrap(OFBinOp->hasNoSignedWrap());
3694 Flags.setNoUnsignedWrap(OFBinOp->hasNoUnsignedWrap());
3695 }
3696 if (auto *ExactOp = dyn_cast<PossiblyExactOperator>(&I))
3697 Flags.setExact(ExactOp->isExact());
3698 if (auto *DisjointOp = dyn_cast<PossiblyDisjointInst>(&I))
3699 Flags.setDisjoint(DisjointOp->isDisjoint());
3700 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3701 Flags.copyFMF(*FPOp);
3702
3703 SDValue Op1 = getValue(I.getOperand(0));
3704 SDValue Op2 = getValue(I.getOperand(1));
3705 SDValue BinNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(),
3706 Op1, Op2, Flags);
3707 setValue(&I, BinNodeValue);
3708}
3709
3710void SelectionDAGBuilder::visitShift(const User &I, unsigned Opcode) {
3711 SDValue Op1 = getValue(I.getOperand(0));
3712 SDValue Op2 = getValue(I.getOperand(1));
3713
3714 EVT ShiftTy = DAG.getTargetLoweringInfo().getShiftAmountTy(
3715 Op1.getValueType(), DAG.getDataLayout());
3716
3717 // Coerce the shift amount to the right type if we can. This exposes the
3718 // truncate or zext to optimization early.
3719 if (!I.getType()->isVectorTy() && Op2.getValueType() != ShiftTy) {
3721 "Unexpected shift type");
3722 Op2 = DAG.getZExtOrTrunc(Op2, getCurSDLoc(), ShiftTy);
3723 }
3724
3725 bool nuw = false;
3726 bool nsw = false;
3727 bool exact = false;
3728
3729 if (Opcode == ISD::SRL || Opcode == ISD::SRA || Opcode == ISD::SHL) {
3730
3731 if (const OverflowingBinaryOperator *OFBinOp =
3733 nuw = OFBinOp->hasNoUnsignedWrap();
3734 nsw = OFBinOp->hasNoSignedWrap();
3735 }
3736 if (const PossiblyExactOperator *ExactOp =
3738 exact = ExactOp->isExact();
3739 }
3740 SDNodeFlags Flags;
3741 Flags.setExact(exact);
3742 Flags.setNoSignedWrap(nsw);
3743 Flags.setNoUnsignedWrap(nuw);
3744 SDValue Res = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(), Op1, Op2,
3745 Flags);
3746 setValue(&I, Res);
3747}
3748
3749void SelectionDAGBuilder::visitSDiv(const User &I) {
3750 SDValue Op1 = getValue(I.getOperand(0));
3751 SDValue Op2 = getValue(I.getOperand(1));
3752
3753 SDNodeFlags Flags;
3754 Flags.setExact(isa<PossiblyExactOperator>(&I) &&
3755 cast<PossiblyExactOperator>(&I)->isExact());
3756 setValue(&I, DAG.getNode(ISD::SDIV, getCurSDLoc(), Op1.getValueType(), Op1,
3757 Op2, Flags));
3758}
3759
3760void SelectionDAGBuilder::visitICmp(const ICmpInst &I) {
3761 ICmpInst::Predicate predicate = I.getPredicate();
3762 SDValue Op1 = getValue(I.getOperand(0));
3763 SDValue Op2 = getValue(I.getOperand(1));
3764 ISD::CondCode Opcode = getICmpCondCode(predicate);
3765
3766 auto &TLI = DAG.getTargetLoweringInfo();
3767 EVT MemVT =
3768 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
3769
3770 // If a pointer's DAG type is larger than its memory type then the DAG values
3771 // are zero-extended. This breaks signed comparisons so truncate back to the
3772 // underlying type before doing the compare.
3773 if (Op1.getValueType() != MemVT) {
3774 Op1 = DAG.getPtrExtOrTrunc(Op1, getCurSDLoc(), MemVT);
3775 Op2 = DAG.getPtrExtOrTrunc(Op2, getCurSDLoc(), MemVT);
3776 }
3777
3778 SDNodeFlags Flags;
3779 Flags.setSameSign(I.hasSameSign());
3780
3781 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3782 I.getType());
3783 setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Opcode,
3784 /*Chain=*/{}, /*IsSignaling=*/false, Flags));
3785}
3786
3787void SelectionDAGBuilder::visitFCmp(const FCmpInst &I) {
3788 FCmpInst::Predicate predicate = I.getPredicate();
3789 SDValue Op1 = getValue(I.getOperand(0));
3790 SDValue Op2 = getValue(I.getOperand(1));
3791
3792 ISD::CondCode Condition = getFCmpCondCode(predicate);
3793 auto *FPMO = cast<FPMathOperator>(&I);
3794 if (FPMO->hasNoNaNs() ||
3795 (DAG.isKnownNeverNaN(Op1) && DAG.isKnownNeverNaN(Op2)))
3796 Condition = getFCmpCodeWithoutNaN(Condition);
3797
3798 SDNodeFlags Flags;
3799 Flags.copyFMF(*FPMO);
3800
3801 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3802 I.getType());
3803 setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Condition,
3804 /*Chain=*/{}, /*IsSignaling=*/false, Flags));
3805}
3806
3807// Check if the condition of the select has one use or two users that are both
3808// selects with the same condition.
3809static bool hasOnlySelectUsers(const Value *Cond) {
3810 return llvm::all_of(Cond->users(), [](const Value *V) {
3811 return isa<SelectInst>(V);
3812 });
3813}
3814
3815void SelectionDAGBuilder::visitSelect(const User &I) {
3816 SmallVector<EVT, 4> ValueVTs;
3817 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
3818 ValueVTs);
3819 unsigned NumValues = ValueVTs.size();
3820 if (NumValues == 0) return;
3821
3822 SmallVector<SDValue, 4> Values(NumValues);
3823 SDValue Cond = getValue(I.getOperand(0));
3824 SDValue LHSVal = getValue(I.getOperand(1));
3825 SDValue RHSVal = getValue(I.getOperand(2));
3826 SmallVector<SDValue, 1> BaseOps(1, Cond);
3828 Cond.getValueType().isVector() ? ISD::VSELECT : ISD::SELECT;
3829
3830 bool IsUnaryAbs = false;
3831 bool Negate = false;
3832
3833 SDNodeFlags Flags;
3834 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3835 Flags.copyFMF(*FPOp);
3836
3837 Flags.setUnpredictable(
3838 cast<SelectInst>(I).getMetadata(LLVMContext::MD_unpredictable));
3839
3840 // Min/max matching is only viable if all output VTs are the same.
3841 if (all_equal(ValueVTs)) {
3842 EVT VT = ValueVTs[0];
3843 LLVMContext &Ctx = *DAG.getContext();
3844 auto &TLI = DAG.getTargetLoweringInfo();
3845
3846 // We care about the legality of the operation after it has been type
3847 // legalized.
3848 while (TLI.getTypeAction(Ctx, VT) != TargetLoweringBase::TypeLegal)
3849 VT = TLI.getTypeToTransformTo(Ctx, VT);
3850
3851 // If the vselect is legal, assume we want to leave this as a vector setcc +
3852 // vselect. Otherwise, if this is going to be scalarized, we want to see if
3853 // min/max is legal on the scalar type.
3854 bool UseScalarMinMax = VT.isVector() &&
3856
3857 // ValueTracking's select pattern matching does not account for -0.0,
3858 // so we can't lower to FMINIMUM/FMAXIMUM because those nodes specify that
3859 // -0.0 is less than +0.0.
3860 const Value *LHS, *RHS;
3861 auto SPR = matchSelectPattern(&I, LHS, RHS);
3863 switch (SPR.Flavor) {
3864 case SPF_UMAX: Opc = ISD::UMAX; break;
3865 case SPF_UMIN: Opc = ISD::UMIN; break;
3866 case SPF_SMAX: Opc = ISD::SMAX; break;
3867 case SPF_SMIN: Opc = ISD::SMIN; break;
3868 case SPF_FMINNUM:
3870 break;
3871
3872 switch (SPR.NaNBehavior) {
3873 case SPNB_NA: llvm_unreachable("No NaN behavior for FP op?");
3874 case SPNB_RETURNS_NAN: break;
3875 case SPNB_RETURNS_OTHER:
3877 Flags.setNoSignedZeros(true);
3878 break;
3879 case SPNB_RETURNS_ANY:
3881 (UseScalarMinMax &&
3883 Opc = ISD::FMINNUM;
3884 break;
3885 }
3886 break;
3887 case SPF_FMAXNUM:
3889 break;
3890
3891 switch (SPR.NaNBehavior) {
3892 case SPNB_NA: llvm_unreachable("No NaN behavior for FP op?");
3893 case SPNB_RETURNS_NAN: break;
3894 case SPNB_RETURNS_OTHER:
3896 Flags.setNoSignedZeros(true);
3897 break;
3898 case SPNB_RETURNS_ANY:
3900 (UseScalarMinMax &&
3902 Opc = ISD::FMAXNUM;
3903 break;
3904 }
3905 break;
3906 case SPF_NABS:
3907 Negate = true;
3908 [[fallthrough]];
3909 case SPF_ABS:
3910 IsUnaryAbs = true;
3911 Opc = ISD::ABS;
3912 break;
3913 default: break;
3914 }
3915
3916 if (!IsUnaryAbs && Opc != ISD::DELETED_NODE &&
3917 (TLI.isOperationLegalOrCustom(Opc, VT) ||
3918 (UseScalarMinMax &&
3920 // If the underlying comparison instruction is used by any other
3921 // instruction, the consumed instructions won't be destroyed, so it is
3922 // not profitable to convert to a min/max.
3924 OpCode = Opc;
3925 LHSVal = getValue(LHS);
3926 RHSVal = getValue(RHS);
3927 BaseOps.clear();
3928 }
3929
3930 if (IsUnaryAbs) {
3931 OpCode = Opc;
3932 LHSVal = getValue(LHS);
3933 BaseOps.clear();
3934 }
3935 }
3936
3937 if (IsUnaryAbs) {
3938 for (unsigned i = 0; i != NumValues; ++i) {
3939 SDLoc dl = getCurSDLoc();
3940 EVT VT = LHSVal.getNode()->getValueType(LHSVal.getResNo() + i);
3941 Values[i] =
3942 DAG.getNode(OpCode, dl, VT, LHSVal.getValue(LHSVal.getResNo() + i));
3943 if (Negate)
3944 Values[i] = DAG.getNegative(Values[i], dl, VT);
3945 }
3946 } else {
3947 for (unsigned i = 0; i != NumValues; ++i) {
3948 SmallVector<SDValue, 3> Ops(BaseOps.begin(), BaseOps.end());
3949 Ops.push_back(SDValue(LHSVal.getNode(), LHSVal.getResNo() + i));
3950 Ops.push_back(SDValue(RHSVal.getNode(), RHSVal.getResNo() + i));
3951 Values[i] = DAG.getNode(
3952 OpCode, getCurSDLoc(),
3953 LHSVal.getNode()->getValueType(LHSVal.getResNo() + i), Ops, Flags);
3954 }
3955 }
3956
3958 DAG.getVTList(ValueVTs), Values));
3959}
3960
3961void SelectionDAGBuilder::visitTrunc(const User &I) {
3962 // TruncInst cannot be a no-op cast because sizeof(src) > sizeof(dest).
3963 SDValue N = getValue(I.getOperand(0));
3964 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3965 I.getType());
3966 SDNodeFlags Flags;
3967 if (auto *Trunc = dyn_cast<TruncInst>(&I)) {
3968 Flags.setNoSignedWrap(Trunc->hasNoSignedWrap());
3969 Flags.setNoUnsignedWrap(Trunc->hasNoUnsignedWrap());
3970 }
3971
3972 setValue(&I, DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), DestVT, N, Flags));
3973}
3974
3975void SelectionDAGBuilder::visitZExt(const User &I) {
3976 // ZExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
3977 // ZExt also can't be a cast to bool for same reason. So, nothing much to do
3978 SDValue N = getValue(I.getOperand(0));
3979 auto &TLI = DAG.getTargetLoweringInfo();
3980 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
3981
3982 SDNodeFlags Flags;
3983 if (auto *PNI = dyn_cast<PossiblyNonNegInst>(&I))
3984 Flags.setNonNeg(PNI->hasNonNeg());
3985
3986 // Eagerly use nonneg information to canonicalize towards sign_extend if
3987 // that is the target's preference.
3988 // TODO: Let the target do this later.
3989 if (Flags.hasNonNeg() &&
3990 TLI.isSExtCheaperThanZExt(N.getValueType(), DestVT)) {
3991 setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));
3992 return;
3993 }
3994
3995 setValue(&I, DAG.getNode(ISD::ZERO_EXTEND, getCurSDLoc(), DestVT, N, Flags));
3996}
3997
3998void SelectionDAGBuilder::visitSExt(const User &I) {
3999 // SExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
4000 // SExt also can't be a cast to bool for same reason. So, nothing much to do
4001 SDValue N = getValue(I.getOperand(0));
4002 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4003 I.getType());
4004 setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));
4005}
4006
4007void SelectionDAGBuilder::visitFPTrunc(const User &I) {
4008 // FPTrunc is never a no-op cast, no need to check
4009 SDValue N = getValue(I.getOperand(0));
4010 SDLoc dl = getCurSDLoc();
4011 SDNodeFlags Flags;
4012 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
4013 Flags.copyFMF(*FPOp);
4014 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4015 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4016 setValue(&I, DAG.getNode(ISD::FP_ROUND, dl, DestVT, N,
4017 DAG.getTargetConstant(
4018 0, dl, TLI.getPointerTy(DAG.getDataLayout())),
4019 Flags));
4020}
4021
4022void SelectionDAGBuilder::visitFPExt(const User &I) {
4023 // FPExt is never a no-op cast, no need to check
4024 SDValue N = getValue(I.getOperand(0));
4025 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4026 I.getType());
4027 SDNodeFlags Flags;
4028 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
4029 Flags.copyFMF(*FPOp);
4030 setValue(&I, DAG.getNode(ISD::FP_EXTEND, getCurSDLoc(), DestVT, N, Flags));
4031}
4032
4033void SelectionDAGBuilder::visitFPToUI(const User &I) {
4034 // FPToUI is never a no-op cast, no need to check
4035 SDValue N = getValue(I.getOperand(0));
4036 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4037 I.getType());
4038 setValue(&I, DAG.getNode(ISD::FP_TO_UINT, getCurSDLoc(), DestVT, N));
4039}
4040
4041void SelectionDAGBuilder::visitFPToSI(const User &I) {
4042 // FPToSI is never a no-op cast, no need to check
4043 SDValue N = getValue(I.getOperand(0));
4044 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4045 I.getType());
4046 setValue(&I, DAG.getNode(ISD::FP_TO_SINT, getCurSDLoc(), DestVT, N));
4047}
4048
4049void SelectionDAGBuilder::visitUIToFP(const User &I) {
4050 // UIToFP is never a no-op cast, no need to check
4051 SDValue N = getValue(I.getOperand(0));
4052 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4053 I.getType());
4054 SDNodeFlags Flags;
4055 if (auto *PNI = dyn_cast<PossiblyNonNegInst>(&I))
4056 Flags.setNonNeg(PNI->hasNonNeg());
4057
4058 setValue(&I, DAG.getNode(ISD::UINT_TO_FP, getCurSDLoc(), DestVT, N, Flags));
4059}
4060
4061void SelectionDAGBuilder::visitSIToFP(const User &I) {
4062 // SIToFP is never a no-op cast, no need to check
4063 SDValue N = getValue(I.getOperand(0));
4064 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4065 I.getType());
4066 setValue(&I, DAG.getNode(ISD::SINT_TO_FP, getCurSDLoc(), DestVT, N));
4067}
4068
4069void SelectionDAGBuilder::visitPtrToAddr(const User &I) {
4070 SDValue N = getValue(I.getOperand(0));
4071 // By definition the type of the ptrtoaddr must be equal to the address type.
4072 const auto &TLI = DAG.getTargetLoweringInfo();
4073 EVT AddrVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4074 // The address width must be smaller or equal to the pointer representation
4075 // width, so we lower ptrtoaddr as a truncate (possibly folded to a no-op).
4076 N = DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), AddrVT, N);
4077 setValue(&I, N);
4078}
4079
4080void SelectionDAGBuilder::visitPtrToInt(const User &I) {
4081 // What to do depends on the size of the integer and the size of the pointer.
4082 // We can either truncate, zero extend, or no-op, accordingly.
4083 SDValue N = getValue(I.getOperand(0));
4084 auto &TLI = DAG.getTargetLoweringInfo();
4085 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4086 I.getType());
4087 EVT PtrMemVT =
4088 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
4089 N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), PtrMemVT);
4090 N = DAG.getZExtOrTrunc(N, getCurSDLoc(), DestVT);
4091 setValue(&I, N);
4092}
4093
4094void SelectionDAGBuilder::visitIntToPtr(const User &I) {
4095 // What to do depends on the size of the integer and the size of the pointer.
4096 // We can either truncate, zero extend, or no-op, accordingly.
4097 SDValue N = getValue(I.getOperand(0));
4098 auto &TLI = DAG.getTargetLoweringInfo();
4099 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4100 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(), I.getType());
4101 N = DAG.getZExtOrTrunc(N, getCurSDLoc(), PtrMemVT);
4102 N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), DestVT);
4103 setValue(&I, N);
4104}
4105
4106void SelectionDAGBuilder::visitBitCast(const User &I) {
4107 SDValue N = getValue(I.getOperand(0));
4108 SDLoc dl = getCurSDLoc();
4109 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4110 I.getType());
4111
4112 // BitCast assures us that source and destination are the same size so this is
4113 // either a BITCAST or a no-op.
4114 if (DestVT != N.getValueType())
4115 setValue(&I, DAG.getNode(ISD::BITCAST, dl,
4116 DestVT, N)); // convert types.
4117 // Check if the original LLVM IR Operand was a ConstantInt, because getValue()
4118 // might fold any kind of constant expression to an integer constant and that
4119 // is not what we are looking for. Only recognize a bitcast of a genuine
4120 // constant integer as an opaque constant.
4121 else if(ConstantInt *C = dyn_cast<ConstantInt>(I.getOperand(0)))
4122 setValue(&I, DAG.getConstant(C->getValue(), dl, DestVT, /*isTarget=*/false,
4123 /*isOpaque*/true));
4124 else
4125 setValue(&I, N); // noop cast.
4126}
4127
4128void SelectionDAGBuilder::visitAddrSpaceCast(const User &I) {
4129 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4130 const Value *SV = I.getOperand(0);
4131 SDValue N = getValue(SV);
4132 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4133
4134 unsigned SrcAS = SV->getType()->getPointerAddressSpace();
4135 unsigned DestAS = I.getType()->getPointerAddressSpace();
4136
4137 if (!TM.isNoopAddrSpaceCast(SrcAS, DestAS))
4138 N = DAG.getAddrSpaceCast(getCurSDLoc(), DestVT, N, SrcAS, DestAS);
4139
4140 setValue(&I, N);
4141}
4142
4143void SelectionDAGBuilder::visitInsertElement(const User &I) {
4144 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4145 SDValue InVec = getValue(I.getOperand(0));
4146 SDValue InVal = getValue(I.getOperand(1));
4147 SDValue InIdx = DAG.getZExtOrTrunc(getValue(I.getOperand(2)), getCurSDLoc(),
4148 TLI.getVectorIdxTy(DAG.getDataLayout()));
4150 TLI.getValueType(DAG.getDataLayout(), I.getType()),
4151 InVec, InVal, InIdx));
4152}
4153
4154void SelectionDAGBuilder::visitExtractElement(const User &I) {
4155 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4156 SDValue InVec = getValue(I.getOperand(0));
4157 SDValue InIdx = DAG.getZExtOrTrunc(getValue(I.getOperand(1)), getCurSDLoc(),
4158 TLI.getVectorIdxTy(DAG.getDataLayout()));
4160 TLI.getValueType(DAG.getDataLayout(), I.getType()),
4161 InVec, InIdx));
4162}
4163
4164void SelectionDAGBuilder::visitShuffleVector(const User &I) {
4165 SDValue Src1 = getValue(I.getOperand(0));
4166 SDValue Src2 = getValue(I.getOperand(1));
4167 ArrayRef<int> Mask;
4168 if (auto *SVI = dyn_cast<ShuffleVectorInst>(&I))
4169 Mask = SVI->getShuffleMask();
4170 else
4171 Mask = cast<ConstantExpr>(I).getShuffleMask();
4172 SDLoc DL = getCurSDLoc();
4173 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4174 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4175 EVT SrcVT = Src1.getValueType();
4176
4177 if (all_of(Mask, equal_to(0)) && VT.isScalableVector()) {
4178 // Canonical splat form of first element of first input vector.
4179 SDValue FirstElt =
4180 DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, SrcVT.getScalarType(), Src1,
4181 DAG.getVectorIdxConstant(0, DL));
4182 setValue(&I, DAG.getNode(ISD::SPLAT_VECTOR, DL, VT, FirstElt));
4183 return;
4184 }
4185
4186 // For now, we only handle splats for scalable vectors.
4187 // The DAGCombiner will perform a BUILD_VECTOR -> SPLAT_VECTOR transformation
4188 // for targets that support a SPLAT_VECTOR for non-scalable vector types.
4189 assert(!VT.isScalableVector() && "Unsupported scalable vector shuffle");
4190
4191 unsigned SrcNumElts = SrcVT.getVectorNumElements();
4192 unsigned MaskNumElts = Mask.size();
4193
4194 if (SrcNumElts == MaskNumElts) {
4195 setValue(&I, DAG.getVectorShuffle(VT, DL, Src1, Src2, Mask));
4196 return;
4197 }
4198
4199 // Normalize the shuffle vector since mask and vector length don't match.
4200 if (SrcNumElts < MaskNumElts) {
4201 // Mask is longer than the source vectors. We can use concatenate vector to
4202 // make the mask and vectors lengths match.
4203
4204 if (MaskNumElts % SrcNumElts == 0) {
4205 // Mask length is a multiple of the source vector length.
4206 // Check if the shuffle is some kind of concatenation of the input
4207 // vectors.
4208 unsigned NumConcat = MaskNumElts / SrcNumElts;
4209 bool IsConcat = true;
4210 SmallVector<int, 8> ConcatSrcs(NumConcat, -1);
4211 for (unsigned i = 0; i != MaskNumElts; ++i) {
4212 int Idx = Mask[i];
4213 if (Idx < 0)
4214 continue;
4215 // Ensure the indices in each SrcVT sized piece are sequential and that
4216 // the same source is used for the whole piece.
4217 if ((Idx % SrcNumElts != (i % SrcNumElts)) ||
4218 (ConcatSrcs[i / SrcNumElts] >= 0 &&
4219 ConcatSrcs[i / SrcNumElts] != (int)(Idx / SrcNumElts))) {
4220 IsConcat = false;
4221 break;
4222 }
4223 // Remember which source this index came from.
4224 ConcatSrcs[i / SrcNumElts] = Idx / SrcNumElts;
4225 }
4226
4227 // The shuffle is concatenating multiple vectors together. Just emit
4228 // a CONCAT_VECTORS operation.
4229 if (IsConcat) {
4230 SmallVector<SDValue, 8> ConcatOps;
4231 for (auto Src : ConcatSrcs) {
4232 if (Src < 0)
4233 ConcatOps.push_back(DAG.getUNDEF(SrcVT));
4234 else if (Src == 0)
4235 ConcatOps.push_back(Src1);
4236 else
4237 ConcatOps.push_back(Src2);
4238 }
4239 setValue(&I, DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, ConcatOps));
4240 return;
4241 }
4242 }
4243
4244 unsigned PaddedMaskNumElts = alignTo(MaskNumElts, SrcNumElts);
4245 unsigned NumConcat = PaddedMaskNumElts / SrcNumElts;
4246 EVT PaddedVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(),
4247 PaddedMaskNumElts);
4248
4249 // Pad both vectors with undefs to make them the same length as the mask.
4250 SDValue UndefVal = DAG.getUNDEF(SrcVT);
4251
4252 SmallVector<SDValue, 8> MOps1(NumConcat, UndefVal);
4253 SmallVector<SDValue, 8> MOps2(NumConcat, UndefVal);
4254 MOps1[0] = Src1;
4255 MOps2[0] = Src2;
4256
4257 Src1 = DAG.getNode(ISD::CONCAT_VECTORS, DL, PaddedVT, MOps1);
4258 Src2 = DAG.getNode(ISD::CONCAT_VECTORS, DL, PaddedVT, MOps2);
4259
4260 // Readjust mask for new input vector length.
4261 SmallVector<int, 8> MappedOps(PaddedMaskNumElts, -1);
4262 for (unsigned i = 0; i != MaskNumElts; ++i) {
4263 int Idx = Mask[i];
4264 if (Idx >= (int)SrcNumElts)
4265 Idx -= SrcNumElts - PaddedMaskNumElts;
4266 MappedOps[i] = Idx;
4267 }
4268
4269 SDValue Result = DAG.getVectorShuffle(PaddedVT, DL, Src1, Src2, MappedOps);
4270
4271 // If the concatenated vector was padded, extract a subvector with the
4272 // correct number of elements.
4273 if (MaskNumElts != PaddedMaskNumElts)
4274 Result = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Result,
4275 DAG.getVectorIdxConstant(0, DL));
4276
4277 setValue(&I, Result);
4278 return;
4279 }
4280
4281 assert(SrcNumElts > MaskNumElts);
4282
4283 // Analyze the access pattern of the vector to see if we can extract
4284 // two subvectors and do the shuffle.
4285 int StartIdx[2] = {-1, -1}; // StartIdx to extract from
4286 bool CanExtract = true;
4287 for (int Idx : Mask) {
4288 unsigned Input = 0;
4289 if (Idx < 0)
4290 continue;
4291
4292 if (Idx >= (int)SrcNumElts) {
4293 Input = 1;
4294 Idx -= SrcNumElts;
4295 }
4296
4297 // If all the indices come from the same MaskNumElts sized portion of
4298 // the sources we can use extract. Also make sure the extract wouldn't
4299 // extract past the end of the source.
4300 int NewStartIdx = alignDown(Idx, MaskNumElts);
4301 if (NewStartIdx + MaskNumElts > SrcNumElts ||
4302 (StartIdx[Input] >= 0 && StartIdx[Input] != NewStartIdx))
4303 CanExtract = false;
4304 // Make sure we always update StartIdx as we use it to track if all
4305 // elements are undef.
4306 StartIdx[Input] = NewStartIdx;
4307 }
4308
4309 if (StartIdx[0] < 0 && StartIdx[1] < 0) {
4310 setValue(&I, DAG.getUNDEF(VT)); // Vectors are not used.
4311 return;
4312 }
4313 if (CanExtract) {
4314 // Extract appropriate subvector and generate a vector shuffle
4315 for (unsigned Input = 0; Input < 2; ++Input) {
4316 SDValue &Src = Input == 0 ? Src1 : Src2;
4317 if (StartIdx[Input] < 0)
4318 Src = DAG.getUNDEF(VT);
4319 else {
4320 Src = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Src,
4321 DAG.getVectorIdxConstant(StartIdx[Input], DL));
4322 }
4323 }
4324
4325 // Calculate new mask.
4326 SmallVector<int, 8> MappedOps(Mask);
4327 for (int &Idx : MappedOps) {
4328 if (Idx >= (int)SrcNumElts)
4329 Idx -= SrcNumElts + StartIdx[1] - MaskNumElts;
4330 else if (Idx >= 0)
4331 Idx -= StartIdx[0];
4332 }
4333
4334 setValue(&I, DAG.getVectorShuffle(VT, DL, Src1, Src2, MappedOps));
4335 return;
4336 }
4337
4338 // We can't use either concat vectors or extract subvectors so fall back to
4339 // replacing the shuffle with extract and build vector.
4340 // to insert and build vector.
4341 EVT EltVT = VT.getVectorElementType();
4343 for (int Idx : Mask) {
4344 SDValue Res;
4345
4346 if (Idx < 0) {
4347 Res = DAG.getUNDEF(EltVT);
4348 } else {
4349 SDValue &Src = Idx < (int)SrcNumElts ? Src1 : Src2;
4350 if (Idx >= (int)SrcNumElts) Idx -= SrcNumElts;
4351
4352 Res = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Src,
4353 DAG.getVectorIdxConstant(Idx, DL));
4354 }
4355
4356 Ops.push_back(Res);
4357 }
4358
4359 setValue(&I, DAG.getBuildVector(VT, DL, Ops));
4360}
4361
4362void SelectionDAGBuilder::visitInsertValue(const InsertValueInst &I) {
4363 ArrayRef<unsigned> Indices = I.getIndices();
4364 const Value *Op0 = I.getOperand(0);
4365 const Value *Op1 = I.getOperand(1);
4366 Type *AggTy = I.getType();
4367 Type *ValTy = Op1->getType();
4368 bool IntoUndef = isa<UndefValue>(Op0);
4369 bool FromUndef = isa<UndefValue>(Op1);
4370
4371 unsigned LinearIndex = ComputeLinearIndex(AggTy, Indices);
4372
4373 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4374 SmallVector<EVT, 4> AggValueVTs;
4375 ComputeValueVTs(TLI, DAG.getDataLayout(), AggTy, AggValueVTs);
4376 SmallVector<EVT, 4> ValValueVTs;
4377 ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);
4378
4379 unsigned NumAggValues = AggValueVTs.size();
4380 unsigned NumValValues = ValValueVTs.size();
4381 SmallVector<SDValue, 4> Values(NumAggValues);
4382
4383 // Ignore an insertvalue that produces an empty object
4384 if (!NumAggValues) {
4385 setValue(&I, DAG.getUNDEF(MVT(MVT::Other)));
4386 return;
4387 }
4388
4389 SDValue Agg = getValue(Op0);
4390 unsigned i = 0;
4391 // Copy the beginning value(s) from the original aggregate.
4392 for (; i != LinearIndex; ++i)
4393 Values[i] = IntoUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4394 SDValue(Agg.getNode(), Agg.getResNo() + i);
4395 // Copy values from the inserted value(s).
4396 if (NumValValues) {
4397 SDValue Val = getValue(Op1);
4398 for (; i != LinearIndex + NumValValues; ++i)
4399 Values[i] = FromUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4400 SDValue(Val.getNode(), Val.getResNo() + i - LinearIndex);
4401 }
4402 // Copy remaining value(s) from the original aggregate.
4403 for (; i != NumAggValues; ++i)
4404 Values[i] = IntoUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4405 SDValue(Agg.getNode(), Agg.getResNo() + i);
4406
4408 DAG.getVTList(AggValueVTs), Values));
4409}
4410
4411void SelectionDAGBuilder::visitExtractValue(const ExtractValueInst &I) {
4412 ArrayRef<unsigned> Indices = I.getIndices();
4413 const Value *Op0 = I.getOperand(0);
4414 Type *AggTy = Op0->getType();
4415 Type *ValTy = I.getType();
4416 bool OutOfUndef = isa<UndefValue>(Op0);
4417
4418 unsigned LinearIndex = ComputeLinearIndex(AggTy, Indices);
4419
4420 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4421 SmallVector<EVT, 4> ValValueVTs;
4422 ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);
4423
4424 unsigned NumValValues = ValValueVTs.size();
4425
4426 // Ignore a extractvalue that produces an empty object
4427 if (!NumValValues) {
4428 setValue(&I, DAG.getUNDEF(MVT(MVT::Other)));
4429 return;
4430 }
4431
4432 SmallVector<SDValue, 4> Values(NumValValues);
4433
4434 SDValue Agg = getValue(Op0);
4435 // Copy out the selected value(s).
4436 for (unsigned i = LinearIndex; i != LinearIndex + NumValValues; ++i)
4437 Values[i - LinearIndex] =
4438 OutOfUndef ?
4439 DAG.getUNDEF(Agg.getNode()->getValueType(Agg.getResNo() + i)) :
4440 SDValue(Agg.getNode(), Agg.getResNo() + i);
4441
4443 DAG.getVTList(ValValueVTs), Values));
4444}
4445
4446void SelectionDAGBuilder::visitGetElementPtr(const User &I) {
4447 Value *Op0 = I.getOperand(0);
4448 // Note that the pointer operand may be a vector of pointers. Take the scalar
4449 // element which holds a pointer.
4450 unsigned AS = Op0->getType()->getScalarType()->getPointerAddressSpace();
4451 SDValue N = getValue(Op0);
4452 SDLoc dl = getCurSDLoc();
4453 auto &TLI = DAG.getTargetLoweringInfo();
4454 GEPNoWrapFlags NW = cast<GEPOperator>(I).getNoWrapFlags();
4455
4456 // For a vector GEP, keep the prefix scalar as long as possible, then
4457 // convert any scalars encountered after the first vector operand to vectors.
4458 bool IsVectorGEP = I.getType()->isVectorTy();
4459 ElementCount VectorElementCount =
4460 IsVectorGEP ? cast<VectorType>(I.getType())->getElementCount()
4462
4464 GTI != E; ++GTI) {
4465 const Value *Idx = GTI.getOperand();
4466 if (StructType *StTy = GTI.getStructTypeOrNull()) {
4467 unsigned Field = cast<Constant>(Idx)->getUniqueInteger().getZExtValue();
4468 if (Field) {
4469 // N = N + Offset
4470 uint64_t Offset =
4471 DAG.getDataLayout().getStructLayout(StTy)->getElementOffset(Field);
4472
4473 // In an inbounds GEP with an offset that is nonnegative even when
4474 // interpreted as signed, assume there is no unsigned overflow.
4475 SDNodeFlags Flags;
4476 if (NW.hasNoUnsignedWrap() ||
4477 (int64_t(Offset) >= 0 && NW.hasNoUnsignedSignedWrap()))
4479 Flags.setInBounds(NW.isInBounds());
4480
4481 N = DAG.getMemBasePlusOffset(
4482 N, DAG.getConstant(Offset, dl, N.getValueType()), dl, Flags);
4483 }
4484 } else {
4485 // IdxSize is the width of the arithmetic according to IR semantics.
4486 // In SelectionDAG, we may prefer to do arithmetic in a wider bitwidth
4487 // (and fix up the result later).
4488 unsigned IdxSize = DAG.getDataLayout().getIndexSizeInBits(AS);
4489 MVT IdxTy = MVT::getIntegerVT(IdxSize);
4490 TypeSize ElementSize =
4491 GTI.getSequentialElementStride(DAG.getDataLayout());
4492 // We intentionally mask away the high bits here; ElementSize may not
4493 // fit in IdxTy.
4494 APInt ElementMul(IdxSize, ElementSize.getKnownMinValue(),
4495 /*isSigned=*/false, /*implicitTrunc=*/true);
4496 bool ElementScalable = ElementSize.isScalable();
4497
4498 // If this is a scalar constant or a splat vector of constants,
4499 // handle it quickly.
4500 const auto *C = dyn_cast<Constant>(Idx);
4501 if (C && isa<VectorType>(C->getType()))
4502 C = C->getSplatValue();
4503
4504 const auto *CI = dyn_cast_or_null<ConstantInt>(C);
4505 if (CI && CI->isZero())
4506 continue;
4507 if (CI && !ElementScalable) {
4508 APInt Offs = ElementMul * CI->getValue().sextOrTrunc(IdxSize);
4509 LLVMContext &Context = *DAG.getContext();
4510 SDValue OffsVal;
4511 if (N.getValueType().isVector())
4512 OffsVal = DAG.getConstant(
4513 Offs, dl, EVT::getVectorVT(Context, IdxTy, VectorElementCount));
4514 else
4515 OffsVal = DAG.getConstant(Offs, dl, IdxTy);
4516
4517 // In an inbounds GEP with an offset that is nonnegative even when
4518 // interpreted as signed, assume there is no unsigned overflow.
4519 SDNodeFlags Flags;
4520 if (NW.hasNoUnsignedWrap() ||
4521 (Offs.isNonNegative() && NW.hasNoUnsignedSignedWrap()))
4522 Flags.setNoUnsignedWrap(true);
4523 Flags.setInBounds(NW.isInBounds());
4524
4525 OffsVal = DAG.getSExtOrTrunc(OffsVal, dl, N.getValueType());
4526
4527 N = DAG.getMemBasePlusOffset(N, OffsVal, dl, Flags);
4528 continue;
4529 }
4530
4531 // N = N + Idx * ElementMul;
4532 SDValue IdxN = getValue(Idx);
4533
4534 if (IdxN.getValueType().isVector() != N.getValueType().isVector()) {
4535 if (N.getValueType().isVector()) {
4536 EVT VT = EVT::getVectorVT(*Context, IdxN.getValueType(),
4537 VectorElementCount);
4538 IdxN = DAG.getSplat(VT, dl, IdxN);
4539 } else {
4540 EVT VT =
4541 EVT::getVectorVT(*Context, N.getValueType(), VectorElementCount);
4542 N = DAG.getSplat(VT, dl, N);
4543 }
4544 }
4545
4546 // If the index is smaller or larger than intptr_t, truncate or extend
4547 // it.
4548 IdxN = DAG.getSExtOrTrunc(IdxN, dl, N.getValueType());
4549
4550 SDNodeFlags ScaleFlags;
4551 // The multiplication of an index by the type size does not wrap the
4552 // pointer index type in a signed sense (mul nsw).
4554
4555 // The multiplication of an index by the type size does not wrap the
4556 // pointer index type in an unsigned sense (mul nuw).
4557 ScaleFlags.setNoUnsignedWrap(NW.hasNoUnsignedWrap());
4558
4559 if (ElementScalable) {
4560 EVT VScaleTy = N.getValueType().getScalarType();
4561 SDValue VScale = DAG.getNode(
4562 ISD::VSCALE, dl, VScaleTy,
4563 DAG.getConstant(ElementMul.getZExtValue(), dl, VScaleTy));
4564 if (N.getValueType().isVector())
4565 VScale = DAG.getSplatVector(N.getValueType(), dl, VScale);
4566 IdxN = DAG.getNode(ISD::MUL, dl, N.getValueType(), IdxN, VScale,
4567 ScaleFlags);
4568 } else {
4569 // If this is a multiply by a power of two, turn it into a shl
4570 // immediately. This is a very common case.
4571 if (ElementMul != 1) {
4572 if (ElementMul.isPowerOf2()) {
4573 unsigned Amt = ElementMul.logBase2();
4574 IdxN = DAG.getNode(
4575 ISD::SHL, dl, N.getValueType(), IdxN,
4576 DAG.getShiftAmountConstant(Amt, N.getValueType(), dl),
4577 ScaleFlags);
4578 } else {
4579 SDValue Scale = DAG.getConstant(ElementMul.getZExtValue(), dl,
4580 IdxN.getValueType());
4581 IdxN = DAG.getNode(ISD::MUL, dl, N.getValueType(), IdxN, Scale,
4582 ScaleFlags);
4583 }
4584 }
4585 }
4586
4587 // The successive addition of the current address, truncated to the
4588 // pointer index type and interpreted as an unsigned number, and each
4589 // offset, also interpreted as an unsigned number, does not wrap the
4590 // pointer index type (add nuw).
4591 SDNodeFlags AddFlags;
4592 AddFlags.setNoUnsignedWrap(NW.hasNoUnsignedWrap());
4593 AddFlags.setInBounds(NW.isInBounds());
4594
4595 N = DAG.getMemBasePlusOffset(N, IdxN, dl, AddFlags);
4596 }
4597 }
4598
4599 if (IsVectorGEP && !N.getValueType().isVector()) {
4600 EVT VT = EVT::getVectorVT(*Context, N.getValueType(), VectorElementCount);
4601 N = DAG.getSplat(VT, dl, N);
4602 }
4603
4604 MVT PtrTy = TLI.getPointerTy(DAG.getDataLayout(), AS);
4605 MVT PtrMemTy = TLI.getPointerMemTy(DAG.getDataLayout(), AS);
4606 if (IsVectorGEP) {
4607 PtrTy = MVT::getVectorVT(PtrTy, VectorElementCount);
4608 PtrMemTy = MVT::getVectorVT(PtrMemTy, VectorElementCount);
4609 }
4610
4611 if (PtrMemTy != PtrTy && !cast<GEPOperator>(I).isInBounds())
4612 N = DAG.getPtrExtendInReg(N, dl, PtrMemTy);
4613
4614 setValue(&I, N);
4615}
4616
4617void SelectionDAGBuilder::visitAlloca(const AllocaInst &I) {
4618 // If this is a fixed sized alloca in the entry block of the function,
4619 // allocate it statically on the stack.
4620 if (FuncInfo.StaticAllocaMap.count(&I))
4621 return; // getValue will auto-populate this.
4622
4623 SDLoc dl = getCurSDLoc();
4624 Type *Ty = I.getAllocatedType();
4625 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4626 auto &DL = DAG.getDataLayout();
4627 TypeSize TySize = DL.getTypeAllocSize(Ty);
4628 MaybeAlign Alignment = I.getAlign();
4629
4630 SDValue AllocSize = getValue(I.getArraySize());
4631
4632 EVT IntPtr = TLI.getPointerTy(DL, I.getAddressSpace());
4633 if (AllocSize.getValueType() != IntPtr)
4634 AllocSize = DAG.getZExtOrTrunc(AllocSize, dl, IntPtr);
4635
4636 AllocSize = DAG.getNode(
4637 ISD::MUL, dl, IntPtr, AllocSize,
4638 DAG.getZExtOrTrunc(DAG.getTypeSize(dl, MVT::i64, TySize), dl, IntPtr));
4639
4640 // Handle alignment. If the requested alignment is less than or equal to
4641 // the stack alignment, ignore it. If the size is greater than or equal to
4642 // the stack alignment, we note this in the DYNAMIC_STACKALLOC node.
4643 Align StackAlign = DAG.getSubtarget().getFrameLowering()->getStackAlign();
4644 if (*Alignment <= StackAlign)
4645 Alignment = std::nullopt;
4646
4647 const uint64_t StackAlignMask = StackAlign.value() - 1U;
4648 // Round the size of the allocation up to the stack alignment size
4649 // by add SA-1 to the size. This doesn't overflow because we're computing
4650 // an address inside an alloca.
4651 AllocSize = DAG.getNode(ISD::ADD, dl, AllocSize.getValueType(), AllocSize,
4652 DAG.getConstant(StackAlignMask, dl, IntPtr),
4654
4655 // Mask out the low bits for alignment purposes.
4656 AllocSize = DAG.getNode(ISD::AND, dl, AllocSize.getValueType(), AllocSize,
4657 DAG.getSignedConstant(~StackAlignMask, dl, IntPtr));
4658
4659 SDValue Ops[] = {
4660 getRoot(), AllocSize,
4661 DAG.getConstant(Alignment ? Alignment->value() : 0, dl, IntPtr)};
4662 SDVTList VTs = DAG.getVTList(AllocSize.getValueType(), MVT::Other);
4663 SDValue DSA = DAG.getNode(ISD::DYNAMIC_STACKALLOC, dl, VTs, Ops);
4664 setValue(&I, DSA);
4665 DAG.setRoot(DSA.getValue(1));
4666
4667 assert(FuncInfo.MF->getFrameInfo().hasVarSizedObjects());
4668}
4669
4670static const MDNode *getRangeMetadata(const Instruction &I) {
4671 return I.getMetadata(LLVMContext::MD_range);
4672}
4673
4674static std::optional<ConstantRange> getRange(const Instruction &I) {
4675 if (const auto *CB = dyn_cast<CallBase>(&I))
4676 if (std::optional<ConstantRange> CR = CB->getRange())
4677 return CR;
4678 if (const MDNode *Range = getRangeMetadata(I))
4680 return std::nullopt;
4681}
4682
4684 if (const auto *CB = dyn_cast<CallBase>(&I))
4685 return CB->getRetNoFPClass();
4686 return fcNone;
4687}
4688
4689void SelectionDAGBuilder::visitLoad(const LoadInst &I) {
4690 if (I.isAtomic())
4691 return visitAtomicLoad(I);
4692
4693 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4694 const Value *SV = I.getOperand(0);
4695 if (TLI.supportSwiftError()) {
4696 // Swifterror values can come from either a function parameter with
4697 // swifterror attribute or an alloca with swifterror attribute.
4698 if (const Argument *Arg = dyn_cast<Argument>(SV)) {
4699 if (Arg->hasSwiftErrorAttr())
4700 return visitLoadFromSwiftError(I);
4701 }
4702
4703 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(SV)) {
4704 if (Alloca->isSwiftError())
4705 return visitLoadFromSwiftError(I);
4706 }
4707 }
4708
4709 SDValue Ptr = getValue(SV);
4710
4711 Type *Ty = I.getType();
4712 SmallVector<EVT, 4> ValueVTs, MemVTs;
4714 ComputeValueVTs(TLI, DAG.getDataLayout(), Ty, ValueVTs, &MemVTs, &Offsets);
4715 unsigned NumValues = ValueVTs.size();
4716 if (NumValues == 0)
4717 return;
4718
4719 Align Alignment = I.getAlign();
4720 AAMDNodes AAInfo = I.getAAMetadata();
4721 const MDNode *Ranges = getRangeMetadata(I);
4722 bool isVolatile = I.isVolatile();
4723 MachineMemOperand::Flags MMOFlags =
4724 TLI.getLoadMemOperandFlags(I, DAG.getDataLayout(), AC, LibInfo);
4725
4726 SDValue Root;
4727 bool ConstantMemory = false;
4728 if (isVolatile)
4729 // Serialize volatile loads with other side effects.
4730 Root = getRoot();
4731 else if (NumValues > MaxParallelChains)
4732 Root = getMemoryRoot();
4733 else if (BatchAA &&
4734 BatchAA->pointsToConstantMemory(MemoryLocation(
4735 SV,
4736 LocationSize::precise(DAG.getDataLayout().getTypeStoreSize(Ty)),
4737 AAInfo))) {
4738 // Do not serialize (non-volatile) loads of constant memory with anything.
4739 Root = DAG.getEntryNode();
4740 ConstantMemory = true;
4742 } else {
4743 // Do not serialize non-volatile loads against each other.
4744 Root = DAG.getRoot();
4745 }
4746
4747 SDLoc dl = getCurSDLoc();
4748
4749 if (isVolatile)
4750 Root = TLI.prepareVolatileOrAtomicLoad(Root, dl, DAG);
4751
4752 SmallVector<SDValue, 4> Values(NumValues);
4753 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4754
4755 unsigned ChainI = 0;
4756 for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
4757 // Serializing loads here may result in excessive register pressure, and
4758 // TokenFactor places arbitrary choke points on the scheduler. SD scheduling
4759 // could recover a bit by hoisting nodes upward in the chain by recognizing
4760 // they are side-effect free or do not alias. The optimizer should really
4761 // avoid this case by converting large object/array copies to llvm.memcpy
4762 // (MaxParallelChains should always remain as failsafe).
4763 if (ChainI == MaxParallelChains) {
4764 assert(PendingLoads.empty() && "PendingLoads must be serialized first");
4765 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4766 ArrayRef(Chains.data(), ChainI));
4767 Root = Chain;
4768 ChainI = 0;
4769 }
4770
4771 // TODO: MachinePointerInfo only supports a fixed length offset.
4772 MachinePointerInfo PtrInfo =
4773 !Offsets[i].isScalable() || Offsets[i].isZero()
4774 ? MachinePointerInfo(SV, Offsets[i].getKnownMinValue())
4775 : MachinePointerInfo();
4776
4777 SDValue A = DAG.getObjectPtrOffset(dl, Ptr, Offsets[i]);
4778 SDValue L = DAG.getLoad(MemVTs[i], dl, Root, A, PtrInfo, Alignment,
4779 MMOFlags, AAInfo, Ranges);
4780 Chains[ChainI] = L.getValue(1);
4781
4782 if (MemVTs[i] != ValueVTs[i])
4783 L = DAG.getPtrExtOrTrunc(L, dl, ValueVTs[i]);
4784
4785 if (MDNode *NoFPClassMD = I.getMetadata(LLVMContext::MD_nofpclass)) {
4786 uint64_t FPTestInt =
4787 cast<ConstantInt>(
4788 cast<ConstantAsMetadata>(NoFPClassMD->getOperand(0))->getValue())
4789 ->getZExtValue();
4790 if (FPTestInt != fcNone) {
4791 SDValue FPTestConst =
4792 DAG.getTargetConstant(FPTestInt, SDLoc(), MVT::i32);
4793 L = DAG.getNode(ISD::AssertNoFPClass, dl, L.getValueType(), L,
4794 FPTestConst);
4795 }
4796 }
4797 Values[i] = L;
4798 }
4799
4800 if (!ConstantMemory) {
4801 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4802 ArrayRef(Chains.data(), ChainI));
4803 if (isVolatile)
4804 DAG.setRoot(Chain);
4805 else
4806 PendingLoads.push_back(Chain);
4807 }
4808
4809 setValue(&I, DAG.getNode(ISD::MERGE_VALUES, dl,
4810 DAG.getVTList(ValueVTs), Values));
4811}
4812
4813void SelectionDAGBuilder::visitStoreToSwiftError(const StoreInst &I) {
4814 assert(DAG.getTargetLoweringInfo().supportSwiftError() &&
4815 "call visitStoreToSwiftError when backend supports swifterror");
4816
4817 SmallVector<EVT, 4> ValueVTs;
4818 SmallVector<uint64_t, 4> Offsets;
4819 const Value *SrcV = I.getOperand(0);
4820 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(),
4821 SrcV->getType(), ValueVTs, /*MemVTs=*/nullptr, &Offsets, 0);
4822 assert(ValueVTs.size() == 1 && Offsets[0] == 0 &&
4823 "expect a single EVT for swifterror");
4824
4825 SDValue Src = getValue(SrcV);
4826 // Create a virtual register, then update the virtual register.
4827 Register VReg =
4828 SwiftError.getOrCreateVRegDefAt(&I, FuncInfo.MBB, I.getPointerOperand());
4829 // Chain, DL, Reg, N or Chain, DL, Reg, N, Glue
4830 // Chain can be getRoot or getControlRoot.
4831 SDValue CopyNode = DAG.getCopyToReg(getRoot(), getCurSDLoc(), VReg,
4832 SDValue(Src.getNode(), Src.getResNo()));
4833 DAG.setRoot(CopyNode);
4834}
4835
4836void SelectionDAGBuilder::visitLoadFromSwiftError(const LoadInst &I) {
4837 assert(DAG.getTargetLoweringInfo().supportSwiftError() &&
4838 "call visitLoadFromSwiftError when backend supports swifterror");
4839
4840 assert(!I.isVolatile() &&
4841 !I.hasMetadata(LLVMContext::MD_nontemporal) &&
4842 !I.hasMetadata(LLVMContext::MD_invariant_load) &&
4843 "Support volatile, non temporal, invariant for load_from_swift_error");
4844
4845 const Value *SV = I.getOperand(0);
4846 Type *Ty = I.getType();
4847 assert(
4848 (!BatchAA ||
4849 !BatchAA->pointsToConstantMemory(MemoryLocation(
4850 SV, LocationSize::precise(DAG.getDataLayout().getTypeStoreSize(Ty)),
4851 I.getAAMetadata()))) &&
4852 "load_from_swift_error should not be constant memory");
4853
4854 SmallVector<EVT, 4> ValueVTs;
4855 SmallVector<uint64_t, 4> Offsets;
4856 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), Ty,
4857 ValueVTs, /*MemVTs=*/nullptr, &Offsets, 0);
4858 assert(ValueVTs.size() == 1 && Offsets[0] == 0 &&
4859 "expect a single EVT for swifterror");
4860
4861 // Chain, DL, Reg, VT, Glue or Chain, DL, Reg, VT
4862 SDValue L = DAG.getCopyFromReg(
4863 getRoot(), getCurSDLoc(),
4864 SwiftError.getOrCreateVRegUseAt(&I, FuncInfo.MBB, SV), ValueVTs[0]);
4865
4866 setValue(&I, L);
4867}
4868
4869void SelectionDAGBuilder::visitStore(const StoreInst &I) {
4870 if (I.isAtomic())
4871 return visitAtomicStore(I);
4872
4873 const Value *SrcV = I.getOperand(0);
4874 const Value *PtrV = I.getOperand(1);
4875
4876 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4877 if (TLI.supportSwiftError()) {
4878 // Swifterror values can come from either a function parameter with
4879 // swifterror attribute or an alloca with swifterror attribute.
4880 if (const Argument *Arg = dyn_cast<Argument>(PtrV)) {
4881 if (Arg->hasSwiftErrorAttr())
4882 return visitStoreToSwiftError(I);
4883 }
4884
4885 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(PtrV)) {
4886 if (Alloca->isSwiftError())
4887 return visitStoreToSwiftError(I);
4888 }
4889 }
4890
4891 SmallVector<EVT, 4> ValueVTs, MemVTs;
4893 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(),
4894 SrcV->getType(), ValueVTs, &MemVTs, &Offsets);
4895 unsigned NumValues = ValueVTs.size();
4896 if (NumValues == 0)
4897 return;
4898
4899 // Get the lowered operands. Note that we do this after
4900 // checking if NumResults is zero, because with zero results
4901 // the operands won't have values in the map.
4902 SDValue Src = getValue(SrcV);
4903 SDValue Ptr = getValue(PtrV);
4904
4905 SDValue Root = I.isVolatile() ? getRoot() : getMemoryRoot();
4906 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4907 SDLoc dl = getCurSDLoc();
4908 Align Alignment = I.getAlign();
4909 AAMDNodes AAInfo = I.getAAMetadata();
4910
4911 auto MMOFlags = TLI.getStoreMemOperandFlags(I, DAG.getDataLayout());
4912
4913 unsigned ChainI = 0;
4914 for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
4915 // See visitLoad comments.
4916 if (ChainI == MaxParallelChains) {
4917 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4918 ArrayRef(Chains.data(), ChainI));
4919 Root = Chain;
4920 ChainI = 0;
4921 }
4922
4923 // TODO: MachinePointerInfo only supports a fixed length offset.
4924 MachinePointerInfo PtrInfo =
4925 !Offsets[i].isScalable() || Offsets[i].isZero()
4926 ? MachinePointerInfo(PtrV, Offsets[i].getKnownMinValue())
4927 : MachinePointerInfo();
4928
4929 SDValue Add = DAG.getObjectPtrOffset(dl, Ptr, Offsets[i]);
4930 SDValue Val = SDValue(Src.getNode(), Src.getResNo() + i);
4931 if (MemVTs[i] != ValueVTs[i])
4932 Val = DAG.getPtrExtOrTrunc(Val, dl, MemVTs[i]);
4933 SDValue St =
4934 DAG.getStore(Root, dl, Val, Add, PtrInfo, Alignment, MMOFlags, AAInfo);
4935 Chains[ChainI] = St;
4936 }
4937
4938 SDValue StoreNode = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4939 ArrayRef(Chains.data(), ChainI));
4940 setValue(&I, StoreNode);
4941 DAG.setRoot(StoreNode);
4942}
4943
4944void SelectionDAGBuilder::visitMaskedStore(const CallInst &I,
4945 bool IsCompressing) {
4946 SDLoc sdl = getCurSDLoc();
4947
4948 Value *Src0Operand = I.getArgOperand(0);
4949 Value *PtrOperand = I.getArgOperand(1);
4950 Value *MaskOperand = I.getArgOperand(2);
4951 Align Alignment = I.getParamAlign(1).valueOrOne();
4952
4953 SDValue Ptr = getValue(PtrOperand);
4954 SDValue Src0 = getValue(Src0Operand);
4955 SDValue Mask = getValue(MaskOperand);
4956 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
4957
4958 EVT VT = Src0.getValueType();
4959
4960 auto MMOFlags = MachineMemOperand::MOStore;
4961 if (I.hasMetadata(LLVMContext::MD_nontemporal))
4963
4964 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
4965 MachinePointerInfo(PtrOperand), MMOFlags,
4966 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata());
4967
4968 const auto &TLI = DAG.getTargetLoweringInfo();
4969
4970 SDValue StoreNode =
4971 !IsCompressing && TTI->hasConditionalLoadStoreForType(
4972 I.getArgOperand(0)->getType(), /*IsStore=*/true)
4973 ? TLI.visitMaskedStore(DAG, sdl, getMemoryRoot(), MMO, Ptr, Src0,
4974 Mask)
4975 : DAG.getMaskedStore(getMemoryRoot(), sdl, Src0, Ptr, Offset, Mask,
4976 VT, MMO, ISD::UNINDEXED, /*Truncating=*/false,
4977 IsCompressing);
4978 DAG.setRoot(StoreNode);
4979 setValue(&I, StoreNode);
4980}
4981
4982// Get a uniform base for the Gather/Scatter intrinsic.
4983// The first argument of the Gather/Scatter intrinsic is a vector of pointers.
4984// We try to represent it as a base pointer + vector of indices.
4985// Usually, the vector of pointers comes from a 'getelementptr' instruction.
4986// The first operand of the GEP may be a single pointer or a vector of pointers
4987// Example:
4988// %gep.ptr = getelementptr i32, <8 x i32*> %vptr, <8 x i32> %ind
4989// or
4990// %gep.ptr = getelementptr i32, i32* %ptr, <8 x i32> %ind
4991// %res = call <8 x i32> @llvm.masked.gather.v8i32(<8 x i32*> %gep.ptr, ..
4992//
4993// When the first GEP operand is a single pointer - it is the uniform base we
4994// are looking for. If first operand of the GEP is a splat vector - we
4995// extract the splat value and use it as a uniform base.
4996// In all other cases the function returns 'false'.
4997static bool getUniformBase(const Value *Ptr, SDValue &Base, SDValue &Index,
4998 SDValue &Scale, SelectionDAGBuilder *SDB,
4999 const BasicBlock *CurBB, uint64_t ElemSize) {
5000 SelectionDAG& DAG = SDB->DAG;
5001 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5002 const DataLayout &DL = DAG.getDataLayout();
5003
5004 assert(Ptr->getType()->isVectorTy() && "Unexpected pointer type");
5005
5006 // Handle splat constant pointer.
5007 if (auto *C = dyn_cast<Constant>(Ptr)) {
5008 C = C->getSplatValue();
5009 if (!C)
5010 return false;
5011
5012 Base = SDB->getValue(C);
5013
5014 ElementCount NumElts = cast<VectorType>(Ptr->getType())->getElementCount();
5015 EVT VT = EVT::getVectorVT(*DAG.getContext(), TLI.getPointerTy(DL), NumElts);
5016 Index = DAG.getConstant(0, SDB->getCurSDLoc(), VT);
5017 Scale = DAG.getTargetConstant(1, SDB->getCurSDLoc(), TLI.getPointerTy(DL));
5018 return true;
5019 }
5020
5022 if (!GEP || GEP->getParent() != CurBB)
5023 return false;
5024
5025 if (GEP->getNumOperands() != 2)
5026 return false;
5027
5028 const Value *BasePtr = GEP->getPointerOperand();
5029 const Value *IndexVal = GEP->getOperand(GEP->getNumOperands() - 1);
5030
5031 // Make sure the base is scalar and the index is a vector.
5032 if (BasePtr->getType()->isVectorTy() || !IndexVal->getType()->isVectorTy())
5033 return false;
5034
5035 TypeSize ScaleVal = DL.getTypeAllocSize(GEP->getResultElementType());
5036 if (ScaleVal.isScalable())
5037 return false;
5038
5039 // Target may not support the required addressing mode.
5040 if (ScaleVal != 1 &&
5041 !TLI.isLegalScaleForGatherScatter(ScaleVal.getFixedValue(), ElemSize))
5042 return false;
5043
5044 Base = SDB->getValue(BasePtr);
5045 Index = SDB->getValue(IndexVal);
5046
5047 Scale =
5048 DAG.getTargetConstant(ScaleVal, SDB->getCurSDLoc(), TLI.getPointerTy(DL));
5049 return true;
5050}
5051
5052void SelectionDAGBuilder::visitMaskedScatter(const CallInst &I) {
5053 SDLoc sdl = getCurSDLoc();
5054
5055 // llvm.masked.scatter.*(Src0, Ptrs, Mask)
5056 const Value *Ptr = I.getArgOperand(1);
5057 SDValue Src0 = getValue(I.getArgOperand(0));
5058 SDValue Mask = getValue(I.getArgOperand(2));
5059 EVT VT = Src0.getValueType();
5060 Align Alignment = I.getParamAlign(1).valueOrOne();
5061 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5062
5063 SDValue Base;
5064 SDValue Index;
5065 SDValue Scale;
5066 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
5067 I.getParent(), VT.getScalarStoreSize());
5068
5069 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
5070 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5071 MachinePointerInfo(AS), MachineMemOperand::MOStore,
5072 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata());
5073 if (!UniformBase) {
5074 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5075 Index = getValue(Ptr);
5076 Scale =
5077 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5078 }
5079
5080 EVT IdxVT = Index.getValueType();
5081 EVT EltTy = IdxVT.getVectorElementType();
5082 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
5083 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
5084 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
5085 }
5086
5087 SDValue Ops[] = { getMemoryRoot(), Src0, Mask, Base, Index, Scale };
5088 SDValue Scatter = DAG.getMaskedScatter(DAG.getVTList(MVT::Other), VT, sdl,
5089 Ops, MMO, ISD::SIGNED_SCALED, false);
5090 DAG.setRoot(Scatter);
5091 setValue(&I, Scatter);
5092}
5093
5094void SelectionDAGBuilder::visitMaskedLoad(const CallInst &I, bool IsExpanding) {
5095 SDLoc sdl = getCurSDLoc();
5096
5097 Value *PtrOperand = I.getArgOperand(0);
5098 Value *MaskOperand = I.getArgOperand(1);
5099 Value *Src0Operand = I.getArgOperand(2);
5100 Align Alignment = I.getParamAlign(0).valueOrOne();
5101
5102 SDValue Ptr = getValue(PtrOperand);
5103 SDValue Src0 = getValue(Src0Operand);
5104 SDValue Mask = getValue(MaskOperand);
5105 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
5106
5107 EVT VT = Src0.getValueType();
5108 AAMDNodes AAInfo = I.getAAMetadata();
5109 const MDNode *Ranges = getRangeMetadata(I);
5110
5111 // Do not serialize masked loads of constant memory with anything.
5112 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
5113 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
5114
5115 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
5116
5117 auto MMOFlags = MachineMemOperand::MOLoad;
5118 if (I.hasMetadata(LLVMContext::MD_nontemporal))
5120 if (I.hasMetadata(LLVMContext::MD_invariant_load))
5122
5123 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5124 MachinePointerInfo(PtrOperand), MMOFlags,
5125 VT.getStoreSize(), Alignment, AAInfo, Ranges);
5126
5127 const auto &TLI = DAG.getTargetLoweringInfo();
5128
5129 // The Load/Res may point to different values and both of them are output
5130 // variables.
5131 SDValue Load;
5132 SDValue Res;
5133 if (!IsExpanding &&
5134 TTI->hasConditionalLoadStoreForType(Src0Operand->getType(),
5135 /*IsStore=*/false))
5136 Res = TLI.visitMaskedLoad(DAG, sdl, InChain, MMO, Load, Ptr, Src0, Mask);
5137 else
5138 Res = Load =
5139 DAG.getMaskedLoad(VT, sdl, InChain, Ptr, Offset, Mask, Src0, VT, MMO,
5140 ISD::UNINDEXED, ISD::NON_EXTLOAD, IsExpanding);
5141 if (AddToChain)
5142 PendingLoads.push_back(Load.getValue(1));
5143 setValue(&I, Res);
5144}
5145
5146void SelectionDAGBuilder::visitMaskedGather(const CallInst &I) {
5147 SDLoc sdl = getCurSDLoc();
5148
5149 // @llvm.masked.gather.*(Ptrs, Mask, Src0)
5150 const Value *Ptr = I.getArgOperand(0);
5151 SDValue Src0 = getValue(I.getArgOperand(2));
5152 SDValue Mask = getValue(I.getArgOperand(1));
5153
5154 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5155 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
5156 Align Alignment = I.getParamAlign(0).valueOrOne();
5157
5158 const MDNode *Ranges = getRangeMetadata(I);
5159
5160 SDValue Root = DAG.getRoot();
5161 SDValue Base;
5162 SDValue Index;
5163 SDValue Scale;
5164 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
5165 I.getParent(), VT.getScalarStoreSize());
5166 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
5167 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5168 MachinePointerInfo(AS), MachineMemOperand::MOLoad,
5169 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata(),
5170 Ranges);
5171
5172 if (!UniformBase) {
5173 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5174 Index = getValue(Ptr);
5175 Scale =
5176 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5177 }
5178
5179 EVT IdxVT = Index.getValueType();
5180 EVT EltTy = IdxVT.getVectorElementType();
5181 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
5182 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
5183 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
5184 }
5185
5186 SDValue Ops[] = { Root, Src0, Mask, Base, Index, Scale };
5187 SDValue Gather =
5188 DAG.getMaskedGather(DAG.getVTList(VT, MVT::Other), VT, sdl, Ops, MMO,
5190
5191 PendingLoads.push_back(Gather.getValue(1));
5192 setValue(&I, Gather);
5193}
5194
5195void SelectionDAGBuilder::visitAtomicCmpXchg(const AtomicCmpXchgInst &I) {
5196 SDLoc dl = getCurSDLoc();
5197 AtomicOrdering SuccessOrdering = I.getSuccessOrdering();
5198 AtomicOrdering FailureOrdering = I.getFailureOrdering();
5199 SyncScope::ID SSID = I.getSyncScopeID();
5200
5201 SDValue InChain = getRoot();
5202
5203 MVT MemVT = getValue(I.getCompareOperand()).getSimpleValueType();
5204 SDVTList VTs = DAG.getVTList(MemVT, MVT::i1, MVT::Other);
5205
5206 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5207 auto Flags = TLI.getAtomicMemOperandFlags(I, DAG.getDataLayout());
5208
5209 MachineFunction &MF = DAG.getMachineFunction();
5210 MachineMemOperand *MMO = MF.getMachineMemOperand(
5211 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5212 DAG.getEVTAlign(MemVT), AAMDNodes(), nullptr, SSID, SuccessOrdering,
5213 FailureOrdering);
5214
5216 dl, MemVT, VTs, InChain,
5217 getValue(I.getPointerOperand()),
5218 getValue(I.getCompareOperand()),
5219 getValue(I.getNewValOperand()), MMO);
5220
5221 SDValue OutChain = L.getValue(2);
5222
5223 setValue(&I, L);
5224 DAG.setRoot(OutChain);
5225}
5226
5227void SelectionDAGBuilder::visitAtomicRMW(const AtomicRMWInst &I) {
5228 SDLoc dl = getCurSDLoc();
5230 switch (I.getOperation()) {
5231 default: llvm_unreachable("Unknown atomicrmw operation");
5249 break;
5252 break;
5255 break;
5258 break;
5261 break;
5264 break;
5267 break;
5270 break;
5271 }
5272 AtomicOrdering Ordering = I.getOrdering();
5273 SyncScope::ID SSID = I.getSyncScopeID();
5274
5275 SDValue InChain = getRoot();
5276
5277 auto MemVT = getValue(I.getValOperand()).getSimpleValueType();
5278 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5279 auto Flags = TLI.getAtomicMemOperandFlags(I, DAG.getDataLayout());
5280
5281 MachineFunction &MF = DAG.getMachineFunction();
5282 MachineMemOperand *MMO = MF.getMachineMemOperand(
5283 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5284 DAG.getEVTAlign(MemVT), AAMDNodes(), nullptr, SSID, Ordering);
5285
5286 SDValue L =
5287 DAG.getAtomic(NT, dl, MemVT, InChain,
5288 getValue(I.getPointerOperand()), getValue(I.getValOperand()),
5289 MMO);
5290
5291 SDValue OutChain = L.getValue(1);
5292
5293 setValue(&I, L);
5294 DAG.setRoot(OutChain);
5295}
5296
5297void SelectionDAGBuilder::visitFence(const FenceInst &I) {
5298 SDLoc dl = getCurSDLoc();
5299 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5300 SDValue Ops[3];
5301 Ops[0] = getRoot();
5302 Ops[1] = DAG.getTargetConstant((unsigned)I.getOrdering(), dl,
5303 TLI.getFenceOperandTy(DAG.getDataLayout()));
5304 Ops[2] = DAG.getTargetConstant(I.getSyncScopeID(), dl,
5305 TLI.getFenceOperandTy(DAG.getDataLayout()));
5306 SDValue N = DAG.getNode(ISD::ATOMIC_FENCE, dl, MVT::Other, Ops);
5307 setValue(&I, N);
5308 DAG.setRoot(N);
5309}
5310
5311void SelectionDAGBuilder::visitAtomicLoad(const LoadInst &I) {
5312 SDLoc dl = getCurSDLoc();
5313 AtomicOrdering Order = I.getOrdering();
5314 SyncScope::ID SSID = I.getSyncScopeID();
5315
5316 SDValue InChain = getRoot();
5317
5318 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5319 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
5320 EVT MemVT = TLI.getMemValueType(DAG.getDataLayout(), I.getType());
5321
5322 if (!TLI.supportsUnalignedAtomics() &&
5323 I.getAlign().value() < MemVT.getSizeInBits() / 8)
5324 report_fatal_error("Cannot generate unaligned atomic load");
5325
5326 auto Flags = TLI.getLoadMemOperandFlags(I, DAG.getDataLayout(), AC, LibInfo);
5327
5328 const MDNode *Ranges = getRangeMetadata(I);
5329 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5330 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5331 I.getAlign(), AAMDNodes(), Ranges, SSID, Order);
5332
5333 InChain = TLI.prepareVolatileOrAtomicLoad(InChain, dl, DAG);
5334
5335 SDValue Ptr = getValue(I.getPointerOperand());
5336 SDValue L =
5337 DAG.getAtomicLoad(ISD::NON_EXTLOAD, dl, MemVT, MemVT, InChain, Ptr, MMO);
5338
5339 SDValue OutChain = L.getValue(1);
5340 if (MemVT != VT)
5341 L = DAG.getPtrExtOrTrunc(L, dl, VT);
5342
5343 setValue(&I, L);
5344 DAG.setRoot(OutChain);
5345}
5346
5347void SelectionDAGBuilder::visitAtomicStore(const StoreInst &I) {
5348 SDLoc dl = getCurSDLoc();
5349
5350 AtomicOrdering Ordering = I.getOrdering();
5351 SyncScope::ID SSID = I.getSyncScopeID();
5352
5353 SDValue InChain = getRoot();
5354
5355 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5356 EVT MemVT =
5357 TLI.getMemValueType(DAG.getDataLayout(), I.getValueOperand()->getType());
5358
5359 if (!TLI.supportsUnalignedAtomics() &&
5360 I.getAlign().value() < MemVT.getSizeInBits() / 8)
5361 report_fatal_error("Cannot generate unaligned atomic store");
5362
5363 auto Flags = TLI.getStoreMemOperandFlags(I, DAG.getDataLayout());
5364
5365 MachineFunction &MF = DAG.getMachineFunction();
5366 MachineMemOperand *MMO = MF.getMachineMemOperand(
5367 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5368 I.getAlign(), AAMDNodes(), nullptr, SSID, Ordering);
5369
5370 SDValue Val = getValue(I.getValueOperand());
5371 if (Val.getValueType() != MemVT)
5372 Val = DAG.getPtrExtOrTrunc(Val, dl, MemVT);
5373 SDValue Ptr = getValue(I.getPointerOperand());
5374
5375 SDValue OutChain =
5376 DAG.getAtomic(ISD::ATOMIC_STORE, dl, MemVT, InChain, Val, Ptr, MMO);
5377
5378 setValue(&I, OutChain);
5379 DAG.setRoot(OutChain);
5380}
5381
5382/// Check if this intrinsic call depends on the chain (1st return value)
5383/// and if it only *loads* memory.
5384/// Ignore the callsite's attributes. A specific call site may be marked with
5385/// readnone, but the lowering code will expect the chain based on the
5386/// definition.
5387std::pair<bool, bool>
5388SelectionDAGBuilder::getTargetIntrinsicCallProperties(const CallBase &I) {
5389 const Function *F = I.getCalledFunction();
5390 bool HasChain = !F->doesNotAccessMemory();
5391 bool OnlyLoad =
5392 HasChain && F->onlyReadsMemory() && F->willReturn() && F->doesNotThrow();
5393
5394 return {HasChain, OnlyLoad};
5395}
5396
5397SmallVector<SDValue, 8> SelectionDAGBuilder::getTargetIntrinsicOperands(
5398 const CallBase &I, bool HasChain, bool OnlyLoad,
5399 TargetLowering::IntrinsicInfo *TgtMemIntrinsicInfo) {
5400 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5401
5402 // Build the operand list.
5404 if (HasChain) { // If this intrinsic has side-effects, chainify it.
5405 if (OnlyLoad) {
5406 // We don't need to serialize loads against other loads.
5407 Ops.push_back(DAG.getRoot());
5408 } else {
5409 Ops.push_back(getRoot());
5410 }
5411 }
5412
5413 // Add the intrinsic ID as an integer operand if it's not a target intrinsic.
5414 if (!TgtMemIntrinsicInfo || TgtMemIntrinsicInfo->opc == ISD::INTRINSIC_VOID ||
5415 TgtMemIntrinsicInfo->opc == ISD::INTRINSIC_W_CHAIN)
5416 Ops.push_back(DAG.getTargetConstant(I.getIntrinsicID(), getCurSDLoc(),
5417 TLI.getPointerTy(DAG.getDataLayout())));
5418
5419 // Add all operands of the call to the operand list.
5420 for (unsigned i = 0, e = I.arg_size(); i != e; ++i) {
5421 const Value *Arg = I.getArgOperand(i);
5422 if (!I.paramHasAttr(i, Attribute::ImmArg)) {
5423 Ops.push_back(getValue(Arg));
5424 continue;
5425 }
5426
5427 // Use TargetConstant instead of a regular constant for immarg.
5428 EVT VT = TLI.getValueType(DAG.getDataLayout(), Arg->getType(), true);
5429 if (const ConstantInt *CI = dyn_cast<ConstantInt>(Arg)) {
5430 assert(CI->getBitWidth() <= 64 &&
5431 "large intrinsic immediates not handled");
5432 Ops.push_back(DAG.getTargetConstant(*CI, SDLoc(), VT));
5433 } else {
5434 Ops.push_back(
5435 DAG.getTargetConstantFP(*cast<ConstantFP>(Arg), SDLoc(), VT));
5436 }
5437 }
5438
5439 if (std::optional<OperandBundleUse> Bundle =
5440 I.getOperandBundle(LLVMContext::OB_deactivation_symbol)) {
5441 auto *Sym = Bundle->Inputs[0].get();
5442 SDValue SDSym = getValue(Sym);
5443 SDSym = DAG.getDeactivationSymbol(cast<GlobalValue>(Sym));
5444 Ops.push_back(SDSym);
5445 }
5446
5447 if (std::optional<OperandBundleUse> Bundle =
5448 I.getOperandBundle(LLVMContext::OB_convergencectrl)) {
5449 Value *Token = Bundle->Inputs[0].get();
5450 SDValue ConvControlToken = getValue(Token);
5451 assert(Ops.back().getValueType() != MVT::Glue &&
5452 "Did not expect another glue node here.");
5453 ConvControlToken =
5454 DAG.getNode(ISD::CONVERGENCECTRL_GLUE, {}, MVT::Glue, ConvControlToken);
5455 Ops.push_back(ConvControlToken);
5456 }
5457
5458 return Ops;
5459}
5460
5461SDVTList SelectionDAGBuilder::getTargetIntrinsicVTList(const CallBase &I,
5462 bool HasChain) {
5463 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5464
5465 SmallVector<EVT, 4> ValueVTs;
5466 ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);
5467
5468 if (HasChain)
5469 ValueVTs.push_back(MVT::Other);
5470
5471 return DAG.getVTList(ValueVTs);
5472}
5473
5474/// Get an INTRINSIC node for a target intrinsic which does not touch memory.
5475SDValue SelectionDAGBuilder::getTargetNonMemIntrinsicNode(
5476 const Type &IntrinsicVT, bool HasChain, ArrayRef<SDValue> Ops,
5477 const SDVTList &VTs) {
5478 if (!HasChain)
5479 return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, getCurSDLoc(), VTs, Ops);
5480 if (!IntrinsicVT.isVoidTy())
5481 return DAG.getNode(ISD::INTRINSIC_W_CHAIN, getCurSDLoc(), VTs, Ops);
5482 return DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops);
5483}
5484
5485/// Set root, convert return type if necessary and check alignment.
5486SDValue SelectionDAGBuilder::handleTargetIntrinsicRet(const CallBase &I,
5487 bool HasChain,
5488 bool OnlyLoad,
5489 SDValue Result) {
5490 if (HasChain) {
5491 SDValue Chain = Result.getValue(Result.getNode()->getNumValues() - 1);
5492 if (OnlyLoad)
5493 PendingLoads.push_back(Chain);
5494 else
5495 DAG.setRoot(Chain);
5496 }
5497
5498 if (I.getType()->isVoidTy())
5499 return Result;
5500
5501 if (MaybeAlign Alignment = I.getRetAlign(); InsertAssertAlign && Alignment) {
5502 // Insert `assertalign` node if there's an alignment.
5503 Result = DAG.getAssertAlign(getCurSDLoc(), Result, Alignment.valueOrOne());
5504 } else if (!isa<VectorType>(I.getType())) {
5505 Result = lowerRangeToAssertZExt(DAG, I, Result);
5506 }
5507
5508 return Result;
5509}
5510
5511/// visitTargetIntrinsic - Lower a call of a target intrinsic to an INTRINSIC
5512/// node.
5513void SelectionDAGBuilder::visitTargetIntrinsic(const CallInst &I,
5514 unsigned Intrinsic) {
5515 auto [HasChain, OnlyLoad] = getTargetIntrinsicCallProperties(I);
5516
5517 // Infos is set by getTgtMemIntrinsic.
5519 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5520 TLI.getTgtMemIntrinsic(Infos, I, DAG.getMachineFunction(), Intrinsic);
5521 // Use the first (primary) info determines the node opcode.
5522 TargetLowering::IntrinsicInfo *Info = !Infos.empty() ? &Infos[0] : nullptr;
5523
5525 getTargetIntrinsicOperands(I, HasChain, OnlyLoad, Info);
5526 SDVTList VTs = getTargetIntrinsicVTList(I, HasChain);
5527
5528 // Propagate fast-math-flags from IR to node(s).
5529 SDNodeFlags Flags;
5530 if (auto *FPMO = dyn_cast<FPMathOperator>(&I))
5531 Flags.copyFMF(*FPMO);
5532 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
5533
5534 // Create the node.
5536
5537 // In some cases, custom collection of operands from CallInst I may be needed.
5539 if (!Infos.empty()) {
5540 // This is target intrinsic that touches memory
5541 // Create MachineMemOperands for each memory access described by the target.
5542 MachineFunction &MF = DAG.getMachineFunction();
5544 for (const auto &Info : Infos) {
5545 // TODO: We currently just fallback to address space 0 if
5546 // getTgtMemIntrinsic didn't yield anything useful.
5547 MachinePointerInfo MPI;
5548 if (Info.ptrVal)
5549 MPI = MachinePointerInfo(Info.ptrVal, Info.offset);
5550 else if (Info.fallbackAddressSpace)
5551 MPI = MachinePointerInfo(*Info.fallbackAddressSpace);
5552 EVT MemVT = Info.memVT;
5553 LocationSize Size = LocationSize::precise(Info.size);
5554 if (Size.hasValue() && !Size.getValue())
5556 Align Alignment = Info.align.value_or(DAG.getEVTAlign(MemVT));
5557 MachineMemOperand *MMO = MF.getMachineMemOperand(
5558 MPI, Info.flags, Size, Alignment, I.getAAMetadata(),
5559 /*Ranges=*/nullptr, Info.ssid, Info.order, Info.failureOrder);
5560 MMOs.push_back(MMO);
5561 }
5562
5563 Result = DAG.getMemIntrinsicNode(Info->opc, getCurSDLoc(), VTs, Ops,
5564 Info->memVT, MMOs);
5565 } else {
5566 Result = getTargetNonMemIntrinsicNode(*I.getType(), HasChain, Ops, VTs);
5567 }
5568
5569 Result = handleTargetIntrinsicRet(I, HasChain, OnlyLoad, Result);
5570
5571 setValue(&I, Result);
5572}
5573
5574/// GetSignificand - Get the significand and build it into a floating-point
5575/// number with exponent of 1:
5576///
5577/// Op = (Op & 0x007fffff) | 0x3f800000;
5578///
5579/// where Op is the hexadecimal representation of floating point value.
5581 SDValue t1 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
5582 DAG.getConstant(0x007fffff, dl, MVT::i32));
5583 SDValue t2 = DAG.getNode(ISD::OR, dl, MVT::i32, t1,
5584 DAG.getConstant(0x3f800000, dl, MVT::i32));
5585 return DAG.getNode(ISD::BITCAST, dl, MVT::f32, t2);
5586}
5587
5588/// GetExponent - Get the exponent:
5589///
5590/// (float)(int)(((Op & 0x7f800000) >> 23) - 127);
5591///
5592/// where Op is the hexadecimal representation of floating point value.
5594 const TargetLowering &TLI, const SDLoc &dl) {
5595 SDValue t0 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
5596 DAG.getConstant(0x7f800000, dl, MVT::i32));
5597 SDValue t1 = DAG.getNode(ISD::SRL, dl, MVT::i32, t0,
5598 DAG.getShiftAmountConstant(23, MVT::i32, dl));
5599 SDValue t2 = DAG.getNode(ISD::SUB, dl, MVT::i32, t1,
5600 DAG.getConstant(127, dl, MVT::i32));
5601 return DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, t2);
5602}
5603
5604/// getF32Constant - Get 32-bit floating point constant.
5605static SDValue getF32Constant(SelectionDAG &DAG, unsigned Flt,
5606 const SDLoc &dl) {
5607 return DAG.getConstantFP(APFloat(APFloat::IEEEsingle(), APInt(32, Flt)), dl,
5608 MVT::f32);
5609}
5610
5612 SelectionDAG &DAG) {
5613 // TODO: What fast-math-flags should be set on the floating-point nodes?
5614
5615 // IntegerPartOfX = ((int32_t)(t0);
5616 SDValue IntegerPartOfX = DAG.getNode(ISD::FP_TO_SINT, dl, MVT::i32, t0);
5617
5618 // FractionalPartOfX = t0 - (float)IntegerPartOfX;
5619 SDValue t1 = DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, IntegerPartOfX);
5620 SDValue X = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0, t1);
5621
5622 // IntegerPartOfX <<= 23;
5623 IntegerPartOfX = DAG.getNode(ISD::SHL, dl, MVT::i32, IntegerPartOfX,
5624 DAG.getShiftAmountConstant(23, MVT::i32, dl));
5625
5626 SDValue TwoToFractionalPartOfX;
5627 if (LimitFloatPrecision <= 6) {
5628 // For floating-point precision of 6:
5629 //
5630 // TwoToFractionalPartOfX =
5631 // 0.997535578f +
5632 // (0.735607626f + 0.252464424f * x) * x;
5633 //
5634 // error 0.0144103317, which is 6 bits
5635 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5636 getF32Constant(DAG, 0x3e814304, dl));
5637 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5638 getF32Constant(DAG, 0x3f3c50c8, dl));
5639 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5640 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5641 getF32Constant(DAG, 0x3f7f5e7e, dl));
5642 } else if (LimitFloatPrecision <= 12) {
5643 // For floating-point precision of 12:
5644 //
5645 // TwoToFractionalPartOfX =
5646 // 0.999892986f +
5647 // (0.696457318f +
5648 // (0.224338339f + 0.792043434e-1f * x) * x) * x;
5649 //
5650 // error 0.000107046256, which is 13 to 14 bits
5651 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5652 getF32Constant(DAG, 0x3da235e3, dl));
5653 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5654 getF32Constant(DAG, 0x3e65b8f3, dl));
5655 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5656 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5657 getF32Constant(DAG, 0x3f324b07, dl));
5658 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5659 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5660 getF32Constant(DAG, 0x3f7ff8fd, dl));
5661 } else { // LimitFloatPrecision <= 18
5662 // For floating-point precision of 18:
5663 //
5664 // TwoToFractionalPartOfX =
5665 // 0.999999982f +
5666 // (0.693148872f +
5667 // (0.240227044f +
5668 // (0.554906021e-1f +
5669 // (0.961591928e-2f +
5670 // (0.136028312e-2f + 0.157059148e-3f *x)*x)*x)*x)*x)*x;
5671 // error 2.47208000*10^(-7), which is better than 18 bits
5672 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5673 getF32Constant(DAG, 0x3924b03e, dl));
5674 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5675 getF32Constant(DAG, 0x3ab24b87, dl));
5676 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5677 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5678 getF32Constant(DAG, 0x3c1d8c17, dl));
5679 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5680 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5681 getF32Constant(DAG, 0x3d634a1d, dl));
5682 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5683 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5684 getF32Constant(DAG, 0x3e75fe14, dl));
5685 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5686 SDValue t11 = DAG.getNode(ISD::FADD, dl, MVT::f32, t10,
5687 getF32Constant(DAG, 0x3f317234, dl));
5688 SDValue t12 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t11, X);
5689 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t12,
5690 getF32Constant(DAG, 0x3f800000, dl));
5691 }
5692
5693 // Add the exponent into the result in integer domain.
5694 SDValue t13 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, TwoToFractionalPartOfX);
5695 return DAG.getNode(ISD::BITCAST, dl, MVT::f32,
5696 DAG.getNode(ISD::ADD, dl, MVT::i32, t13, IntegerPartOfX));
5697}
5698
5699/// expandExp - Lower an exp intrinsic. Handles the special sequences for
5700/// limited-precision mode.
5702 const TargetLowering &TLI, SDNodeFlags Flags) {
5703 if (Op.getValueType() == MVT::f32 &&
5705
5706 // Put the exponent in the right bit position for later addition to the
5707 // final result:
5708 //
5709 // t0 = Op * log2(e)
5710
5711 // TODO: What fast-math-flags should be set here?
5712 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, Op,
5713 DAG.getConstantFP(numbers::log2ef, dl, MVT::f32));
5714 return getLimitedPrecisionExp2(t0, dl, DAG);
5715 }
5716
5717 // No special expansion.
5718 return DAG.getNode(ISD::FEXP, dl, Op.getValueType(), Op, Flags);
5719}
5720
5721/// expandLog - Lower a log intrinsic. Handles the special sequences for
5722/// limited-precision mode.
5724 const TargetLowering &TLI, SDNodeFlags Flags) {
5725 // TODO: What fast-math-flags should be set on the floating-point nodes?
5726
5727 if (Op.getValueType() == MVT::f32 &&
5729 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5730
5731 // Scale the exponent by log(2).
5732 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5733 SDValue LogOfExponent =
5734 DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5735 DAG.getConstantFP(numbers::ln2f, dl, MVT::f32));
5736
5737 // Get the significand and build it into a floating-point number with
5738 // exponent of 1.
5739 SDValue X = GetSignificand(DAG, Op1, dl);
5740
5741 SDValue LogOfMantissa;
5742 if (LimitFloatPrecision <= 6) {
5743 // For floating-point precision of 6:
5744 //
5745 // LogofMantissa =
5746 // -1.1609546f +
5747 // (1.4034025f - 0.23903021f * x) * x;
5748 //
5749 // error 0.0034276066, which is better than 8 bits
5750 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5751 getF32Constant(DAG, 0xbe74c456, dl));
5752 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5753 getF32Constant(DAG, 0x3fb3a2b1, dl));
5754 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5755 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5756 getF32Constant(DAG, 0x3f949a29, dl));
5757 } else if (LimitFloatPrecision <= 12) {
5758 // For floating-point precision of 12:
5759 //
5760 // LogOfMantissa =
5761 // -1.7417939f +
5762 // (2.8212026f +
5763 // (-1.4699568f +
5764 // (0.44717955f - 0.56570851e-1f * x) * x) * x) * x;
5765 //
5766 // error 0.000061011436, which is 14 bits
5767 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5768 getF32Constant(DAG, 0xbd67b6d6, dl));
5769 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5770 getF32Constant(DAG, 0x3ee4f4b8, dl));
5771 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5772 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5773 getF32Constant(DAG, 0x3fbc278b, dl));
5774 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5775 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5776 getF32Constant(DAG, 0x40348e95, dl));
5777 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5778 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5779 getF32Constant(DAG, 0x3fdef31a, dl));
5780 } else { // LimitFloatPrecision <= 18
5781 // For floating-point precision of 18:
5782 //
5783 // LogOfMantissa =
5784 // -2.1072184f +
5785 // (4.2372794f +
5786 // (-3.7029485f +
5787 // (2.2781945f +
5788 // (-0.87823314f +
5789 // (0.19073739f - 0.17809712e-1f * x) * x) * x) * x) * x)*x;
5790 //
5791 // error 0.0000023660568, which is better than 18 bits
5792 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5793 getF32Constant(DAG, 0xbc91e5ac, dl));
5794 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5795 getF32Constant(DAG, 0x3e4350aa, dl));
5796 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5797 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5798 getF32Constant(DAG, 0x3f60d3e3, dl));
5799 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5800 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5801 getF32Constant(DAG, 0x4011cdf0, dl));
5802 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5803 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5804 getF32Constant(DAG, 0x406cfd1c, dl));
5805 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5806 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5807 getF32Constant(DAG, 0x408797cb, dl));
5808 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5809 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t10,
5810 getF32Constant(DAG, 0x4006dcab, dl));
5811 }
5812
5813 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, LogOfMantissa);
5814 }
5815
5816 // No special expansion.
5817 return DAG.getNode(ISD::FLOG, dl, Op.getValueType(), Op, Flags);
5818}
5819
5820/// expandLog2 - Lower a log2 intrinsic. Handles the special sequences for
5821/// limited-precision mode.
5823 const TargetLowering &TLI, SDNodeFlags Flags) {
5824 // TODO: What fast-math-flags should be set on the floating-point nodes?
5825
5826 if (Op.getValueType() == MVT::f32 &&
5828 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5829
5830 // Get the exponent.
5831 SDValue LogOfExponent = GetExponent(DAG, Op1, TLI, dl);
5832
5833 // Get the significand and build it into a floating-point number with
5834 // exponent of 1.
5835 SDValue X = GetSignificand(DAG, Op1, dl);
5836
5837 // Different possible minimax approximations of significand in
5838 // floating-point for various degrees of accuracy over [1,2].
5839 SDValue Log2ofMantissa;
5840 if (LimitFloatPrecision <= 6) {
5841 // For floating-point precision of 6:
5842 //
5843 // Log2ofMantissa = -1.6749035f + (2.0246817f - .34484768f * x) * x;
5844 //
5845 // error 0.0049451742, which is more than 7 bits
5846 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5847 getF32Constant(DAG, 0xbeb08fe0, dl));
5848 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5849 getF32Constant(DAG, 0x40019463, dl));
5850 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5851 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5852 getF32Constant(DAG, 0x3fd6633d, dl));
5853 } else if (LimitFloatPrecision <= 12) {
5854 // For floating-point precision of 12:
5855 //
5856 // Log2ofMantissa =
5857 // -2.51285454f +
5858 // (4.07009056f +
5859 // (-2.12067489f +
5860 // (.645142248f - 0.816157886e-1f * x) * x) * x) * x;
5861 //
5862 // error 0.0000876136000, which is better than 13 bits
5863 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5864 getF32Constant(DAG, 0xbda7262e, dl));
5865 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5866 getF32Constant(DAG, 0x3f25280b, dl));
5867 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5868 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5869 getF32Constant(DAG, 0x4007b923, dl));
5870 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5871 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5872 getF32Constant(DAG, 0x40823e2f, dl));
5873 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5874 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5875 getF32Constant(DAG, 0x4020d29c, dl));
5876 } else { // LimitFloatPrecision <= 18
5877 // For floating-point precision of 18:
5878 //
5879 // Log2ofMantissa =
5880 // -3.0400495f +
5881 // (6.1129976f +
5882 // (-5.3420409f +
5883 // (3.2865683f +
5884 // (-1.2669343f +
5885 // (0.27515199f -
5886 // 0.25691327e-1f * x) * x) * x) * x) * x) * x;
5887 //
5888 // error 0.0000018516, which is better than 18 bits
5889 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5890 getF32Constant(DAG, 0xbcd2769e, dl));
5891 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5892 getF32Constant(DAG, 0x3e8ce0b9, dl));
5893 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5894 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5895 getF32Constant(DAG, 0x3fa22ae7, dl));
5896 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5897 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5898 getF32Constant(DAG, 0x40525723, dl));
5899 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5900 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5901 getF32Constant(DAG, 0x40aaf200, dl));
5902 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5903 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5904 getF32Constant(DAG, 0x40c39dad, dl));
5905 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5906 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t10,
5907 getF32Constant(DAG, 0x4042902c, dl));
5908 }
5909
5910 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, Log2ofMantissa);
5911 }
5912
5913 // No special expansion.
5914 return DAG.getNode(ISD::FLOG2, dl, Op.getValueType(), Op, Flags);
5915}
5916
5917/// expandLog10 - Lower a log10 intrinsic. Handles the special sequences for
5918/// limited-precision mode.
5920 const TargetLowering &TLI, SDNodeFlags Flags) {
5921 // TODO: What fast-math-flags should be set on the floating-point nodes?
5922
5923 if (Op.getValueType() == MVT::f32 &&
5925 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5926
5927 // Scale the exponent by log10(2) [0.30102999f].
5928 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5929 SDValue LogOfExponent = DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5930 getF32Constant(DAG, 0x3e9a209a, dl));
5931
5932 // Get the significand and build it into a floating-point number with
5933 // exponent of 1.
5934 SDValue X = GetSignificand(DAG, Op1, dl);
5935
5936 SDValue Log10ofMantissa;
5937 if (LimitFloatPrecision <= 6) {
5938 // For floating-point precision of 6:
5939 //
5940 // Log10ofMantissa =
5941 // -0.50419619f +
5942 // (0.60948995f - 0.10380950f * x) * x;
5943 //
5944 // error 0.0014886165, which is 6 bits
5945 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5946 getF32Constant(DAG, 0xbdd49a13, dl));
5947 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5948 getF32Constant(DAG, 0x3f1c0789, dl));
5949 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5950 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5951 getF32Constant(DAG, 0x3f011300, dl));
5952 } else if (LimitFloatPrecision <= 12) {
5953 // For floating-point precision of 12:
5954 //
5955 // Log10ofMantissa =
5956 // -0.64831180f +
5957 // (0.91751397f +
5958 // (-0.31664806f + 0.47637168e-1f * x) * x) * x;
5959 //
5960 // error 0.00019228036, which is better than 12 bits
5961 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5962 getF32Constant(DAG, 0x3d431f31, dl));
5963 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
5964 getF32Constant(DAG, 0x3ea21fb2, dl));
5965 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5966 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5967 getF32Constant(DAG, 0x3f6ae232, dl));
5968 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5969 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
5970 getF32Constant(DAG, 0x3f25f7c3, dl));
5971 } else { // LimitFloatPrecision <= 18
5972 // For floating-point precision of 18:
5973 //
5974 // Log10ofMantissa =
5975 // -0.84299375f +
5976 // (1.5327582f +
5977 // (-1.0688956f +
5978 // (0.49102474f +
5979 // (-0.12539807f + 0.13508273e-1f * x) * x) * x) * x) * x;
5980 //
5981 // error 0.0000037995730, which is better than 18 bits
5982 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5983 getF32Constant(DAG, 0x3c5d51ce, dl));
5984 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
5985 getF32Constant(DAG, 0x3e00685a, dl));
5986 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5987 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5988 getF32Constant(DAG, 0x3efb6798, dl));
5989 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5990 SDValue t5 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
5991 getF32Constant(DAG, 0x3f88d192, dl));
5992 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5993 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5994 getF32Constant(DAG, 0x3fc4316c, dl));
5995 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5996 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t8,
5997 getF32Constant(DAG, 0x3f57ce70, dl));
5998 }
5999
6000 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, Log10ofMantissa);
6001 }
6002
6003 // No special expansion.
6004 return DAG.getNode(ISD::FLOG10, dl, Op.getValueType(), Op, Flags);
6005}
6006
6007/// expandExp2 - Lower an exp2 intrinsic. Handles the special sequences for
6008/// limited-precision mode.
6010 const TargetLowering &TLI, SDNodeFlags Flags) {
6011 if (Op.getValueType() == MVT::f32 &&
6013 return getLimitedPrecisionExp2(Op, dl, DAG);
6014
6015 // No special expansion.
6016 return DAG.getNode(ISD::FEXP2, dl, Op.getValueType(), Op, Flags);
6017}
6018
6019/// visitPow - Lower a pow intrinsic. Handles the special sequences for
6020/// limited-precision mode with x == 10.0f.
6022 SelectionDAG &DAG, const TargetLowering &TLI,
6023 SDNodeFlags Flags) {
6024 bool IsExp10 = false;
6025 if (LHS.getValueType() == MVT::f32 && RHS.getValueType() == MVT::f32 &&
6028 APFloat Ten(10.0f);
6029 IsExp10 = LHSC->isExactlyValue(Ten);
6030 }
6031 }
6032
6033 // TODO: What fast-math-flags should be set on the FMUL node?
6034 if (IsExp10) {
6035 // Put the exponent in the right bit position for later addition to the
6036 // final result:
6037 //
6038 // #define LOG2OF10 3.3219281f
6039 // t0 = Op * LOG2OF10;
6040 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, RHS,
6041 getF32Constant(DAG, 0x40549a78, dl));
6042 return getLimitedPrecisionExp2(t0, dl, DAG);
6043 }
6044
6045 // No special expansion.
6046 return DAG.getNode(ISD::FPOW, dl, LHS.getValueType(), LHS, RHS, Flags);
6047}
6048
6049/// ExpandPowI - Expand a llvm.powi intrinsic.
6051 SelectionDAG &DAG) {
6052 // If RHS is a constant, we can expand this out to a multiplication tree if
6053 // it's beneficial on the target, otherwise we end up lowering to a call to
6054 // __powidf2 (for example).
6056 unsigned Val = RHSC->getSExtValue();
6057
6058 // powi(x, 0) -> 1.0
6059 if (Val == 0)
6060 return DAG.getConstantFP(1.0, DL, LHS.getValueType());
6061
6063 Val, DAG.shouldOptForSize())) {
6064 // Get the exponent as a positive value.
6065 if ((int)Val < 0)
6066 Val = -Val;
6067 // We use the simple binary decomposition method to generate the multiply
6068 // sequence. There are more optimal ways to do this (for example,
6069 // powi(x,15) generates one more multiply than it should), but this has
6070 // the benefit of being both really simple and much better than a libcall.
6071 SDValue Res; // Logically starts equal to 1.0
6072 SDValue CurSquare = LHS;
6073 // TODO: Intrinsics should have fast-math-flags that propagate to these
6074 // nodes.
6075 while (Val) {
6076 if (Val & 1) {
6077 if (Res.getNode())
6078 Res =
6079 DAG.getNode(ISD::FMUL, DL, Res.getValueType(), Res, CurSquare);
6080 else
6081 Res = CurSquare; // 1.0*CurSquare.
6082 }
6083
6084 CurSquare = DAG.getNode(ISD::FMUL, DL, CurSquare.getValueType(),
6085 CurSquare, CurSquare);
6086 Val >>= 1;
6087 }
6088
6089 // If the original was negative, invert the result, producing 1/(x*x*x).
6090 if (RHSC->getSExtValue() < 0)
6091 Res = DAG.getNode(ISD::FDIV, DL, LHS.getValueType(),
6092 DAG.getConstantFP(1.0, DL, LHS.getValueType()), Res);
6093 return Res;
6094 }
6095 }
6096
6097 // Otherwise, expand to a libcall.
6098 return DAG.getNode(ISD::FPOWI, DL, LHS.getValueType(), LHS, RHS);
6099}
6100
6101static SDValue expandDivFix(unsigned Opcode, const SDLoc &DL,
6102 SDValue LHS, SDValue RHS, SDValue Scale,
6103 SelectionDAG &DAG, const TargetLowering &TLI) {
6104 EVT VT = LHS.getValueType();
6105 bool Signed = Opcode == ISD::SDIVFIX || Opcode == ISD::SDIVFIXSAT;
6106 bool Saturating = Opcode == ISD::SDIVFIXSAT || Opcode == ISD::UDIVFIXSAT;
6107 LLVMContext &Ctx = *DAG.getContext();
6108
6109 // If the type is legal but the operation isn't, this node might survive all
6110 // the way to operation legalization. If we end up there and we do not have
6111 // the ability to widen the type (if VT*2 is not legal), we cannot expand the
6112 // node.
6113
6114 // Coax the legalizer into expanding the node during type legalization instead
6115 // by bumping the size by one bit. This will force it to Promote, enabling the
6116 // early expansion and avoiding the need to expand later.
6117
6118 // We don't have to do this if Scale is 0; that can always be expanded, unless
6119 // it's a saturating signed operation. Those can experience true integer
6120 // division overflow, a case which we must avoid.
6121
6122 // FIXME: We wouldn't have to do this (or any of the early
6123 // expansion/promotion) if it was possible to expand a libcall of an
6124 // illegal type during operation legalization. But it's not, so things
6125 // get a bit hacky.
6126 unsigned ScaleInt = Scale->getAsZExtVal();
6127 if ((ScaleInt > 0 || (Saturating && Signed)) &&
6128 (TLI.isTypeLegal(VT) ||
6129 (VT.isVector() && TLI.isTypeLegal(VT.getVectorElementType())))) {
6131 Opcode, VT, ScaleInt);
6132 if (Action != TargetLowering::Legal && Action != TargetLowering::Custom) {
6133 EVT PromVT;
6134 if (VT.isScalarInteger())
6135 PromVT = EVT::getIntegerVT(Ctx, VT.getSizeInBits() + 1);
6136 else if (VT.isVector()) {
6137 PromVT = VT.getVectorElementType();
6138 PromVT = EVT::getIntegerVT(Ctx, PromVT.getSizeInBits() + 1);
6139 PromVT = EVT::getVectorVT(Ctx, PromVT, VT.getVectorElementCount());
6140 } else
6141 llvm_unreachable("Wrong VT for DIVFIX?");
6142 LHS = DAG.getExtOrTrunc(Signed, LHS, DL, PromVT);
6143 RHS = DAG.getExtOrTrunc(Signed, RHS, DL, PromVT);
6144 EVT ShiftTy = TLI.getShiftAmountTy(PromVT, DAG.getDataLayout());
6145 // For saturating operations, we need to shift up the LHS to get the
6146 // proper saturation width, and then shift down again afterwards.
6147 if (Saturating)
6148 LHS = DAG.getNode(ISD::SHL, DL, PromVT, LHS,
6149 DAG.getConstant(1, DL, ShiftTy));
6150 SDValue Res = DAG.getNode(Opcode, DL, PromVT, LHS, RHS, Scale);
6151 if (Saturating)
6152 Res = DAG.getNode(Signed ? ISD::SRA : ISD::SRL, DL, PromVT, Res,
6153 DAG.getConstant(1, DL, ShiftTy));
6154 return DAG.getZExtOrTrunc(Res, DL, VT);
6155 }
6156 }
6157
6158 return DAG.getNode(Opcode, DL, VT, LHS, RHS, Scale);
6159}
6160
6161// getUnderlyingArgRegs - Find underlying registers used for a truncated,
6162// bitcasted, or split argument. Returns a list of <Register, size in bits>
6163static void
6164getUnderlyingArgRegs(SmallVectorImpl<std::pair<Register, TypeSize>> &Regs,
6165 const SDValue &N) {
6166 switch (N.getOpcode()) {
6167 case ISD::CopyFromReg: {
6168 SDValue Op = N.getOperand(1);
6169 Regs.emplace_back(cast<RegisterSDNode>(Op)->getReg(),
6170 Op.getValueType().getSizeInBits());
6171 return;
6172 }
6173 case ISD::BITCAST:
6174 case ISD::AssertZext:
6175 case ISD::AssertSext:
6176 case ISD::TRUNCATE:
6177 getUnderlyingArgRegs(Regs, N.getOperand(0));
6178 return;
6179 case ISD::BUILD_PAIR:
6180 case ISD::BUILD_VECTOR:
6182 for (SDValue Op : N->op_values())
6183 getUnderlyingArgRegs(Regs, Op);
6184 return;
6185 default:
6186 return;
6187 }
6188}
6189
6190/// If the DbgValueInst is a dbg_value of a function argument, create the
6191/// corresponding DBG_VALUE machine instruction for it now. At the end of
6192/// instruction selection, they will be inserted to the entry BB.
6193/// We don't currently support this for variadic dbg_values, as they shouldn't
6194/// appear for function arguments or in the prologue.
6195bool SelectionDAGBuilder::EmitFuncArgumentDbgValue(
6196 const Value *V, DILocalVariable *Variable, DIExpression *Expr,
6197 DILocation *DL, FuncArgumentDbgValueKind Kind, const SDValue &N) {
6198 const Argument *Arg = dyn_cast<Argument>(V);
6199 if (!Arg)
6200 return false;
6201
6202 MachineFunction &MF = DAG.getMachineFunction();
6203 const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo();
6204
6205 // Helper to create DBG_INSTR_REFs or DBG_VALUEs, depending on what kind
6206 // we've been asked to pursue.
6207 auto MakeVRegDbgValue = [&](Register Reg, DIExpression *FragExpr,
6208 bool Indirect) {
6209 if (Reg.isVirtual() && MF.useDebugInstrRef()) {
6210 // For VRegs, in instruction referencing mode, create a DBG_INSTR_REF
6211 // pointing at the VReg, which will be patched up later.
6212 auto &Inst = TII->get(TargetOpcode::DBG_INSTR_REF);
6214 /* Reg */ Reg, /* isDef */ false, /* isImp */ false,
6215 /* isKill */ false, /* isDead */ false,
6216 /* isUndef */ false, /* isEarlyClobber */ false,
6217 /* SubReg */ 0, /* isDebug */ true)});
6218
6219 auto *NewDIExpr = FragExpr;
6220 // We don't have an "Indirect" field in DBG_INSTR_REF, fold that into
6221 // the DIExpression.
6222 if (Indirect)
6223 NewDIExpr = DIExpression::prepend(FragExpr, DIExpression::DerefBefore);
6225 NewDIExpr = DIExpression::prependOpcodes(NewDIExpr, Ops);
6226 return BuildMI(MF, DL, Inst, false, MOs, Variable, NewDIExpr);
6227 } else {
6228 // Create a completely standard DBG_VALUE.
6229 auto &Inst = TII->get(TargetOpcode::DBG_VALUE);
6230 return BuildMI(MF, DL, Inst, Indirect, Reg, Variable, FragExpr);
6231 }
6232 };
6233
6234 if (Kind == FuncArgumentDbgValueKind::Value) {
6235 // ArgDbgValues are hoisted to the beginning of the entry block. So we
6236 // should only emit as ArgDbgValue if the dbg.value intrinsic is found in
6237 // the entry block.
6238 bool IsInEntryBlock = FuncInfo.MBB == &FuncInfo.MF->front();
6239 if (!IsInEntryBlock)
6240 return false;
6241
6242 // ArgDbgValues are hoisted to the beginning of the entry block. So we
6243 // should only emit as ArgDbgValue if the dbg.value intrinsic describes a
6244 // variable that also is a param.
6245 //
6246 // Although, if we are at the top of the entry block already, we can still
6247 // emit using ArgDbgValue. This might catch some situations when the
6248 // dbg.value refers to an argument that isn't used in the entry block, so
6249 // any CopyToReg node would be optimized out and the only way to express
6250 // this DBG_VALUE is by using the physical reg (or FI) as done in this
6251 // method. ArgDbgValues are hoisted to the beginning of the entry block. So
6252 // we should only emit as ArgDbgValue if the Variable is an argument to the
6253 // current function, and the dbg.value intrinsic is found in the entry
6254 // block.
6255 bool VariableIsFunctionInputArg = Variable->isParameter() &&
6256 !DL->getInlinedAt();
6257 bool IsInPrologue = SDNodeOrder == LowestSDNodeOrder;
6258 if (!IsInPrologue && !VariableIsFunctionInputArg)
6259 return false;
6260
6261 // Here we assume that a function argument on IR level only can be used to
6262 // describe one input parameter on source level. If we for example have
6263 // source code like this
6264 //
6265 // struct A { long x, y; };
6266 // void foo(struct A a, long b) {
6267 // ...
6268 // b = a.x;
6269 // ...
6270 // }
6271 //
6272 // and IR like this
6273 //
6274 // define void @foo(i32 %a1, i32 %a2, i32 %b) {
6275 // entry:
6276 // call void @llvm.dbg.value(metadata i32 %a1, "a", DW_OP_LLVM_fragment
6277 // call void @llvm.dbg.value(metadata i32 %a2, "a", DW_OP_LLVM_fragment
6278 // call void @llvm.dbg.value(metadata i32 %b, "b",
6279 // ...
6280 // call void @llvm.dbg.value(metadata i32 %a1, "b"
6281 // ...
6282 //
6283 // then the last dbg.value is describing a parameter "b" using a value that
6284 // is an argument. But since we already has used %a1 to describe a parameter
6285 // we should not handle that last dbg.value here (that would result in an
6286 // incorrect hoisting of the DBG_VALUE to the function entry).
6287 // Notice that we allow one dbg.value per IR level argument, to accommodate
6288 // for the situation with fragments above.
6289 // If there is no node for the value being handled, we return true to skip
6290 // the normal generation of debug info, as it would kill existing debug
6291 // info for the parameter in case of duplicates.
6292 if (VariableIsFunctionInputArg) {
6293 unsigned ArgNo = Arg->getArgNo();
6294 if (ArgNo >= FuncInfo.DescribedArgs.size())
6295 FuncInfo.DescribedArgs.resize(ArgNo + 1, false);
6296 else if (!IsInPrologue && FuncInfo.DescribedArgs.test(ArgNo))
6297 return !NodeMap[V].getNode();
6298 FuncInfo.DescribedArgs.set(ArgNo);
6299 }
6300 }
6301
6302 bool IsIndirect = false;
6303 std::optional<MachineOperand> Op;
6304 // Some arguments' frame index is recorded during argument lowering.
6305 int FI = FuncInfo.getArgumentFrameIndex(Arg);
6306 if (FI != std::numeric_limits<int>::max())
6308
6310 if (!Op && N.getNode()) {
6311 getUnderlyingArgRegs(ArgRegsAndSizes, N);
6312 Register Reg;
6313 if (ArgRegsAndSizes.size() == 1)
6314 Reg = ArgRegsAndSizes.front().first;
6315
6316 if (Reg && Reg.isVirtual()) {
6317 MachineRegisterInfo &RegInfo = MF.getRegInfo();
6318 Register PR = RegInfo.getLiveInPhysReg(Reg);
6319 if (PR)
6320 Reg = PR;
6321 }
6322 if (Reg) {
6324 IsIndirect = Kind != FuncArgumentDbgValueKind::Value;
6325 }
6326 }
6327
6328 if (!Op && N.getNode()) {
6329 // Check if frame index is available.
6330 SDValue LCandidate = peekThroughBitcasts(N);
6331 if (LoadSDNode *LNode = dyn_cast<LoadSDNode>(LCandidate.getNode()))
6332 if (FrameIndexSDNode *FINode =
6333 dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
6334 Op = MachineOperand::CreateFI(FINode->getIndex());
6335 }
6336
6337 if (!Op) {
6338 // Create a DBG_VALUE for each decomposed value in ArgRegs to cover Reg
6339 auto splitMultiRegDbgValue =
6340 [&](ArrayRef<std::pair<Register, TypeSize>> SplitRegs) -> bool {
6341 unsigned Offset = 0;
6342 for (const auto &[Reg, RegSizeInBits] : SplitRegs) {
6343 // FIXME: Scalable sizes are not supported in fragment expressions.
6344 if (RegSizeInBits.isScalable())
6345 return false;
6346
6347 // If the expression is already a fragment, the current register
6348 // offset+size might extend beyond the fragment. In this case, only
6349 // the register bits that are inside the fragment are relevant.
6350 int RegFragmentSizeInBits = RegSizeInBits.getFixedValue();
6351 if (auto ExprFragmentInfo = Expr->getFragmentInfo()) {
6352 uint64_t ExprFragmentSizeInBits = ExprFragmentInfo->SizeInBits;
6353 // The register is entirely outside the expression fragment,
6354 // so is irrelevant for debug info.
6355 if (Offset >= ExprFragmentSizeInBits)
6356 break;
6357 // The register is partially outside the expression fragment, only
6358 // the low bits within the fragment are relevant for debug info.
6359 if (Offset + RegFragmentSizeInBits > ExprFragmentSizeInBits) {
6360 RegFragmentSizeInBits = ExprFragmentSizeInBits - Offset;
6361 }
6362 }
6363
6364 auto FragmentExpr = DIExpression::createFragmentExpression(
6365 Expr, Offset, RegFragmentSizeInBits);
6366 Offset += RegSizeInBits.getFixedValue();
6367 // If a valid fragment expression cannot be created, the variable's
6368 // correct value cannot be determined and so it is set as poison.
6369 if (!FragmentExpr) {
6370 SDDbgValue *SDV = DAG.getConstantDbgValue(
6371 Variable, Expr, PoisonValue::get(V->getType()), DL, SDNodeOrder);
6372 DAG.AddDbgValue(SDV, false);
6373 continue;
6374 }
6375 MachineInstr *NewMI = MakeVRegDbgValue(
6376 Reg, *FragmentExpr, Kind != FuncArgumentDbgValueKind::Value);
6377 FuncInfo.ArgDbgValues.push_back(NewMI);
6378 }
6379
6380 return true;
6381 };
6382
6383 // Check if ValueMap has reg number.
6385 VMI = FuncInfo.ValueMap.find(V);
6386 if (VMI != FuncInfo.ValueMap.end()) {
6387 const auto &TLI = DAG.getTargetLoweringInfo();
6388 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), VMI->second,
6389 V->getType(), std::nullopt);
6390 if (RFV.occupiesMultipleRegs())
6391 return splitMultiRegDbgValue(RFV.getRegsAndSizes());
6392
6393 Op = MachineOperand::CreateReg(VMI->second, false);
6394 IsIndirect = Kind != FuncArgumentDbgValueKind::Value;
6395 } else if (ArgRegsAndSizes.size() > 1) {
6396 // This was split due to the calling convention, and no virtual register
6397 // mapping exists for the value.
6398 return splitMultiRegDbgValue(ArgRegsAndSizes);
6399 }
6400 }
6401
6402 if (!Op)
6403 return false;
6404
6405 assert(Variable->isValidLocationForIntrinsic(DL) &&
6406 "Expected inlined-at fields to agree");
6407 MachineInstr *NewMI = nullptr;
6408
6409 if (Op->isReg())
6410 NewMI = MakeVRegDbgValue(Op->getReg(), Expr, IsIndirect);
6411 else
6412 NewMI = BuildMI(MF, DL, TII->get(TargetOpcode::DBG_VALUE), true, *Op,
6413 Variable, Expr);
6414
6415 // Otherwise, use ArgDbgValues.
6416 FuncInfo.ArgDbgValues.push_back(NewMI);
6417 return true;
6418}
6419
6420/// Return the appropriate SDDbgValue based on N.
6421SDDbgValue *SelectionDAGBuilder::getDbgValue(SDValue N,
6422 DILocalVariable *Variable,
6423 DIExpression *Expr,
6424 const DebugLoc &dl,
6425 unsigned DbgSDNodeOrder) {
6426 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(N.getNode())) {
6427 // Construct a FrameIndexDbgValue for FrameIndexSDNodes so we can describe
6428 // stack slot locations.
6429 //
6430 // Consider "int x = 0; int *px = &x;". There are two kinds of interesting
6431 // debug values here after optimization:
6432 //
6433 // dbg.value(i32* %px, !"int *px", !DIExpression()), and
6434 // dbg.value(i32* %px, !"int x", !DIExpression(DW_OP_deref))
6435 //
6436 // Both describe the direct values of their associated variables.
6437 return DAG.getFrameIndexDbgValue(Variable, Expr, FISDN->getIndex(),
6438 /*IsIndirect*/ false, dl, DbgSDNodeOrder);
6439 }
6440 return DAG.getDbgValue(Variable, Expr, N.getNode(), N.getResNo(),
6441 /*IsIndirect*/ false, dl, DbgSDNodeOrder);
6442}
6443
6444static unsigned FixedPointIntrinsicToOpcode(unsigned Intrinsic) {
6445 switch (Intrinsic) {
6446 case Intrinsic::smul_fix:
6447 return ISD::SMULFIX;
6448 case Intrinsic::umul_fix:
6449 return ISD::UMULFIX;
6450 case Intrinsic::smul_fix_sat:
6451 return ISD::SMULFIXSAT;
6452 case Intrinsic::umul_fix_sat:
6453 return ISD::UMULFIXSAT;
6454 case Intrinsic::sdiv_fix:
6455 return ISD::SDIVFIX;
6456 case Intrinsic::udiv_fix:
6457 return ISD::UDIVFIX;
6458 case Intrinsic::sdiv_fix_sat:
6459 return ISD::SDIVFIXSAT;
6460 case Intrinsic::udiv_fix_sat:
6461 return ISD::UDIVFIXSAT;
6462 default:
6463 llvm_unreachable("Unhandled fixed point intrinsic");
6464 }
6465}
6466
6467/// Given a @llvm.call.preallocated.setup, return the corresponding
6468/// preallocated call.
6469static const CallBase *FindPreallocatedCall(const Value *PreallocatedSetup) {
6470 assert(cast<CallBase>(PreallocatedSetup)
6472 ->getIntrinsicID() == Intrinsic::call_preallocated_setup &&
6473 "expected call_preallocated_setup Value");
6474 for (const auto *U : PreallocatedSetup->users()) {
6475 auto *UseCall = cast<CallBase>(U);
6476 const Function *Fn = UseCall->getCalledFunction();
6477 if (!Fn || Fn->getIntrinsicID() != Intrinsic::call_preallocated_arg) {
6478 return UseCall;
6479 }
6480 }
6481 llvm_unreachable("expected corresponding call to preallocated setup/arg");
6482}
6483
6484/// If DI is a debug value with an EntryValue expression, lower it using the
6485/// corresponding physical register of the associated Argument value
6486/// (guaranteed to exist by the verifier).
6487bool SelectionDAGBuilder::visitEntryValueDbgValue(
6488 ArrayRef<const Value *> Values, DILocalVariable *Variable,
6489 DIExpression *Expr, DebugLoc DbgLoc) {
6490 if (!Expr->isEntryValue() || !hasSingleElement(Values))
6491 return false;
6492
6493 // These properties are guaranteed by the verifier.
6494 const Argument *Arg = cast<Argument>(Values[0]);
6495 assert(Arg->hasAttribute(Attribute::AttrKind::SwiftAsync));
6496
6497 auto ArgIt = FuncInfo.ValueMap.find(Arg);
6498 if (ArgIt == FuncInfo.ValueMap.end()) {
6499 LLVM_DEBUG(
6500 dbgs() << "Dropping dbg.value: expression is entry_value but "
6501 "couldn't find an associated register for the Argument\n");
6502 return true;
6503 }
6504 Register ArgVReg = ArgIt->getSecond();
6505
6506 for (auto [PhysReg, VirtReg] : FuncInfo.RegInfo->liveins())
6507 if (ArgVReg == VirtReg || ArgVReg == PhysReg) {
6508 SDDbgValue *SDV = DAG.getVRegDbgValue(
6509 Variable, Expr, PhysReg, false /*IsIndidrect*/, DbgLoc, SDNodeOrder);
6510 DAG.AddDbgValue(SDV, false /*treat as dbg.declare byval parameter*/);
6511 return true;
6512 }
6513 LLVM_DEBUG(dbgs() << "Dropping dbg.value: expression is entry_value but "
6514 "couldn't find a physical register\n");
6515 return true;
6516}
6517
6518/// Lower the call to the specified intrinsic function.
6519void SelectionDAGBuilder::visitConvergenceControl(const CallInst &I,
6520 unsigned Intrinsic) {
6521 SDLoc sdl = getCurSDLoc();
6522 switch (Intrinsic) {
6523 case Intrinsic::experimental_convergence_anchor:
6524 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_ANCHOR, sdl, MVT::Untyped));
6525 break;
6526 case Intrinsic::experimental_convergence_entry:
6527 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_ENTRY, sdl, MVT::Untyped));
6528 break;
6529 case Intrinsic::experimental_convergence_loop: {
6530 auto Bundle = I.getOperandBundle(LLVMContext::OB_convergencectrl);
6531 auto *Token = Bundle->Inputs[0].get();
6532 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_LOOP, sdl, MVT::Untyped,
6533 getValue(Token)));
6534 break;
6535 }
6536 }
6537}
6538
6539void SelectionDAGBuilder::visitVectorHistogram(const CallInst &I,
6540 unsigned IntrinsicID) {
6541 // For now, we're only lowering an 'add' histogram.
6542 // We can add others later, e.g. saturating adds, min/max.
6543 assert(IntrinsicID == Intrinsic::experimental_vector_histogram_add &&
6544 "Tried to lower unsupported histogram type");
6545 SDLoc sdl = getCurSDLoc();
6546 Value *Ptr = I.getOperand(0);
6547 SDValue Inc = getValue(I.getOperand(1));
6548 SDValue Mask = getValue(I.getOperand(2));
6549
6550 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6551 DataLayout TargetDL = DAG.getDataLayout();
6552 EVT VT = Inc.getValueType();
6553 Align Alignment = DAG.getEVTAlign(VT);
6554
6555 const MDNode *Ranges = getRangeMetadata(I);
6556
6557 SDValue Root = DAG.getRoot();
6558 SDValue Base;
6559 SDValue Index;
6560 SDValue Scale;
6561 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
6562 I.getParent(), VT.getScalarStoreSize());
6563
6564 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
6565
6566 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
6567 MachinePointerInfo(AS),
6569 MemoryLocation::UnknownSize, Alignment, I.getAAMetadata(), Ranges);
6570
6571 if (!UniformBase) {
6572 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
6573 Index = getValue(Ptr);
6574 Scale =
6575 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
6576 }
6577
6578 EVT IdxVT = Index.getValueType();
6579
6580 // Avoid using e.g. i32 as index type when the increment must be performed
6581 // on i64's.
6582 bool MustExtendIndex = VT.getScalarSizeInBits() > IdxVT.getScalarSizeInBits();
6583 EVT EltTy = MustExtendIndex ? VT : IdxVT.getVectorElementType();
6584 if (MustExtendIndex || TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
6585 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
6586 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
6587 }
6588
6589 SDValue ID = DAG.getTargetConstant(IntrinsicID, sdl, MVT::i32);
6590
6591 SDValue Ops[] = {Root, Inc, Mask, Base, Index, Scale, ID};
6592 SDValue Histogram = DAG.getMaskedHistogram(DAG.getVTList(MVT::Other), VT, sdl,
6593 Ops, MMO, ISD::SIGNED_SCALED);
6594
6595 setValue(&I, Histogram);
6596 DAG.setRoot(Histogram);
6597}
6598
6599void SelectionDAGBuilder::visitVectorExtractLastActive(const CallInst &I,
6600 unsigned Intrinsic) {
6601 assert(Intrinsic == Intrinsic::experimental_vector_extract_last_active &&
6602 "Tried lowering invalid vector extract last");
6603 SDLoc sdl = getCurSDLoc();
6604 const DataLayout &Layout = DAG.getDataLayout();
6605 SDValue Data = getValue(I.getOperand(0));
6606 SDValue Mask = getValue(I.getOperand(1));
6607
6608 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6609 EVT ResVT = TLI.getValueType(Layout, I.getType());
6610
6611 EVT ExtVT = TLI.getVectorIdxTy(Layout);
6612 SDValue Idx = DAG.getNode(ISD::VECTOR_FIND_LAST_ACTIVE, sdl, ExtVT, Mask);
6613 SDValue Result = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, sdl, ResVT, Data, Idx);
6614
6615 Value *Default = I.getOperand(2);
6617 SDValue PassThru = getValue(Default);
6618 EVT BoolVT = Mask.getValueType().getScalarType();
6619 SDValue AnyActive = DAG.getNode(ISD::VECREDUCE_OR, sdl, BoolVT, Mask);
6620 Result = DAG.getSelect(sdl, ResVT, AnyActive, Result, PassThru);
6621 }
6622
6623 setValue(&I, Result);
6624}
6625
6626/// Lower the call to the specified intrinsic function.
6627void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
6628 unsigned Intrinsic) {
6629 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6630 SDLoc sdl = getCurSDLoc();
6631 DebugLoc dl = getCurDebugLoc();
6632 SDValue Res;
6633
6634 SDNodeFlags Flags;
6635 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
6636 Flags.copyFMF(*FPOp);
6637
6638 switch (Intrinsic) {
6639 default:
6640 // By default, turn this into a target intrinsic node.
6641 visitTargetIntrinsic(I, Intrinsic);
6642 return;
6643 case Intrinsic::vscale: {
6644 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6645 setValue(&I, DAG.getVScale(sdl, VT, APInt(VT.getSizeInBits(), 1)));
6646 return;
6647 }
6648 case Intrinsic::vastart: visitVAStart(I); return;
6649 case Intrinsic::vaend: visitVAEnd(I); return;
6650 case Intrinsic::vacopy: visitVACopy(I); return;
6651 case Intrinsic::returnaddress:
6652 setValue(&I, DAG.getNode(ISD::RETURNADDR, sdl,
6653 TLI.getValueType(DAG.getDataLayout(), I.getType()),
6654 getValue(I.getArgOperand(0))));
6655 return;
6656 case Intrinsic::addressofreturnaddress:
6657 setValue(&I,
6658 DAG.getNode(ISD::ADDROFRETURNADDR, sdl,
6659 TLI.getValueType(DAG.getDataLayout(), I.getType())));
6660 return;
6661 case Intrinsic::sponentry:
6662 setValue(&I,
6663 DAG.getNode(ISD::SPONENTRY, sdl,
6664 TLI.getValueType(DAG.getDataLayout(), I.getType())));
6665 return;
6666 case Intrinsic::frameaddress:
6667 setValue(&I, DAG.getNode(ISD::FRAMEADDR, sdl,
6668 TLI.getFrameIndexTy(DAG.getDataLayout()),
6669 getValue(I.getArgOperand(0))));
6670 return;
6671 case Intrinsic::read_volatile_register:
6672 case Intrinsic::read_register: {
6673 Value *Reg = I.getArgOperand(0);
6674 SDValue Chain = getRoot();
6676 DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
6677 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6678 Res = DAG.getNode(ISD::READ_REGISTER, sdl,
6679 DAG.getVTList(VT, MVT::Other), Chain, RegName);
6680 setValue(&I, Res);
6681 DAG.setRoot(Res.getValue(1));
6682 return;
6683 }
6684 case Intrinsic::write_register: {
6685 Value *Reg = I.getArgOperand(0);
6686 Value *RegValue = I.getArgOperand(1);
6687 SDValue Chain = getRoot();
6689 DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
6690 DAG.setRoot(DAG.getNode(ISD::WRITE_REGISTER, sdl, MVT::Other, Chain,
6691 RegName, getValue(RegValue)));
6692 return;
6693 }
6694 case Intrinsic::memcpy:
6695 case Intrinsic::memcpy_inline: {
6696 const auto &MCI = cast<MemCpyInst>(I);
6697 SDValue Dst = getValue(I.getArgOperand(0));
6698 SDValue Src = getValue(I.getArgOperand(1));
6699 SDValue Size = getValue(I.getArgOperand(2));
6700 assert((!MCI.isForceInlined() || isa<ConstantSDNode>(Size)) &&
6701 "memcpy_inline needs constant size");
6702 // @llvm.memcpy.inline defines 0 and 1 to both mean no alignment.
6703 Align DstAlign = MCI.getDestAlign().valueOrOne();
6704 Align SrcAlign = MCI.getSourceAlign().valueOrOne();
6705 Align Alignment = std::min(DstAlign, SrcAlign);
6706 bool isVol = MCI.isVolatile();
6707 // FIXME: Support passing different dest/src alignments to the memcpy DAG
6708 // node.
6709 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6710 SDValue MC = DAG.getMemcpy(Root, sdl, Dst, Src, Size, Alignment, isVol,
6711 MCI.isForceInlined(), &I, std::nullopt,
6712 MachinePointerInfo(I.getArgOperand(0)),
6713 MachinePointerInfo(I.getArgOperand(1)),
6714 I.getAAMetadata(), BatchAA);
6715 updateDAGForMaybeTailCall(MC);
6716 return;
6717 }
6718 case Intrinsic::memset:
6719 case Intrinsic::memset_inline: {
6720 const auto &MSII = cast<MemSetInst>(I);
6721 SDValue Dst = getValue(I.getArgOperand(0));
6722 SDValue Value = getValue(I.getArgOperand(1));
6723 SDValue Size = getValue(I.getArgOperand(2));
6724 assert((!MSII.isForceInlined() || isa<ConstantSDNode>(Size)) &&
6725 "memset_inline needs constant size");
6726 // @llvm.memset defines 0 and 1 to both mean no alignment.
6727 Align DstAlign = MSII.getDestAlign().valueOrOne();
6728 bool isVol = MSII.isVolatile();
6729 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6730 SDValue MC = DAG.getMemset(
6731 Root, sdl, Dst, Value, Size, DstAlign, isVol, MSII.isForceInlined(),
6732 &I, MachinePointerInfo(I.getArgOperand(0)), I.getAAMetadata());
6733 updateDAGForMaybeTailCall(MC);
6734 return;
6735 }
6736 case Intrinsic::memmove: {
6737 const auto &MMI = cast<MemMoveInst>(I);
6738 SDValue Op1 = getValue(I.getArgOperand(0));
6739 SDValue Op2 = getValue(I.getArgOperand(1));
6740 SDValue Op3 = getValue(I.getArgOperand(2));
6741 // @llvm.memmove defines 0 and 1 to both mean no alignment.
6742 Align DstAlign = MMI.getDestAlign().valueOrOne();
6743 Align SrcAlign = MMI.getSourceAlign().valueOrOne();
6744 Align Alignment = std::min(DstAlign, SrcAlign);
6745 bool isVol = MMI.isVolatile();
6746 // FIXME: Support passing different dest/src alignments to the memmove DAG
6747 // node.
6748 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6749 SDValue MM = DAG.getMemmove(Root, sdl, Op1, Op2, Op3, Alignment, isVol, &I,
6750 /* OverrideTailCall */ std::nullopt,
6751 MachinePointerInfo(I.getArgOperand(0)),
6752 MachinePointerInfo(I.getArgOperand(1)),
6753 I.getAAMetadata(), BatchAA);
6754 updateDAGForMaybeTailCall(MM);
6755 return;
6756 }
6757 case Intrinsic::memcpy_element_unordered_atomic: {
6758 auto &MI = cast<AnyMemCpyInst>(I);
6759 SDValue Dst = getValue(MI.getRawDest());
6760 SDValue Src = getValue(MI.getRawSource());
6761 SDValue Length = getValue(MI.getLength());
6762
6763 Type *LengthTy = MI.getLength()->getType();
6764 unsigned ElemSz = MI.getElementSizeInBytes();
6765 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6766 SDValue MC =
6767 DAG.getAtomicMemcpy(getRoot(), sdl, Dst, Src, Length, LengthTy, ElemSz,
6768 isTC, MachinePointerInfo(MI.getRawDest()),
6769 MachinePointerInfo(MI.getRawSource()));
6770 updateDAGForMaybeTailCall(MC);
6771 return;
6772 }
6773 case Intrinsic::memmove_element_unordered_atomic: {
6774 auto &MI = cast<AnyMemMoveInst>(I);
6775 SDValue Dst = getValue(MI.getRawDest());
6776 SDValue Src = getValue(MI.getRawSource());
6777 SDValue Length = getValue(MI.getLength());
6778
6779 Type *LengthTy = MI.getLength()->getType();
6780 unsigned ElemSz = MI.getElementSizeInBytes();
6781 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6782 SDValue MC =
6783 DAG.getAtomicMemmove(getRoot(), sdl, Dst, Src, Length, LengthTy, ElemSz,
6784 isTC, MachinePointerInfo(MI.getRawDest()),
6785 MachinePointerInfo(MI.getRawSource()));
6786 updateDAGForMaybeTailCall(MC);
6787 return;
6788 }
6789 case Intrinsic::memset_element_unordered_atomic: {
6790 auto &MI = cast<AnyMemSetInst>(I);
6791 SDValue Dst = getValue(MI.getRawDest());
6792 SDValue Val = getValue(MI.getValue());
6793 SDValue Length = getValue(MI.getLength());
6794
6795 Type *LengthTy = MI.getLength()->getType();
6796 unsigned ElemSz = MI.getElementSizeInBytes();
6797 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6798 SDValue MC =
6799 DAG.getAtomicMemset(getRoot(), sdl, Dst, Val, Length, LengthTy, ElemSz,
6800 isTC, MachinePointerInfo(MI.getRawDest()));
6801 updateDAGForMaybeTailCall(MC);
6802 return;
6803 }
6804 case Intrinsic::call_preallocated_setup: {
6805 const CallBase *PreallocatedCall = FindPreallocatedCall(&I);
6806 SDValue SrcValue = DAG.getSrcValue(PreallocatedCall);
6807 SDValue Res = DAG.getNode(ISD::PREALLOCATED_SETUP, sdl, MVT::Other,
6808 getRoot(), SrcValue);
6809 setValue(&I, Res);
6810 DAG.setRoot(Res);
6811 return;
6812 }
6813 case Intrinsic::call_preallocated_arg: {
6814 const CallBase *PreallocatedCall = FindPreallocatedCall(I.getOperand(0));
6815 SDValue SrcValue = DAG.getSrcValue(PreallocatedCall);
6816 SDValue Ops[3];
6817 Ops[0] = getRoot();
6818 Ops[1] = SrcValue;
6819 Ops[2] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(1)), sdl,
6820 MVT::i32); // arg index
6821 SDValue Res = DAG.getNode(
6823 DAG.getVTList(TLI.getPointerTy(DAG.getDataLayout()), MVT::Other), Ops);
6824 setValue(&I, Res);
6825 DAG.setRoot(Res.getValue(1));
6826 return;
6827 }
6828
6829 case Intrinsic::eh_typeid_for: {
6830 // Find the type id for the given typeinfo.
6831 GlobalValue *GV = ExtractTypeInfo(I.getArgOperand(0));
6832 unsigned TypeID = DAG.getMachineFunction().getTypeIDFor(GV);
6833 Res = DAG.getConstant(TypeID, sdl, MVT::i32);
6834 setValue(&I, Res);
6835 return;
6836 }
6837
6838 case Intrinsic::eh_return_i32:
6839 case Intrinsic::eh_return_i64:
6840 DAG.getMachineFunction().setCallsEHReturn(true);
6841 DAG.setRoot(DAG.getNode(ISD::EH_RETURN, sdl,
6842 MVT::Other,
6844 getValue(I.getArgOperand(0)),
6845 getValue(I.getArgOperand(1))));
6846 return;
6847 case Intrinsic::eh_unwind_init:
6848 DAG.getMachineFunction().setCallsUnwindInit(true);
6849 return;
6850 case Intrinsic::eh_dwarf_cfa:
6851 setValue(&I, DAG.getNode(ISD::EH_DWARF_CFA, sdl,
6852 TLI.getPointerTy(DAG.getDataLayout()),
6853 getValue(I.getArgOperand(0))));
6854 return;
6855 case Intrinsic::eh_sjlj_callsite: {
6856 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(0));
6857 assert(FuncInfo.getCurrentCallSite() == 0 && "Overlapping call sites!");
6858
6859 FuncInfo.setCurrentCallSite(CI->getZExtValue());
6860 return;
6861 }
6862 case Intrinsic::eh_sjlj_functioncontext: {
6863 // Get and store the index of the function context.
6864 MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo();
6865 AllocaInst *FnCtx =
6866 cast<AllocaInst>(I.getArgOperand(0)->stripPointerCasts());
6867 int FI = FuncInfo.StaticAllocaMap[FnCtx];
6869 return;
6870 }
6871 case Intrinsic::eh_sjlj_setjmp: {
6872 SDValue Ops[2];
6873 Ops[0] = getRoot();
6874 Ops[1] = getValue(I.getArgOperand(0));
6875 SDValue Op = DAG.getNode(ISD::EH_SJLJ_SETJMP, sdl,
6876 DAG.getVTList(MVT::i32, MVT::Other), Ops);
6877 setValue(&I, Op.getValue(0));
6878 DAG.setRoot(Op.getValue(1));
6879 return;
6880 }
6881 case Intrinsic::eh_sjlj_longjmp:
6882 DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_LONGJMP, sdl, MVT::Other,
6883 getRoot(), getValue(I.getArgOperand(0))));
6884 return;
6885 case Intrinsic::eh_sjlj_setup_dispatch:
6886 DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_SETUP_DISPATCH, sdl, MVT::Other,
6887 getRoot()));
6888 return;
6889 case Intrinsic::masked_gather:
6890 visitMaskedGather(I);
6891 return;
6892 case Intrinsic::masked_load:
6893 visitMaskedLoad(I);
6894 return;
6895 case Intrinsic::masked_scatter:
6896 visitMaskedScatter(I);
6897 return;
6898 case Intrinsic::masked_store:
6899 visitMaskedStore(I);
6900 return;
6901 case Intrinsic::masked_expandload:
6902 visitMaskedLoad(I, true /* IsExpanding */);
6903 return;
6904 case Intrinsic::masked_compressstore:
6905 visitMaskedStore(I, true /* IsCompressing */);
6906 return;
6907 case Intrinsic::powi:
6908 setValue(&I, ExpandPowI(sdl, getValue(I.getArgOperand(0)),
6909 getValue(I.getArgOperand(1)), DAG));
6910 return;
6911 case Intrinsic::log:
6912 setValue(&I, expandLog(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6913 return;
6914 case Intrinsic::log2:
6915 setValue(&I,
6916 expandLog2(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6917 return;
6918 case Intrinsic::log10:
6919 setValue(&I,
6920 expandLog10(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6921 return;
6922 case Intrinsic::exp:
6923 setValue(&I, expandExp(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6924 return;
6925 case Intrinsic::exp2:
6926 setValue(&I,
6927 expandExp2(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6928 return;
6929 case Intrinsic::pow:
6930 setValue(&I, expandPow(sdl, getValue(I.getArgOperand(0)),
6931 getValue(I.getArgOperand(1)), DAG, TLI, Flags));
6932 return;
6933 case Intrinsic::sqrt:
6934 case Intrinsic::fabs:
6935 case Intrinsic::sin:
6936 case Intrinsic::cos:
6937 case Intrinsic::tan:
6938 case Intrinsic::asin:
6939 case Intrinsic::acos:
6940 case Intrinsic::atan:
6941 case Intrinsic::sinh:
6942 case Intrinsic::cosh:
6943 case Intrinsic::tanh:
6944 case Intrinsic::exp10:
6945 case Intrinsic::floor:
6946 case Intrinsic::ceil:
6947 case Intrinsic::trunc:
6948 case Intrinsic::rint:
6949 case Intrinsic::nearbyint:
6950 case Intrinsic::round:
6951 case Intrinsic::roundeven:
6952 case Intrinsic::canonicalize: {
6953 unsigned Opcode;
6954 // clang-format off
6955 switch (Intrinsic) {
6956 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
6957 case Intrinsic::sqrt: Opcode = ISD::FSQRT; break;
6958 case Intrinsic::fabs: Opcode = ISD::FABS; break;
6959 case Intrinsic::sin: Opcode = ISD::FSIN; break;
6960 case Intrinsic::cos: Opcode = ISD::FCOS; break;
6961 case Intrinsic::tan: Opcode = ISD::FTAN; break;
6962 case Intrinsic::asin: Opcode = ISD::FASIN; break;
6963 case Intrinsic::acos: Opcode = ISD::FACOS; break;
6964 case Intrinsic::atan: Opcode = ISD::FATAN; break;
6965 case Intrinsic::sinh: Opcode = ISD::FSINH; break;
6966 case Intrinsic::cosh: Opcode = ISD::FCOSH; break;
6967 case Intrinsic::tanh: Opcode = ISD::FTANH; break;
6968 case Intrinsic::exp10: Opcode = ISD::FEXP10; break;
6969 case Intrinsic::floor: Opcode = ISD::FFLOOR; break;
6970 case Intrinsic::ceil: Opcode = ISD::FCEIL; break;
6971 case Intrinsic::trunc: Opcode = ISD::FTRUNC; break;
6972 case Intrinsic::rint: Opcode = ISD::FRINT; break;
6973 case Intrinsic::nearbyint: Opcode = ISD::FNEARBYINT; break;
6974 case Intrinsic::round: Opcode = ISD::FROUND; break;
6975 case Intrinsic::roundeven: Opcode = ISD::FROUNDEVEN; break;
6976 case Intrinsic::canonicalize: Opcode = ISD::FCANONICALIZE; break;
6977 }
6978 // clang-format on
6979
6980 setValue(&I, DAG.getNode(Opcode, sdl,
6981 getValue(I.getArgOperand(0)).getValueType(),
6982 getValue(I.getArgOperand(0)), Flags));
6983 return;
6984 }
6985 case Intrinsic::atan2:
6986 setValue(&I, DAG.getNode(ISD::FATAN2, sdl,
6987 getValue(I.getArgOperand(0)).getValueType(),
6988 getValue(I.getArgOperand(0)),
6989 getValue(I.getArgOperand(1)), Flags));
6990 return;
6991 case Intrinsic::lround:
6992 case Intrinsic::llround:
6993 case Intrinsic::lrint:
6994 case Intrinsic::llrint: {
6995 unsigned Opcode;
6996 // clang-format off
6997 switch (Intrinsic) {
6998 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
6999 case Intrinsic::lround: Opcode = ISD::LROUND; break;
7000 case Intrinsic::llround: Opcode = ISD::LLROUND; break;
7001 case Intrinsic::lrint: Opcode = ISD::LRINT; break;
7002 case Intrinsic::llrint: Opcode = ISD::LLRINT; break;
7003 }
7004 // clang-format on
7005
7006 EVT RetVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7007 setValue(&I, DAG.getNode(Opcode, sdl, RetVT,
7008 getValue(I.getArgOperand(0))));
7009 return;
7010 }
7011 case Intrinsic::minnum:
7012 setValue(&I, DAG.getNode(ISD::FMINNUM, sdl,
7013 getValue(I.getArgOperand(0)).getValueType(),
7014 getValue(I.getArgOperand(0)),
7015 getValue(I.getArgOperand(1)), Flags));
7016 return;
7017 case Intrinsic::maxnum:
7018 setValue(&I, DAG.getNode(ISD::FMAXNUM, sdl,
7019 getValue(I.getArgOperand(0)).getValueType(),
7020 getValue(I.getArgOperand(0)),
7021 getValue(I.getArgOperand(1)), Flags));
7022 return;
7023 case Intrinsic::minimum:
7024 setValue(&I, DAG.getNode(ISD::FMINIMUM, sdl,
7025 getValue(I.getArgOperand(0)).getValueType(),
7026 getValue(I.getArgOperand(0)),
7027 getValue(I.getArgOperand(1)), Flags));
7028 return;
7029 case Intrinsic::maximum:
7030 setValue(&I, DAG.getNode(ISD::FMAXIMUM, sdl,
7031 getValue(I.getArgOperand(0)).getValueType(),
7032 getValue(I.getArgOperand(0)),
7033 getValue(I.getArgOperand(1)), Flags));
7034 return;
7035 case Intrinsic::minimumnum:
7036 setValue(&I, DAG.getNode(ISD::FMINIMUMNUM, sdl,
7037 getValue(I.getArgOperand(0)).getValueType(),
7038 getValue(I.getArgOperand(0)),
7039 getValue(I.getArgOperand(1)), Flags));
7040 return;
7041 case Intrinsic::maximumnum:
7042 setValue(&I, DAG.getNode(ISD::FMAXIMUMNUM, sdl,
7043 getValue(I.getArgOperand(0)).getValueType(),
7044 getValue(I.getArgOperand(0)),
7045 getValue(I.getArgOperand(1)), Flags));
7046 return;
7047 case Intrinsic::copysign:
7048 setValue(&I, DAG.getNode(ISD::FCOPYSIGN, sdl,
7049 getValue(I.getArgOperand(0)).getValueType(),
7050 getValue(I.getArgOperand(0)),
7051 getValue(I.getArgOperand(1)), Flags));
7052 return;
7053 case Intrinsic::ldexp:
7054 setValue(&I, DAG.getNode(ISD::FLDEXP, sdl,
7055 getValue(I.getArgOperand(0)).getValueType(),
7056 getValue(I.getArgOperand(0)),
7057 getValue(I.getArgOperand(1)), Flags));
7058 return;
7059 case Intrinsic::modf:
7060 case Intrinsic::sincos:
7061 case Intrinsic::sincospi:
7062 case Intrinsic::frexp: {
7063 unsigned Opcode;
7064 switch (Intrinsic) {
7065 default:
7066 llvm_unreachable("unexpected intrinsic");
7067 case Intrinsic::sincos:
7068 Opcode = ISD::FSINCOS;
7069 break;
7070 case Intrinsic::sincospi:
7071 Opcode = ISD::FSINCOSPI;
7072 break;
7073 case Intrinsic::modf:
7074 Opcode = ISD::FMODF;
7075 break;
7076 case Intrinsic::frexp:
7077 Opcode = ISD::FFREXP;
7078 break;
7079 }
7080 SmallVector<EVT, 2> ValueVTs;
7081 ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);
7082 SDVTList VTs = DAG.getVTList(ValueVTs);
7083 setValue(
7084 &I, DAG.getNode(Opcode, sdl, VTs, getValue(I.getArgOperand(0)), Flags));
7085 return;
7086 }
7087 case Intrinsic::arithmetic_fence: {
7088 setValue(&I, DAG.getNode(ISD::ARITH_FENCE, sdl,
7089 getValue(I.getArgOperand(0)).getValueType(),
7090 getValue(I.getArgOperand(0)), Flags));
7091 return;
7092 }
7093 case Intrinsic::fma:
7094 setValue(&I, DAG.getNode(
7095 ISD::FMA, sdl, getValue(I.getArgOperand(0)).getValueType(),
7096 getValue(I.getArgOperand(0)), getValue(I.getArgOperand(1)),
7097 getValue(I.getArgOperand(2)), Flags));
7098 return;
7099#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
7100 case Intrinsic::INTRINSIC:
7101#include "llvm/IR/ConstrainedOps.def"
7102 visitConstrainedFPIntrinsic(cast<ConstrainedFPIntrinsic>(I));
7103 return;
7104#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID:
7105#include "llvm/IR/VPIntrinsics.def"
7106 visitVectorPredicationIntrinsic(cast<VPIntrinsic>(I));
7107 return;
7108 case Intrinsic::fptrunc_round: {
7109 // Get the last argument, the metadata and convert it to an integer in the
7110 // call
7111 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(1))->getMetadata();
7112 std::optional<RoundingMode> RoundMode =
7113 convertStrToRoundingMode(cast<MDString>(MD)->getString());
7114
7115 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7116
7117 // Propagate fast-math-flags from IR to node(s).
7118 SDNodeFlags Flags;
7119 Flags.copyFMF(*cast<FPMathOperator>(&I));
7120 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
7121
7123 Result = DAG.getNode(
7124 ISD::FPTRUNC_ROUND, sdl, VT, getValue(I.getArgOperand(0)),
7125 DAG.getTargetConstant((int)*RoundMode, sdl, MVT::i32));
7126 setValue(&I, Result);
7127
7128 return;
7129 }
7130 case Intrinsic::fmuladd: {
7131 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7132 if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
7133 TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), VT)) {
7134 setValue(&I, DAG.getNode(ISD::FMA, sdl,
7135 getValue(I.getArgOperand(0)).getValueType(),
7136 getValue(I.getArgOperand(0)),
7137 getValue(I.getArgOperand(1)),
7138 getValue(I.getArgOperand(2)), Flags));
7139 } else if (TLI.isOperationLegalOrCustom(ISD::FMULADD, VT)) {
7140 // TODO: Support splitting the vector.
7141 setValue(&I, DAG.getNode(ISD::FMULADD, sdl,
7142 getValue(I.getArgOperand(0)).getValueType(),
7143 getValue(I.getArgOperand(0)),
7144 getValue(I.getArgOperand(1)),
7145 getValue(I.getArgOperand(2)), Flags));
7146 } else {
7147 // TODO: Intrinsic calls should have fast-math-flags.
7148 SDValue Mul = DAG.getNode(
7149 ISD::FMUL, sdl, getValue(I.getArgOperand(0)).getValueType(),
7150 getValue(I.getArgOperand(0)), getValue(I.getArgOperand(1)), Flags);
7151 SDValue Add = DAG.getNode(ISD::FADD, sdl,
7152 getValue(I.getArgOperand(0)).getValueType(),
7153 Mul, getValue(I.getArgOperand(2)), Flags);
7154 setValue(&I, Add);
7155 }
7156 return;
7157 }
7158 case Intrinsic::fptosi_sat: {
7159 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7160 setValue(&I, DAG.getNode(ISD::FP_TO_SINT_SAT, sdl, VT,
7161 getValue(I.getArgOperand(0)),
7162 DAG.getValueType(VT.getScalarType())));
7163 return;
7164 }
7165 case Intrinsic::fptoui_sat: {
7166 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7167 setValue(&I, DAG.getNode(ISD::FP_TO_UINT_SAT, sdl, VT,
7168 getValue(I.getArgOperand(0)),
7169 DAG.getValueType(VT.getScalarType())));
7170 return;
7171 }
7172 case Intrinsic::convert_from_arbitrary_fp: {
7173 // Extract format metadata and convert to semantics enum.
7174 EVT DstVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7175 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(1))->getMetadata();
7176 StringRef FormatStr = cast<MDString>(MD)->getString();
7177 const fltSemantics *SrcSem =
7179 if (!SrcSem) {
7180 DAG.getContext()->emitError(
7181 "convert_from_arbitrary_fp: not implemented format '" + FormatStr +
7182 "'");
7183 setValue(&I, DAG.getPOISON(DstVT));
7184 return;
7185 }
7187
7188 SDValue IntVal = getValue(I.getArgOperand(0));
7189
7190 // Emit ISD::CONVERT_FROM_ARBITRARY_FP node.
7191 SDValue SemConst =
7192 DAG.getTargetConstant(static_cast<int>(SemEnum), sdl, MVT::i32);
7193 setValue(&I, DAG.getNode(ISD::CONVERT_FROM_ARBITRARY_FP, sdl, DstVT, IntVal,
7194 SemConst));
7195 return;
7196 }
7197 case Intrinsic::set_rounding:
7198 Res = DAG.getNode(ISD::SET_ROUNDING, sdl, MVT::Other,
7199 {getRoot(), getValue(I.getArgOperand(0))});
7200 setValue(&I, Res);
7201 DAG.setRoot(Res.getValue(0));
7202 return;
7203 case Intrinsic::is_fpclass: {
7204 const DataLayout DLayout = DAG.getDataLayout();
7205 EVT DestVT = TLI.getValueType(DLayout, I.getType());
7206 EVT ArgVT = TLI.getValueType(DLayout, I.getArgOperand(0)->getType());
7207 FPClassTest Test = static_cast<FPClassTest>(
7208 cast<ConstantInt>(I.getArgOperand(1))->getZExtValue());
7209 MachineFunction &MF = DAG.getMachineFunction();
7210 const Function &F = MF.getFunction();
7211 SDValue Op = getValue(I.getArgOperand(0));
7212 SDNodeFlags Flags;
7213 Flags.setNoFPExcept(
7214 !F.getAttributes().hasFnAttr(llvm::Attribute::StrictFP));
7215 // If ISD::IS_FPCLASS should be expanded, do it right now, because the
7216 // expansion can use illegal types. Making expansion early allows
7217 // legalizing these types prior to selection.
7218 if (!TLI.isOperationLegal(ISD::IS_FPCLASS, ArgVT) &&
7219 !TLI.isOperationCustom(ISD::IS_FPCLASS, ArgVT)) {
7220 SDValue Result = TLI.expandIS_FPCLASS(DestVT, Op, Test, Flags, sdl, DAG);
7221 setValue(&I, Result);
7222 return;
7223 }
7224
7225 SDValue Check = DAG.getTargetConstant(Test, sdl, MVT::i32);
7226 SDValue V = DAG.getNode(ISD::IS_FPCLASS, sdl, DestVT, {Op, Check}, Flags);
7227 setValue(&I, V);
7228 return;
7229 }
7230 case Intrinsic::get_fpenv: {
7231 const DataLayout DLayout = DAG.getDataLayout();
7232 EVT EnvVT = TLI.getValueType(DLayout, I.getType());
7233 Align TempAlign = DAG.getEVTAlign(EnvVT);
7234 SDValue Chain = getRoot();
7235 // Use GET_FPENV if it is legal or custom. Otherwise use memory-based node
7236 // and temporary storage in stack.
7237 if (TLI.isOperationLegalOrCustom(ISD::GET_FPENV, EnvVT)) {
7238 Res = DAG.getNode(
7239 ISD::GET_FPENV, sdl,
7240 DAG.getVTList(TLI.getValueType(DAG.getDataLayout(), I.getType()),
7241 MVT::Other),
7242 Chain);
7243 } else {
7244 SDValue Temp = DAG.CreateStackTemporary(EnvVT, TempAlign.value());
7245 int SPFI = cast<FrameIndexSDNode>(Temp.getNode())->getIndex();
7246 auto MPI =
7247 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI);
7248 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
7250 TempAlign);
7251 Chain = DAG.getGetFPEnv(Chain, sdl, Temp, EnvVT, MMO);
7252 Res = DAG.getLoad(EnvVT, sdl, Chain, Temp, MPI);
7253 }
7254 setValue(&I, Res);
7255 DAG.setRoot(Res.getValue(1));
7256 return;
7257 }
7258 case Intrinsic::set_fpenv: {
7259 const DataLayout DLayout = DAG.getDataLayout();
7260 SDValue Env = getValue(I.getArgOperand(0));
7261 EVT EnvVT = Env.getValueType();
7262 Align TempAlign = DAG.getEVTAlign(EnvVT);
7263 SDValue Chain = getRoot();
7264 // If SET_FPENV is custom or legal, use it. Otherwise use loading
7265 // environment from memory.
7266 if (TLI.isOperationLegalOrCustom(ISD::SET_FPENV, EnvVT)) {
7267 Chain = DAG.getNode(ISD::SET_FPENV, sdl, MVT::Other, Chain, Env);
7268 } else {
7269 // Allocate space in stack, copy environment bits into it and use this
7270 // memory in SET_FPENV_MEM.
7271 SDValue Temp = DAG.CreateStackTemporary(EnvVT, TempAlign.value());
7272 int SPFI = cast<FrameIndexSDNode>(Temp.getNode())->getIndex();
7273 auto MPI =
7274 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI);
7275 Chain = DAG.getStore(Chain, sdl, Env, Temp, MPI, TempAlign,
7277 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
7279 TempAlign);
7280 Chain = DAG.getSetFPEnv(Chain, sdl, Temp, EnvVT, MMO);
7281 }
7282 DAG.setRoot(Chain);
7283 return;
7284 }
7285 case Intrinsic::reset_fpenv:
7286 DAG.setRoot(DAG.getNode(ISD::RESET_FPENV, sdl, MVT::Other, getRoot()));
7287 return;
7288 case Intrinsic::get_fpmode:
7289 Res = DAG.getNode(
7290 ISD::GET_FPMODE, sdl,
7291 DAG.getVTList(TLI.getValueType(DAG.getDataLayout(), I.getType()),
7292 MVT::Other),
7293 DAG.getRoot());
7294 setValue(&I, Res);
7295 DAG.setRoot(Res.getValue(1));
7296 return;
7297 case Intrinsic::set_fpmode:
7298 Res = DAG.getNode(ISD::SET_FPMODE, sdl, MVT::Other, {DAG.getRoot()},
7299 getValue(I.getArgOperand(0)));
7300 DAG.setRoot(Res);
7301 return;
7302 case Intrinsic::reset_fpmode: {
7303 Res = DAG.getNode(ISD::RESET_FPMODE, sdl, MVT::Other, getRoot());
7304 DAG.setRoot(Res);
7305 return;
7306 }
7307 case Intrinsic::pcmarker: {
7308 SDValue Tmp = getValue(I.getArgOperand(0));
7309 DAG.setRoot(DAG.getNode(ISD::PCMARKER, sdl, MVT::Other, getRoot(), Tmp));
7310 return;
7311 }
7312 case Intrinsic::readcyclecounter: {
7313 SDValue Op = getRoot();
7314 Res = DAG.getNode(ISD::READCYCLECOUNTER, sdl,
7315 DAG.getVTList(MVT::i64, MVT::Other), Op);
7316 setValue(&I, Res);
7317 DAG.setRoot(Res.getValue(1));
7318 return;
7319 }
7320 case Intrinsic::readsteadycounter: {
7321 SDValue Op = getRoot();
7322 Res = DAG.getNode(ISD::READSTEADYCOUNTER, sdl,
7323 DAG.getVTList(MVT::i64, MVT::Other), Op);
7324 setValue(&I, Res);
7325 DAG.setRoot(Res.getValue(1));
7326 return;
7327 }
7328 case Intrinsic::bitreverse:
7329 setValue(&I, DAG.getNode(ISD::BITREVERSE, sdl,
7330 getValue(I.getArgOperand(0)).getValueType(),
7331 getValue(I.getArgOperand(0))));
7332 return;
7333 case Intrinsic::bswap:
7334 setValue(&I, DAG.getNode(ISD::BSWAP, sdl,
7335 getValue(I.getArgOperand(0)).getValueType(),
7336 getValue(I.getArgOperand(0))));
7337 return;
7338 case Intrinsic::cttz: {
7339 SDValue Arg = getValue(I.getArgOperand(0));
7340 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
7341 EVT Ty = Arg.getValueType();
7342 setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTTZ : ISD::CTTZ_ZERO_UNDEF,
7343 sdl, Ty, Arg));
7344 return;
7345 }
7346 case Intrinsic::ctlz: {
7347 SDValue Arg = getValue(I.getArgOperand(0));
7348 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
7349 EVT Ty = Arg.getValueType();
7350 setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTLZ : ISD::CTLZ_ZERO_UNDEF,
7351 sdl, Ty, Arg));
7352 return;
7353 }
7354 case Intrinsic::ctpop: {
7355 SDValue Arg = getValue(I.getArgOperand(0));
7356 EVT Ty = Arg.getValueType();
7357 setValue(&I, DAG.getNode(ISD::CTPOP, sdl, Ty, Arg));
7358 return;
7359 }
7360 case Intrinsic::fshl:
7361 case Intrinsic::fshr: {
7362 bool IsFSHL = Intrinsic == Intrinsic::fshl;
7363 SDValue X = getValue(I.getArgOperand(0));
7364 SDValue Y = getValue(I.getArgOperand(1));
7365 SDValue Z = getValue(I.getArgOperand(2));
7366 EVT VT = X.getValueType();
7367
7368 if (X == Y) {
7369 auto RotateOpcode = IsFSHL ? ISD::ROTL : ISD::ROTR;
7370 setValue(&I, DAG.getNode(RotateOpcode, sdl, VT, X, Z));
7371 } else {
7372 auto FunnelOpcode = IsFSHL ? ISD::FSHL : ISD::FSHR;
7373 setValue(&I, DAG.getNode(FunnelOpcode, sdl, VT, X, Y, Z));
7374 }
7375 return;
7376 }
7377 case Intrinsic::clmul: {
7378 SDValue X = getValue(I.getArgOperand(0));
7379 SDValue Y = getValue(I.getArgOperand(1));
7380 setValue(&I, DAG.getNode(ISD::CLMUL, sdl, X.getValueType(), X, Y));
7381 return;
7382 }
7383 case Intrinsic::sadd_sat: {
7384 SDValue Op1 = getValue(I.getArgOperand(0));
7385 SDValue Op2 = getValue(I.getArgOperand(1));
7386 setValue(&I, DAG.getNode(ISD::SADDSAT, sdl, Op1.getValueType(), Op1, Op2));
7387 return;
7388 }
7389 case Intrinsic::uadd_sat: {
7390 SDValue Op1 = getValue(I.getArgOperand(0));
7391 SDValue Op2 = getValue(I.getArgOperand(1));
7392 setValue(&I, DAG.getNode(ISD::UADDSAT, sdl, Op1.getValueType(), Op1, Op2));
7393 return;
7394 }
7395 case Intrinsic::ssub_sat: {
7396 SDValue Op1 = getValue(I.getArgOperand(0));
7397 SDValue Op2 = getValue(I.getArgOperand(1));
7398 setValue(&I, DAG.getNode(ISD::SSUBSAT, sdl, Op1.getValueType(), Op1, Op2));
7399 return;
7400 }
7401 case Intrinsic::usub_sat: {
7402 SDValue Op1 = getValue(I.getArgOperand(0));
7403 SDValue Op2 = getValue(I.getArgOperand(1));
7404 setValue(&I, DAG.getNode(ISD::USUBSAT, sdl, Op1.getValueType(), Op1, Op2));
7405 return;
7406 }
7407 case Intrinsic::sshl_sat:
7408 case Intrinsic::ushl_sat: {
7409 SDValue Op1 = getValue(I.getArgOperand(0));
7410 SDValue Op2 = getValue(I.getArgOperand(1));
7411
7412 EVT ShiftTy = DAG.getTargetLoweringInfo().getShiftAmountTy(
7413 Op1.getValueType(), DAG.getDataLayout());
7414
7415 // Coerce the shift amount to the right type if we can. This exposes the
7416 // truncate or zext to optimization early.
7417 if (!I.getType()->isVectorTy() && Op2.getValueType() != ShiftTy) {
7418 assert(ShiftTy.getSizeInBits() >=
7420 "Unexpected shift type");
7421 Op2 = DAG.getZExtOrTrunc(Op2, getCurSDLoc(), ShiftTy);
7422 }
7423
7424 unsigned Opc =
7425 Intrinsic == Intrinsic::sshl_sat ? ISD::SSHLSAT : ISD::USHLSAT;
7426 setValue(&I, DAG.getNode(Opc, sdl, Op1.getValueType(), Op1, Op2));
7427 return;
7428 }
7429 case Intrinsic::smul_fix:
7430 case Intrinsic::umul_fix:
7431 case Intrinsic::smul_fix_sat:
7432 case Intrinsic::umul_fix_sat: {
7433 SDValue Op1 = getValue(I.getArgOperand(0));
7434 SDValue Op2 = getValue(I.getArgOperand(1));
7435 SDValue Op3 = getValue(I.getArgOperand(2));
7436 setValue(&I, DAG.getNode(FixedPointIntrinsicToOpcode(Intrinsic), sdl,
7437 Op1.getValueType(), Op1, Op2, Op3));
7438 return;
7439 }
7440 case Intrinsic::sdiv_fix:
7441 case Intrinsic::udiv_fix:
7442 case Intrinsic::sdiv_fix_sat:
7443 case Intrinsic::udiv_fix_sat: {
7444 SDValue Op1 = getValue(I.getArgOperand(0));
7445 SDValue Op2 = getValue(I.getArgOperand(1));
7446 SDValue Op3 = getValue(I.getArgOperand(2));
7448 Op1, Op2, Op3, DAG, TLI));
7449 return;
7450 }
7451 case Intrinsic::smax: {
7452 SDValue Op1 = getValue(I.getArgOperand(0));
7453 SDValue Op2 = getValue(I.getArgOperand(1));
7454 setValue(&I, DAG.getNode(ISD::SMAX, sdl, Op1.getValueType(), Op1, Op2));
7455 return;
7456 }
7457 case Intrinsic::smin: {
7458 SDValue Op1 = getValue(I.getArgOperand(0));
7459 SDValue Op2 = getValue(I.getArgOperand(1));
7460 setValue(&I, DAG.getNode(ISD::SMIN, sdl, Op1.getValueType(), Op1, Op2));
7461 return;
7462 }
7463 case Intrinsic::umax: {
7464 SDValue Op1 = getValue(I.getArgOperand(0));
7465 SDValue Op2 = getValue(I.getArgOperand(1));
7466 setValue(&I, DAG.getNode(ISD::UMAX, sdl, Op1.getValueType(), Op1, Op2));
7467 return;
7468 }
7469 case Intrinsic::umin: {
7470 SDValue Op1 = getValue(I.getArgOperand(0));
7471 SDValue Op2 = getValue(I.getArgOperand(1));
7472 setValue(&I, DAG.getNode(ISD::UMIN, sdl, Op1.getValueType(), Op1, Op2));
7473 return;
7474 }
7475 case Intrinsic::abs: {
7476 // TODO: Preserve "int min is poison" arg in SDAG?
7477 SDValue Op1 = getValue(I.getArgOperand(0));
7478 setValue(&I, DAG.getNode(ISD::ABS, sdl, Op1.getValueType(), Op1));
7479 return;
7480 }
7481 case Intrinsic::scmp: {
7482 SDValue Op1 = getValue(I.getArgOperand(0));
7483 SDValue Op2 = getValue(I.getArgOperand(1));
7484 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7485 setValue(&I, DAG.getNode(ISD::SCMP, sdl, DestVT, Op1, Op2));
7486 break;
7487 }
7488 case Intrinsic::ucmp: {
7489 SDValue Op1 = getValue(I.getArgOperand(0));
7490 SDValue Op2 = getValue(I.getArgOperand(1));
7491 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7492 setValue(&I, DAG.getNode(ISD::UCMP, sdl, DestVT, Op1, Op2));
7493 break;
7494 }
7495 case Intrinsic::stackaddress:
7496 case Intrinsic::stacksave: {
7497 unsigned SDOpcode = Intrinsic == Intrinsic::stackaddress ? ISD::STACKADDRESS
7499 SDValue Op = getRoot();
7500 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7501 Res = DAG.getNode(SDOpcode, sdl, DAG.getVTList(VT, MVT::Other), Op);
7502 setValue(&I, Res);
7503 DAG.setRoot(Res.getValue(1));
7504 return;
7505 }
7506 case Intrinsic::stackrestore:
7507 Res = getValue(I.getArgOperand(0));
7508 DAG.setRoot(DAG.getNode(ISD::STACKRESTORE, sdl, MVT::Other, getRoot(), Res));
7509 return;
7510 case Intrinsic::get_dynamic_area_offset: {
7511 SDValue Op = getRoot();
7512 EVT ResTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
7513 Res = DAG.getNode(ISD::GET_DYNAMIC_AREA_OFFSET, sdl, DAG.getVTList(ResTy),
7514 Op);
7515 DAG.setRoot(Op);
7516 setValue(&I, Res);
7517 return;
7518 }
7519 case Intrinsic::stackguard: {
7520 MachineFunction &MF = DAG.getMachineFunction();
7521 const Module &M = *MF.getFunction().getParent();
7522 EVT PtrTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
7523 SDValue Chain = getRoot();
7524 if (TLI.useLoadStackGuardNode(M)) {
7525 Res = getLoadStackGuard(DAG, sdl, Chain);
7526 Res = DAG.getPtrExtOrTrunc(Res, sdl, PtrTy);
7527 } else {
7528 const Value *Global = TLI.getSDagStackGuard(M, DAG.getLibcalls());
7529 if (!Global) {
7530 LLVMContext &Ctx = *DAG.getContext();
7531 Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
7532 setValue(&I, DAG.getPOISON(PtrTy));
7533 return;
7534 }
7535
7536 Align Align = DAG.getDataLayout().getPrefTypeAlign(Global->getType());
7537 Res = DAG.getLoad(PtrTy, sdl, Chain, getValue(Global),
7538 MachinePointerInfo(Global, 0), Align,
7540 }
7541 if (TLI.useStackGuardXorFP())
7542 Res = TLI.emitStackGuardXorFP(DAG, Res, sdl);
7543 DAG.setRoot(Chain);
7544 setValue(&I, Res);
7545 return;
7546 }
7547 case Intrinsic::stackprotector: {
7548 // Emit code into the DAG to store the stack guard onto the stack.
7549 MachineFunction &MF = DAG.getMachineFunction();
7550 MachineFrameInfo &MFI = MF.getFrameInfo();
7551 const Module &M = *MF.getFunction().getParent();
7552 SDValue Src, Chain = getRoot();
7553
7554 if (TLI.useLoadStackGuardNode(M))
7555 Src = getLoadStackGuard(DAG, sdl, Chain);
7556 else
7557 Src = getValue(I.getArgOperand(0)); // The guard's value.
7558
7559 AllocaInst *Slot = cast<AllocaInst>(I.getArgOperand(1));
7560
7561 int FI = FuncInfo.StaticAllocaMap[Slot];
7562 MFI.setStackProtectorIndex(FI);
7563 EVT PtrTy = TLI.getFrameIndexTy(DAG.getDataLayout());
7564
7565 SDValue FIN = DAG.getFrameIndex(FI, PtrTy);
7566
7567 // Store the stack protector onto the stack.
7568 Res = DAG.getStore(
7569 Chain, sdl, Src, FIN,
7570 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI),
7571 MaybeAlign(), MachineMemOperand::MOVolatile);
7572 setValue(&I, Res);
7573 DAG.setRoot(Res);
7574 return;
7575 }
7576 case Intrinsic::objectsize:
7577 llvm_unreachable("llvm.objectsize.* should have been lowered already");
7578
7579 case Intrinsic::is_constant:
7580 llvm_unreachable("llvm.is.constant.* should have been lowered already");
7581
7582 case Intrinsic::annotation:
7583 case Intrinsic::ptr_annotation:
7584 case Intrinsic::launder_invariant_group:
7585 case Intrinsic::strip_invariant_group:
7586 // Drop the intrinsic, but forward the value
7587 setValue(&I, getValue(I.getOperand(0)));
7588 return;
7589
7590 case Intrinsic::type_test:
7591 case Intrinsic::public_type_test:
7592 reportFatalUsageError("llvm.type.test intrinsic must be lowered by the "
7593 "LowerTypeTests pass before code generation");
7594 return;
7595
7596 case Intrinsic::assume:
7597 case Intrinsic::experimental_noalias_scope_decl:
7598 case Intrinsic::var_annotation:
7599 case Intrinsic::sideeffect:
7600 // Discard annotate attributes, noalias scope declarations, assumptions, and
7601 // artificial side-effects.
7602 return;
7603
7604 case Intrinsic::codeview_annotation: {
7605 // Emit a label associated with this metadata.
7606 MachineFunction &MF = DAG.getMachineFunction();
7607 MCSymbol *Label = MF.getContext().createTempSymbol("annotation", true);
7608 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(0))->getMetadata();
7609 MF.addCodeViewAnnotation(Label, cast<MDNode>(MD));
7610 Res = DAG.getLabelNode(ISD::ANNOTATION_LABEL, sdl, getRoot(), Label);
7611 DAG.setRoot(Res);
7612 return;
7613 }
7614
7615 case Intrinsic::init_trampoline: {
7616 const Function *F = cast<Function>(I.getArgOperand(1)->stripPointerCasts());
7617
7618 SDValue Ops[6];
7619 Ops[0] = getRoot();
7620 Ops[1] = getValue(I.getArgOperand(0));
7621 Ops[2] = getValue(I.getArgOperand(1));
7622 Ops[3] = getValue(I.getArgOperand(2));
7623 Ops[4] = DAG.getSrcValue(I.getArgOperand(0));
7624 Ops[5] = DAG.getSrcValue(F);
7625
7626 Res = DAG.getNode(ISD::INIT_TRAMPOLINE, sdl, MVT::Other, Ops);
7627
7628 DAG.setRoot(Res);
7629 return;
7630 }
7631 case Intrinsic::adjust_trampoline:
7632 setValue(&I, DAG.getNode(ISD::ADJUST_TRAMPOLINE, sdl,
7633 TLI.getPointerTy(DAG.getDataLayout()),
7634 getValue(I.getArgOperand(0))));
7635 return;
7636 case Intrinsic::gcroot: {
7637 assert(DAG.getMachineFunction().getFunction().hasGC() &&
7638 "only valid in functions with gc specified, enforced by Verifier");
7639 assert(GFI && "implied by previous");
7640 const Value *Alloca = I.getArgOperand(0)->stripPointerCasts();
7641 const Constant *TypeMap = cast<Constant>(I.getArgOperand(1));
7642
7643 FrameIndexSDNode *FI = cast<FrameIndexSDNode>(getValue(Alloca).getNode());
7644 GFI->addStackRoot(FI->getIndex(), TypeMap);
7645 return;
7646 }
7647 case Intrinsic::gcread:
7648 case Intrinsic::gcwrite:
7649 llvm_unreachable("GC failed to lower gcread/gcwrite intrinsics!");
7650 case Intrinsic::get_rounding:
7651 Res = DAG.getNode(ISD::GET_ROUNDING, sdl, {MVT::i32, MVT::Other}, getRoot());
7652 setValue(&I, Res);
7653 DAG.setRoot(Res.getValue(1));
7654 return;
7655
7656 case Intrinsic::expect:
7657 case Intrinsic::expect_with_probability:
7658 // Just replace __builtin_expect(exp, c) and
7659 // __builtin_expect_with_probability(exp, c, p) with EXP.
7660 setValue(&I, getValue(I.getArgOperand(0)));
7661 return;
7662
7663 case Intrinsic::ubsantrap:
7664 case Intrinsic::debugtrap:
7665 case Intrinsic::trap: {
7666 StringRef TrapFuncName =
7667 I.getAttributes().getFnAttr("trap-func-name").getValueAsString();
7668 if (TrapFuncName.empty()) {
7669 switch (Intrinsic) {
7670 case Intrinsic::trap:
7671 DAG.setRoot(DAG.getNode(ISD::TRAP, sdl, MVT::Other, getRoot()));
7672 break;
7673 case Intrinsic::debugtrap:
7674 DAG.setRoot(DAG.getNode(ISD::DEBUGTRAP, sdl, MVT::Other, getRoot()));
7675 break;
7676 case Intrinsic::ubsantrap:
7677 DAG.setRoot(DAG.getNode(
7678 ISD::UBSANTRAP, sdl, MVT::Other, getRoot(),
7679 DAG.getTargetConstant(
7680 cast<ConstantInt>(I.getArgOperand(0))->getZExtValue(), sdl,
7681 MVT::i32)));
7682 break;
7683 default: llvm_unreachable("unknown trap intrinsic");
7684 }
7685 DAG.addNoMergeSiteInfo(DAG.getRoot().getNode(),
7686 I.hasFnAttr(Attribute::NoMerge));
7687 return;
7688 }
7690 if (Intrinsic == Intrinsic::ubsantrap) {
7691 Value *Arg = I.getArgOperand(0);
7692 Args.emplace_back(Arg, getValue(Arg));
7693 }
7694
7695 TargetLowering::CallLoweringInfo CLI(DAG);
7696 CLI.setDebugLoc(sdl).setChain(getRoot()).setLibCallee(
7697 CallingConv::C, I.getType(),
7698 DAG.getExternalSymbol(TrapFuncName.data(),
7699 TLI.getPointerTy(DAG.getDataLayout())),
7700 std::move(Args));
7701 CLI.NoMerge = I.hasFnAttr(Attribute::NoMerge);
7702 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
7703 DAG.setRoot(Result.second);
7704 return;
7705 }
7706
7707 case Intrinsic::allow_runtime_check:
7708 case Intrinsic::allow_ubsan_check:
7709 setValue(&I, getValue(ConstantInt::getTrue(I.getType())));
7710 return;
7711
7712 case Intrinsic::uadd_with_overflow:
7713 case Intrinsic::sadd_with_overflow:
7714 case Intrinsic::usub_with_overflow:
7715 case Intrinsic::ssub_with_overflow:
7716 case Intrinsic::umul_with_overflow:
7717 case Intrinsic::smul_with_overflow: {
7719 switch (Intrinsic) {
7720 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
7721 case Intrinsic::uadd_with_overflow: Op = ISD::UADDO; break;
7722 case Intrinsic::sadd_with_overflow: Op = ISD::SADDO; break;
7723 case Intrinsic::usub_with_overflow: Op = ISD::USUBO; break;
7724 case Intrinsic::ssub_with_overflow: Op = ISD::SSUBO; break;
7725 case Intrinsic::umul_with_overflow: Op = ISD::UMULO; break;
7726 case Intrinsic::smul_with_overflow: Op = ISD::SMULO; break;
7727 }
7728 SDValue Op1 = getValue(I.getArgOperand(0));
7729 SDValue Op2 = getValue(I.getArgOperand(1));
7730
7731 EVT ResultVT = Op1.getValueType();
7732 EVT OverflowVT = ResultVT.changeElementType(*Context, MVT::i1);
7733
7734 SDVTList VTs = DAG.getVTList(ResultVT, OverflowVT);
7735 setValue(&I, DAG.getNode(Op, sdl, VTs, Op1, Op2));
7736 return;
7737 }
7738 case Intrinsic::prefetch: {
7739 SDValue Ops[5];
7740 unsigned rw = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
7742 Ops[0] = DAG.getRoot();
7743 Ops[1] = getValue(I.getArgOperand(0));
7744 Ops[2] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(1)), sdl,
7745 MVT::i32);
7746 Ops[3] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(2)), sdl,
7747 MVT::i32);
7748 Ops[4] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(3)), sdl,
7749 MVT::i32);
7750 SDValue Result = DAG.getMemIntrinsicNode(
7751 ISD::PREFETCH, sdl, DAG.getVTList(MVT::Other), Ops,
7752 EVT::getIntegerVT(*Context, 8), MachinePointerInfo(I.getArgOperand(0)),
7753 /* align */ std::nullopt, Flags);
7754
7755 // Chain the prefetch in parallel with any pending loads, to stay out of
7756 // the way of later optimizations.
7757 PendingLoads.push_back(Result);
7758 Result = getRoot();
7759 DAG.setRoot(Result);
7760 return;
7761 }
7762 case Intrinsic::lifetime_start:
7763 case Intrinsic::lifetime_end: {
7764 bool IsStart = (Intrinsic == Intrinsic::lifetime_start);
7765 // Stack coloring is not enabled in O0, discard region information.
7766 if (TM.getOptLevel() == CodeGenOptLevel::None)
7767 return;
7768
7769 const AllocaInst *LifetimeObject = dyn_cast<AllocaInst>(I.getArgOperand(0));
7770 if (!LifetimeObject)
7771 return;
7772
7773 // First check that the Alloca is static, otherwise it won't have a
7774 // valid frame index.
7775 auto SI = FuncInfo.StaticAllocaMap.find(LifetimeObject);
7776 if (SI == FuncInfo.StaticAllocaMap.end())
7777 return;
7778
7779 const int FrameIndex = SI->second;
7780 Res = DAG.getLifetimeNode(IsStart, sdl, getRoot(), FrameIndex);
7781 DAG.setRoot(Res);
7782 return;
7783 }
7784 case Intrinsic::pseudoprobe: {
7785 auto Guid = cast<ConstantInt>(I.getArgOperand(0))->getZExtValue();
7786 auto Index = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
7787 auto Attr = cast<ConstantInt>(I.getArgOperand(2))->getZExtValue();
7788 Res = DAG.getPseudoProbeNode(sdl, getRoot(), Guid, Index, Attr);
7789 DAG.setRoot(Res);
7790 return;
7791 }
7792 case Intrinsic::invariant_start:
7793 // Discard region information.
7794 setValue(&I,
7795 DAG.getUNDEF(TLI.getValueType(DAG.getDataLayout(), I.getType())));
7796 return;
7797 case Intrinsic::invariant_end:
7798 // Discard region information.
7799 return;
7800 case Intrinsic::clear_cache: {
7801 SDValue InputChain = DAG.getRoot();
7802 SDValue StartVal = getValue(I.getArgOperand(0));
7803 SDValue EndVal = getValue(I.getArgOperand(1));
7804 Res = DAG.getNode(ISD::CLEAR_CACHE, sdl, DAG.getVTList(MVT::Other),
7805 {InputChain, StartVal, EndVal});
7806 setValue(&I, Res);
7807 DAG.setRoot(Res);
7808 return;
7809 }
7810 case Intrinsic::donothing:
7811 case Intrinsic::seh_try_begin:
7812 case Intrinsic::seh_scope_begin:
7813 case Intrinsic::seh_try_end:
7814 case Intrinsic::seh_scope_end:
7815 // ignore
7816 return;
7817 case Intrinsic::experimental_stackmap:
7818 visitStackmap(I);
7819 return;
7820 case Intrinsic::experimental_patchpoint_void:
7821 case Intrinsic::experimental_patchpoint:
7822 visitPatchpoint(I);
7823 return;
7824 case Intrinsic::experimental_gc_statepoint:
7826 return;
7827 case Intrinsic::experimental_gc_result:
7828 visitGCResult(cast<GCResultInst>(I));
7829 return;
7830 case Intrinsic::experimental_gc_relocate:
7831 visitGCRelocate(cast<GCRelocateInst>(I));
7832 return;
7833 case Intrinsic::instrprof_cover:
7834 llvm_unreachable("instrprof failed to lower a cover");
7835 case Intrinsic::instrprof_increment:
7836 llvm_unreachable("instrprof failed to lower an increment");
7837 case Intrinsic::instrprof_timestamp:
7838 llvm_unreachable("instrprof failed to lower a timestamp");
7839 case Intrinsic::instrprof_value_profile:
7840 llvm_unreachable("instrprof failed to lower a value profiling call");
7841 case Intrinsic::instrprof_mcdc_parameters:
7842 llvm_unreachable("instrprof failed to lower mcdc parameters");
7843 case Intrinsic::instrprof_mcdc_tvbitmap_update:
7844 llvm_unreachable("instrprof failed to lower an mcdc tvbitmap update");
7845 case Intrinsic::localescape: {
7846 MachineFunction &MF = DAG.getMachineFunction();
7847 const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo();
7848
7849 // Directly emit some LOCAL_ESCAPE machine instrs. Label assignment emission
7850 // is the same on all targets.
7851 for (unsigned Idx = 0, E = I.arg_size(); Idx < E; ++Idx) {
7852 Value *Arg = I.getArgOperand(Idx)->stripPointerCasts();
7853 if (isa<ConstantPointerNull>(Arg))
7854 continue; // Skip null pointers. They represent a hole in index space.
7855 AllocaInst *Slot = cast<AllocaInst>(Arg);
7856 assert(FuncInfo.StaticAllocaMap.count(Slot) &&
7857 "can only escape static allocas");
7858 int FI = FuncInfo.StaticAllocaMap[Slot];
7859 MCSymbol *FrameAllocSym = MF.getContext().getOrCreateFrameAllocSymbol(
7861 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, dl,
7862 TII->get(TargetOpcode::LOCAL_ESCAPE))
7863 .addSym(FrameAllocSym)
7864 .addFrameIndex(FI);
7865 }
7866
7867 return;
7868 }
7869
7870 case Intrinsic::localrecover: {
7871 // i8* @llvm.localrecover(i8* %fn, i8* %fp, i32 %idx)
7872 MachineFunction &MF = DAG.getMachineFunction();
7873
7874 // Get the symbol that defines the frame offset.
7875 auto *Fn = cast<Function>(I.getArgOperand(0)->stripPointerCasts());
7876 auto *Idx = cast<ConstantInt>(I.getArgOperand(2));
7877 unsigned IdxVal =
7878 unsigned(Idx->getLimitedValue(std::numeric_limits<int>::max()));
7879 MCSymbol *FrameAllocSym = MF.getContext().getOrCreateFrameAllocSymbol(
7881
7882 Value *FP = I.getArgOperand(1);
7883 SDValue FPVal = getValue(FP);
7884 EVT PtrVT = FPVal.getValueType();
7885
7886 // Create a MCSymbol for the label to avoid any target lowering
7887 // that would make this PC relative.
7888 SDValue OffsetSym = DAG.getMCSymbol(FrameAllocSym, PtrVT);
7889 SDValue OffsetVal =
7890 DAG.getNode(ISD::LOCAL_RECOVER, sdl, PtrVT, OffsetSym);
7891
7892 // Add the offset to the FP.
7893 SDValue Add = DAG.getMemBasePlusOffset(FPVal, OffsetVal, sdl);
7894 setValue(&I, Add);
7895
7896 return;
7897 }
7898
7899 case Intrinsic::fake_use: {
7900 Value *V = I.getArgOperand(0);
7901 SDValue Ops[2];
7902 // For Values not declared or previously used in this basic block, the
7903 // NodeMap will not have an entry, and `getValue` will assert if V has no
7904 // valid register value.
7905 auto FakeUseValue = [&]() -> SDValue {
7906 SDValue &N = NodeMap[V];
7907 if (N.getNode())
7908 return N;
7909
7910 // If there's a virtual register allocated and initialized for this
7911 // value, use it.
7912 if (SDValue copyFromReg = getCopyFromRegs(V, V->getType()))
7913 return copyFromReg;
7914 // FIXME: Do we want to preserve constants? It seems pointless.
7915 if (isa<Constant>(V))
7916 return getValue(V);
7917 return SDValue();
7918 }();
7919 if (!FakeUseValue || FakeUseValue.isUndef())
7920 return;
7921 Ops[0] = getRoot();
7922 Ops[1] = FakeUseValue;
7923 // Also, do not translate a fake use with an undef operand, or any other
7924 // empty SDValues.
7925 if (!Ops[1] || Ops[1].isUndef())
7926 return;
7927 DAG.setRoot(DAG.getNode(ISD::FAKE_USE, sdl, MVT::Other, Ops));
7928 return;
7929 }
7930
7931 case Intrinsic::reloc_none: {
7932 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(0))->getMetadata();
7933 StringRef SymbolName = cast<MDString>(MD)->getString();
7934 SDValue Ops[2] = {
7935 getRoot(),
7936 DAG.getTargetExternalSymbol(
7937 SymbolName.data(), TLI.getProgramPointerTy(DAG.getDataLayout()))};
7938 DAG.setRoot(DAG.getNode(ISD::RELOC_NONE, sdl, MVT::Other, Ops));
7939 return;
7940 }
7941
7942 case Intrinsic::cond_loop: {
7943 SDValue InputChain = DAG.getRoot();
7944 SDValue P = getValue(I.getArgOperand(0));
7945 Res = DAG.getNode(ISD::COND_LOOP, sdl, DAG.getVTList(MVT::Other),
7946 {InputChain, P});
7947 setValue(&I, Res);
7948 DAG.setRoot(Res);
7949 return;
7950 }
7951
7952 case Intrinsic::eh_exceptionpointer:
7953 case Intrinsic::eh_exceptioncode: {
7954 // Get the exception pointer vreg, copy from it, and resize it to fit.
7955 const auto *CPI = cast<CatchPadInst>(I.getArgOperand(0));
7956 MVT PtrVT = TLI.getPointerTy(DAG.getDataLayout());
7957 const TargetRegisterClass *PtrRC = TLI.getRegClassFor(PtrVT);
7958 Register VReg = FuncInfo.getCatchPadExceptionPointerVReg(CPI, PtrRC);
7959 SDValue N = DAG.getCopyFromReg(DAG.getEntryNode(), sdl, VReg, PtrVT);
7960 if (Intrinsic == Intrinsic::eh_exceptioncode)
7961 N = DAG.getZExtOrTrunc(N, sdl, MVT::i32);
7962 setValue(&I, N);
7963 return;
7964 }
7965 case Intrinsic::xray_customevent: {
7966 // Here we want to make sure that the intrinsic behaves as if it has a
7967 // specific calling convention.
7968 const auto &Triple = DAG.getTarget().getTargetTriple();
7969 if (!Triple.isAArch64(64) && Triple.getArch() != Triple::x86_64)
7970 return;
7971
7973
7974 // We want to say that we always want the arguments in registers.
7975 SDValue LogEntryVal = getValue(I.getArgOperand(0));
7976 SDValue StrSizeVal = getValue(I.getArgOperand(1));
7977 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
7978 SDValue Chain = getRoot();
7979 Ops.push_back(LogEntryVal);
7980 Ops.push_back(StrSizeVal);
7981 Ops.push_back(Chain);
7982
7983 // We need to enforce the calling convention for the callsite, so that
7984 // argument ordering is enforced correctly, and that register allocation can
7985 // see that some registers may be assumed clobbered and have to preserve
7986 // them across calls to the intrinsic.
7987 MachineSDNode *MN = DAG.getMachineNode(TargetOpcode::PATCHABLE_EVENT_CALL,
7988 sdl, NodeTys, Ops);
7989 SDValue patchableNode = SDValue(MN, 0);
7990 DAG.setRoot(patchableNode);
7991 setValue(&I, patchableNode);
7992 return;
7993 }
7994 case Intrinsic::xray_typedevent: {
7995 // Here we want to make sure that the intrinsic behaves as if it has a
7996 // specific calling convention.
7997 const auto &Triple = DAG.getTarget().getTargetTriple();
7998 if (!Triple.isAArch64(64) && Triple.getArch() != Triple::x86_64)
7999 return;
8000
8002
8003 // We want to say that we always want the arguments in registers.
8004 // It's unclear to me how manipulating the selection DAG here forces callers
8005 // to provide arguments in registers instead of on the stack.
8006 SDValue LogTypeId = getValue(I.getArgOperand(0));
8007 SDValue LogEntryVal = getValue(I.getArgOperand(1));
8008 SDValue StrSizeVal = getValue(I.getArgOperand(2));
8009 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
8010 SDValue Chain = getRoot();
8011 Ops.push_back(LogTypeId);
8012 Ops.push_back(LogEntryVal);
8013 Ops.push_back(StrSizeVal);
8014 Ops.push_back(Chain);
8015
8016 // We need to enforce the calling convention for the callsite, so that
8017 // argument ordering is enforced correctly, and that register allocation can
8018 // see that some registers may be assumed clobbered and have to preserve
8019 // them across calls to the intrinsic.
8020 MachineSDNode *MN = DAG.getMachineNode(
8021 TargetOpcode::PATCHABLE_TYPED_EVENT_CALL, sdl, NodeTys, Ops);
8022 SDValue patchableNode = SDValue(MN, 0);
8023 DAG.setRoot(patchableNode);
8024 setValue(&I, patchableNode);
8025 return;
8026 }
8027 case Intrinsic::experimental_deoptimize:
8029 return;
8030 case Intrinsic::stepvector:
8031 visitStepVector(I);
8032 return;
8033 case Intrinsic::vector_reduce_fadd:
8034 case Intrinsic::vector_reduce_fmul:
8035 case Intrinsic::vector_reduce_add:
8036 case Intrinsic::vector_reduce_mul:
8037 case Intrinsic::vector_reduce_and:
8038 case Intrinsic::vector_reduce_or:
8039 case Intrinsic::vector_reduce_xor:
8040 case Intrinsic::vector_reduce_smax:
8041 case Intrinsic::vector_reduce_smin:
8042 case Intrinsic::vector_reduce_umax:
8043 case Intrinsic::vector_reduce_umin:
8044 case Intrinsic::vector_reduce_fmax:
8045 case Intrinsic::vector_reduce_fmin:
8046 case Intrinsic::vector_reduce_fmaximum:
8047 case Intrinsic::vector_reduce_fminimum:
8048 visitVectorReduce(I, Intrinsic);
8049 return;
8050
8051 case Intrinsic::icall_branch_funnel: {
8053 Ops.push_back(getValue(I.getArgOperand(0)));
8054
8055 int64_t Offset;
8057 I.getArgOperand(1), Offset, DAG.getDataLayout()));
8058 if (!Base)
8060 "llvm.icall.branch.funnel operand must be a GlobalValue");
8061 Ops.push_back(DAG.getTargetGlobalAddress(Base, sdl, MVT::i64, 0));
8062
8063 struct BranchFunnelTarget {
8064 int64_t Offset;
8066 };
8068
8069 for (unsigned Op = 1, N = I.arg_size(); Op != N; Op += 2) {
8071 I.getArgOperand(Op), Offset, DAG.getDataLayout()));
8072 if (ElemBase != Base)
8073 report_fatal_error("all llvm.icall.branch.funnel operands must refer "
8074 "to the same GlobalValue");
8075
8076 SDValue Val = getValue(I.getArgOperand(Op + 1));
8077 auto *GA = dyn_cast<GlobalAddressSDNode>(Val);
8078 if (!GA)
8080 "llvm.icall.branch.funnel operand must be a GlobalValue");
8081 Targets.push_back({Offset, DAG.getTargetGlobalAddress(
8082 GA->getGlobal(), sdl, Val.getValueType(),
8083 GA->getOffset())});
8084 }
8085 llvm::sort(Targets,
8086 [](const BranchFunnelTarget &T1, const BranchFunnelTarget &T2) {
8087 return T1.Offset < T2.Offset;
8088 });
8089
8090 for (auto &T : Targets) {
8091 Ops.push_back(DAG.getTargetConstant(T.Offset, sdl, MVT::i32));
8092 Ops.push_back(T.Target);
8093 }
8094
8095 Ops.push_back(DAG.getRoot()); // Chain
8096 SDValue N(DAG.getMachineNode(TargetOpcode::ICALL_BRANCH_FUNNEL, sdl,
8097 MVT::Other, Ops),
8098 0);
8099 DAG.setRoot(N);
8100 setValue(&I, N);
8101 HasTailCall = true;
8102 return;
8103 }
8104
8105 case Intrinsic::wasm_landingpad_index:
8106 // Information this intrinsic contained has been transferred to
8107 // MachineFunction in SelectionDAGISel::PrepareEHLandingPad. We can safely
8108 // delete it now.
8109 return;
8110
8111 case Intrinsic::aarch64_settag:
8112 case Intrinsic::aarch64_settag_zero: {
8113 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
8114 bool ZeroMemory = Intrinsic == Intrinsic::aarch64_settag_zero;
8116 DAG, sdl, getRoot(), getValue(I.getArgOperand(0)),
8117 getValue(I.getArgOperand(1)), MachinePointerInfo(I.getArgOperand(0)),
8118 ZeroMemory);
8119 DAG.setRoot(Val);
8120 setValue(&I, Val);
8121 return;
8122 }
8123 case Intrinsic::amdgcn_cs_chain: {
8124 // At this point we don't care if it's amdgpu_cs_chain or
8125 // amdgpu_cs_chain_preserve.
8127
8128 Type *RetTy = I.getType();
8129 assert(RetTy->isVoidTy() && "Should not return");
8130
8131 SDValue Callee = getValue(I.getOperand(0));
8132
8133 // We only have 2 actual args: one for the SGPRs and one for the VGPRs.
8134 // We'll also tack the value of the EXEC mask at the end.
8136 Args.reserve(3);
8137
8138 for (unsigned Idx : {2, 3, 1}) {
8139 TargetLowering::ArgListEntry Arg(getValue(I.getOperand(Idx)),
8140 I.getOperand(Idx)->getType());
8141 Arg.setAttributes(&I, Idx);
8142 Args.push_back(Arg);
8143 }
8144
8145 assert(Args[0].IsInReg && "SGPR args should be marked inreg");
8146 assert(!Args[1].IsInReg && "VGPR args should not be marked inreg");
8147 Args[2].IsInReg = true; // EXEC should be inreg
8148
8149 // Forward the flags and any additional arguments.
8150 for (unsigned Idx = 4; Idx < I.arg_size(); ++Idx) {
8151 TargetLowering::ArgListEntry Arg(getValue(I.getOperand(Idx)),
8152 I.getOperand(Idx)->getType());
8153 Arg.setAttributes(&I, Idx);
8154 Args.push_back(Arg);
8155 }
8156
8157 TargetLowering::CallLoweringInfo CLI(DAG);
8158 CLI.setDebugLoc(getCurSDLoc())
8159 .setChain(getRoot())
8160 .setCallee(CC, RetTy, Callee, std::move(Args))
8161 .setNoReturn(true)
8162 .setTailCall(true)
8163 .setConvergent(I.isConvergent());
8164 CLI.CB = &I;
8165 std::pair<SDValue, SDValue> Result =
8166 lowerInvokable(CLI, /*EHPadBB*/ nullptr);
8167 (void)Result;
8168 assert(!Result.first.getNode() && !Result.second.getNode() &&
8169 "Should've lowered as tail call");
8170
8171 HasTailCall = true;
8172 return;
8173 }
8174 case Intrinsic::amdgcn_call_whole_wave: {
8176 bool isTailCall = I.isTailCall();
8177
8178 // The first argument is the callee. Skip it when assembling the call args.
8179 for (unsigned Idx = 1; Idx < I.arg_size(); ++Idx) {
8180 TargetLowering::ArgListEntry Arg(getValue(I.getArgOperand(Idx)),
8181 I.getArgOperand(Idx)->getType());
8182 Arg.setAttributes(&I, Idx);
8183
8184 // If we have an explicit sret argument that is an Instruction, (i.e., it
8185 // might point to function-local memory), we can't meaningfully tail-call.
8186 if (Arg.IsSRet && isa<Instruction>(I.getArgOperand(Idx)))
8187 isTailCall = false;
8188
8189 Args.push_back(Arg);
8190 }
8191
8192 SDValue ConvControlToken;
8193 if (auto Bundle = I.getOperandBundle(LLVMContext::OB_convergencectrl)) {
8194 auto *Token = Bundle->Inputs[0].get();
8195 ConvControlToken = getValue(Token);
8196 }
8197
8198 TargetLowering::CallLoweringInfo CLI(DAG);
8199 CLI.setDebugLoc(getCurSDLoc())
8200 .setChain(getRoot())
8201 .setCallee(CallingConv::AMDGPU_Gfx_WholeWave, I.getType(),
8202 getValue(I.getArgOperand(0)), std::move(Args))
8203 .setTailCall(isTailCall && canTailCall(I))
8204 .setIsPreallocated(
8205 I.countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0)
8206 .setConvergent(I.isConvergent())
8207 .setConvergenceControlToken(ConvControlToken);
8208 CLI.CB = &I;
8209
8210 std::pair<SDValue, SDValue> Result =
8211 lowerInvokable(CLI, /*EHPadBB=*/nullptr);
8212
8213 if (Result.first.getNode())
8214 setValue(&I, Result.first);
8215 return;
8216 }
8217 case Intrinsic::ptrmask: {
8218 SDValue Ptr = getValue(I.getOperand(0));
8219 SDValue Mask = getValue(I.getOperand(1));
8220
8221 // On arm64_32, pointers are 32 bits when stored in memory, but
8222 // zero-extended to 64 bits when in registers. Thus the mask is 32 bits to
8223 // match the index type, but the pointer is 64 bits, so the mask must be
8224 // zero-extended up to 64 bits to match the pointer.
8225 EVT PtrVT =
8226 TLI.getValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
8227 EVT MemVT =
8228 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
8229 assert(PtrVT == Ptr.getValueType());
8230 if (Mask.getValueType().getFixedSizeInBits() < MemVT.getFixedSizeInBits()) {
8231 // For AMDGPU buffer descriptors the mask is 48 bits, but the pointer is
8232 // 128-bit, so we have to pad the mask with ones for unused bits.
8233 auto HighOnes = DAG.getNode(
8234 ISD::SHL, sdl, PtrVT, DAG.getAllOnesConstant(sdl, PtrVT),
8235 DAG.getShiftAmountConstant(Mask.getValueType().getFixedSizeInBits(),
8236 PtrVT, sdl));
8237 Mask = DAG.getNode(ISD::OR, sdl, PtrVT,
8238 DAG.getZExtOrTrunc(Mask, sdl, PtrVT), HighOnes);
8239 } else if (Mask.getValueType() != PtrVT)
8240 Mask = DAG.getPtrExtOrTrunc(Mask, sdl, PtrVT);
8241
8242 assert(Mask.getValueType() == PtrVT);
8243 setValue(&I, DAG.getNode(ISD::AND, sdl, PtrVT, Ptr, Mask));
8244 return;
8245 }
8246 case Intrinsic::threadlocal_address: {
8247 setValue(&I, getValue(I.getOperand(0)));
8248 return;
8249 }
8250 case Intrinsic::get_active_lane_mask: {
8251 EVT CCVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8252 SDValue Index = getValue(I.getOperand(0));
8253 SDValue TripCount = getValue(I.getOperand(1));
8254 EVT ElementVT = Index.getValueType();
8255
8256 if (!TLI.shouldExpandGetActiveLaneMask(CCVT, ElementVT)) {
8257 setValue(&I, DAG.getNode(ISD::GET_ACTIVE_LANE_MASK, sdl, CCVT, Index,
8258 TripCount));
8259 return;
8260 }
8261
8262 EVT VecTy = EVT::getVectorVT(*DAG.getContext(), ElementVT,
8263 CCVT.getVectorElementCount());
8264
8265 SDValue VectorIndex = DAG.getSplat(VecTy, sdl, Index);
8266 SDValue VectorTripCount = DAG.getSplat(VecTy, sdl, TripCount);
8267 SDValue VectorStep = DAG.getStepVector(sdl, VecTy);
8268 SDValue VectorInduction = DAG.getNode(
8269 ISD::UADDSAT, sdl, VecTy, VectorIndex, VectorStep);
8270 SDValue SetCC = DAG.getSetCC(sdl, CCVT, VectorInduction,
8271 VectorTripCount, ISD::CondCode::SETULT);
8272 setValue(&I, SetCC);
8273 return;
8274 }
8275 case Intrinsic::experimental_get_vector_length: {
8276 assert(cast<ConstantInt>(I.getOperand(1))->getSExtValue() > 0 &&
8277 "Expected positive VF");
8278 unsigned VF = cast<ConstantInt>(I.getOperand(1))->getZExtValue();
8279 bool IsScalable = cast<ConstantInt>(I.getOperand(2))->isOne();
8280
8281 SDValue Count = getValue(I.getOperand(0));
8282 EVT CountVT = Count.getValueType();
8283
8284 if (!TLI.shouldExpandGetVectorLength(CountVT, VF, IsScalable)) {
8285 visitTargetIntrinsic(I, Intrinsic);
8286 return;
8287 }
8288
8289 // Expand to a umin between the trip count and the maximum elements the type
8290 // can hold.
8291 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8292
8293 // Extend the trip count to at least the result VT.
8294 if (CountVT.bitsLT(VT)) {
8295 Count = DAG.getNode(ISD::ZERO_EXTEND, sdl, VT, Count);
8296 CountVT = VT;
8297 }
8298
8299 SDValue MaxEVL = DAG.getElementCount(sdl, CountVT,
8300 ElementCount::get(VF, IsScalable));
8301
8302 SDValue UMin = DAG.getNode(ISD::UMIN, sdl, CountVT, Count, MaxEVL);
8303 // Clip to the result type if needed.
8304 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, sdl, VT, UMin);
8305
8306 setValue(&I, Trunc);
8307 return;
8308 }
8309 case Intrinsic::vector_partial_reduce_add: {
8310 SDValue Acc = getValue(I.getOperand(0));
8311 SDValue Input = getValue(I.getOperand(1));
8312 setValue(&I,
8313 DAG.getNode(ISD::PARTIAL_REDUCE_UMLA, sdl, Acc.getValueType(), Acc,
8314 Input, DAG.getConstant(1, sdl, Input.getValueType())));
8315 return;
8316 }
8317 case Intrinsic::vector_partial_reduce_fadd: {
8318 SDValue Acc = getValue(I.getOperand(0));
8319 SDValue Input = getValue(I.getOperand(1));
8320 setValue(&I, DAG.getNode(
8321 ISD::PARTIAL_REDUCE_FMLA, sdl, Acc.getValueType(), Acc,
8322 Input, DAG.getConstantFP(1.0, sdl, Input.getValueType())));
8323 return;
8324 }
8325 case Intrinsic::experimental_cttz_elts: {
8326 SDValue Op = getValue(I.getOperand(0));
8327 EVT OpVT = Op.getValueType();
8328 EVT RetTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
8329 bool ZeroIsPoison =
8330 !cast<ConstantSDNode>(getValue(I.getOperand(1)))->isZero();
8331 if (OpVT.getVectorElementType() != MVT::i1) {
8332 // Compare the input vector elements to zero & use to count trailing
8333 // zeros.
8334 SDValue AllZero = DAG.getConstant(0, sdl, OpVT);
8335 EVT I1OpVT = OpVT.changeVectorElementType(*DAG.getContext(), MVT::i1);
8336 Op = DAG.getSetCC(sdl, I1OpVT, Op, AllZero, ISD::SETNE);
8337 }
8338 setValue(&I, DAG.getNode(ZeroIsPoison ? ISD::CTTZ_ELTS_ZERO_POISON
8340 sdl, RetTy, Op));
8341 return;
8342 }
8343 case Intrinsic::vector_insert: {
8344 SDValue Vec = getValue(I.getOperand(0));
8345 SDValue SubVec = getValue(I.getOperand(1));
8346 SDValue Index = getValue(I.getOperand(2));
8347
8348 // The intrinsic's index type is i64, but the SDNode requires an index type
8349 // suitable for the target. Convert the index as required.
8350 MVT VectorIdxTy = TLI.getVectorIdxTy(DAG.getDataLayout());
8351 if (Index.getValueType() != VectorIdxTy)
8352 Index = DAG.getVectorIdxConstant(Index->getAsZExtVal(), sdl);
8353
8354 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8355 setValue(&I, DAG.getNode(ISD::INSERT_SUBVECTOR, sdl, ResultVT, Vec, SubVec,
8356 Index));
8357 return;
8358 }
8359 case Intrinsic::vector_extract: {
8360 SDValue Vec = getValue(I.getOperand(0));
8361 SDValue Index = getValue(I.getOperand(1));
8362 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8363
8364 // The intrinsic's index type is i64, but the SDNode requires an index type
8365 // suitable for the target. Convert the index as required.
8366 MVT VectorIdxTy = TLI.getVectorIdxTy(DAG.getDataLayout());
8367 if (Index.getValueType() != VectorIdxTy)
8368 Index = DAG.getVectorIdxConstant(Index->getAsZExtVal(), sdl);
8369
8370 setValue(&I,
8371 DAG.getNode(ISD::EXTRACT_SUBVECTOR, sdl, ResultVT, Vec, Index));
8372 return;
8373 }
8374 case Intrinsic::experimental_vector_match: {
8375 SDValue Op1 = getValue(I.getOperand(0));
8376 SDValue Op2 = getValue(I.getOperand(1));
8377 SDValue Mask = getValue(I.getOperand(2));
8378 EVT Op1VT = Op1.getValueType();
8379 EVT Op2VT = Op2.getValueType();
8380 EVT ResVT = Mask.getValueType();
8381 unsigned SearchSize = Op2VT.getVectorNumElements();
8382
8383 // If the target has native support for this vector match operation, lower
8384 // the intrinsic untouched; otherwise, expand it below.
8385 if (!TLI.shouldExpandVectorMatch(Op1VT, SearchSize)) {
8386 visitTargetIntrinsic(I, Intrinsic);
8387 return;
8388 }
8389
8390 SDValue Ret = DAG.getConstant(0, sdl, ResVT);
8391
8392 for (unsigned i = 0; i < SearchSize; ++i) {
8393 SDValue Op2Elem = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, sdl,
8394 Op2VT.getVectorElementType(), Op2,
8395 DAG.getVectorIdxConstant(i, sdl));
8396 SDValue Splat = DAG.getNode(ISD::SPLAT_VECTOR, sdl, Op1VT, Op2Elem);
8397 SDValue Cmp = DAG.getSetCC(sdl, ResVT, Op1, Splat, ISD::SETEQ);
8398 Ret = DAG.getNode(ISD::OR, sdl, ResVT, Ret, Cmp);
8399 }
8400
8401 setValue(&I, DAG.getNode(ISD::AND, sdl, ResVT, Ret, Mask));
8402 return;
8403 }
8404 case Intrinsic::vector_reverse:
8405 visitVectorReverse(I);
8406 return;
8407 case Intrinsic::vector_splice_left:
8408 case Intrinsic::vector_splice_right:
8409 visitVectorSplice(I);
8410 return;
8411 case Intrinsic::callbr_landingpad:
8412 visitCallBrLandingPad(I);
8413 return;
8414 case Intrinsic::vector_interleave2:
8415 visitVectorInterleave(I, 2);
8416 return;
8417 case Intrinsic::vector_interleave3:
8418 visitVectorInterleave(I, 3);
8419 return;
8420 case Intrinsic::vector_interleave4:
8421 visitVectorInterleave(I, 4);
8422 return;
8423 case Intrinsic::vector_interleave5:
8424 visitVectorInterleave(I, 5);
8425 return;
8426 case Intrinsic::vector_interleave6:
8427 visitVectorInterleave(I, 6);
8428 return;
8429 case Intrinsic::vector_interleave7:
8430 visitVectorInterleave(I, 7);
8431 return;
8432 case Intrinsic::vector_interleave8:
8433 visitVectorInterleave(I, 8);
8434 return;
8435 case Intrinsic::vector_deinterleave2:
8436 visitVectorDeinterleave(I, 2);
8437 return;
8438 case Intrinsic::vector_deinterleave3:
8439 visitVectorDeinterleave(I, 3);
8440 return;
8441 case Intrinsic::vector_deinterleave4:
8442 visitVectorDeinterleave(I, 4);
8443 return;
8444 case Intrinsic::vector_deinterleave5:
8445 visitVectorDeinterleave(I, 5);
8446 return;
8447 case Intrinsic::vector_deinterleave6:
8448 visitVectorDeinterleave(I, 6);
8449 return;
8450 case Intrinsic::vector_deinterleave7:
8451 visitVectorDeinterleave(I, 7);
8452 return;
8453 case Intrinsic::vector_deinterleave8:
8454 visitVectorDeinterleave(I, 8);
8455 return;
8456 case Intrinsic::experimental_vector_compress:
8457 setValue(&I, DAG.getNode(ISD::VECTOR_COMPRESS, sdl,
8458 getValue(I.getArgOperand(0)).getValueType(),
8459 getValue(I.getArgOperand(0)),
8460 getValue(I.getArgOperand(1)),
8461 getValue(I.getArgOperand(2)), Flags));
8462 return;
8463 case Intrinsic::experimental_convergence_anchor:
8464 case Intrinsic::experimental_convergence_entry:
8465 case Intrinsic::experimental_convergence_loop:
8466 visitConvergenceControl(I, Intrinsic);
8467 return;
8468 case Intrinsic::experimental_vector_histogram_add: {
8469 visitVectorHistogram(I, Intrinsic);
8470 return;
8471 }
8472 case Intrinsic::experimental_vector_extract_last_active: {
8473 visitVectorExtractLastActive(I, Intrinsic);
8474 return;
8475 }
8476 case Intrinsic::loop_dependence_war_mask:
8477 setValue(&I,
8479 EVT::getEVT(I.getType()), getValue(I.getOperand(0)),
8480 getValue(I.getOperand(1)), getValue(I.getOperand(2)),
8481 DAG.getConstant(0, sdl, MVT::i64)));
8482 return;
8483 case Intrinsic::loop_dependence_raw_mask:
8484 setValue(&I,
8486 EVT::getEVT(I.getType()), getValue(I.getOperand(0)),
8487 getValue(I.getOperand(1)), getValue(I.getOperand(2)),
8488 DAG.getConstant(0, sdl, MVT::i64)));
8489 return;
8490 case Intrinsic::masked_udiv:
8491 setValue(&I,
8492 DAG.getNode(ISD::MASKED_UDIV, sdl, EVT::getEVT(I.getType()),
8493 getValue(I.getOperand(0)), getValue(I.getOperand(1)),
8494 getValue(I.getOperand(2))));
8495 return;
8496 case Intrinsic::masked_sdiv:
8497 setValue(&I,
8498 DAG.getNode(ISD::MASKED_SDIV, sdl, EVT::getEVT(I.getType()),
8499 getValue(I.getOperand(0)), getValue(I.getOperand(1)),
8500 getValue(I.getOperand(2))));
8501 return;
8502 case Intrinsic::masked_urem:
8503 setValue(&I,
8504 DAG.getNode(ISD::MASKED_UREM, sdl, EVT::getEVT(I.getType()),
8505 getValue(I.getOperand(0)), getValue(I.getOperand(1)),
8506 getValue(I.getOperand(2))));
8507 return;
8508 case Intrinsic::masked_srem:
8509 setValue(&I,
8510 DAG.getNode(ISD::MASKED_SREM, sdl, EVT::getEVT(I.getType()),
8511 getValue(I.getOperand(0)), getValue(I.getOperand(1)),
8512 getValue(I.getOperand(2))));
8513 return;
8514 }
8515}
8516
8517void SelectionDAGBuilder::pushFPOpOutChain(SDValue Result,
8519 assert(Result.getNode()->getNumValues() == 2);
8520 SDValue OutChain = Result.getValue(1);
8521 assert(OutChain.getValueType() == MVT::Other);
8522
8523 // Instead of updating the root immediately, push the produced chain to the
8524 // appropriate list, deferring the update until the root is requested. In this
8525 // case, the nodes from the lists are chained using TokenFactor, indicating
8526 // that the operations are independent.
8527 //
8528 // In particular, the root is updated before any call that might access the
8529 // floating-point environment, except for constrained intrinsics.
8530 switch (EB) {
8533 PendingConstrainedFP.push_back(OutChain);
8534 break;
8536 PendingConstrainedFPStrict.push_back(OutChain);
8537 break;
8538 }
8539}
8540
8541void SelectionDAGBuilder::visitConstrainedFPIntrinsic(
8542 const ConstrainedFPIntrinsic &FPI) {
8543 SDLoc sdl = getCurSDLoc();
8544
8545 // We do not need to serialize constrained FP intrinsics against
8546 // each other or against (nonvolatile) loads, so they can be
8547 // chained like loads.
8549 SDValue Chain = getFPOperationRoot(EB);
8551 Opers.push_back(Chain);
8552 for (unsigned I = 0, E = FPI.getNonMetadataArgCount(); I != E; ++I)
8553 Opers.push_back(getValue(FPI.getArgOperand(I)));
8554
8555 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8556 EVT VT = TLI.getValueType(DAG.getDataLayout(), FPI.getType());
8557 SDVTList VTs = DAG.getVTList(VT, MVT::Other);
8558
8559 SDNodeFlags Flags;
8561 Flags.setNoFPExcept(true);
8562
8563 if (auto *FPOp = dyn_cast<FPMathOperator>(&FPI))
8564 Flags.copyFMF(*FPOp);
8565
8566 unsigned Opcode;
8567 switch (FPI.getIntrinsicID()) {
8568 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
8569#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
8570 case Intrinsic::INTRINSIC: \
8571 Opcode = ISD::STRICT_##DAGN; \
8572 break;
8573#include "llvm/IR/ConstrainedOps.def"
8574 case Intrinsic::experimental_constrained_fmuladd: {
8575 Opcode = ISD::STRICT_FMA;
8576 // Break fmuladd into fmul and fadd.
8577 if (TM.Options.AllowFPOpFusion == FPOpFusion::Strict ||
8578 !TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), VT)) {
8579 Opers.pop_back();
8580 SDValue Mul = DAG.getNode(ISD::STRICT_FMUL, sdl, VTs, Opers, Flags);
8581 pushFPOpOutChain(Mul, EB);
8582 Opcode = ISD::STRICT_FADD;
8583 Opers.clear();
8584 Opers.push_back(Mul.getValue(1));
8585 Opers.push_back(Mul.getValue(0));
8586 Opers.push_back(getValue(FPI.getArgOperand(2)));
8587 }
8588 break;
8589 }
8590 }
8591
8592 // A few strict DAG nodes carry additional operands that are not
8593 // set up by the default code above.
8594 switch (Opcode) {
8595 default: break;
8597 Opers.push_back(
8598 DAG.getTargetConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout())));
8599 break;
8600 case ISD::STRICT_FSETCC:
8601 case ISD::STRICT_FSETCCS: {
8602 auto *FPCmp = dyn_cast<ConstrainedFPCmpIntrinsic>(&FPI);
8603 ISD::CondCode Condition = getFCmpCondCode(FPCmp->getPredicate());
8604 if (DAG.isKnownNeverNaN(Opers[1]) && DAG.isKnownNeverNaN(Opers[2]))
8605 Condition = getFCmpCodeWithoutNaN(Condition);
8606 Opers.push_back(DAG.getCondCode(Condition));
8607 break;
8608 }
8609 }
8610
8611 SDValue Result = DAG.getNode(Opcode, sdl, VTs, Opers, Flags);
8612 pushFPOpOutChain(Result, EB);
8613
8614 SDValue FPResult = Result.getValue(0);
8615 setValue(&FPI, FPResult);
8616}
8617
8618static unsigned getISDForVPIntrinsic(const VPIntrinsic &VPIntrin) {
8619 std::optional<unsigned> ResOPC;
8620 switch (VPIntrin.getIntrinsicID()) {
8621 case Intrinsic::vp_ctlz: {
8622 bool IsZeroUndef = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8623 ResOPC = IsZeroUndef ? ISD::VP_CTLZ_ZERO_UNDEF : ISD::VP_CTLZ;
8624 break;
8625 }
8626 case Intrinsic::vp_cttz: {
8627 bool IsZeroUndef = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8628 ResOPC = IsZeroUndef ? ISD::VP_CTTZ_ZERO_UNDEF : ISD::VP_CTTZ;
8629 break;
8630 }
8631 case Intrinsic::vp_cttz_elts: {
8632 bool IsZeroPoison = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8633 ResOPC = IsZeroPoison ? ISD::VP_CTTZ_ELTS_ZERO_UNDEF : ISD::VP_CTTZ_ELTS;
8634 break;
8635 }
8636#define HELPER_MAP_VPID_TO_VPSD(VPID, VPSD) \
8637 case Intrinsic::VPID: \
8638 ResOPC = ISD::VPSD; \
8639 break;
8640#include "llvm/IR/VPIntrinsics.def"
8641 }
8642
8643 if (!ResOPC)
8645 "Inconsistency: no SDNode available for this VPIntrinsic!");
8646
8647 if (*ResOPC == ISD::VP_REDUCE_SEQ_FADD ||
8648 *ResOPC == ISD::VP_REDUCE_SEQ_FMUL) {
8649 if (VPIntrin.getFastMathFlags().allowReassoc())
8650 return *ResOPC == ISD::VP_REDUCE_SEQ_FADD ? ISD::VP_REDUCE_FADD
8651 : ISD::VP_REDUCE_FMUL;
8652 }
8653
8654 return *ResOPC;
8655}
8656
8657void SelectionDAGBuilder::visitVPLoad(
8658 const VPIntrinsic &VPIntrin, EVT VT,
8659 const SmallVectorImpl<SDValue> &OpValues) {
8660 SDLoc DL = getCurSDLoc();
8661 Value *PtrOperand = VPIntrin.getArgOperand(0);
8662 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8663 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8664 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8665 SDValue LD;
8666 // Do not serialize variable-length loads of constant memory with
8667 // anything.
8668 if (!Alignment)
8669 Alignment = DAG.getEVTAlign(VT);
8670 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8671 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8672 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8673 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8674 MachineMemOperand::Flags MMOFlags =
8675 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8676 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8677 MachinePointerInfo(PtrOperand), MMOFlags,
8678 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo, Ranges);
8679 LD = DAG.getLoadVP(VT, DL, InChain, OpValues[0], OpValues[1], OpValues[2],
8680 MMO, false /*IsExpanding */);
8681 if (AddToChain)
8682 PendingLoads.push_back(LD.getValue(1));
8683 setValue(&VPIntrin, LD);
8684}
8685
8686void SelectionDAGBuilder::visitVPLoadFF(
8687 const VPIntrinsic &VPIntrin, EVT VT, EVT EVLVT,
8688 const SmallVectorImpl<SDValue> &OpValues) {
8689 assert(OpValues.size() == 3 && "Unexpected number of operands");
8690 SDLoc DL = getCurSDLoc();
8691 Value *PtrOperand = VPIntrin.getArgOperand(0);
8692 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8693 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8694 const MDNode *Ranges = VPIntrin.getMetadata(LLVMContext::MD_range);
8695 SDValue LD;
8696 // Do not serialize variable-length loads of constant memory with
8697 // anything.
8698 if (!Alignment)
8699 Alignment = DAG.getEVTAlign(VT);
8700 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8701 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8702 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8703 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8704 MachinePointerInfo(PtrOperand), MachineMemOperand::MOLoad,
8705 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo, Ranges);
8706 LD = DAG.getLoadFFVP(VT, DL, InChain, OpValues[0], OpValues[1], OpValues[2],
8707 MMO);
8708 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, EVLVT, LD.getValue(1));
8709 if (AddToChain)
8710 PendingLoads.push_back(LD.getValue(2));
8711 setValue(&VPIntrin, DAG.getMergeValues({LD.getValue(0), Trunc}, DL));
8712}
8713
8714void SelectionDAGBuilder::visitVPGather(
8715 const VPIntrinsic &VPIntrin, EVT VT,
8716 const SmallVectorImpl<SDValue> &OpValues) {
8717 SDLoc DL = getCurSDLoc();
8718 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8719 Value *PtrOperand = VPIntrin.getArgOperand(0);
8720 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8721 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8722 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8723 SDValue LD;
8724 if (!Alignment)
8725 Alignment = DAG.getEVTAlign(VT.getScalarType());
8726 unsigned AS =
8727 PtrOperand->getType()->getScalarType()->getPointerAddressSpace();
8728 MachineMemOperand::Flags MMOFlags =
8729 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8730 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8731 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8732 *Alignment, AAInfo, Ranges);
8733 SDValue Base, Index, Scale;
8734 bool UniformBase =
8735 getUniformBase(PtrOperand, Base, Index, Scale, this, VPIntrin.getParent(),
8736 VT.getScalarStoreSize());
8737 if (!UniformBase) {
8738 Base = DAG.getConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout()));
8739 Index = getValue(PtrOperand);
8740 Scale = DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout()));
8741 }
8742 EVT IdxVT = Index.getValueType();
8743 EVT EltTy = IdxVT.getVectorElementType();
8744 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
8745 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
8746 Index = DAG.getNode(ISD::SIGN_EXTEND, DL, NewIdxVT, Index);
8747 }
8748 LD = DAG.getGatherVP(
8749 DAG.getVTList(VT, MVT::Other), VT, DL,
8750 {DAG.getRoot(), Base, Index, Scale, OpValues[1], OpValues[2]}, MMO,
8752 PendingLoads.push_back(LD.getValue(1));
8753 setValue(&VPIntrin, LD);
8754}
8755
8756void SelectionDAGBuilder::visitVPStore(
8757 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8758 SDLoc DL = getCurSDLoc();
8759 Value *PtrOperand = VPIntrin.getArgOperand(1);
8760 EVT VT = OpValues[0].getValueType();
8761 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8762 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8763 SDValue ST;
8764 if (!Alignment)
8765 Alignment = DAG.getEVTAlign(VT);
8766 SDValue Ptr = OpValues[1];
8767 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
8768 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8769 MachineMemOperand::Flags MMOFlags =
8770 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8771 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8772 MachinePointerInfo(PtrOperand), MMOFlags,
8773 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo);
8774 ST = DAG.getStoreVP(getMemoryRoot(), DL, OpValues[0], Ptr, Offset,
8775 OpValues[2], OpValues[3], VT, MMO, ISD::UNINDEXED,
8776 /* IsTruncating */ false, /*IsCompressing*/ false);
8777 DAG.setRoot(ST);
8778 setValue(&VPIntrin, ST);
8779}
8780
8781void SelectionDAGBuilder::visitVPScatter(
8782 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8783 SDLoc DL = getCurSDLoc();
8784 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8785 Value *PtrOperand = VPIntrin.getArgOperand(1);
8786 EVT VT = OpValues[0].getValueType();
8787 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8788 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8789 SDValue ST;
8790 if (!Alignment)
8791 Alignment = DAG.getEVTAlign(VT.getScalarType());
8792 unsigned AS =
8793 PtrOperand->getType()->getScalarType()->getPointerAddressSpace();
8794 MachineMemOperand::Flags MMOFlags =
8795 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8796 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8797 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8798 *Alignment, AAInfo);
8799 SDValue Base, Index, Scale;
8800 bool UniformBase =
8801 getUniformBase(PtrOperand, Base, Index, Scale, this, VPIntrin.getParent(),
8802 VT.getScalarStoreSize());
8803 if (!UniformBase) {
8804 Base = DAG.getConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout()));
8805 Index = getValue(PtrOperand);
8806 Scale = DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout()));
8807 }
8808 EVT IdxVT = Index.getValueType();
8809 EVT EltTy = IdxVT.getVectorElementType();
8810 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
8811 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
8812 Index = DAG.getNode(ISD::SIGN_EXTEND, DL, NewIdxVT, Index);
8813 }
8814 ST = DAG.getScatterVP(DAG.getVTList(MVT::Other), VT, DL,
8815 {getMemoryRoot(), OpValues[0], Base, Index, Scale,
8816 OpValues[2], OpValues[3]},
8817 MMO, ISD::SIGNED_SCALED);
8818 DAG.setRoot(ST);
8819 setValue(&VPIntrin, ST);
8820}
8821
8822void SelectionDAGBuilder::visitVPStridedLoad(
8823 const VPIntrinsic &VPIntrin, EVT VT,
8824 const SmallVectorImpl<SDValue> &OpValues) {
8825 SDLoc DL = getCurSDLoc();
8826 Value *PtrOperand = VPIntrin.getArgOperand(0);
8827 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8828 if (!Alignment)
8829 Alignment = DAG.getEVTAlign(VT.getScalarType());
8830 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8831 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8832 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8833 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8834 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8835 unsigned AS = PtrOperand->getType()->getPointerAddressSpace();
8836 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8837 MachineMemOperand::Flags MMOFlags =
8838 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8839 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8840 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8841 *Alignment, AAInfo, Ranges);
8842
8843 SDValue LD = DAG.getStridedLoadVP(VT, DL, InChain, OpValues[0], OpValues[1],
8844 OpValues[2], OpValues[3], MMO,
8845 false /*IsExpanding*/);
8846
8847 if (AddToChain)
8848 PendingLoads.push_back(LD.getValue(1));
8849 setValue(&VPIntrin, LD);
8850}
8851
8852void SelectionDAGBuilder::visitVPStridedStore(
8853 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8854 SDLoc DL = getCurSDLoc();
8855 Value *PtrOperand = VPIntrin.getArgOperand(1);
8856 EVT VT = OpValues[0].getValueType();
8857 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8858 if (!Alignment)
8859 Alignment = DAG.getEVTAlign(VT.getScalarType());
8860 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8861 unsigned AS = PtrOperand->getType()->getPointerAddressSpace();
8862 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8863 MachineMemOperand::Flags MMOFlags =
8864 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8865 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8866 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8867 *Alignment, AAInfo);
8868
8869 SDValue ST = DAG.getStridedStoreVP(
8870 getMemoryRoot(), DL, OpValues[0], OpValues[1],
8871 DAG.getUNDEF(OpValues[1].getValueType()), OpValues[2], OpValues[3],
8872 OpValues[4], VT, MMO, ISD::UNINDEXED, /*IsTruncating*/ false,
8873 /*IsCompressing*/ false);
8874
8875 DAG.setRoot(ST);
8876 setValue(&VPIntrin, ST);
8877}
8878
8879void SelectionDAGBuilder::visitVPCmp(const VPCmpIntrinsic &VPIntrin) {
8880 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8881 SDLoc DL = getCurSDLoc();
8882
8883 ISD::CondCode Condition;
8885
8886 Value *Op1 = VPIntrin.getOperand(0);
8887 Value *Op2 = VPIntrin.getOperand(1);
8888 // #2 is the condition code
8889 SDValue MaskOp = getValue(VPIntrin.getOperand(3));
8890 SDValue EVL = getValue(VPIntrin.getOperand(4));
8891 MVT EVLParamVT = TLI.getVPExplicitVectorLengthTy();
8892 assert(EVLParamVT.isScalarInteger() && EVLParamVT.bitsGE(MVT::i32) &&
8893 "Unexpected target EVL type");
8894 EVL = DAG.getNode(ISD::ZERO_EXTEND, DL, EVLParamVT, EVL);
8895
8896 if (VPIntrin.getOperand(0)->getType()->isFPOrFPVectorTy()) {
8897 Condition = getFCmpCondCode(CondCode);
8898 SimplifyQuery SQ(DAG.getDataLayout(), &VPIntrin);
8899 if (isKnownNeverNaN(Op2, SQ) && isKnownNeverNaN(Op1, SQ))
8900 Condition = getFCmpCodeWithoutNaN(Condition);
8901 } else {
8902 Condition = getICmpCondCode(CondCode);
8903 }
8904
8905 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
8906 VPIntrin.getType());
8907 setValue(&VPIntrin, DAG.getSetCCVP(DL, DestVT, getValue(Op1), getValue(Op2),
8908 Condition, MaskOp, EVL));
8909}
8910
8911void SelectionDAGBuilder::visitVectorPredicationIntrinsic(
8912 const VPIntrinsic &VPIntrin) {
8913 SDLoc DL = getCurSDLoc();
8914 unsigned Opcode = getISDForVPIntrinsic(VPIntrin);
8915
8916 auto IID = VPIntrin.getIntrinsicID();
8917
8918 if (const auto *CmpI = dyn_cast<VPCmpIntrinsic>(&VPIntrin))
8919 return visitVPCmp(*CmpI);
8920
8921 SmallVector<EVT, 4> ValueVTs;
8922 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8923 ComputeValueVTs(TLI, DAG.getDataLayout(), VPIntrin.getType(), ValueVTs);
8924 SDVTList VTs = DAG.getVTList(ValueVTs);
8925
8926 auto EVLParamPos = VPIntrinsic::getVectorLengthParamPos(IID);
8927
8928 MVT EVLParamVT = TLI.getVPExplicitVectorLengthTy();
8929 assert(EVLParamVT.isScalarInteger() && EVLParamVT.bitsGE(MVT::i32) &&
8930 "Unexpected target EVL type");
8931
8932 // Request operands.
8933 SmallVector<SDValue, 7> OpValues;
8934 for (unsigned I = 0; I < VPIntrin.arg_size(); ++I) {
8935 auto Op = getValue(VPIntrin.getArgOperand(I));
8936 if (I == EVLParamPos)
8937 Op = DAG.getNode(ISD::ZERO_EXTEND, DL, EVLParamVT, Op);
8938 OpValues.push_back(Op);
8939 }
8940
8941 switch (Opcode) {
8942 default: {
8943 SDNodeFlags SDFlags;
8944 if (auto *FPMO = dyn_cast<FPMathOperator>(&VPIntrin))
8945 SDFlags.copyFMF(*FPMO);
8946 SDValue Result = DAG.getNode(Opcode, DL, VTs, OpValues, SDFlags);
8947 setValue(&VPIntrin, Result);
8948 break;
8949 }
8950 case ISD::VP_LOAD:
8951 visitVPLoad(VPIntrin, ValueVTs[0], OpValues);
8952 break;
8953 case ISD::VP_LOAD_FF:
8954 visitVPLoadFF(VPIntrin, ValueVTs[0], ValueVTs[1], OpValues);
8955 break;
8956 case ISD::VP_GATHER:
8957 visitVPGather(VPIntrin, ValueVTs[0], OpValues);
8958 break;
8959 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
8960 visitVPStridedLoad(VPIntrin, ValueVTs[0], OpValues);
8961 break;
8962 case ISD::VP_STORE:
8963 visitVPStore(VPIntrin, OpValues);
8964 break;
8965 case ISD::VP_SCATTER:
8966 visitVPScatter(VPIntrin, OpValues);
8967 break;
8968 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
8969 visitVPStridedStore(VPIntrin, OpValues);
8970 break;
8971 case ISD::VP_FMULADD: {
8972 assert(OpValues.size() == 5 && "Unexpected number of operands");
8973 SDNodeFlags SDFlags;
8974 if (auto *FPMO = dyn_cast<FPMathOperator>(&VPIntrin))
8975 SDFlags.copyFMF(*FPMO);
8976 if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
8977 TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), ValueVTs[0])) {
8978 setValue(&VPIntrin, DAG.getNode(ISD::VP_FMA, DL, VTs, OpValues, SDFlags));
8979 } else {
8980 SDValue Mul = DAG.getNode(
8981 ISD::VP_FMUL, DL, VTs,
8982 {OpValues[0], OpValues[1], OpValues[3], OpValues[4]}, SDFlags);
8983 SDValue Add =
8984 DAG.getNode(ISD::VP_FADD, DL, VTs,
8985 {Mul, OpValues[2], OpValues[3], OpValues[4]}, SDFlags);
8986 setValue(&VPIntrin, Add);
8987 }
8988 break;
8989 }
8990 case ISD::VP_IS_FPCLASS: {
8991 const DataLayout DLayout = DAG.getDataLayout();
8992 EVT DestVT = TLI.getValueType(DLayout, VPIntrin.getType());
8993 auto Constant = OpValues[1]->getAsZExtVal();
8994 SDValue Check = DAG.getTargetConstant(Constant, DL, MVT::i32);
8995 SDValue V = DAG.getNode(ISD::VP_IS_FPCLASS, DL, DestVT,
8996 {OpValues[0], Check, OpValues[2], OpValues[3]});
8997 setValue(&VPIntrin, V);
8998 return;
8999 }
9000 case ISD::VP_INTTOPTR: {
9001 SDValue N = OpValues[0];
9002 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), VPIntrin.getType());
9003 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(), VPIntrin.getType());
9004 N = DAG.getVPPtrExtOrTrunc(getCurSDLoc(), DestVT, N, OpValues[1],
9005 OpValues[2]);
9006 N = DAG.getVPZExtOrTrunc(getCurSDLoc(), PtrMemVT, N, OpValues[1],
9007 OpValues[2]);
9008 setValue(&VPIntrin, N);
9009 break;
9010 }
9011 case ISD::VP_PTRTOINT: {
9012 SDValue N = OpValues[0];
9013 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9014 VPIntrin.getType());
9015 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(),
9016 VPIntrin.getOperand(0)->getType());
9017 N = DAG.getVPPtrExtOrTrunc(getCurSDLoc(), PtrMemVT, N, OpValues[1],
9018 OpValues[2]);
9019 N = DAG.getVPZExtOrTrunc(getCurSDLoc(), DestVT, N, OpValues[1],
9020 OpValues[2]);
9021 setValue(&VPIntrin, N);
9022 break;
9023 }
9024 case ISD::VP_ABS:
9025 case ISD::VP_CTLZ:
9026 case ISD::VP_CTLZ_ZERO_UNDEF:
9027 case ISD::VP_CTTZ:
9028 case ISD::VP_CTTZ_ZERO_UNDEF:
9029 case ISD::VP_CTTZ_ELTS_ZERO_UNDEF:
9030 case ISD::VP_CTTZ_ELTS: {
9031 SDValue Result =
9032 DAG.getNode(Opcode, DL, VTs, {OpValues[0], OpValues[2], OpValues[3]});
9033 setValue(&VPIntrin, Result);
9034 break;
9035 }
9036 }
9037}
9038
9039SDValue SelectionDAGBuilder::lowerStartEH(SDValue Chain,
9040 const BasicBlock *EHPadBB,
9041 MCSymbol *&BeginLabel) {
9042 MachineFunction &MF = DAG.getMachineFunction();
9043
9044 // Insert a label before the invoke call to mark the try range. This can be
9045 // used to detect deletion of the invoke via the MachineModuleInfo.
9046 BeginLabel = MF.getContext().createTempSymbol();
9047
9048 // For SjLj, keep track of which landing pads go with which invokes
9049 // so as to maintain the ordering of pads in the LSDA.
9050 unsigned CallSiteIndex = FuncInfo.getCurrentCallSite();
9051 if (CallSiteIndex) {
9052 MF.setCallSiteBeginLabel(BeginLabel, CallSiteIndex);
9053 LPadToCallSiteMap[FuncInfo.getMBB(EHPadBB)].push_back(CallSiteIndex);
9054
9055 // Now that the call site is handled, stop tracking it.
9056 FuncInfo.setCurrentCallSite(0);
9057 }
9058
9059 return DAG.getEHLabel(getCurSDLoc(), Chain, BeginLabel);
9060}
9061
9062SDValue SelectionDAGBuilder::lowerEndEH(SDValue Chain, const InvokeInst *II,
9063 const BasicBlock *EHPadBB,
9064 MCSymbol *BeginLabel) {
9065 assert(BeginLabel && "BeginLabel should've been set");
9066
9067 MachineFunction &MF = DAG.getMachineFunction();
9068
9069 // Insert a label at the end of the invoke call to mark the try range. This
9070 // can be used to detect deletion of the invoke via the MachineModuleInfo.
9071 MCSymbol *EndLabel = MF.getContext().createTempSymbol();
9072 Chain = DAG.getEHLabel(getCurSDLoc(), Chain, EndLabel);
9073
9074 // Inform MachineModuleInfo of range.
9075 auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn());
9076 // There is a platform (e.g. wasm) that uses funclet style IR but does not
9077 // actually use outlined funclets and their LSDA info style.
9078 if (MF.hasEHFunclets() && isFuncletEHPersonality(Pers)) {
9079 assert(II && "II should've been set");
9080 WinEHFuncInfo *EHInfo = MF.getWinEHFuncInfo();
9081 EHInfo->addIPToStateRange(II, BeginLabel, EndLabel);
9082 } else if (!isScopedEHPersonality(Pers)) {
9083 assert(EHPadBB);
9084 MF.addInvoke(FuncInfo.getMBB(EHPadBB), BeginLabel, EndLabel);
9085 }
9086
9087 return Chain;
9088}
9089
9090std::pair<SDValue, SDValue>
9092 const BasicBlock *EHPadBB) {
9093 MCSymbol *BeginLabel = nullptr;
9094
9095 if (EHPadBB) {
9096 // Both PendingLoads and PendingExports must be flushed here;
9097 // this call might not return.
9098 (void)getRoot();
9099 DAG.setRoot(lowerStartEH(getControlRoot(), EHPadBB, BeginLabel));
9100 CLI.setChain(getRoot());
9101 }
9102
9103 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9104 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
9105
9106 assert((CLI.IsTailCall || Result.second.getNode()) &&
9107 "Non-null chain expected with non-tail call!");
9108 assert((Result.second.getNode() || !Result.first.getNode()) &&
9109 "Null value expected with tail call!");
9110
9111 if (!Result.second.getNode()) {
9112 // As a special case, a null chain means that a tail call has been emitted
9113 // and the DAG root is already updated.
9114 HasTailCall = true;
9115
9116 // Since there's no actual continuation from this block, nothing can be
9117 // relying on us setting vregs for them.
9118 PendingExports.clear();
9119 } else {
9120 DAG.setRoot(Result.second);
9121 }
9122
9123 if (EHPadBB) {
9124 DAG.setRoot(lowerEndEH(getRoot(), cast_or_null<InvokeInst>(CLI.CB), EHPadBB,
9125 BeginLabel));
9126 Result.second = getRoot();
9127 }
9128
9129 return Result;
9130}
9131
9133 bool isMustTailCall = CB.isMustTailCall();
9134
9135 // Avoid emitting tail calls in functions with the disable-tail-calls
9136 // attribute.
9137 const Function *Caller = CB.getParent()->getParent();
9138 if (!isMustTailCall &&
9139 Caller->getFnAttribute("disable-tail-calls").getValueAsBool())
9140 return false;
9141
9142 // We can't tail call inside a function with a swifterror argument. Lowering
9143 // does not support this yet. It would have to move into the swifterror
9144 // register before the call.
9145 if (DAG.getTargetLoweringInfo().supportSwiftError() &&
9146 Caller->getAttributes().hasAttrSomewhere(Attribute::SwiftError))
9147 return false;
9148
9149 // Check if target-independent constraints permit a tail call here.
9150 // Target-dependent constraints are checked within TLI->LowerCallTo.
9151 return isInTailCallPosition(CB, DAG.getTarget());
9152}
9153
9155 bool isTailCall, bool isMustTailCall,
9156 const BasicBlock *EHPadBB,
9157 const TargetLowering::PtrAuthInfo *PAI) {
9158 auto &DL = DAG.getDataLayout();
9159 FunctionType *FTy = CB.getFunctionType();
9160 Type *RetTy = CB.getType();
9161
9163 Args.reserve(CB.arg_size());
9164
9165 const Value *SwiftErrorVal = nullptr;
9166 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9167
9168 if (isTailCall)
9169 isTailCall = canTailCall(CB);
9170
9171 for (auto I = CB.arg_begin(), E = CB.arg_end(); I != E; ++I) {
9172 const Value *V = *I;
9173
9174 // Skip empty types
9175 if (V->getType()->isEmptyTy())
9176 continue;
9177
9178 SDValue ArgNode = getValue(V);
9179 TargetLowering::ArgListEntry Entry(ArgNode, V->getType());
9180 Entry.setAttributes(&CB, I - CB.arg_begin());
9181
9182 // Use swifterror virtual register as input to the call.
9183 if (Entry.IsSwiftError && TLI.supportSwiftError()) {
9184 SwiftErrorVal = V;
9185 // We find the virtual register for the actual swifterror argument.
9186 // Instead of using the Value, we use the virtual register instead.
9187 Entry.Node =
9188 DAG.getRegister(SwiftError.getOrCreateVRegUseAt(&CB, FuncInfo.MBB, V),
9189 EVT(TLI.getPointerTy(DL)));
9190 }
9191
9192 Args.push_back(Entry);
9193
9194 // If we have an explicit sret argument that is an Instruction, (i.e., it
9195 // might point to function-local memory), we can't meaningfully tail-call.
9196 if (Entry.IsSRet && isa<Instruction>(V))
9197 isTailCall = false;
9198 }
9199
9200 // If call site has a cfguardtarget operand bundle, create and add an
9201 // additional ArgListEntry.
9202 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_cfguardtarget)) {
9203 Value *V = Bundle->Inputs[0];
9205 Entry.IsCFGuardTarget = true;
9206 Args.push_back(Entry);
9207 }
9208
9209 // Disable tail calls if there is an swifterror argument. Targets have not
9210 // been updated to support tail calls.
9211 if (TLI.supportSwiftError() && SwiftErrorVal)
9212 isTailCall = false;
9213
9214 ConstantInt *CFIType = nullptr;
9215 if (CB.isIndirectCall()) {
9216 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_kcfi)) {
9217 if (!TLI.supportKCFIBundles())
9219 "Target doesn't support calls with kcfi operand bundles.");
9220 CFIType = cast<ConstantInt>(Bundle->Inputs[0]);
9221 assert(CFIType->getType()->isIntegerTy(32) && "Invalid CFI type");
9222 }
9223 }
9224
9225 SDValue ConvControlToken;
9226 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_convergencectrl)) {
9227 auto *Token = Bundle->Inputs[0].get();
9228 ConvControlToken = getValue(Token);
9229 }
9230
9231 GlobalValue *DeactivationSymbol = nullptr;
9233 DeactivationSymbol = cast<GlobalValue>(Bundle->Inputs[0].get());
9234 }
9235
9238 .setChain(getRoot())
9239 .setCallee(RetTy, FTy, Callee, std::move(Args), CB)
9240 .setTailCall(isTailCall)
9244 .setCFIType(CFIType)
9245 .setConvergenceControlToken(ConvControlToken)
9246 .setDeactivationSymbol(DeactivationSymbol);
9247
9248 // Set the pointer authentication info if we have it.
9249 if (PAI) {
9250 if (!TLI.supportPtrAuthBundles())
9252 "This target doesn't support calls with ptrauth operand bundles.");
9253 CLI.setPtrAuth(*PAI);
9254 }
9255
9256 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
9257
9258 if (Result.first.getNode()) {
9259 Result.first = lowerRangeToAssertZExt(DAG, CB, Result.first);
9260 Result.first = lowerNoFPClassToAssertNoFPClass(DAG, CB, Result.first);
9261 setValue(&CB, Result.first);
9262 }
9263
9264 // The last element of CLI.InVals has the SDValue for swifterror return.
9265 // Here we copy it to a virtual register and update SwiftErrorMap for
9266 // book-keeping.
9267 if (SwiftErrorVal && TLI.supportSwiftError()) {
9268 // Get the last element of InVals.
9269 SDValue Src = CLI.InVals.back();
9270 Register VReg =
9271 SwiftError.getOrCreateVRegDefAt(&CB, FuncInfo.MBB, SwiftErrorVal);
9272 SDValue CopyNode = CLI.DAG.getCopyToReg(Result.second, CLI.DL, VReg, Src);
9273 DAG.setRoot(CopyNode);
9274 }
9275}
9276
9277static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT,
9278 SelectionDAGBuilder &Builder) {
9279 // Check to see if this load can be trivially constant folded, e.g. if the
9280 // input is from a string literal.
9281 if (const Constant *LoadInput = dyn_cast<Constant>(PtrVal)) {
9282 // Cast pointer to the type we really want to load.
9283 Type *LoadTy =
9284 Type::getIntNTy(PtrVal->getContext(), LoadVT.getScalarSizeInBits());
9285 if (LoadVT.isVector())
9286 LoadTy = FixedVectorType::get(LoadTy, LoadVT.getVectorNumElements());
9287 if (const Constant *LoadCst =
9288 ConstantFoldLoadFromConstPtr(const_cast<Constant *>(LoadInput),
9289 LoadTy, Builder.DAG.getDataLayout()))
9290 return Builder.getValue(LoadCst);
9291 }
9292
9293 // Otherwise, we have to emit the load. If the pointer is to unfoldable but
9294 // still constant memory, the input chain can be the entry node.
9295 SDValue Root;
9296 bool ConstantMemory = false;
9297
9298 // Do not serialize (non-volatile) loads of constant memory with anything.
9299 if (Builder.BatchAA && Builder.BatchAA->pointsToConstantMemory(PtrVal)) {
9300 Root = Builder.DAG.getEntryNode();
9301 ConstantMemory = true;
9302 } else {
9303 // Do not serialize non-volatile loads against each other.
9304 Root = Builder.DAG.getRoot();
9305 }
9306
9307 SDValue Ptr = Builder.getValue(PtrVal);
9308 SDValue LoadVal =
9309 Builder.DAG.getLoad(LoadVT, Builder.getCurSDLoc(), Root, Ptr,
9310 MachinePointerInfo(PtrVal), Align(1));
9311
9312 if (!ConstantMemory)
9313 Builder.PendingLoads.push_back(LoadVal.getValue(1));
9314 return LoadVal;
9315}
9316
9317/// Record the value for an instruction that produces an integer result,
9318/// converting the type where necessary.
9319void SelectionDAGBuilder::processIntegerCallValue(const Instruction &I,
9320 SDValue Value,
9321 bool IsSigned) {
9322 EVT VT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9323 I.getType(), true);
9324 Value = DAG.getExtOrTrunc(IsSigned, Value, getCurSDLoc(), VT);
9325 setValue(&I, Value);
9326}
9327
9328/// See if we can lower a memcmp/bcmp call into an optimized form. If so, return
9329/// true and lower it. Otherwise return false, and it will be lowered like a
9330/// normal call.
9331/// The caller already checked that \p I calls the appropriate LibFunc with a
9332/// correct prototype.
9333bool SelectionDAGBuilder::visitMemCmpBCmpCall(const CallInst &I) {
9334 const Value *LHS = I.getArgOperand(0), *RHS = I.getArgOperand(1);
9335 const Value *Size = I.getArgOperand(2);
9336 const ConstantSDNode *CSize = dyn_cast<ConstantSDNode>(getValue(Size));
9337 if (CSize && CSize->getZExtValue() == 0) {
9338 EVT CallVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9339 I.getType(), true);
9340 setValue(&I, DAG.getConstant(0, getCurSDLoc(), CallVT));
9341 return true;
9342 }
9343
9344 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9345 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForMemcmp(
9346 DAG, getCurSDLoc(), DAG.getRoot(), getValue(LHS), getValue(RHS),
9347 getValue(Size), &I);
9348 if (Res.first.getNode()) {
9349 processIntegerCallValue(I, Res.first, true);
9350 PendingLoads.push_back(Res.second);
9351 return true;
9352 }
9353
9354 // memcmp(S1,S2,2) != 0 -> (*(short*)LHS != *(short*)RHS) != 0
9355 // memcmp(S1,S2,4) != 0 -> (*(int*)LHS != *(int*)RHS) != 0
9356 if (!CSize || !isOnlyUsedInZeroEqualityComparison(&I))
9357 return false;
9358
9359 // If the target has a fast compare for the given size, it will return a
9360 // preferred load type for that size. Require that the load VT is legal and
9361 // that the target supports unaligned loads of that type. Otherwise, return
9362 // INVALID.
9363 auto hasFastLoadsAndCompare = [&](unsigned NumBits) {
9364 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9365 MVT LVT = TLI.hasFastEqualityCompare(NumBits);
9366 if (LVT != MVT::INVALID_SIMPLE_VALUE_TYPE) {
9367 // TODO: Handle 5 byte compare as 4-byte + 1 byte.
9368 // TODO: Handle 8 byte compare on x86-32 as two 32-bit loads.
9369 // TODO: Check alignment of src and dest ptrs.
9370 unsigned DstAS = LHS->getType()->getPointerAddressSpace();
9371 unsigned SrcAS = RHS->getType()->getPointerAddressSpace();
9372 if (!TLI.isTypeLegal(LVT) ||
9373 !TLI.allowsMisalignedMemoryAccesses(LVT, SrcAS) ||
9374 !TLI.allowsMisalignedMemoryAccesses(LVT, DstAS))
9376 }
9377
9378 return LVT;
9379 };
9380
9381 // This turns into unaligned loads. We only do this if the target natively
9382 // supports the MVT we'll be loading or if it is small enough (<= 4) that
9383 // we'll only produce a small number of byte loads.
9384 MVT LoadVT;
9385 unsigned NumBitsToCompare = CSize->getZExtValue() * 8;
9386 switch (NumBitsToCompare) {
9387 default:
9388 return false;
9389 case 16:
9390 LoadVT = MVT::i16;
9391 break;
9392 case 32:
9393 LoadVT = MVT::i32;
9394 break;
9395 case 64:
9396 case 128:
9397 case 256:
9398 LoadVT = hasFastLoadsAndCompare(NumBitsToCompare);
9399 break;
9400 }
9401
9402 if (LoadVT == MVT::INVALID_SIMPLE_VALUE_TYPE)
9403 return false;
9404
9405 SDValue LoadL = getMemCmpLoad(LHS, LoadVT, *this);
9406 SDValue LoadR = getMemCmpLoad(RHS, LoadVT, *this);
9407
9408 // Bitcast to a wide integer type if the loads are vectors.
9409 if (LoadVT.isVector()) {
9410 EVT CmpVT = EVT::getIntegerVT(LHS->getContext(), LoadVT.getSizeInBits());
9411 LoadL = DAG.getBitcast(CmpVT, LoadL);
9412 LoadR = DAG.getBitcast(CmpVT, LoadR);
9413 }
9414
9415 SDValue Cmp = DAG.getSetCC(getCurSDLoc(), MVT::i1, LoadL, LoadR, ISD::SETNE);
9416 processIntegerCallValue(I, Cmp, false);
9417 return true;
9418}
9419
9420/// See if we can lower a memchr call into an optimized form. If so, return
9421/// true and lower it. Otherwise return false, and it will be lowered like a
9422/// normal call.
9423/// The caller already checked that \p I calls the appropriate LibFunc with a
9424/// correct prototype.
9425bool SelectionDAGBuilder::visitMemChrCall(const CallInst &I) {
9426 const Value *Src = I.getArgOperand(0);
9427 const Value *Char = I.getArgOperand(1);
9428 const Value *Length = I.getArgOperand(2);
9429
9430 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9431 std::pair<SDValue, SDValue> Res =
9432 TSI.EmitTargetCodeForMemchr(DAG, getCurSDLoc(), DAG.getRoot(),
9433 getValue(Src), getValue(Char), getValue(Length),
9434 MachinePointerInfo(Src));
9435 if (Res.first.getNode()) {
9436 setValue(&I, Res.first);
9437 PendingLoads.push_back(Res.second);
9438 return true;
9439 }
9440
9441 return false;
9442}
9443
9444/// See if we can lower a memccpy call into an optimized form. If so, return
9445/// true and lower it, otherwise return false and it will be lowered like a
9446/// normal call.
9447/// The caller already checked that \p I calls the appropriate LibFunc with a
9448/// correct prototype.
9449bool SelectionDAGBuilder::visitMemCCpyCall(const CallInst &I) {
9450 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9451 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForMemccpy(
9452 DAG, getCurSDLoc(), DAG.getRoot(), getValue(I.getArgOperand(0)),
9453 getValue(I.getArgOperand(1)), getValue(I.getArgOperand(2)),
9454 getValue(I.getArgOperand(3)), &I);
9455
9456 if (Res.first) {
9457 processIntegerCallValue(I, Res.first, true);
9458 PendingLoads.push_back(Res.second);
9459 return true;
9460 }
9461 return false;
9462}
9463
9464/// See if we can lower a mempcpy call into an optimized form. If so, return
9465/// true and lower it. Otherwise return false, and it will be lowered like a
9466/// normal call.
9467/// The caller already checked that \p I calls the appropriate LibFunc with a
9468/// correct prototype.
9469bool SelectionDAGBuilder::visitMemPCpyCall(const CallInst &I) {
9470 SDValue Dst = getValue(I.getArgOperand(0));
9471 SDValue Src = getValue(I.getArgOperand(1));
9472 SDValue Size = getValue(I.getArgOperand(2));
9473
9474 Align DstAlign = DAG.InferPtrAlign(Dst).valueOrOne();
9475 Align SrcAlign = DAG.InferPtrAlign(Src).valueOrOne();
9476 // DAG::getMemcpy needs Alignment to be defined.
9477 Align Alignment = std::min(DstAlign, SrcAlign);
9478
9479 SDLoc sdl = getCurSDLoc();
9480
9481 // In the mempcpy context we need to pass in a false value for isTailCall
9482 // because the return pointer needs to be adjusted by the size of
9483 // the copied memory.
9484 SDValue Root = getMemoryRoot();
9485 SDValue MC = DAG.getMemcpy(
9486 Root, sdl, Dst, Src, Size, Alignment, false, false, /*CI=*/nullptr,
9487 std::nullopt, MachinePointerInfo(I.getArgOperand(0)),
9488 MachinePointerInfo(I.getArgOperand(1)), I.getAAMetadata());
9489 assert(MC.getNode() != nullptr &&
9490 "** memcpy should not be lowered as TailCall in mempcpy context **");
9491 DAG.setRoot(MC);
9492
9493 // Check if Size needs to be truncated or extended.
9494 Size = DAG.getSExtOrTrunc(Size, sdl, Dst.getValueType());
9495
9496 // Adjust return pointer to point just past the last dst byte.
9497 SDValue DstPlusSize = DAG.getMemBasePlusOffset(Dst, Size, sdl);
9498 setValue(&I, DstPlusSize);
9499 return true;
9500}
9501
9502/// See if we can lower a strcpy call into an optimized form. If so, return
9503/// true and lower it, otherwise return false and it will be lowered like a
9504/// normal call.
9505/// The caller already checked that \p I calls the appropriate LibFunc with a
9506/// correct prototype.
9507bool SelectionDAGBuilder::visitStrCpyCall(const CallInst &I, bool isStpcpy) {
9508 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9509
9510 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9511 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrcpy(
9512 DAG, getCurSDLoc(), getRoot(), getValue(Arg0), getValue(Arg1),
9513 MachinePointerInfo(Arg0), MachinePointerInfo(Arg1), isStpcpy, &I);
9514 if (Res.first.getNode()) {
9515 setValue(&I, Res.first);
9516 DAG.setRoot(Res.second);
9517 return true;
9518 }
9519
9520 return false;
9521}
9522
9523/// See if we can lower a strcmp call into an optimized form. If so, return
9524/// true and lower it, otherwise return false and it will be lowered like a
9525/// normal call.
9526/// The caller already checked that \p I calls the appropriate LibFunc with a
9527/// correct prototype.
9528bool SelectionDAGBuilder::visitStrCmpCall(const CallInst &I) {
9529 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9530
9531 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9532 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrcmp(
9533 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), getValue(Arg1),
9534 MachinePointerInfo(Arg0), MachinePointerInfo(Arg1), &I);
9535 if (Res.first.getNode()) {
9536 processIntegerCallValue(I, Res.first, true);
9537 PendingLoads.push_back(Res.second);
9538 return true;
9539 }
9540
9541 return false;
9542}
9543
9544/// See if we can lower a strlen call into an optimized form. If so, return
9545/// true and lower it, otherwise return false and it will be lowered like a
9546/// normal call.
9547/// The caller already checked that \p I calls the appropriate LibFunc with a
9548/// correct prototype.
9549bool SelectionDAGBuilder::visitStrLenCall(const CallInst &I) {
9550 const Value *Arg0 = I.getArgOperand(0);
9551
9552 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9553 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrlen(
9554 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), &I);
9555 if (Res.first.getNode()) {
9556 processIntegerCallValue(I, Res.first, false);
9557 PendingLoads.push_back(Res.second);
9558 return true;
9559 }
9560
9561 return false;
9562}
9563
9564/// See if we can lower a strnlen call into an optimized form. If so, return
9565/// true and lower it, otherwise return false and it will be lowered like a
9566/// normal call.
9567/// The caller already checked that \p I calls the appropriate LibFunc with a
9568/// correct prototype.
9569bool SelectionDAGBuilder::visitStrNLenCall(const CallInst &I) {
9570 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9571
9572 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9573 std::pair<SDValue, SDValue> Res =
9574 TSI.EmitTargetCodeForStrnlen(DAG, getCurSDLoc(), DAG.getRoot(),
9575 getValue(Arg0), getValue(Arg1),
9576 MachinePointerInfo(Arg0));
9577 if (Res.first.getNode()) {
9578 processIntegerCallValue(I, Res.first, false);
9579 PendingLoads.push_back(Res.second);
9580 return true;
9581 }
9582
9583 return false;
9584}
9585
9586/// See if we can lower a Strstr call into an optimized form. If so, return
9587/// true and lower it, otherwise return false and it will be lowered like a
9588/// normal call.
9589/// The caller already checked that \p I calls the appropriate LibFunc with a
9590/// correct prototype.
9591bool SelectionDAGBuilder::visitStrstrCall(const CallInst &I) {
9592 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9593 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9594 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrstr(
9595 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), getValue(Arg1), &I);
9596 if (Res.first) {
9597 processIntegerCallValue(I, Res.first, false);
9598 PendingLoads.push_back(Res.second);
9599 return true;
9600 }
9601 return false;
9602}
9603
9604/// See if we can lower a unary floating-point operation into an SDNode with
9605/// the specified Opcode. If so, return true and lower it, otherwise return
9606/// false and it will be lowered like a normal call.
9607/// The caller already checked that \p I calls the appropriate LibFunc with a
9608/// correct prototype.
9609bool SelectionDAGBuilder::visitUnaryFloatCall(const CallInst &I,
9610 unsigned Opcode) {
9611 // We already checked this call's prototype; verify it doesn't modify errno.
9612 // Do not perform optimizations for call sites that require strict
9613 // floating-point semantics.
9614 if (!I.onlyReadsMemory() || I.isStrictFP())
9615 return false;
9616
9617 SDNodeFlags Flags;
9618 Flags.copyFMF(cast<FPMathOperator>(I));
9619
9620 SDValue Tmp = getValue(I.getArgOperand(0));
9621 setValue(&I,
9622 DAG.getNode(Opcode, getCurSDLoc(), Tmp.getValueType(), Tmp, Flags));
9623 return true;
9624}
9625
9626/// See if we can lower a binary floating-point operation into an SDNode with
9627/// the specified Opcode. If so, return true and lower it. Otherwise return
9628/// false, and it will be lowered like a normal call.
9629/// The caller already checked that \p I calls the appropriate LibFunc with a
9630/// correct prototype.
9631bool SelectionDAGBuilder::visitBinaryFloatCall(const CallInst &I,
9632 unsigned Opcode) {
9633 // We already checked this call's prototype; verify it doesn't modify errno.
9634 // Do not perform optimizations for call sites that require strict
9635 // floating-point semantics.
9636 if (!I.onlyReadsMemory() || I.isStrictFP())
9637 return false;
9638
9639 SDNodeFlags Flags;
9640 Flags.copyFMF(cast<FPMathOperator>(I));
9641
9642 SDValue Tmp0 = getValue(I.getArgOperand(0));
9643 SDValue Tmp1 = getValue(I.getArgOperand(1));
9644 EVT VT = Tmp0.getValueType();
9645 setValue(&I, DAG.getNode(Opcode, getCurSDLoc(), VT, Tmp0, Tmp1, Flags));
9646 return true;
9647}
9648
9649void SelectionDAGBuilder::visitCall(const CallInst &I) {
9650 // Handle inline assembly differently.
9651 if (I.isInlineAsm()) {
9652 visitInlineAsm(I);
9653 return;
9654 }
9655
9657
9658 if (Function *F = I.getCalledFunction()) {
9659 if (F->isDeclaration()) {
9660 // Is this an LLVM intrinsic?
9661 if (unsigned IID = F->getIntrinsicID()) {
9662 visitIntrinsicCall(I, IID);
9663 return;
9664 }
9665 }
9666
9667 // Check for well-known libc/libm calls. If the function is internal, it
9668 // can't be a library call. Don't do the check if marked as nobuiltin for
9669 // some reason.
9670 // This code should not handle libcalls that are already canonicalized to
9671 // intrinsics by the middle-end.
9672 LibFunc Func;
9673 if (!I.isNoBuiltin() && !F->hasLocalLinkage() && F->hasName() &&
9674 LibInfo->getLibFunc(*F, Func) && LibInfo->hasOptimizedCodeGen(Func)) {
9675 switch (Func) {
9676 default: break;
9677 case LibFunc_bcmp:
9678 if (visitMemCmpBCmpCall(I))
9679 return;
9680 break;
9681 case LibFunc_copysign:
9682 case LibFunc_copysignf:
9683 case LibFunc_copysignl:
9684 // We already checked this call's prototype; verify it doesn't modify
9685 // errno.
9686 if (I.onlyReadsMemory()) {
9687 SDValue LHS = getValue(I.getArgOperand(0));
9688 SDValue RHS = getValue(I.getArgOperand(1));
9690 LHS.getValueType(), LHS, RHS));
9691 return;
9692 }
9693 break;
9694 case LibFunc_sin:
9695 case LibFunc_sinf:
9696 case LibFunc_sinl:
9697 if (visitUnaryFloatCall(I, ISD::FSIN))
9698 return;
9699 break;
9700 case LibFunc_cos:
9701 case LibFunc_cosf:
9702 case LibFunc_cosl:
9703 if (visitUnaryFloatCall(I, ISD::FCOS))
9704 return;
9705 break;
9706 case LibFunc_tan:
9707 case LibFunc_tanf:
9708 case LibFunc_tanl:
9709 if (visitUnaryFloatCall(I, ISD::FTAN))
9710 return;
9711 break;
9712 case LibFunc_asin:
9713 case LibFunc_asinf:
9714 case LibFunc_asinl:
9715 if (visitUnaryFloatCall(I, ISD::FASIN))
9716 return;
9717 break;
9718 case LibFunc_acos:
9719 case LibFunc_acosf:
9720 case LibFunc_acosl:
9721 if (visitUnaryFloatCall(I, ISD::FACOS))
9722 return;
9723 break;
9724 case LibFunc_atan:
9725 case LibFunc_atanf:
9726 case LibFunc_atanl:
9727 if (visitUnaryFloatCall(I, ISD::FATAN))
9728 return;
9729 break;
9730 case LibFunc_atan2:
9731 case LibFunc_atan2f:
9732 case LibFunc_atan2l:
9733 if (visitBinaryFloatCall(I, ISD::FATAN2))
9734 return;
9735 break;
9736 case LibFunc_sinh:
9737 case LibFunc_sinhf:
9738 case LibFunc_sinhl:
9739 if (visitUnaryFloatCall(I, ISD::FSINH))
9740 return;
9741 break;
9742 case LibFunc_cosh:
9743 case LibFunc_coshf:
9744 case LibFunc_coshl:
9745 if (visitUnaryFloatCall(I, ISD::FCOSH))
9746 return;
9747 break;
9748 case LibFunc_tanh:
9749 case LibFunc_tanhf:
9750 case LibFunc_tanhl:
9751 if (visitUnaryFloatCall(I, ISD::FTANH))
9752 return;
9753 break;
9754 case LibFunc_sqrt:
9755 case LibFunc_sqrtf:
9756 case LibFunc_sqrtl:
9757 case LibFunc_sqrt_finite:
9758 case LibFunc_sqrtf_finite:
9759 case LibFunc_sqrtl_finite:
9760 if (visitUnaryFloatCall(I, ISD::FSQRT))
9761 return;
9762 break;
9763 case LibFunc_log2:
9764 case LibFunc_log2f:
9765 case LibFunc_log2l:
9766 if (visitUnaryFloatCall(I, ISD::FLOG2))
9767 return;
9768 break;
9769 case LibFunc_exp2:
9770 case LibFunc_exp2f:
9771 case LibFunc_exp2l:
9772 if (visitUnaryFloatCall(I, ISD::FEXP2))
9773 return;
9774 break;
9775 case LibFunc_exp10:
9776 case LibFunc_exp10f:
9777 case LibFunc_exp10l:
9778 if (visitUnaryFloatCall(I, ISD::FEXP10))
9779 return;
9780 break;
9781 case LibFunc_ldexp:
9782 case LibFunc_ldexpf:
9783 case LibFunc_ldexpl:
9784 if (visitBinaryFloatCall(I, ISD::FLDEXP))
9785 return;
9786 break;
9787 case LibFunc_strstr:
9788 if (visitStrstrCall(I))
9789 return;
9790 break;
9791 case LibFunc_memcmp:
9792 if (visitMemCmpBCmpCall(I))
9793 return;
9794 break;
9795 case LibFunc_memccpy:
9796 if (visitMemCCpyCall(I))
9797 return;
9798 break;
9799 case LibFunc_mempcpy:
9800 if (visitMemPCpyCall(I))
9801 return;
9802 break;
9803 case LibFunc_memchr:
9804 if (visitMemChrCall(I))
9805 return;
9806 break;
9807 case LibFunc_strcpy:
9808 if (visitStrCpyCall(I, false))
9809 return;
9810 break;
9811 case LibFunc_stpcpy:
9812 if (visitStrCpyCall(I, true))
9813 return;
9814 break;
9815 case LibFunc_strcmp:
9816 if (visitStrCmpCall(I))
9817 return;
9818 break;
9819 case LibFunc_strlen:
9820 if (visitStrLenCall(I))
9821 return;
9822 break;
9823 case LibFunc_strnlen:
9824 if (visitStrNLenCall(I))
9825 return;
9826 break;
9827 }
9828 }
9829 }
9830
9831 if (I.countOperandBundlesOfType(LLVMContext::OB_ptrauth)) {
9832 LowerCallSiteWithPtrAuthBundle(cast<CallBase>(I), /*EHPadBB=*/nullptr);
9833 return;
9834 }
9835
9836 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
9837 // have to do anything here to lower funclet bundles.
9838 // CFGuardTarget bundles are lowered in LowerCallTo.
9840 I, "calls",
9845
9846 SDValue Callee = getValue(I.getCalledOperand());
9847
9848 if (I.hasDeoptState())
9849 LowerCallSiteWithDeoptBundle(&I, Callee, nullptr);
9850 else
9851 // Check if we can potentially perform a tail call. More detailed checking
9852 // is be done within LowerCallTo, after more information about the call is
9853 // known.
9854 LowerCallTo(I, Callee, I.isTailCall(), I.isMustTailCall());
9855}
9856
9858 const CallBase &CB, const BasicBlock *EHPadBB) {
9859 auto PAB = CB.getOperandBundle("ptrauth");
9860 const Value *CalleeV = CB.getCalledOperand();
9861
9862 // Gather the call ptrauth data from the operand bundle:
9863 // [ i32 <key>, i64 <discriminator> ]
9864 const auto *Key = cast<ConstantInt>(PAB->Inputs[0]);
9865 const Value *Discriminator = PAB->Inputs[1];
9866
9867 assert(Key->getType()->isIntegerTy(32) && "Invalid ptrauth key");
9868 assert(Discriminator->getType()->isIntegerTy(64) &&
9869 "Invalid ptrauth discriminator");
9870
9871 // Look through ptrauth constants to find the raw callee.
9872 // Do a direct unauthenticated call if we found it and everything matches.
9873 if (const auto *CalleeCPA = dyn_cast<ConstantPtrAuth>(CalleeV))
9874 if (CalleeCPA->isKnownCompatibleWith(Key, Discriminator,
9875 DAG.getDataLayout()))
9876 return LowerCallTo(CB, getValue(CalleeCPA->getPointer()), CB.isTailCall(),
9877 CB.isMustTailCall(), EHPadBB);
9878
9879 // Functions should never be ptrauth-called directly.
9880 assert(!isa<Function>(CalleeV) && "invalid direct ptrauth call");
9881
9882 // Otherwise, do an authenticated indirect call.
9883 TargetLowering::PtrAuthInfo PAI = {Key->getZExtValue(),
9884 getValue(Discriminator)};
9885
9886 LowerCallTo(CB, getValue(CalleeV), CB.isTailCall(), CB.isMustTailCall(),
9887 EHPadBB, &PAI);
9888}
9889
9890namespace {
9891
9892/// AsmOperandInfo - This contains information for each constraint that we are
9893/// lowering.
9894class SDISelAsmOperandInfo : public TargetLowering::AsmOperandInfo {
9895public:
9896 /// CallOperand - If this is the result output operand or a clobber
9897 /// this is null, otherwise it is the incoming operand to the CallInst.
9898 /// This gets modified as the asm is processed.
9899 SDValue CallOperand;
9900
9901 /// AssignedRegs - If this is a register or register class operand, this
9902 /// contains the set of register corresponding to the operand.
9903 RegsForValue AssignedRegs;
9904
9905 explicit SDISelAsmOperandInfo(const TargetLowering::AsmOperandInfo &info)
9906 : TargetLowering::AsmOperandInfo(info), CallOperand(nullptr, 0) {
9907 }
9908
9909 /// Whether or not this operand accesses memory
9910 bool hasMemory(const TargetLowering &TLI) const {
9911 // Indirect operand accesses access memory.
9912 if (isIndirect)
9913 return true;
9914
9915 for (const auto &Code : Codes)
9917 return true;
9918
9919 return false;
9920 }
9921};
9922
9923
9924} // end anonymous namespace
9925
9926/// Make sure that the output operand \p OpInfo and its corresponding input
9927/// operand \p MatchingOpInfo have compatible constraint types (otherwise error
9928/// out).
9929static void patchMatchingInput(const SDISelAsmOperandInfo &OpInfo,
9930 SDISelAsmOperandInfo &MatchingOpInfo,
9931 SelectionDAG &DAG) {
9932 if (OpInfo.ConstraintVT == MatchingOpInfo.ConstraintVT)
9933 return;
9934
9936 const auto &TLI = DAG.getTargetLoweringInfo();
9937
9938 std::pair<unsigned, const TargetRegisterClass *> MatchRC =
9939 TLI.getRegForInlineAsmConstraint(TRI, OpInfo.ConstraintCode,
9940 OpInfo.ConstraintVT);
9941 std::pair<unsigned, const TargetRegisterClass *> InputRC =
9942 TLI.getRegForInlineAsmConstraint(TRI, MatchingOpInfo.ConstraintCode,
9943 MatchingOpInfo.ConstraintVT);
9944 const bool OutOpIsIntOrFP =
9945 OpInfo.ConstraintVT.isInteger() || OpInfo.ConstraintVT.isFloatingPoint();
9946 const bool InOpIsIntOrFP = MatchingOpInfo.ConstraintVT.isInteger() ||
9947 MatchingOpInfo.ConstraintVT.isFloatingPoint();
9948 if ((OutOpIsIntOrFP != InOpIsIntOrFP) || (MatchRC.second != InputRC.second)) {
9949 // FIXME: error out in a more elegant fashion
9950 report_fatal_error("Unsupported asm: input constraint"
9951 " with a matching output constraint of"
9952 " incompatible type!");
9953 }
9954 MatchingOpInfo.ConstraintVT = OpInfo.ConstraintVT;
9955}
9956
9957/// Get a direct memory input to behave well as an indirect operand.
9958/// This may introduce stores, hence the need for a \p Chain.
9959/// \return The (possibly updated) chain.
9960static SDValue getAddressForMemoryInput(SDValue Chain, const SDLoc &Location,
9961 SDISelAsmOperandInfo &OpInfo,
9962 SelectionDAG &DAG) {
9963 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9964
9965 // If we don't have an indirect input, put it in the constpool if we can,
9966 // otherwise spill it to a stack slot.
9967 // TODO: This isn't quite right. We need to handle these according to
9968 // the addressing mode that the constraint wants. Also, this may take
9969 // an additional register for the computation and we don't want that
9970 // either.
9971
9972 // If the operand is a float, integer, or vector constant, spill to a
9973 // constant pool entry to get its address.
9974 const Value *OpVal = OpInfo.CallOperandVal;
9975 if (isa<ConstantFP>(OpVal) || isa<ConstantInt>(OpVal) ||
9977 OpInfo.CallOperand = DAG.getConstantPool(
9978 cast<Constant>(OpVal), TLI.getPointerTy(DAG.getDataLayout()));
9979 return Chain;
9980 }
9981
9982 // Otherwise, create a stack slot and emit a store to it before the asm.
9983 Type *Ty = OpVal->getType();
9984 auto &DL = DAG.getDataLayout();
9985 TypeSize TySize = DL.getTypeAllocSize(Ty);
9988 int StackID = 0;
9989 if (TySize.isScalable())
9990 StackID = TFI->getStackIDForScalableVectors();
9991 int SSFI = MF.getFrameInfo().CreateStackObject(TySize.getKnownMinValue(),
9992 DL.getPrefTypeAlign(Ty), false,
9993 nullptr, StackID);
9994 SDValue StackSlot = DAG.getFrameIndex(SSFI, TLI.getFrameIndexTy(DL));
9995 Chain = DAG.getTruncStore(Chain, Location, OpInfo.CallOperand, StackSlot,
9997 TLI.getMemValueType(DL, Ty));
9998 OpInfo.CallOperand = StackSlot;
9999
10000 return Chain;
10001}
10002
10003/// GetRegistersForValue - Assign registers (virtual or physical) for the
10004/// specified operand. We prefer to assign virtual registers, to allow the
10005/// register allocator to handle the assignment process. However, if the asm
10006/// uses features that we can't model on machineinstrs, we have SDISel do the
10007/// allocation. This produces generally horrible, but correct, code.
10008///
10009/// OpInfo describes the operand
10010/// RefOpInfo describes the matching operand if any, the operand otherwise
10011static std::optional<unsigned>
10013 SDISelAsmOperandInfo &OpInfo,
10014 SDISelAsmOperandInfo &RefOpInfo) {
10015 LLVMContext &Context = *DAG.getContext();
10016 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10017
10021
10022 // No work to do for memory/address operands.
10023 if (OpInfo.ConstraintType == TargetLowering::C_Memory ||
10024 OpInfo.ConstraintType == TargetLowering::C_Address)
10025 return std::nullopt;
10026
10027 // If this is a constraint for a single physreg, or a constraint for a
10028 // register class, find it.
10029 unsigned AssignedReg;
10030 const TargetRegisterClass *RC;
10031 std::tie(AssignedReg, RC) = TLI.getRegForInlineAsmConstraint(
10032 &TRI, RefOpInfo.ConstraintCode, RefOpInfo.ConstraintVT);
10033 // RC is unset only on failure. Return immediately.
10034 if (!RC)
10035 return std::nullopt;
10036
10037 // Get the actual register value type. This is important, because the user
10038 // may have asked for (e.g.) the AX register in i32 type. We need to
10039 // remember that AX is actually i16 to get the right extension.
10040 const MVT RegVT = *TRI.legalclasstypes_begin(*RC);
10041
10042 if (OpInfo.ConstraintVT != MVT::Other && RegVT != MVT::Untyped) {
10043 // If this is an FP operand in an integer register (or visa versa), or more
10044 // generally if the operand value disagrees with the register class we plan
10045 // to stick it in, fix the operand type.
10046 //
10047 // If this is an input value, the bitcast to the new type is done now.
10048 // Bitcast for output value is done at the end of visitInlineAsm().
10049 if ((OpInfo.Type == InlineAsm::isOutput ||
10050 OpInfo.Type == InlineAsm::isInput) &&
10051 !TRI.isTypeLegalForClass(*RC, OpInfo.ConstraintVT)) {
10052 // Try to convert to the first EVT that the reg class contains. If the
10053 // types are identical size, use a bitcast to convert (e.g. two differing
10054 // vector types). Note: output bitcast is done at the end of
10055 // visitInlineAsm().
10056 if (RegVT.getSizeInBits() == OpInfo.ConstraintVT.getSizeInBits()) {
10057 // Exclude indirect inputs while they are unsupported because the code
10058 // to perform the load is missing and thus OpInfo.CallOperand still
10059 // refers to the input address rather than the pointed-to value.
10060 if (OpInfo.Type == InlineAsm::isInput && !OpInfo.isIndirect)
10061 OpInfo.CallOperand =
10062 DAG.getNode(ISD::BITCAST, DL, RegVT, OpInfo.CallOperand);
10063 OpInfo.ConstraintVT = RegVT;
10064 // If the operand is an FP value and we want it in integer registers,
10065 // use the corresponding integer type. This turns an f64 value into
10066 // i64, which can be passed with two i32 values on a 32-bit machine.
10067 } else if (RegVT.isInteger() && OpInfo.ConstraintVT.isFloatingPoint()) {
10068 MVT VT = MVT::getIntegerVT(OpInfo.ConstraintVT.getSizeInBits());
10069 if (OpInfo.Type == InlineAsm::isInput)
10070 OpInfo.CallOperand =
10071 DAG.getNode(ISD::BITCAST, DL, VT, OpInfo.CallOperand);
10072 OpInfo.ConstraintVT = VT;
10073 }
10074 }
10075 }
10076
10077 // No need to allocate a matching input constraint since the constraint it's
10078 // matching to has already been allocated.
10079 if (OpInfo.isMatchingInputConstraint())
10080 return std::nullopt;
10081
10082 EVT ValueVT = OpInfo.ConstraintVT;
10083 if (OpInfo.ConstraintVT == MVT::Other)
10084 ValueVT = RegVT;
10085
10086 // Initialize NumRegs.
10087 unsigned NumRegs = 1;
10088 if (OpInfo.ConstraintVT != MVT::Other)
10089 NumRegs = TLI.getNumRegisters(Context, OpInfo.ConstraintVT, RegVT);
10090
10091 // If this is a constraint for a specific physical register, like {r17},
10092 // assign it now.
10093
10094 // If this associated to a specific register, initialize iterator to correct
10095 // place. If virtual, make sure we have enough registers
10096
10097 // Initialize iterator if necessary
10100
10101 // Do not check for single registers.
10102 if (AssignedReg) {
10103 I = std::find(I, RC->end(), AssignedReg);
10104 if (I == RC->end()) {
10105 // RC does not contain the selected register, which indicates a
10106 // mismatch between the register and the required type/bitwidth.
10107 return {AssignedReg};
10108 }
10109 }
10110
10111 for (; NumRegs; --NumRegs, ++I) {
10112 assert(I != RC->end() && "Ran out of registers to allocate!");
10113 Register R = AssignedReg ? Register(*I) : RegInfo.createVirtualRegister(RC);
10114 Regs.push_back(R);
10115 }
10116
10117 OpInfo.AssignedRegs = RegsForValue(Regs, RegVT, ValueVT);
10118 return std::nullopt;
10119}
10120
10121static unsigned
10123 const std::vector<SDValue> &AsmNodeOperands) {
10124 // Scan until we find the definition we already emitted of this operand.
10125 unsigned CurOp = InlineAsm::Op_FirstOperand;
10126 for (; OperandNo; --OperandNo) {
10127 // Advance to the next operand.
10128 unsigned OpFlag = AsmNodeOperands[CurOp]->getAsZExtVal();
10129 const InlineAsm::Flag F(OpFlag);
10130 assert(
10131 (F.isRegDefKind() || F.isRegDefEarlyClobberKind() || F.isMemKind()) &&
10132 "Skipped past definitions?");
10133 CurOp += F.getNumOperandRegisters() + 1;
10134 }
10135 return CurOp;
10136}
10137
10138namespace {
10139
10140class ExtraFlags {
10141 unsigned Flags = 0;
10142
10143public:
10144 explicit ExtraFlags(const CallBase &Call) {
10145 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
10146 if (IA->hasSideEffects())
10148 if (IA->isAlignStack())
10150 if (IA->canThrow())
10152 if (Call.isConvergent())
10154 Flags |= IA->getDialect() * InlineAsm::Extra_AsmDialect;
10155 }
10156
10157 void update(const TargetLowering::AsmOperandInfo &OpInfo) {
10158 // Ideally, we would only check against memory constraints. However, the
10159 // meaning of an Other constraint can be target-specific and we can't easily
10160 // reason about it. Therefore, be conservative and set MayLoad/MayStore
10161 // for Other constraints as well.
10164 if (OpInfo.Type == InlineAsm::isInput)
10166 else if (OpInfo.Type == InlineAsm::isOutput)
10168 else if (OpInfo.Type == InlineAsm::isClobber)
10170 }
10171 }
10172
10173 unsigned get() const { return Flags; }
10174};
10175
10176} // end anonymous namespace
10177
10178static bool isFunction(SDValue Op) {
10179 if (Op && Op.getOpcode() == ISD::GlobalAddress) {
10180 if (auto *GA = dyn_cast<GlobalAddressSDNode>(Op)) {
10181 auto Fn = dyn_cast_or_null<Function>(GA->getGlobal());
10182
10183 // In normal "call dllimport func" instruction (non-inlineasm) it force
10184 // indirect access by specifing call opcode. And usually specially print
10185 // asm with indirect symbol (i.g: "*") according to opcode. Inline asm can
10186 // not do in this way now. (In fact, this is similar with "Data Access"
10187 // action). So here we ignore dllimport function.
10188 if (Fn && !Fn->hasDLLImportStorageClass())
10189 return true;
10190 }
10191 }
10192 return false;
10193}
10194
10195/// visitInlineAsm - Handle a call to an InlineAsm object.
10196void SelectionDAGBuilder::visitInlineAsm(const CallBase &Call,
10197 const BasicBlock *EHPadBB) {
10198 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
10199
10200 /// ConstraintOperands - Information about all of the constraints.
10201 SmallVector<SDISelAsmOperandInfo, 16> ConstraintOperands;
10202
10203 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10205 DAG.getDataLayout(), DAG.getSubtarget().getRegisterInfo(), Call);
10206
10207 // First Pass: Calculate HasSideEffects and ExtraFlags (AlignStack,
10208 // AsmDialect, MayLoad, MayStore).
10209 bool HasSideEffect = IA->hasSideEffects();
10210 ExtraFlags ExtraInfo(Call);
10211
10212 for (auto &T : TargetConstraints) {
10213 ConstraintOperands.push_back(SDISelAsmOperandInfo(T));
10214 SDISelAsmOperandInfo &OpInfo = ConstraintOperands.back();
10215
10216 if (OpInfo.CallOperandVal)
10217 OpInfo.CallOperand = getValue(OpInfo.CallOperandVal);
10218
10219 if (!HasSideEffect)
10220 HasSideEffect = OpInfo.hasMemory(TLI);
10221
10222 // Determine if this InlineAsm MayLoad or MayStore based on the constraints.
10223 // FIXME: Could we compute this on OpInfo rather than T?
10224
10225 // Compute the constraint code and ConstraintType to use.
10227
10228 if (T.ConstraintType == TargetLowering::C_Immediate &&
10229 OpInfo.CallOperand && !isa<ConstantSDNode>(OpInfo.CallOperand))
10230 // We've delayed emitting a diagnostic like the "n" constraint because
10231 // inlining could cause an integer showing up.
10232 return emitInlineAsmError(Call, "constraint '" + Twine(T.ConstraintCode) +
10233 "' expects an integer constant "
10234 "expression");
10235
10236 ExtraInfo.update(T);
10237 }
10238
10239 // We won't need to flush pending loads if this asm doesn't touch
10240 // memory and is nonvolatile.
10241 SDValue Glue, Chain = (HasSideEffect) ? getRoot() : DAG.getRoot();
10242
10243 bool EmitEHLabels = isa<InvokeInst>(Call);
10244 if (EmitEHLabels) {
10245 assert(EHPadBB && "InvokeInst must have an EHPadBB");
10246 }
10247 bool IsCallBr = isa<CallBrInst>(Call);
10248
10249 if (IsCallBr || EmitEHLabels) {
10250 // If this is a callbr or invoke we need to flush pending exports since
10251 // inlineasm_br and invoke are terminators.
10252 // We need to do this before nodes are glued to the inlineasm_br node.
10253 Chain = getControlRoot();
10254 }
10255
10256 MCSymbol *BeginLabel = nullptr;
10257 if (EmitEHLabels) {
10258 Chain = lowerStartEH(Chain, EHPadBB, BeginLabel);
10259 }
10260
10261 int OpNo = -1;
10262 SmallVector<StringRef> AsmStrs;
10263 IA->collectAsmStrs(AsmStrs);
10264
10265 // Second pass over the constraints: compute which constraint option to use.
10266 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
10267 if (OpInfo.hasArg() || OpInfo.Type == InlineAsm::isOutput)
10268 OpNo++;
10269
10270 // If this is an output operand with a matching input operand, look up the
10271 // matching input. If their types mismatch, e.g. one is an integer, the
10272 // other is floating point, or their sizes are different, flag it as an
10273 // error.
10274 if (OpInfo.hasMatchingInput()) {
10275 SDISelAsmOperandInfo &Input = ConstraintOperands[OpInfo.MatchingInput];
10276 patchMatchingInput(OpInfo, Input, DAG);
10277 }
10278
10279 // Compute the constraint code and ConstraintType to use.
10280 TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
10281
10282 if ((OpInfo.ConstraintType == TargetLowering::C_Memory &&
10283 OpInfo.Type == InlineAsm::isClobber) ||
10284 OpInfo.ConstraintType == TargetLowering::C_Address)
10285 continue;
10286
10287 // In Linux PIC model, there are 4 cases about value/label addressing:
10288 //
10289 // 1: Function call or Label jmp inside the module.
10290 // 2: Data access (such as global variable, static variable) inside module.
10291 // 3: Function call or Label jmp outside the module.
10292 // 4: Data access (such as global variable) outside the module.
10293 //
10294 // Due to current llvm inline asm architecture designed to not "recognize"
10295 // the asm code, there are quite troubles for us to treat mem addressing
10296 // differently for same value/adress used in different instuctions.
10297 // For example, in pic model, call a func may in plt way or direclty
10298 // pc-related, but lea/mov a function adress may use got.
10299 //
10300 // Here we try to "recognize" function call for the case 1 and case 3 in
10301 // inline asm. And try to adjust the constraint for them.
10302 //
10303 // TODO: Due to current inline asm didn't encourage to jmp to the outsider
10304 // label, so here we don't handle jmp function label now, but we need to
10305 // enhance it (especilly in PIC model) if we meet meaningful requirements.
10306 if (OpInfo.isIndirect && isFunction(OpInfo.CallOperand) &&
10307 TLI.isInlineAsmTargetBranch(AsmStrs, OpNo) &&
10308 TM.getCodeModel() != CodeModel::Large) {
10309 OpInfo.isIndirect = false;
10310 OpInfo.ConstraintType = TargetLowering::C_Address;
10311 }
10312
10313 // If this is a memory input, and if the operand is not indirect, do what we
10314 // need to provide an address for the memory input.
10315 if (OpInfo.ConstraintType == TargetLowering::C_Memory &&
10316 !OpInfo.isIndirect) {
10317 assert((OpInfo.isMultipleAlternative ||
10318 (OpInfo.Type == InlineAsm::isInput)) &&
10319 "Can only indirectify direct input operands!");
10320
10321 // Memory operands really want the address of the value.
10322 Chain = getAddressForMemoryInput(Chain, getCurSDLoc(), OpInfo, DAG);
10323
10324 // There is no longer a Value* corresponding to this operand.
10325 OpInfo.CallOperandVal = nullptr;
10326
10327 // It is now an indirect operand.
10328 OpInfo.isIndirect = true;
10329 }
10330
10331 }
10332
10333 // AsmNodeOperands - The operands for the ISD::INLINEASM node.
10334 std::vector<SDValue> AsmNodeOperands;
10335 AsmNodeOperands.push_back(SDValue()); // reserve space for input chain
10336 AsmNodeOperands.push_back(DAG.getTargetExternalSymbol(
10337 IA->getAsmString().data(), TLI.getProgramPointerTy(DAG.getDataLayout())));
10338
10339 // If we have a !srcloc metadata node associated with it, we want to attach
10340 // this to the ultimately generated inline asm machineinstr. To do this, we
10341 // pass in the third operand as this (potentially null) inline asm MDNode.
10342 const MDNode *SrcLoc = Call.getMetadata("srcloc");
10343 AsmNodeOperands.push_back(DAG.getMDNode(SrcLoc));
10344
10345 // Remember the HasSideEffect, AlignStack, AsmDialect, MayLoad and MayStore
10346 // bits as operand 3.
10347 AsmNodeOperands.push_back(DAG.getTargetConstant(
10348 ExtraInfo.get(), getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10349
10350 // Third pass: Loop over operands to prepare DAG-level operands.. As part of
10351 // this, assign virtual and physical registers for inputs and otput.
10352 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
10353 // Assign Registers.
10354 SDISelAsmOperandInfo &RefOpInfo =
10355 OpInfo.isMatchingInputConstraint()
10356 ? ConstraintOperands[OpInfo.getMatchedOperand()]
10357 : OpInfo;
10358 const auto RegError =
10359 getRegistersForValue(DAG, getCurSDLoc(), OpInfo, RefOpInfo);
10360 if (RegError) {
10361 const MachineFunction &MF = DAG.getMachineFunction();
10362 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
10363 const char *RegName = TRI.getName(*RegError);
10364 emitInlineAsmError(Call, "register '" + Twine(RegName) +
10365 "' allocated for constraint '" +
10366 Twine(OpInfo.ConstraintCode) +
10367 "' does not match required type");
10368 return;
10369 }
10370
10371 auto DetectWriteToReservedRegister = [&]() {
10372 const MachineFunction &MF = DAG.getMachineFunction();
10373 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
10374 for (Register Reg : OpInfo.AssignedRegs.Regs) {
10375 if (Reg.isPhysical() && TRI.isInlineAsmReadOnlyReg(MF, Reg)) {
10376 const char *RegName = TRI.getName(Reg);
10377 emitInlineAsmError(Call, "write to reserved register '" +
10378 Twine(RegName) + "'");
10379 return true;
10380 }
10381 }
10382 return false;
10383 };
10384 assert((OpInfo.ConstraintType != TargetLowering::C_Address ||
10385 (OpInfo.Type == InlineAsm::isInput &&
10386 !OpInfo.isMatchingInputConstraint())) &&
10387 "Only address as input operand is allowed.");
10388
10389 switch (OpInfo.Type) {
10391 if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
10392 const InlineAsm::ConstraintCode ConstraintID =
10393 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10395 "Failed to convert memory constraint code to constraint id.");
10396
10397 // Add information to the INLINEASM node to know about this output.
10398 InlineAsm::Flag OpFlags(InlineAsm::Kind::Mem, 1);
10399 OpFlags.setMemConstraint(ConstraintID);
10400 AsmNodeOperands.push_back(DAG.getTargetConstant(OpFlags, getCurSDLoc(),
10401 MVT::i32));
10402 AsmNodeOperands.push_back(OpInfo.CallOperand);
10403 } else {
10404 // Otherwise, this outputs to a register (directly for C_Register /
10405 // C_RegisterClass, and a target-defined fashion for
10406 // C_Immediate/C_Other). Find a register that we can use.
10407 if (OpInfo.AssignedRegs.Regs.empty()) {
10408 emitInlineAsmError(
10409 Call, "couldn't allocate output register for constraint '" +
10410 Twine(OpInfo.ConstraintCode) + "'");
10411 return;
10412 }
10413
10414 if (DetectWriteToReservedRegister())
10415 return;
10416
10417 // Add information to the INLINEASM node to know that this register is
10418 // set.
10419 OpInfo.AssignedRegs.AddInlineAsmOperands(
10420 OpInfo.isEarlyClobber ? InlineAsm::Kind::RegDefEarlyClobber
10422 false, 0, getCurSDLoc(), DAG, AsmNodeOperands);
10423 }
10424 break;
10425
10426 case InlineAsm::isInput:
10427 case InlineAsm::isLabel: {
10428 SDValue InOperandVal = OpInfo.CallOperand;
10429
10430 if (OpInfo.isMatchingInputConstraint()) {
10431 // If this is required to match an output register we have already set,
10432 // just use its register.
10433 auto CurOp = findMatchingInlineAsmOperand(OpInfo.getMatchedOperand(),
10434 AsmNodeOperands);
10435 InlineAsm::Flag Flag(AsmNodeOperands[CurOp]->getAsZExtVal());
10436 if (Flag.isRegDefKind() || Flag.isRegDefEarlyClobberKind()) {
10437 if (OpInfo.isIndirect) {
10438 // This happens on gcc/testsuite/gcc.dg/pr8788-1.c
10439 emitInlineAsmError(Call, "inline asm not supported yet: "
10440 "don't know how to handle tied "
10441 "indirect register inputs");
10442 return;
10443 }
10444
10446 MachineFunction &MF = DAG.getMachineFunction();
10447 MachineRegisterInfo &MRI = MF.getRegInfo();
10448 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
10449 auto *R = cast<RegisterSDNode>(AsmNodeOperands[CurOp+1]);
10450 Register TiedReg = R->getReg();
10451 MVT RegVT = R->getSimpleValueType(0);
10452 const TargetRegisterClass *RC =
10453 TiedReg.isVirtual() ? MRI.getRegClass(TiedReg)
10454 : RegVT != MVT::Untyped ? TLI.getRegClassFor(RegVT)
10455 : TRI.getMinimalPhysRegClass(TiedReg);
10456 for (unsigned i = 0, e = Flag.getNumOperandRegisters(); i != e; ++i)
10457 Regs.push_back(MRI.createVirtualRegister(RC));
10458
10459 RegsForValue MatchedRegs(Regs, RegVT, InOperandVal.getValueType());
10460
10461 SDLoc dl = getCurSDLoc();
10462 // Use the produced MatchedRegs object to
10463 MatchedRegs.getCopyToRegs(InOperandVal, DAG, dl, Chain, &Glue, &Call);
10464 MatchedRegs.AddInlineAsmOperands(InlineAsm::Kind::RegUse, true,
10465 OpInfo.getMatchedOperand(), dl, DAG,
10466 AsmNodeOperands);
10467 break;
10468 }
10469
10470 assert(Flag.isMemKind() && "Unknown matching constraint!");
10471 assert(Flag.getNumOperandRegisters() == 1 &&
10472 "Unexpected number of operands");
10473 // Add information to the INLINEASM node to know about this input.
10474 // See InlineAsm.h isUseOperandTiedToDef.
10475 Flag.clearMemConstraint();
10476 Flag.setMatchingOp(OpInfo.getMatchedOperand());
10477 AsmNodeOperands.push_back(DAG.getTargetConstant(
10478 Flag, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10479 AsmNodeOperands.push_back(AsmNodeOperands[CurOp+1]);
10480 break;
10481 }
10482
10483 // Treat indirect 'X' constraint as memory.
10484 if (OpInfo.ConstraintType == TargetLowering::C_Other &&
10485 OpInfo.isIndirect)
10486 OpInfo.ConstraintType = TargetLowering::C_Memory;
10487
10488 if (OpInfo.ConstraintType == TargetLowering::C_Immediate ||
10489 OpInfo.ConstraintType == TargetLowering::C_Other) {
10490 std::vector<SDValue> Ops;
10491 TLI.LowerAsmOperandForConstraint(InOperandVal, OpInfo.ConstraintCode,
10492 Ops, DAG);
10493 if (Ops.empty()) {
10494 if (OpInfo.ConstraintType == TargetLowering::C_Immediate)
10495 if (isa<ConstantSDNode>(InOperandVal)) {
10496 emitInlineAsmError(Call, "value out of range for constraint '" +
10497 Twine(OpInfo.ConstraintCode) + "'");
10498 return;
10499 }
10500
10501 emitInlineAsmError(Call,
10502 "invalid operand for inline asm constraint '" +
10503 Twine(OpInfo.ConstraintCode) + "'");
10504 return;
10505 }
10506
10507 // Add information to the INLINEASM node to know about this input.
10508 InlineAsm::Flag ResOpType(InlineAsm::Kind::Imm, Ops.size());
10509 AsmNodeOperands.push_back(DAG.getTargetConstant(
10510 ResOpType, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10511 llvm::append_range(AsmNodeOperands, Ops);
10512 break;
10513 }
10514
10515 if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
10516 assert((OpInfo.isIndirect ||
10517 OpInfo.ConstraintType != TargetLowering::C_Memory) &&
10518 "Operand must be indirect to be a mem!");
10519 assert(InOperandVal.getValueType() ==
10520 TLI.getPointerTy(DAG.getDataLayout()) &&
10521 "Memory operands expect pointer values");
10522
10523 const InlineAsm::ConstraintCode ConstraintID =
10524 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10526 "Failed to convert memory constraint code to constraint id.");
10527
10528 // Add information to the INLINEASM node to know about this input.
10529 InlineAsm::Flag ResOpType(InlineAsm::Kind::Mem, 1);
10530 ResOpType.setMemConstraint(ConstraintID);
10531 AsmNodeOperands.push_back(DAG.getTargetConstant(ResOpType,
10532 getCurSDLoc(),
10533 MVT::i32));
10534 AsmNodeOperands.push_back(InOperandVal);
10535 break;
10536 }
10537
10538 if (OpInfo.ConstraintType == TargetLowering::C_Address) {
10539 const InlineAsm::ConstraintCode ConstraintID =
10540 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10542 "Failed to convert memory constraint code to constraint id.");
10543
10544 InlineAsm::Flag ResOpType(InlineAsm::Kind::Mem, 1);
10545
10546 SDValue AsmOp = InOperandVal;
10547 if (isFunction(InOperandVal)) {
10548 auto *GA = cast<GlobalAddressSDNode>(InOperandVal);
10549 ResOpType = InlineAsm::Flag(InlineAsm::Kind::Func, 1);
10550 AsmOp = DAG.getTargetGlobalAddress(GA->getGlobal(), getCurSDLoc(),
10551 InOperandVal.getValueType(),
10552 GA->getOffset());
10553 }
10554
10555 // Add information to the INLINEASM node to know about this input.
10556 ResOpType.setMemConstraint(ConstraintID);
10557
10558 AsmNodeOperands.push_back(
10559 DAG.getTargetConstant(ResOpType, getCurSDLoc(), MVT::i32));
10560
10561 AsmNodeOperands.push_back(AsmOp);
10562 break;
10563 }
10564
10565 if (OpInfo.ConstraintType != TargetLowering::C_RegisterClass &&
10566 OpInfo.ConstraintType != TargetLowering::C_Register) {
10567 emitInlineAsmError(Call, "unknown asm constraint '" +
10568 Twine(OpInfo.ConstraintCode) + "'");
10569 return;
10570 }
10571
10572 // TODO: Support this.
10573 if (OpInfo.isIndirect) {
10574 emitInlineAsmError(
10575 Call, "Don't know how to handle indirect register inputs yet "
10576 "for constraint '" +
10577 Twine(OpInfo.ConstraintCode) + "'");
10578 return;
10579 }
10580
10581 // Copy the input into the appropriate registers.
10582 if (OpInfo.AssignedRegs.Regs.empty()) {
10583 emitInlineAsmError(Call,
10584 "couldn't allocate input reg for constraint '" +
10585 Twine(OpInfo.ConstraintCode) + "'");
10586 return;
10587 }
10588
10589 if (DetectWriteToReservedRegister())
10590 return;
10591
10592 SDLoc dl = getCurSDLoc();
10593
10594 OpInfo.AssignedRegs.getCopyToRegs(InOperandVal, DAG, dl, Chain, &Glue,
10595 &Call);
10596
10597 OpInfo.AssignedRegs.AddInlineAsmOperands(InlineAsm::Kind::RegUse, false,
10598 0, dl, DAG, AsmNodeOperands);
10599 break;
10600 }
10602 // Add the clobbered value to the operand list, so that the register
10603 // allocator is aware that the physreg got clobbered.
10604 if (!OpInfo.AssignedRegs.Regs.empty())
10606 false, 0, getCurSDLoc(), DAG,
10607 AsmNodeOperands);
10608 break;
10609 }
10610 }
10611
10612 // Finish up input operands. Set the input chain and add the flag last.
10613 AsmNodeOperands[InlineAsm::Op_InputChain] = Chain;
10614 if (Glue.getNode()) AsmNodeOperands.push_back(Glue);
10615
10616 unsigned ISDOpc = IsCallBr ? ISD::INLINEASM_BR : ISD::INLINEASM;
10617 Chain = DAG.getNode(ISDOpc, getCurSDLoc(),
10618 DAG.getVTList(MVT::Other, MVT::Glue), AsmNodeOperands);
10619 Glue = Chain.getValue(1);
10620
10621 // Do additional work to generate outputs.
10622
10623 SmallVector<EVT, 1> ResultVTs;
10624 SmallVector<SDValue, 1> ResultValues;
10625 SmallVector<SDValue, 8> OutChains;
10626
10627 llvm::Type *CallResultType = Call.getType();
10628 ArrayRef<Type *> ResultTypes;
10629 if (StructType *StructResult = dyn_cast<StructType>(CallResultType))
10630 ResultTypes = StructResult->elements();
10631 else if (!CallResultType->isVoidTy())
10632 ResultTypes = ArrayRef(CallResultType);
10633
10634 auto CurResultType = ResultTypes.begin();
10635 auto handleRegAssign = [&](SDValue V) {
10636 assert(CurResultType != ResultTypes.end() && "Unexpected value");
10637 assert((*CurResultType)->isSized() && "Unexpected unsized type");
10638 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), *CurResultType);
10639 ++CurResultType;
10640 // If the type of the inline asm call site return value is different but has
10641 // same size as the type of the asm output bitcast it. One example of this
10642 // is for vectors with different width / number of elements. This can
10643 // happen for register classes that can contain multiple different value
10644 // types. The preg or vreg allocated may not have the same VT as was
10645 // expected.
10646 //
10647 // This can also happen for a return value that disagrees with the register
10648 // class it is put in, eg. a double in a general-purpose register on a
10649 // 32-bit machine.
10650 if (ResultVT != V.getValueType() &&
10651 ResultVT.getSizeInBits() == V.getValueSizeInBits())
10652 V = DAG.getNode(ISD::BITCAST, getCurSDLoc(), ResultVT, V);
10653 else if (ResultVT != V.getValueType() && ResultVT.isInteger() &&
10654 V.getValueType().isInteger()) {
10655 // If a result value was tied to an input value, the computed result
10656 // may have a wider width than the expected result. Extract the
10657 // relevant portion.
10658 V = DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), ResultVT, V);
10659 }
10660 assert(ResultVT == V.getValueType() && "Asm result value mismatch!");
10661 ResultVTs.push_back(ResultVT);
10662 ResultValues.push_back(V);
10663 };
10664
10665 // Deal with output operands.
10666 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
10667 if (OpInfo.Type == InlineAsm::isOutput) {
10668 SDValue Val;
10669 // Skip trivial output operands.
10670 if (OpInfo.AssignedRegs.Regs.empty())
10671 continue;
10672
10673 switch (OpInfo.ConstraintType) {
10676 Val = OpInfo.AssignedRegs.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(),
10677 Chain, &Glue, &Call);
10678 break;
10681 Val = TLI.LowerAsmOutputForConstraint(Chain, Glue, getCurSDLoc(),
10682 OpInfo, DAG);
10683 break;
10685 break; // Already handled.
10687 break; // Silence warning.
10689 assert(false && "Unexpected unknown constraint");
10690 }
10691
10692 // Indirect output manifest as stores. Record output chains.
10693 if (OpInfo.isIndirect) {
10694 const Value *Ptr = OpInfo.CallOperandVal;
10695 assert(Ptr && "Expected value CallOperandVal for indirect asm operand");
10696 SDValue Store = DAG.getStore(Chain, getCurSDLoc(), Val, getValue(Ptr),
10697 MachinePointerInfo(Ptr));
10698 OutChains.push_back(Store);
10699 } else {
10700 // generate CopyFromRegs to associated registers.
10701 assert(!Call.getType()->isVoidTy() && "Bad inline asm!");
10702 if (Val.getOpcode() == ISD::MERGE_VALUES) {
10703 for (const SDValue &V : Val->op_values())
10704 handleRegAssign(V);
10705 } else
10706 handleRegAssign(Val);
10707 }
10708 }
10709 }
10710
10711 // Set results.
10712 if (!ResultValues.empty()) {
10713 assert(CurResultType == ResultTypes.end() &&
10714 "Mismatch in number of ResultTypes");
10715 assert(ResultValues.size() == ResultTypes.size() &&
10716 "Mismatch in number of output operands in asm result");
10717
10719 DAG.getVTList(ResultVTs), ResultValues);
10720 setValue(&Call, V);
10721 }
10722
10723 // Collect store chains.
10724 if (!OutChains.empty())
10725 Chain = DAG.getNode(ISD::TokenFactor, getCurSDLoc(), MVT::Other, OutChains);
10726
10727 if (EmitEHLabels) {
10728 Chain = lowerEndEH(Chain, cast<InvokeInst>(&Call), EHPadBB, BeginLabel);
10729 }
10730
10731 // Only Update Root if inline assembly has a memory effect.
10732 if (ResultValues.empty() || HasSideEffect || !OutChains.empty() || IsCallBr ||
10733 EmitEHLabels)
10734 DAG.setRoot(Chain);
10735}
10736
10737void SelectionDAGBuilder::emitInlineAsmError(const CallBase &Call,
10738 const Twine &Message) {
10739 LLVMContext &Ctx = *DAG.getContext();
10740 Ctx.diagnose(DiagnosticInfoInlineAsm(Call, Message));
10741
10742 // Make sure we leave the DAG in a valid state
10743 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10744 SmallVector<EVT, 1> ValueVTs;
10745 ComputeValueVTs(TLI, DAG.getDataLayout(), Call.getType(), ValueVTs);
10746
10747 if (ValueVTs.empty())
10748 return;
10749
10751 for (const EVT &VT : ValueVTs)
10752 Ops.push_back(DAG.getUNDEF(VT));
10753
10754 setValue(&Call, DAG.getMergeValues(Ops, getCurSDLoc()));
10755}
10756
10757void SelectionDAGBuilder::visitVAStart(const CallInst &I) {
10758 DAG.setRoot(DAG.getNode(ISD::VASTART, getCurSDLoc(),
10759 MVT::Other, getRoot(),
10760 getValue(I.getArgOperand(0)),
10761 DAG.getSrcValue(I.getArgOperand(0))));
10762}
10763
10764void SelectionDAGBuilder::visitVAArg(const VAArgInst &I) {
10765 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10766 const DataLayout &DL = DAG.getDataLayout();
10767 SDValue V = DAG.getVAArg(
10768 TLI.getMemValueType(DAG.getDataLayout(), I.getType()), getCurSDLoc(),
10769 getRoot(), getValue(I.getOperand(0)), DAG.getSrcValue(I.getOperand(0)),
10770 DL.getABITypeAlign(I.getType()).value());
10771 DAG.setRoot(V.getValue(1));
10772
10773 if (I.getType()->isPointerTy())
10774 V = DAG.getPtrExtOrTrunc(
10775 V, getCurSDLoc(), TLI.getValueType(DAG.getDataLayout(), I.getType()));
10776 setValue(&I, V);
10777}
10778
10779void SelectionDAGBuilder::visitVAEnd(const CallInst &I) {
10780 DAG.setRoot(DAG.getNode(ISD::VAEND, getCurSDLoc(),
10781 MVT::Other, getRoot(),
10782 getValue(I.getArgOperand(0)),
10783 DAG.getSrcValue(I.getArgOperand(0))));
10784}
10785
10786void SelectionDAGBuilder::visitVACopy(const CallInst &I) {
10787 DAG.setRoot(DAG.getNode(ISD::VACOPY, getCurSDLoc(),
10788 MVT::Other, getRoot(),
10789 getValue(I.getArgOperand(0)),
10790 getValue(I.getArgOperand(1)),
10791 DAG.getSrcValue(I.getArgOperand(0)),
10792 DAG.getSrcValue(I.getArgOperand(1))));
10793}
10794
10796 const Instruction &I,
10797 SDValue Op) {
10798 std::optional<ConstantRange> CR = getRange(I);
10799
10800 if (!CR || CR->isFullSet() || CR->isEmptySet() || CR->isUpperWrapped())
10801 return Op;
10802
10803 APInt Lo = CR->getUnsignedMin();
10804 if (!Lo.isMinValue())
10805 return Op;
10806
10807 APInt Hi = CR->getUnsignedMax();
10808 unsigned Bits = std::max(Hi.getActiveBits(),
10809 static_cast<unsigned>(IntegerType::MIN_INT_BITS));
10810
10811 EVT SmallVT = EVT::getIntegerVT(*DAG.getContext(), Bits);
10812
10813 SDLoc SL = getCurSDLoc();
10814
10815 SDValue ZExt = DAG.getNode(ISD::AssertZext, SL, Op.getValueType(), Op,
10816 DAG.getValueType(SmallVT));
10817 unsigned NumVals = Op.getNode()->getNumValues();
10818 if (NumVals == 1)
10819 return ZExt;
10820
10822
10823 Ops.push_back(ZExt);
10824 for (unsigned I = 1; I != NumVals; ++I)
10825 Ops.push_back(Op.getValue(I));
10826
10827 return DAG.getMergeValues(Ops, SL);
10828}
10829
10831 SelectionDAG &DAG, const Instruction &I, SDValue Op) {
10832 FPClassTest Classes = getNoFPClass(I);
10833 if (Classes == fcNone)
10834 return Op;
10835
10836 SDLoc SL = getCurSDLoc();
10837 SDValue TestConst = DAG.getTargetConstant(Classes, SDLoc(), MVT::i32);
10838
10839 if (Op.getOpcode() != ISD::MERGE_VALUES) {
10840 return DAG.getNode(ISD::AssertNoFPClass, SL, Op.getValueType(), Op,
10841 TestConst);
10842 }
10843
10844 SmallVector<SDValue, 8> Ops(Op.getNumOperands());
10845 for (unsigned I = 0, E = Ops.size(); I != E; ++I) {
10846 SDValue MergeOp = Op.getOperand(I);
10847 Ops[I] = DAG.getNode(ISD::AssertNoFPClass, SL, MergeOp.getValueType(),
10848 MergeOp, TestConst);
10849 }
10850
10851 return DAG.getMergeValues(Ops, SL);
10852}
10853
10854/// Populate a CallLowerinInfo (into \p CLI) based on the properties of
10855/// the call being lowered.
10856///
10857/// This is a helper for lowering intrinsics that follow a target calling
10858/// convention or require stack pointer adjustment. Only a subset of the
10859/// intrinsic's operands need to participate in the calling convention.
10862 unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy,
10863 AttributeSet RetAttrs, bool IsPatchPoint) {
10865 Args.reserve(NumArgs);
10866
10867 // Populate the argument list.
10868 // Attributes for args start at offset 1, after the return attribute.
10869 for (unsigned ArgI = ArgIdx, ArgE = ArgIdx + NumArgs;
10870 ArgI != ArgE; ++ArgI) {
10871 const Value *V = Call->getOperand(ArgI);
10872
10873 assert(!V->getType()->isEmptyTy() && "Empty type passed to intrinsic.");
10874
10875 TargetLowering::ArgListEntry Entry(getValue(V), V->getType());
10876 Entry.setAttributes(Call, ArgI);
10877 Args.push_back(Entry);
10878 }
10879
10881 .setChain(getRoot())
10882 .setCallee(Call->getCallingConv(), ReturnTy, Callee, std::move(Args),
10883 RetAttrs)
10884 .setDiscardResult(Call->use_empty())
10885 .setIsPatchPoint(IsPatchPoint)
10887 Call->countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0);
10888}
10889
10890/// Add a stack map intrinsic call's live variable operands to a stackmap
10891/// or patchpoint target node's operand list.
10892///
10893/// Constants are converted to TargetConstants purely as an optimization to
10894/// avoid constant materialization and register allocation.
10895///
10896/// FrameIndex operands are converted to TargetFrameIndex so that ISEL does not
10897/// generate addess computation nodes, and so FinalizeISel can convert the
10898/// TargetFrameIndex into a DirectMemRefOp StackMap location. This avoids
10899/// address materialization and register allocation, but may also be required
10900/// for correctness. If a StackMap (or PatchPoint) intrinsic directly uses an
10901/// alloca in the entry block, then the runtime may assume that the alloca's
10902/// StackMap location can be read immediately after compilation and that the
10903/// location is valid at any point during execution (this is similar to the
10904/// assumption made by the llvm.gcroot intrinsic). If the alloca's location were
10905/// only available in a register, then the runtime would need to trap when
10906/// execution reaches the StackMap in order to read the alloca's location.
10907static void addStackMapLiveVars(const CallBase &Call, unsigned StartIdx,
10909 SelectionDAGBuilder &Builder) {
10910 SelectionDAG &DAG = Builder.DAG;
10911 for (unsigned I = StartIdx; I < Call.arg_size(); I++) {
10912 SDValue Op = Builder.getValue(Call.getArgOperand(I));
10913
10914 // Things on the stack are pointer-typed, meaning that they are already
10915 // legal and can be emitted directly to target nodes.
10917 Ops.push_back(DAG.getTargetFrameIndex(FI->getIndex(), Op.getValueType()));
10918 } else {
10919 // Otherwise emit a target independent node to be legalised.
10920 Ops.push_back(Builder.getValue(Call.getArgOperand(I)));
10921 }
10922 }
10923}
10924
10925/// Lower llvm.experimental.stackmap.
10926void SelectionDAGBuilder::visitStackmap(const CallInst &CI) {
10927 // void @llvm.experimental.stackmap(i64 <id>, i32 <numShadowBytes>,
10928 // [live variables...])
10929
10930 assert(CI.getType()->isVoidTy() && "Stackmap cannot return a value.");
10931
10932 SDValue Chain, InGlue, Callee;
10934
10935 SDLoc DL = getCurSDLoc();
10937
10938 // The stackmap intrinsic only records the live variables (the arguments
10939 // passed to it) and emits NOPS (if requested). Unlike the patchpoint
10940 // intrinsic, this won't be lowered to a function call. This means we don't
10941 // have to worry about calling conventions and target specific lowering code.
10942 // Instead we perform the call lowering right here.
10943 //
10944 // chain, flag = CALLSEQ_START(chain, 0, 0)
10945 // chain, flag = STACKMAP(id, nbytes, ..., chain, flag)
10946 // chain, flag = CALLSEQ_END(chain, 0, 0, flag)
10947 //
10948 Chain = DAG.getCALLSEQ_START(getRoot(), 0, 0, DL);
10949 InGlue = Chain.getValue(1);
10950
10951 // Add the STACKMAP operands, starting with DAG house-keeping.
10952 Ops.push_back(Chain);
10953 Ops.push_back(InGlue);
10954
10955 // Add the <id>, <numShadowBytes> operands.
10956 //
10957 // These do not require legalisation, and can be emitted directly to target
10958 // constant nodes.
10960 assert(ID.getValueType() == MVT::i64);
10961 SDValue IDConst =
10962 DAG.getTargetConstant(ID->getAsZExtVal(), DL, ID.getValueType());
10963 Ops.push_back(IDConst);
10964
10965 SDValue Shad = getValue(CI.getArgOperand(1));
10966 assert(Shad.getValueType() == MVT::i32);
10967 SDValue ShadConst =
10968 DAG.getTargetConstant(Shad->getAsZExtVal(), DL, Shad.getValueType());
10969 Ops.push_back(ShadConst);
10970
10971 // Add the live variables.
10972 addStackMapLiveVars(CI, 2, DL, Ops, *this);
10973
10974 // Create the STACKMAP node.
10975 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
10976 Chain = DAG.getNode(ISD::STACKMAP, DL, NodeTys, Ops);
10977 InGlue = Chain.getValue(1);
10978
10979 Chain = DAG.getCALLSEQ_END(Chain, 0, 0, InGlue, DL);
10980
10981 // Stackmaps don't generate values, so nothing goes into the NodeMap.
10982
10983 // Set the root to the target-lowered call chain.
10984 DAG.setRoot(Chain);
10985
10986 // Inform the Frame Information that we have a stackmap in this function.
10987 FuncInfo.MF->getFrameInfo().setHasStackMap();
10988}
10989
10990/// Lower llvm.experimental.patchpoint directly to its target opcode.
10991void SelectionDAGBuilder::visitPatchpoint(const CallBase &CB,
10992 const BasicBlock *EHPadBB) {
10993 // <ty> @llvm.experimental.patchpoint.<ty>(i64 <id>,
10994 // i32 <numBytes>,
10995 // i8* <target>,
10996 // i32 <numArgs>,
10997 // [Args...],
10998 // [live variables...])
10999
11001 bool IsAnyRegCC = CC == CallingConv::AnyReg;
11002 bool HasDef = !CB.getType()->isVoidTy();
11003 SDLoc dl = getCurSDLoc();
11005
11006 // Handle immediate and symbolic callees.
11007 if (auto* ConstCallee = dyn_cast<ConstantSDNode>(Callee))
11008 Callee = DAG.getIntPtrConstant(ConstCallee->getZExtValue(), dl,
11009 /*isTarget=*/true);
11010 else if (auto* SymbolicCallee = dyn_cast<GlobalAddressSDNode>(Callee))
11011 Callee = DAG.getTargetGlobalAddress(SymbolicCallee->getGlobal(),
11012 SDLoc(SymbolicCallee),
11013 SymbolicCallee->getValueType(0));
11014
11015 // Get the real number of arguments participating in the call <numArgs>
11017 unsigned NumArgs = NArgVal->getAsZExtVal();
11018
11019 // Skip the four meta args: <id>, <numNopBytes>, <target>, <numArgs>
11020 // Intrinsics include all meta-operands up to but not including CC.
11021 unsigned NumMetaOpers = PatchPointOpers::CCPos;
11022 assert(CB.arg_size() >= NumMetaOpers + NumArgs &&
11023 "Not enough arguments provided to the patchpoint intrinsic");
11024
11025 // For AnyRegCC the arguments are lowered later on manually.
11026 unsigned NumCallArgs = IsAnyRegCC ? 0 : NumArgs;
11027 Type *ReturnTy =
11028 IsAnyRegCC ? Type::getVoidTy(*DAG.getContext()) : CB.getType();
11029
11030 TargetLowering::CallLoweringInfo CLI(DAG);
11031 populateCallLoweringInfo(CLI, &CB, NumMetaOpers, NumCallArgs, Callee,
11032 ReturnTy, CB.getAttributes().getRetAttrs(), true);
11033 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
11034
11035 SDNode *CallEnd = Result.second.getNode();
11036 if (CallEnd->getOpcode() == ISD::EH_LABEL)
11037 CallEnd = CallEnd->getOperand(0).getNode();
11038 if (HasDef && (CallEnd->getOpcode() == ISD::CopyFromReg))
11039 CallEnd = CallEnd->getOperand(0).getNode();
11040
11041 /// Get a call instruction from the call sequence chain.
11042 /// Tail calls are not allowed.
11043 assert(CallEnd->getOpcode() == ISD::CALLSEQ_END &&
11044 "Expected a callseq node.");
11045 SDNode *Call = CallEnd->getOperand(0).getNode();
11046 bool HasGlue = Call->getGluedNode();
11047
11048 // Replace the target specific call node with the patchable intrinsic.
11050
11051 // Push the chain.
11052 Ops.push_back(*(Call->op_begin()));
11053
11054 // Optionally, push the glue (if any).
11055 if (HasGlue)
11056 Ops.push_back(*(Call->op_end() - 1));
11057
11058 // Push the register mask info.
11059 if (HasGlue)
11060 Ops.push_back(*(Call->op_end() - 2));
11061 else
11062 Ops.push_back(*(Call->op_end() - 1));
11063
11064 // Add the <id> and <numBytes> constants.
11066 Ops.push_back(DAG.getTargetConstant(IDVal->getAsZExtVal(), dl, MVT::i64));
11068 Ops.push_back(DAG.getTargetConstant(NBytesVal->getAsZExtVal(), dl, MVT::i32));
11069
11070 // Add the callee.
11071 Ops.push_back(Callee);
11072
11073 // Adjust <numArgs> to account for any arguments that have been passed on the
11074 // stack instead.
11075 // Call Node: Chain, Target, {Args}, RegMask, [Glue]
11076 unsigned NumCallRegArgs = Call->getNumOperands() - (HasGlue ? 4 : 3);
11077 NumCallRegArgs = IsAnyRegCC ? NumArgs : NumCallRegArgs;
11078 Ops.push_back(DAG.getTargetConstant(NumCallRegArgs, dl, MVT::i32));
11079
11080 // Add the calling convention
11081 Ops.push_back(DAG.getTargetConstant((unsigned)CC, dl, MVT::i32));
11082
11083 // Add the arguments we omitted previously. The register allocator should
11084 // place these in any free register.
11085 if (IsAnyRegCC)
11086 for (unsigned i = NumMetaOpers, e = NumMetaOpers + NumArgs; i != e; ++i)
11087 Ops.push_back(getValue(CB.getArgOperand(i)));
11088
11089 // Push the arguments from the call instruction.
11090 SDNode::op_iterator e = HasGlue ? Call->op_end()-2 : Call->op_end()-1;
11091 Ops.append(Call->op_begin() + 2, e);
11092
11093 // Push live variables for the stack map.
11094 addStackMapLiveVars(CB, NumMetaOpers + NumArgs, dl, Ops, *this);
11095
11096 SDVTList NodeTys;
11097 if (IsAnyRegCC && HasDef) {
11098 // Create the return types based on the intrinsic definition
11099 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11100 SmallVector<EVT, 3> ValueVTs;
11101 ComputeValueVTs(TLI, DAG.getDataLayout(), CB.getType(), ValueVTs);
11102 assert(ValueVTs.size() == 1 && "Expected only one return value type.");
11103
11104 // There is always a chain and a glue type at the end
11105 ValueVTs.push_back(MVT::Other);
11106 ValueVTs.push_back(MVT::Glue);
11107 NodeTys = DAG.getVTList(ValueVTs);
11108 } else
11109 NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
11110
11111 // Replace the target specific call node with a PATCHPOINT node.
11112 SDValue PPV = DAG.getNode(ISD::PATCHPOINT, dl, NodeTys, Ops);
11113
11114 // Update the NodeMap.
11115 if (HasDef) {
11116 if (IsAnyRegCC)
11117 setValue(&CB, SDValue(PPV.getNode(), 0));
11118 else
11119 setValue(&CB, Result.first);
11120 }
11121
11122 // Fixup the consumers of the intrinsic. The chain and glue may be used in the
11123 // call sequence. Furthermore the location of the chain and glue can change
11124 // when the AnyReg calling convention is used and the intrinsic returns a
11125 // value.
11126 if (IsAnyRegCC && HasDef) {
11127 SDValue From[] = {SDValue(Call, 0), SDValue(Call, 1)};
11128 SDValue To[] = {PPV.getValue(1), PPV.getValue(2)};
11129 DAG.ReplaceAllUsesOfValuesWith(From, To, 2);
11130 } else
11131 DAG.ReplaceAllUsesWith(Call, PPV.getNode());
11132 DAG.DeleteNode(Call);
11133
11134 // Inform the Frame Information that we have a patchpoint in this function.
11135 FuncInfo.MF->getFrameInfo().setHasPatchPoint();
11136}
11137
11138void SelectionDAGBuilder::visitVectorReduce(const CallInst &I,
11139 unsigned Intrinsic) {
11140 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11141 SDValue Op1 = getValue(I.getArgOperand(0));
11142 SDValue Op2;
11143 if (I.arg_size() > 1)
11144 Op2 = getValue(I.getArgOperand(1));
11145 SDLoc dl = getCurSDLoc();
11146 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
11147 SDValue Res;
11148 SDNodeFlags SDFlags;
11149 if (auto *FPMO = dyn_cast<FPMathOperator>(&I))
11150 SDFlags.copyFMF(*FPMO);
11151
11152 switch (Intrinsic) {
11153 case Intrinsic::vector_reduce_fadd:
11154 if (SDFlags.hasAllowReassociation())
11155 Res = DAG.getNode(ISD::FADD, dl, VT, Op1,
11156 DAG.getNode(ISD::VECREDUCE_FADD, dl, VT, Op2, SDFlags),
11157 SDFlags);
11158 else
11159 Res = DAG.getNode(ISD::VECREDUCE_SEQ_FADD, dl, VT, Op1, Op2, SDFlags);
11160 break;
11161 case Intrinsic::vector_reduce_fmul:
11162 if (SDFlags.hasAllowReassociation())
11163 Res = DAG.getNode(ISD::FMUL, dl, VT, Op1,
11164 DAG.getNode(ISD::VECREDUCE_FMUL, dl, VT, Op2, SDFlags),
11165 SDFlags);
11166 else
11167 Res = DAG.getNode(ISD::VECREDUCE_SEQ_FMUL, dl, VT, Op1, Op2, SDFlags);
11168 break;
11169 case Intrinsic::vector_reduce_add:
11170 Res = DAG.getNode(ISD::VECREDUCE_ADD, dl, VT, Op1);
11171 break;
11172 case Intrinsic::vector_reduce_mul:
11173 Res = DAG.getNode(ISD::VECREDUCE_MUL, dl, VT, Op1);
11174 break;
11175 case Intrinsic::vector_reduce_and:
11176 Res = DAG.getNode(ISD::VECREDUCE_AND, dl, VT, Op1);
11177 break;
11178 case Intrinsic::vector_reduce_or:
11179 Res = DAG.getNode(ISD::VECREDUCE_OR, dl, VT, Op1);
11180 break;
11181 case Intrinsic::vector_reduce_xor:
11182 Res = DAG.getNode(ISD::VECREDUCE_XOR, dl, VT, Op1);
11183 break;
11184 case Intrinsic::vector_reduce_smax:
11185 Res = DAG.getNode(ISD::VECREDUCE_SMAX, dl, VT, Op1);
11186 break;
11187 case Intrinsic::vector_reduce_smin:
11188 Res = DAG.getNode(ISD::VECREDUCE_SMIN, dl, VT, Op1);
11189 break;
11190 case Intrinsic::vector_reduce_umax:
11191 Res = DAG.getNode(ISD::VECREDUCE_UMAX, dl, VT, Op1);
11192 break;
11193 case Intrinsic::vector_reduce_umin:
11194 Res = DAG.getNode(ISD::VECREDUCE_UMIN, dl, VT, Op1);
11195 break;
11196 case Intrinsic::vector_reduce_fmax:
11197 Res = DAG.getNode(ISD::VECREDUCE_FMAX, dl, VT, Op1, SDFlags);
11198 break;
11199 case Intrinsic::vector_reduce_fmin:
11200 Res = DAG.getNode(ISD::VECREDUCE_FMIN, dl, VT, Op1, SDFlags);
11201 break;
11202 case Intrinsic::vector_reduce_fmaximum:
11203 Res = DAG.getNode(ISD::VECREDUCE_FMAXIMUM, dl, VT, Op1, SDFlags);
11204 break;
11205 case Intrinsic::vector_reduce_fminimum:
11206 Res = DAG.getNode(ISD::VECREDUCE_FMINIMUM, dl, VT, Op1, SDFlags);
11207 break;
11208 default:
11209 llvm_unreachable("Unhandled vector reduce intrinsic");
11210 }
11211 setValue(&I, Res);
11212}
11213
11214/// Returns an AttributeList representing the attributes applied to the return
11215/// value of the given call.
11218 if (CLI.RetSExt)
11219 Attrs.push_back(Attribute::SExt);
11220 if (CLI.RetZExt)
11221 Attrs.push_back(Attribute::ZExt);
11222 if (CLI.IsInReg)
11223 Attrs.push_back(Attribute::InReg);
11224
11225 return AttributeList::get(CLI.RetTy->getContext(), AttributeList::ReturnIndex,
11226 Attrs);
11227}
11228
11229/// TargetLowering::LowerCallTo - This is the default LowerCallTo
11230/// implementation, which just calls LowerCall.
11231/// FIXME: When all targets are
11232/// migrated to using LowerCall, this hook should be integrated into SDISel.
11233std::pair<SDValue, SDValue>
11235 LLVMContext &Context = CLI.RetTy->getContext();
11236
11237 // Handle the incoming return values from the call.
11238 CLI.Ins.clear();
11239 SmallVector<Type *, 4> RetOrigTys;
11241 auto &DL = CLI.DAG.getDataLayout();
11242 ComputeValueTypes(DL, CLI.OrigRetTy, RetOrigTys, &Offsets);
11243
11244 SmallVector<EVT, 4> RetVTs;
11245 if (CLI.RetTy != CLI.OrigRetTy) {
11246 assert(RetOrigTys.size() == 1 &&
11247 "Only supported for non-aggregate returns");
11248 RetVTs.push_back(getValueType(DL, CLI.RetTy));
11249 } else {
11250 for (Type *Ty : RetOrigTys)
11251 RetVTs.push_back(getValueType(DL, Ty));
11252 }
11253
11254 if (CLI.IsPostTypeLegalization) {
11255 // If we are lowering a libcall after legalization, split the return type.
11256 SmallVector<Type *, 4> OldRetOrigTys;
11257 SmallVector<EVT, 4> OldRetVTs;
11258 SmallVector<TypeSize, 4> OldOffsets;
11259 RetOrigTys.swap(OldRetOrigTys);
11260 RetVTs.swap(OldRetVTs);
11261 Offsets.swap(OldOffsets);
11262
11263 for (size_t i = 0, e = OldRetVTs.size(); i != e; ++i) {
11264 EVT RetVT = OldRetVTs[i];
11265 uint64_t Offset = OldOffsets[i];
11266 MVT RegisterVT = getRegisterType(Context, RetVT);
11267 unsigned NumRegs = getNumRegisters(Context, RetVT);
11268 unsigned RegisterVTByteSZ = RegisterVT.getSizeInBits() / 8;
11269 RetOrigTys.append(NumRegs, OldRetOrigTys[i]);
11270 RetVTs.append(NumRegs, RegisterVT);
11271 for (unsigned j = 0; j != NumRegs; ++j)
11272 Offsets.push_back(TypeSize::getFixed(Offset + j * RegisterVTByteSZ));
11273 }
11274 }
11275
11277 GetReturnInfo(CLI.CallConv, CLI.RetTy, getReturnAttrs(CLI), Outs, *this, DL);
11278
11279 bool CanLowerReturn =
11281 CLI.IsVarArg, Outs, Context, CLI.RetTy);
11282
11283 SDValue DemoteStackSlot;
11284 int DemoteStackIdx = -100;
11285 if (!CanLowerReturn) {
11286 // FIXME: equivalent assert?
11287 // assert(!CS.hasInAllocaArgument() &&
11288 // "sret demotion is incompatible with inalloca");
11289 uint64_t TySize = DL.getTypeAllocSize(CLI.RetTy);
11290 Align Alignment = DL.getPrefTypeAlign(CLI.RetTy);
11292 DemoteStackIdx =
11293 MF.getFrameInfo().CreateStackObject(TySize, Alignment, false);
11294 Type *StackSlotPtrType = PointerType::get(Context, DL.getAllocaAddrSpace());
11295
11296 DemoteStackSlot = CLI.DAG.getFrameIndex(DemoteStackIdx, getFrameIndexTy(DL));
11297 ArgListEntry Entry(DemoteStackSlot, StackSlotPtrType);
11298 Entry.IsSRet = true;
11299 Entry.Alignment = Alignment;
11300 CLI.getArgs().insert(CLI.getArgs().begin(), Entry);
11301 CLI.NumFixedArgs += 1;
11302 CLI.getArgs()[0].IndirectType = CLI.RetTy;
11303 CLI.RetTy = CLI.OrigRetTy = Type::getVoidTy(Context);
11304
11305 // sret demotion isn't compatible with tail-calls, since the sret argument
11306 // points into the callers stack frame.
11307 CLI.IsTailCall = false;
11308 } else {
11309 bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
11310 CLI.RetTy, CLI.CallConv, CLI.IsVarArg, DL);
11311 for (unsigned I = 0, E = RetVTs.size(); I != E; ++I) {
11312 ISD::ArgFlagsTy Flags;
11313 if (NeedsRegBlock) {
11314 Flags.setInConsecutiveRegs();
11315 if (I == RetVTs.size() - 1)
11316 Flags.setInConsecutiveRegsLast();
11317 }
11318 EVT VT = RetVTs[I];
11319 MVT RegisterVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11320 unsigned NumRegs =
11321 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11322 for (unsigned i = 0; i != NumRegs; ++i) {
11323 ISD::InputArg Ret(Flags, RegisterVT, VT, RetOrigTys[I],
11325 if (CLI.RetTy->isPointerTy()) {
11326 Ret.Flags.setPointer();
11328 cast<PointerType>(CLI.RetTy)->getAddressSpace());
11329 }
11330 if (CLI.RetSExt)
11331 Ret.Flags.setSExt();
11332 if (CLI.RetZExt)
11333 Ret.Flags.setZExt();
11334 if (CLI.IsInReg)
11335 Ret.Flags.setInReg();
11336 CLI.Ins.push_back(Ret);
11337 }
11338 }
11339 }
11340
11341 // We push in swifterror return as the last element of CLI.Ins.
11342 ArgListTy &Args = CLI.getArgs();
11343 if (supportSwiftError()) {
11344 for (const ArgListEntry &Arg : Args) {
11345 if (Arg.IsSwiftError) {
11346 ISD::ArgFlagsTy Flags;
11347 Flags.setSwiftError();
11349 PointerType::getUnqual(Context),
11350 /*Used=*/true, ISD::InputArg::NoArgIndex, 0);
11351 CLI.Ins.push_back(Ret);
11352 }
11353 }
11354 }
11355
11356 // Handle all of the outgoing arguments.
11357 CLI.Outs.clear();
11358 CLI.OutVals.clear();
11359 for (unsigned i = 0, e = Args.size(); i != e; ++i) {
11360 SmallVector<Type *, 4> OrigArgTys;
11361 ComputeValueTypes(DL, Args[i].OrigTy, OrigArgTys);
11362 // FIXME: Split arguments if CLI.IsPostTypeLegalization
11363 Type *FinalType = Args[i].Ty;
11364 if (Args[i].IsByVal)
11365 FinalType = Args[i].IndirectType;
11366 bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
11367 FinalType, CLI.CallConv, CLI.IsVarArg, DL);
11368 for (unsigned Value = 0, NumValues = OrigArgTys.size(); Value != NumValues;
11369 ++Value) {
11370 Type *OrigArgTy = OrigArgTys[Value];
11371 Type *ArgTy = OrigArgTy;
11372 if (Args[i].Ty != Args[i].OrigTy) {
11373 assert(Value == 0 && "Only supported for non-aggregate arguments");
11374 ArgTy = Args[i].Ty;
11375 }
11376
11377 EVT VT = getValueType(DL, ArgTy);
11378 SDValue Op = SDValue(Args[i].Node.getNode(),
11379 Args[i].Node.getResNo() + Value);
11380 ISD::ArgFlagsTy Flags;
11381
11382 // Certain targets (such as MIPS), may have a different ABI alignment
11383 // for a type depending on the context. Give the target a chance to
11384 // specify the alignment it wants.
11385 const Align OriginalAlignment(getABIAlignmentForCallingConv(ArgTy, DL));
11386 Flags.setOrigAlign(OriginalAlignment);
11387
11388 if (i >= CLI.NumFixedArgs)
11389 Flags.setVarArg();
11390 if (ArgTy->isPointerTy()) {
11391 Flags.setPointer();
11392 Flags.setPointerAddrSpace(cast<PointerType>(ArgTy)->getAddressSpace());
11393 }
11394 if (Args[i].IsZExt)
11395 Flags.setZExt();
11396 if (Args[i].IsSExt)
11397 Flags.setSExt();
11398 if (Args[i].IsNoExt)
11399 Flags.setNoExt();
11400 if (Args[i].IsInReg) {
11401 // If we are using vectorcall calling convention, a structure that is
11402 // passed InReg - is surely an HVA
11404 isa<StructType>(FinalType)) {
11405 // The first value of a structure is marked
11406 if (0 == Value)
11407 Flags.setHvaStart();
11408 Flags.setHva();
11409 }
11410 // Set InReg Flag
11411 Flags.setInReg();
11412 }
11413 if (Args[i].IsSRet)
11414 Flags.setSRet();
11415 if (Args[i].IsSwiftSelf)
11416 Flags.setSwiftSelf();
11417 if (Args[i].IsSwiftAsync)
11418 Flags.setSwiftAsync();
11419 if (Args[i].IsSwiftError)
11420 Flags.setSwiftError();
11421 if (Args[i].IsCFGuardTarget)
11422 Flags.setCFGuardTarget();
11423 if (Args[i].IsByVal)
11424 Flags.setByVal();
11425 if (Args[i].IsByRef)
11426 Flags.setByRef();
11427 if (Args[i].IsPreallocated) {
11428 Flags.setPreallocated();
11429 // Set the byval flag for CCAssignFn callbacks that don't know about
11430 // preallocated. This way we can know how many bytes we should've
11431 // allocated and how many bytes a callee cleanup function will pop. If
11432 // we port preallocated to more targets, we'll have to add custom
11433 // preallocated handling in the various CC lowering callbacks.
11434 Flags.setByVal();
11435 }
11436 if (Args[i].IsInAlloca) {
11437 Flags.setInAlloca();
11438 // Set the byval flag for CCAssignFn callbacks that don't know about
11439 // inalloca. This way we can know how many bytes we should've allocated
11440 // and how many bytes a callee cleanup function will pop. If we port
11441 // inalloca to more targets, we'll have to add custom inalloca handling
11442 // in the various CC lowering callbacks.
11443 Flags.setByVal();
11444 }
11445 Align MemAlign;
11446 if (Args[i].IsByVal || Args[i].IsInAlloca || Args[i].IsPreallocated) {
11447 unsigned FrameSize = DL.getTypeAllocSize(Args[i].IndirectType);
11448 Flags.setByValSize(FrameSize);
11449
11450 // info is not there but there are cases it cannot get right.
11451 if (auto MA = Args[i].Alignment)
11452 MemAlign = *MA;
11453 else
11454 MemAlign = getByValTypeAlignment(Args[i].IndirectType, DL);
11455 } else if (auto MA = Args[i].Alignment) {
11456 MemAlign = *MA;
11457 } else {
11458 MemAlign = OriginalAlignment;
11459 }
11460 Flags.setMemAlign(MemAlign);
11461 if (Args[i].IsNest)
11462 Flags.setNest();
11463 if (NeedsRegBlock)
11464 Flags.setInConsecutiveRegs();
11465
11466 MVT PartVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11467 unsigned NumParts =
11468 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11469 SmallVector<SDValue, 4> Parts(NumParts);
11470 ISD::NodeType ExtendKind = ISD::ANY_EXTEND;
11471
11472 if (Args[i].IsSExt)
11473 ExtendKind = ISD::SIGN_EXTEND;
11474 else if (Args[i].IsZExt)
11475 ExtendKind = ISD::ZERO_EXTEND;
11476
11477 // Conservatively only handle 'returned' on non-vectors that can be lowered,
11478 // for now.
11479 if (Args[i].IsReturned && !Op.getValueType().isVector() &&
11481 assert((CLI.RetTy == Args[i].Ty ||
11482 (CLI.RetTy->isPointerTy() && Args[i].Ty->isPointerTy() &&
11484 Args[i].Ty->getPointerAddressSpace())) &&
11485 RetVTs.size() == NumValues && "unexpected use of 'returned'");
11486 // Before passing 'returned' to the target lowering code, ensure that
11487 // either the register MVT and the actual EVT are the same size or that
11488 // the return value and argument are extended in the same way; in these
11489 // cases it's safe to pass the argument register value unchanged as the
11490 // return register value (although it's at the target's option whether
11491 // to do so)
11492 // TODO: allow code generation to take advantage of partially preserved
11493 // registers rather than clobbering the entire register when the
11494 // parameter extension method is not compatible with the return
11495 // extension method
11496 if ((NumParts * PartVT.getSizeInBits() == VT.getSizeInBits()) ||
11497 (ExtendKind != ISD::ANY_EXTEND && CLI.RetSExt == Args[i].IsSExt &&
11498 CLI.RetZExt == Args[i].IsZExt))
11499 Flags.setReturned();
11500 }
11501
11502 getCopyToParts(CLI.DAG, CLI.DL, Op, &Parts[0], NumParts, PartVT, CLI.CB,
11503 CLI.CallConv, ExtendKind);
11504
11505 for (unsigned j = 0; j != NumParts; ++j) {
11506 // if it isn't first piece, alignment must be 1
11507 // For scalable vectors the scalable part is currently handled
11508 // by individual targets, so we just use the known minimum size here.
11509 ISD::OutputArg MyFlags(
11510 Flags, Parts[j].getValueType().getSimpleVT(), VT, OrigArgTy, i,
11511 j * Parts[j].getValueType().getStoreSize().getKnownMinValue());
11512 if (NumParts > 1 && j == 0)
11513 MyFlags.Flags.setSplit();
11514 else if (j != 0) {
11515 MyFlags.Flags.setOrigAlign(Align(1));
11516 if (j == NumParts - 1)
11517 MyFlags.Flags.setSplitEnd();
11518 }
11519
11520 CLI.Outs.push_back(MyFlags);
11521 CLI.OutVals.push_back(Parts[j]);
11522 }
11523
11524 if (NeedsRegBlock && Value == NumValues - 1)
11525 CLI.Outs[CLI.Outs.size() - 1].Flags.setInConsecutiveRegsLast();
11526 }
11527 }
11528
11530 CLI.Chain = LowerCall(CLI, InVals);
11531
11532 // Update CLI.InVals to use outside of this function.
11533 CLI.InVals = InVals;
11534
11535 // Verify that the target's LowerCall behaved as expected.
11536 assert(CLI.Chain.getNode() && CLI.Chain.getValueType() == MVT::Other &&
11537 "LowerCall didn't return a valid chain!");
11538 assert((!CLI.IsTailCall || InVals.empty()) &&
11539 "LowerCall emitted a return value for a tail call!");
11540 assert((CLI.IsTailCall || InVals.size() == CLI.Ins.size()) &&
11541 "LowerCall didn't emit the correct number of values!");
11542
11543 // For a tail call, the return value is merely live-out and there aren't
11544 // any nodes in the DAG representing it. Return a special value to
11545 // indicate that a tail call has been emitted and no more Instructions
11546 // should be processed in the current block.
11547 if (CLI.IsTailCall) {
11548 CLI.DAG.setRoot(CLI.Chain);
11549 return std::make_pair(SDValue(), SDValue());
11550 }
11551
11552#ifndef NDEBUG
11553 for (unsigned i = 0, e = CLI.Ins.size(); i != e; ++i) {
11554 assert(InVals[i].getNode() && "LowerCall emitted a null value!");
11555 assert(EVT(CLI.Ins[i].VT) == InVals[i].getValueType() &&
11556 "LowerCall emitted a value with the wrong type!");
11557 }
11558#endif
11559
11560 SmallVector<SDValue, 4> ReturnValues;
11561 if (!CanLowerReturn) {
11562 // The instruction result is the result of loading from the
11563 // hidden sret parameter.
11564 MVT PtrVT = getPointerTy(DL, DL.getAllocaAddrSpace());
11565
11566 unsigned NumValues = RetVTs.size();
11567 ReturnValues.resize(NumValues);
11568 SmallVector<SDValue, 4> Chains(NumValues);
11569
11570 // An aggregate return value cannot wrap around the address space, so
11571 // offsets to its parts don't wrap either.
11573 Align HiddenSRetAlign = MF.getFrameInfo().getObjectAlign(DemoteStackIdx);
11574 for (unsigned i = 0; i < NumValues; ++i) {
11576 DemoteStackSlot, CLI.DAG.getConstant(Offsets[i], CLI.DL, PtrVT),
11578 SDValue L = CLI.DAG.getLoad(
11579 RetVTs[i], CLI.DL, CLI.Chain, Add,
11581 DemoteStackIdx, Offsets[i]),
11582 HiddenSRetAlign);
11583 ReturnValues[i] = L;
11584 Chains[i] = L.getValue(1);
11585 }
11586
11587 CLI.Chain = CLI.DAG.getNode(ISD::TokenFactor, CLI.DL, MVT::Other, Chains);
11588 } else {
11589 // Collect the legal value parts into potentially illegal values
11590 // that correspond to the original function's return values.
11591 std::optional<ISD::NodeType> AssertOp;
11592 if (CLI.RetSExt)
11593 AssertOp = ISD::AssertSext;
11594 else if (CLI.RetZExt)
11595 AssertOp = ISD::AssertZext;
11596 unsigned CurReg = 0;
11597 for (EVT VT : RetVTs) {
11598 MVT RegisterVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11599 unsigned NumRegs =
11600 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11601
11602 ReturnValues.push_back(getCopyFromParts(
11603 CLI.DAG, CLI.DL, &InVals[CurReg], NumRegs, RegisterVT, VT, nullptr,
11604 CLI.Chain, CLI.CallConv, AssertOp));
11605 CurReg += NumRegs;
11606 }
11607
11608 // For a function returning void, there is no return value. We can't create
11609 // such a node, so we just return a null return value in that case. In
11610 // that case, nothing will actually look at the value.
11611 if (ReturnValues.empty())
11612 return std::make_pair(SDValue(), CLI.Chain);
11613 }
11614
11615 SDValue Res = CLI.DAG.getNode(ISD::MERGE_VALUES, CLI.DL,
11616 CLI.DAG.getVTList(RetVTs), ReturnValues);
11617 return std::make_pair(Res, CLI.Chain);
11618}
11619
11620/// Places new result values for the node in Results (their number
11621/// and types must exactly match those of the original return values of
11622/// the node), or leaves Results empty, which indicates that the node is not
11623/// to be custom lowered after all.
11626 SelectionDAG &DAG) const {
11627 SDValue Res = LowerOperation(SDValue(N, 0), DAG);
11628
11629 if (!Res.getNode())
11630 return;
11631
11632 // If the original node has one result, take the return value from
11633 // LowerOperation as is. It might not be result number 0.
11634 if (N->getNumValues() == 1) {
11635 Results.push_back(Res);
11636 return;
11637 }
11638
11639 // If the original node has multiple results, then the return node should
11640 // have the same number of results.
11641 assert((N->getNumValues() == Res->getNumValues()) &&
11642 "Lowering returned the wrong number of results!");
11643
11644 // Places new result values base on N result number.
11645 for (unsigned I = 0, E = N->getNumValues(); I != E; ++I)
11646 Results.push_back(Res.getValue(I));
11647}
11648
11650 llvm_unreachable("LowerOperation not implemented for this target!");
11651}
11652
11654 Register Reg,
11655 ISD::NodeType ExtendType) {
11657 assert((Op.getOpcode() != ISD::CopyFromReg ||
11658 cast<RegisterSDNode>(Op.getOperand(1))->getReg() != Reg) &&
11659 "Copy from a reg to the same reg!");
11660 assert(!Reg.isPhysical() && "Is a physreg");
11661
11662 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11663 // If this is an InlineAsm we have to match the registers required, not the
11664 // notional registers required by the type.
11665
11666 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), Reg, V->getType(),
11667 std::nullopt); // This is not an ABI copy.
11668 SDValue Chain = DAG.getEntryNode();
11669
11670 if (ExtendType == ISD::ANY_EXTEND) {
11671 auto PreferredExtendIt = FuncInfo.PreferredExtendType.find(V);
11672 if (PreferredExtendIt != FuncInfo.PreferredExtendType.end())
11673 ExtendType = PreferredExtendIt->second;
11674 }
11675 RFV.getCopyToRegs(Op, DAG, getCurSDLoc(), Chain, nullptr, V, ExtendType);
11676 PendingExports.push_back(Chain);
11677}
11678
11680
11681/// isOnlyUsedInEntryBlock - If the specified argument is only used in the
11682/// entry block, return true. This includes arguments used by switches, since
11683/// the switch may expand into multiple basic blocks.
11684static bool isOnlyUsedInEntryBlock(const Argument *A, bool FastISel) {
11685 // With FastISel active, we may be splitting blocks, so force creation
11686 // of virtual registers for all non-dead arguments.
11687 if (FastISel)
11688 return A->use_empty();
11689
11690 const BasicBlock &Entry = A->getParent()->front();
11691 for (const User *U : A->users())
11692 if (cast<Instruction>(U)->getParent() != &Entry || isa<SwitchInst>(U))
11693 return false; // Use not in entry block.
11694
11695 return true;
11696}
11697
11699 DenseMap<const Argument *,
11700 std::pair<const AllocaInst *, const StoreInst *>>;
11701
11702/// Scan the entry block of the function in FuncInfo for arguments that look
11703/// like copies into a local alloca. Record any copied arguments in
11704/// ArgCopyElisionCandidates.
11705static void
11707 FunctionLoweringInfo *FuncInfo,
11708 ArgCopyElisionMapTy &ArgCopyElisionCandidates) {
11709 // Record the state of every static alloca used in the entry block. Argument
11710 // allocas are all used in the entry block, so we need approximately as many
11711 // entries as we have arguments.
11712 enum StaticAllocaInfo { Unknown, Clobbered, Elidable };
11714 unsigned NumArgs = FuncInfo->Fn->arg_size();
11715 StaticAllocas.reserve(NumArgs * 2);
11716
11717 auto GetInfoIfStaticAlloca = [&](const Value *V) -> StaticAllocaInfo * {
11718 if (!V)
11719 return nullptr;
11720 V = V->stripPointerCasts();
11721 const auto *AI = dyn_cast<AllocaInst>(V);
11722 if (!AI || !AI->isStaticAlloca() || !FuncInfo->StaticAllocaMap.count(AI))
11723 return nullptr;
11724 auto Iter = StaticAllocas.insert({AI, Unknown});
11725 return &Iter.first->second;
11726 };
11727
11728 // Look for stores of arguments to static allocas. Look through bitcasts and
11729 // GEPs to handle type coercions, as long as the alloca is fully initialized
11730 // by the store. Any non-store use of an alloca escapes it and any subsequent
11731 // unanalyzed store might write it.
11732 // FIXME: Handle structs initialized with multiple stores.
11733 for (const Instruction &I : FuncInfo->Fn->getEntryBlock()) {
11734 // Look for stores, and handle non-store uses conservatively.
11735 const auto *SI = dyn_cast<StoreInst>(&I);
11736 if (!SI) {
11737 // We will look through cast uses, so ignore them completely.
11738 if (I.isCast())
11739 continue;
11740 // Ignore debug info and pseudo op intrinsics, they don't escape or store
11741 // to allocas.
11742 if (I.isDebugOrPseudoInst())
11743 continue;
11744 // This is an unknown instruction. Assume it escapes or writes to all
11745 // static alloca operands.
11746 for (const Use &U : I.operands()) {
11747 if (StaticAllocaInfo *Info = GetInfoIfStaticAlloca(U))
11748 *Info = StaticAllocaInfo::Clobbered;
11749 }
11750 continue;
11751 }
11752
11753 // If the stored value is a static alloca, mark it as escaped.
11754 if (StaticAllocaInfo *Info = GetInfoIfStaticAlloca(SI->getValueOperand()))
11755 *Info = StaticAllocaInfo::Clobbered;
11756
11757 // Check if the destination is a static alloca.
11758 const Value *Dst = SI->getPointerOperand()->stripPointerCasts();
11759 StaticAllocaInfo *Info = GetInfoIfStaticAlloca(Dst);
11760 if (!Info)
11761 continue;
11762 const AllocaInst *AI = cast<AllocaInst>(Dst);
11763
11764 // Skip allocas that have been initialized or clobbered.
11765 if (*Info != StaticAllocaInfo::Unknown)
11766 continue;
11767
11768 // Check if the stored value is an argument, and that this store fully
11769 // initializes the alloca.
11770 // If the argument type has padding bits we can't directly forward a pointer
11771 // as the upper bits may contain garbage.
11772 // Don't elide copies from the same argument twice.
11773 const Value *Val = SI->getValueOperand()->stripPointerCasts();
11774 const auto *Arg = dyn_cast<Argument>(Val);
11775 std::optional<TypeSize> AllocaSize = AI->getAllocationSize(DL);
11776 if (!Arg || Arg->hasPassPointeeByValueCopyAttr() ||
11777 Arg->getType()->isEmptyTy() || !AllocaSize ||
11778 DL.getTypeStoreSize(Arg->getType()) != *AllocaSize ||
11779 !DL.typeSizeEqualsStoreSize(Arg->getType()) ||
11780 ArgCopyElisionCandidates.count(Arg)) {
11781 *Info = StaticAllocaInfo::Clobbered;
11782 continue;
11783 }
11784
11785 LLVM_DEBUG(dbgs() << "Found argument copy elision candidate: " << *AI
11786 << '\n');
11787
11788 // Mark this alloca and store for argument copy elision.
11789 *Info = StaticAllocaInfo::Elidable;
11790 ArgCopyElisionCandidates.insert({Arg, {AI, SI}});
11791
11792 // Stop scanning if we've seen all arguments. This will happen early in -O0
11793 // builds, which is useful, because -O0 builds have large entry blocks and
11794 // many allocas.
11795 if (ArgCopyElisionCandidates.size() == NumArgs)
11796 break;
11797 }
11798}
11799
11800/// Try to elide argument copies from memory into a local alloca. Succeeds if
11801/// ArgVal is a load from a suitable fixed stack object.
11804 DenseMap<int, int> &ArgCopyElisionFrameIndexMap,
11805 SmallPtrSetImpl<const Instruction *> &ElidedArgCopyInstrs,
11806 ArgCopyElisionMapTy &ArgCopyElisionCandidates, const Argument &Arg,
11807 ArrayRef<SDValue> ArgVals, bool &ArgHasUses) {
11808 // Check if this is a load from a fixed stack object.
11809 auto *LNode = dyn_cast<LoadSDNode>(ArgVals[0]);
11810 if (!LNode)
11811 return;
11812 auto *FINode = dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode());
11813 if (!FINode)
11814 return;
11815
11816 // Check that the fixed stack object is the right size and alignment.
11817 // Look at the alignment that the user wrote on the alloca instead of looking
11818 // at the stack object.
11819 auto ArgCopyIter = ArgCopyElisionCandidates.find(&Arg);
11820 assert(ArgCopyIter != ArgCopyElisionCandidates.end());
11821 const AllocaInst *AI = ArgCopyIter->second.first;
11822 int FixedIndex = FINode->getIndex();
11823 int &AllocaIndex = FuncInfo.StaticAllocaMap[AI];
11824 int OldIndex = AllocaIndex;
11825 MachineFrameInfo &MFI = FuncInfo.MF->getFrameInfo();
11826 if (MFI.getObjectSize(FixedIndex) != MFI.getObjectSize(OldIndex)) {
11827 LLVM_DEBUG(
11828 dbgs() << " argument copy elision failed due to bad fixed stack "
11829 "object size\n");
11830 return;
11831 }
11832 Align RequiredAlignment = AI->getAlign();
11833 if (MFI.getObjectAlign(FixedIndex) < RequiredAlignment) {
11834 LLVM_DEBUG(dbgs() << " argument copy elision failed: alignment of alloca "
11835 "greater than stack argument alignment ("
11836 << DebugStr(RequiredAlignment) << " vs "
11837 << DebugStr(MFI.getObjectAlign(FixedIndex)) << ")\n");
11838 return;
11839 }
11840
11841 // Perform the elision. Delete the old stack object and replace its only use
11842 // in the variable info map. Mark the stack object as mutable and aliased.
11843 LLVM_DEBUG({
11844 dbgs() << "Eliding argument copy from " << Arg << " to " << *AI << '\n'
11845 << " Replacing frame index " << OldIndex << " with " << FixedIndex
11846 << '\n';
11847 });
11848 MFI.RemoveStackObject(OldIndex);
11849 MFI.setIsImmutableObjectIndex(FixedIndex, false);
11850 MFI.setIsAliasedObjectIndex(FixedIndex, true);
11851 AllocaIndex = FixedIndex;
11852 ArgCopyElisionFrameIndexMap.insert({OldIndex, FixedIndex});
11853 for (SDValue ArgVal : ArgVals)
11854 Chains.push_back(ArgVal.getValue(1));
11855
11856 // Avoid emitting code for the store implementing the copy.
11857 const StoreInst *SI = ArgCopyIter->second.second;
11858 ElidedArgCopyInstrs.insert(SI);
11859
11860 // Check for uses of the argument again so that we can avoid exporting ArgVal
11861 // if it is't used by anything other than the store.
11862 for (const Value *U : Arg.users()) {
11863 if (U != SI) {
11864 ArgHasUses = true;
11865 break;
11866 }
11867 }
11868}
11869
11870void SelectionDAGISel::LowerArguments(const Function &F) {
11871 SelectionDAG &DAG = SDB->DAG;
11872 SDLoc dl = SDB->getCurSDLoc();
11873 const DataLayout &DL = DAG.getDataLayout();
11875
11876 // In Naked functions we aren't going to save any registers.
11877 if (F.hasFnAttribute(Attribute::Naked))
11878 return;
11879
11880 if (!FuncInfo->CanLowerReturn) {
11881 // Put in an sret pointer parameter before all the other parameters.
11882 MVT ValueVT = TLI->getPointerTy(DL, DL.getAllocaAddrSpace());
11883
11884 ISD::ArgFlagsTy Flags;
11885 Flags.setSRet();
11886 MVT RegisterVT = TLI->getRegisterType(*DAG.getContext(), ValueVT);
11887 ISD::InputArg RetArg(Flags, RegisterVT, ValueVT, F.getReturnType(), true,
11889 Ins.push_back(RetArg);
11890 }
11891
11892 // Look for stores of arguments to static allocas. Mark such arguments with a
11893 // flag to ask the target to give us the memory location of that argument if
11894 // available.
11895 ArgCopyElisionMapTy ArgCopyElisionCandidates;
11897 ArgCopyElisionCandidates);
11898
11899 // Set up the incoming argument description vector.
11900 for (const Argument &Arg : F.args()) {
11901 unsigned ArgNo = Arg.getArgNo();
11903 ComputeValueTypes(DAG.getDataLayout(), Arg.getType(), Types);
11904 bool isArgValueUsed = !Arg.use_empty();
11905 Type *FinalType = Arg.getType();
11906 if (Arg.hasAttribute(Attribute::ByVal))
11907 FinalType = Arg.getParamByValType();
11908 bool NeedsRegBlock = TLI->functionArgumentNeedsConsecutiveRegisters(
11909 FinalType, F.getCallingConv(), F.isVarArg(), DL);
11910 for (unsigned Value = 0, NumValues = Types.size(); Value != NumValues;
11911 ++Value) {
11912 Type *ArgTy = Types[Value];
11913 EVT VT = TLI->getValueType(DL, ArgTy);
11914 ISD::ArgFlagsTy Flags;
11915
11916 if (ArgTy->isPointerTy()) {
11917 Flags.setPointer();
11918 Flags.setPointerAddrSpace(cast<PointerType>(ArgTy)->getAddressSpace());
11919 }
11920 if (Arg.hasAttribute(Attribute::ZExt))
11921 Flags.setZExt();
11922 if (Arg.hasAttribute(Attribute::SExt))
11923 Flags.setSExt();
11924 if (Arg.hasAttribute(Attribute::InReg)) {
11925 // If we are using vectorcall calling convention, a structure that is
11926 // passed InReg - is surely an HVA
11927 if (F.getCallingConv() == CallingConv::X86_VectorCall &&
11928 isa<StructType>(Arg.getType())) {
11929 // The first value of a structure is marked
11930 if (0 == Value)
11931 Flags.setHvaStart();
11932 Flags.setHva();
11933 }
11934 // Set InReg Flag
11935 Flags.setInReg();
11936 }
11937 if (Arg.hasAttribute(Attribute::StructRet))
11938 Flags.setSRet();
11939 if (Arg.hasAttribute(Attribute::SwiftSelf))
11940 Flags.setSwiftSelf();
11941 if (Arg.hasAttribute(Attribute::SwiftAsync))
11942 Flags.setSwiftAsync();
11943 if (Arg.hasAttribute(Attribute::SwiftError))
11944 Flags.setSwiftError();
11945 if (Arg.hasAttribute(Attribute::ByVal))
11946 Flags.setByVal();
11947 if (Arg.hasAttribute(Attribute::ByRef))
11948 Flags.setByRef();
11949 if (Arg.hasAttribute(Attribute::InAlloca)) {
11950 Flags.setInAlloca();
11951 // Set the byval flag for CCAssignFn callbacks that don't know about
11952 // inalloca. This way we can know how many bytes we should've allocated
11953 // and how many bytes a callee cleanup function will pop. If we port
11954 // inalloca to more targets, we'll have to add custom inalloca handling
11955 // in the various CC lowering callbacks.
11956 Flags.setByVal();
11957 }
11958 if (Arg.hasAttribute(Attribute::Preallocated)) {
11959 Flags.setPreallocated();
11960 // Set the byval flag for CCAssignFn callbacks that don't know about
11961 // preallocated. This way we can know how many bytes we should've
11962 // allocated and how many bytes a callee cleanup function will pop. If
11963 // we port preallocated to more targets, we'll have to add custom
11964 // preallocated handling in the various CC lowering callbacks.
11965 Flags.setByVal();
11966 }
11967
11968 // Certain targets (such as MIPS), may have a different ABI alignment
11969 // for a type depending on the context. Give the target a chance to
11970 // specify the alignment it wants.
11971 const Align OriginalAlignment(
11972 TLI->getABIAlignmentForCallingConv(ArgTy, DL));
11973 Flags.setOrigAlign(OriginalAlignment);
11974
11975 Align MemAlign;
11976 Type *ArgMemTy = nullptr;
11977 if (Flags.isByVal() || Flags.isInAlloca() || Flags.isPreallocated() ||
11978 Flags.isByRef()) {
11979 if (!ArgMemTy)
11980 ArgMemTy = Arg.getPointeeInMemoryValueType();
11981
11982 uint64_t MemSize = DL.getTypeAllocSize(ArgMemTy);
11983
11984 // For in-memory arguments, size and alignment should be passed from FE.
11985 // BE will guess if this info is not there but there are cases it cannot
11986 // get right.
11987 if (auto ParamAlign = Arg.getParamStackAlign())
11988 MemAlign = *ParamAlign;
11989 else if ((ParamAlign = Arg.getParamAlign()))
11990 MemAlign = *ParamAlign;
11991 else
11992 MemAlign = TLI->getByValTypeAlignment(ArgMemTy, DL);
11993 if (Flags.isByRef())
11994 Flags.setByRefSize(MemSize);
11995 else
11996 Flags.setByValSize(MemSize);
11997 } else if (auto ParamAlign = Arg.getParamStackAlign()) {
11998 MemAlign = *ParamAlign;
11999 } else {
12000 MemAlign = OriginalAlignment;
12001 }
12002 Flags.setMemAlign(MemAlign);
12003
12004 if (Arg.hasAttribute(Attribute::Nest))
12005 Flags.setNest();
12006 if (NeedsRegBlock)
12007 Flags.setInConsecutiveRegs();
12008 if (ArgCopyElisionCandidates.count(&Arg))
12009 Flags.setCopyElisionCandidate();
12010 if (Arg.hasAttribute(Attribute::Returned))
12011 Flags.setReturned();
12012
12013 MVT RegisterVT = TLI->getRegisterTypeForCallingConv(
12014 *CurDAG->getContext(), F.getCallingConv(), VT);
12015 unsigned NumRegs = TLI->getNumRegistersForCallingConv(
12016 *CurDAG->getContext(), F.getCallingConv(), VT);
12017 for (unsigned i = 0; i != NumRegs; ++i) {
12018 // For scalable vectors, use the minimum size; individual targets
12019 // are responsible for handling scalable vector arguments and
12020 // return values.
12021 ISD::InputArg MyFlags(
12022 Flags, RegisterVT, VT, ArgTy, isArgValueUsed, ArgNo,
12023 i * RegisterVT.getStoreSize().getKnownMinValue());
12024 if (NumRegs > 1 && i == 0)
12025 MyFlags.Flags.setSplit();
12026 // if it isn't first piece, alignment must be 1
12027 else if (i > 0) {
12028 MyFlags.Flags.setOrigAlign(Align(1));
12029 if (i == NumRegs - 1)
12030 MyFlags.Flags.setSplitEnd();
12031 }
12032 Ins.push_back(MyFlags);
12033 }
12034 if (NeedsRegBlock && Value == NumValues - 1)
12035 Ins[Ins.size() - 1].Flags.setInConsecutiveRegsLast();
12036 }
12037 }
12038
12039 // Call the target to set up the argument values.
12041 SDValue NewRoot = TLI->LowerFormalArguments(
12042 DAG.getRoot(), F.getCallingConv(), F.isVarArg(), Ins, dl, DAG, InVals);
12043
12044 // Verify that the target's LowerFormalArguments behaved as expected.
12045 assert(NewRoot.getNode() && NewRoot.getValueType() == MVT::Other &&
12046 "LowerFormalArguments didn't return a valid chain!");
12047 assert(InVals.size() == Ins.size() &&
12048 "LowerFormalArguments didn't emit the correct number of values!");
12049 LLVM_DEBUG({
12050 for (unsigned i = 0, e = Ins.size(); i != e; ++i) {
12051 assert(InVals[i].getNode() &&
12052 "LowerFormalArguments emitted a null value!");
12053 assert(EVT(Ins[i].VT) == InVals[i].getValueType() &&
12054 "LowerFormalArguments emitted a value with the wrong type!");
12055 }
12056 });
12057
12058 // Update the DAG with the new chain value resulting from argument lowering.
12059 DAG.setRoot(NewRoot);
12060
12061 // Set up the argument values.
12062 unsigned i = 0;
12063 if (!FuncInfo->CanLowerReturn) {
12064 // Create a virtual register for the sret pointer, and put in a copy
12065 // from the sret argument into it.
12066 MVT VT = TLI->getPointerTy(DL, DL.getAllocaAddrSpace());
12067 MVT RegVT = TLI->getRegisterType(*CurDAG->getContext(), VT);
12068 std::optional<ISD::NodeType> AssertOp;
12069 SDValue ArgValue =
12070 getCopyFromParts(DAG, dl, &InVals[0], 1, RegVT, VT, nullptr, NewRoot,
12071 F.getCallingConv(), AssertOp);
12072
12073 MachineFunction& MF = SDB->DAG.getMachineFunction();
12074 MachineRegisterInfo& RegInfo = MF.getRegInfo();
12075 Register SRetReg =
12076 RegInfo.createVirtualRegister(TLI->getRegClassFor(RegVT));
12077 FuncInfo->DemoteRegister = SRetReg;
12078 NewRoot =
12079 SDB->DAG.getCopyToReg(NewRoot, SDB->getCurSDLoc(), SRetReg, ArgValue);
12080 DAG.setRoot(NewRoot);
12081
12082 // i indexes lowered arguments. Bump it past the hidden sret argument.
12083 ++i;
12084 }
12085
12087 DenseMap<int, int> ArgCopyElisionFrameIndexMap;
12088 for (const Argument &Arg : F.args()) {
12089 SmallVector<SDValue, 4> ArgValues;
12090 SmallVector<EVT, 4> ValueVTs;
12091 ComputeValueVTs(*TLI, DAG.getDataLayout(), Arg.getType(), ValueVTs);
12092 unsigned NumValues = ValueVTs.size();
12093 if (NumValues == 0)
12094 continue;
12095
12096 bool ArgHasUses = !Arg.use_empty();
12097
12098 // Elide the copying store if the target loaded this argument from a
12099 // suitable fixed stack object.
12100 if (Ins[i].Flags.isCopyElisionCandidate()) {
12101 unsigned NumParts = 0;
12102 for (EVT VT : ValueVTs)
12103 NumParts += TLI->getNumRegistersForCallingConv(*CurDAG->getContext(),
12104 F.getCallingConv(), VT);
12105
12106 tryToElideArgumentCopy(*FuncInfo, Chains, ArgCopyElisionFrameIndexMap,
12107 ElidedArgCopyInstrs, ArgCopyElisionCandidates, Arg,
12108 ArrayRef(&InVals[i], NumParts), ArgHasUses);
12109 }
12110
12111 // If this argument is unused then remember its value. It is used to generate
12112 // debugging information.
12113 bool isSwiftErrorArg =
12114 TLI->supportSwiftError() &&
12115 Arg.hasAttribute(Attribute::SwiftError);
12116 if (!ArgHasUses && !isSwiftErrorArg) {
12117 SDB->setUnusedArgValue(&Arg, InVals[i]);
12118
12119 // Also remember any frame index for use in FastISel.
12120 if (FrameIndexSDNode *FI =
12122 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12123 }
12124
12125 for (unsigned Val = 0; Val != NumValues; ++Val) {
12126 EVT VT = ValueVTs[Val];
12127 MVT PartVT = TLI->getRegisterTypeForCallingConv(*CurDAG->getContext(),
12128 F.getCallingConv(), VT);
12129 unsigned NumParts = TLI->getNumRegistersForCallingConv(
12130 *CurDAG->getContext(), F.getCallingConv(), VT);
12131
12132 // Even an apparent 'unused' swifterror argument needs to be returned. So
12133 // we do generate a copy for it that can be used on return from the
12134 // function.
12135 if (ArgHasUses || isSwiftErrorArg) {
12136 std::optional<ISD::NodeType> AssertOp;
12137 if (Arg.hasAttribute(Attribute::SExt))
12138 AssertOp = ISD::AssertSext;
12139 else if (Arg.hasAttribute(Attribute::ZExt))
12140 AssertOp = ISD::AssertZext;
12141
12142 SDValue OutVal =
12143 getCopyFromParts(DAG, dl, &InVals[i], NumParts, PartVT, VT, nullptr,
12144 NewRoot, F.getCallingConv(), AssertOp);
12145
12146 FPClassTest NoFPClass = Arg.getNoFPClass();
12147 if (NoFPClass != fcNone) {
12148 SDValue SDNoFPClass = DAG.getTargetConstant(
12149 static_cast<uint64_t>(NoFPClass), dl, MVT::i32);
12150 OutVal = DAG.getNode(ISD::AssertNoFPClass, dl, OutVal.getValueType(),
12151 OutVal, SDNoFPClass);
12152 }
12153 ArgValues.push_back(OutVal);
12154 }
12155
12156 i += NumParts;
12157 }
12158
12159 // We don't need to do anything else for unused arguments.
12160 if (ArgValues.empty())
12161 continue;
12162
12163 // Note down frame index.
12164 if (FrameIndexSDNode *FI =
12165 dyn_cast<FrameIndexSDNode>(ArgValues[0].getNode()))
12166 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12167
12168 SDValue Res = DAG.getMergeValues(ArrayRef(ArgValues.data(), NumValues),
12169 SDB->getCurSDLoc());
12170
12171 SDB->setValue(&Arg, Res);
12172 if (!TM.Options.EnableFastISel && Res.getOpcode() == ISD::BUILD_PAIR) {
12173 // We want to associate the argument with the frame index, among
12174 // involved operands, that correspond to the lowest address. The
12175 // getCopyFromParts function, called earlier, is swapping the order of
12176 // the operands to BUILD_PAIR depending on endianness. The result of
12177 // that swapping is that the least significant bits of the argument will
12178 // be in the first operand of the BUILD_PAIR node, and the most
12179 // significant bits will be in the second operand.
12180 unsigned LowAddressOp = DAG.getDataLayout().isBigEndian() ? 1 : 0;
12181 if (LoadSDNode *LNode =
12182 dyn_cast<LoadSDNode>(Res.getOperand(LowAddressOp).getNode()))
12183 if (FrameIndexSDNode *FI =
12184 dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
12185 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12186 }
12187
12188 // Analyses past this point are naive and don't expect an assertion.
12189 if (Res.getOpcode() == ISD::AssertZext)
12190 Res = Res.getOperand(0);
12191
12192 // Update the SwiftErrorVRegDefMap.
12193 if (Res.getOpcode() == ISD::CopyFromReg && isSwiftErrorArg) {
12194 Register Reg = cast<RegisterSDNode>(Res.getOperand(1))->getReg();
12195 if (Reg.isVirtual())
12196 SwiftError->setCurrentVReg(FuncInfo->MBB, SwiftError->getFunctionArg(),
12197 Reg);
12198 }
12199
12200 // If this argument is live outside of the entry block, insert a copy from
12201 // wherever we got it to the vreg that other BB's will reference it as.
12202 if (Res.getOpcode() == ISD::CopyFromReg) {
12203 // If we can, though, try to skip creating an unnecessary vreg.
12204 // FIXME: This isn't very clean... it would be nice to make this more
12205 // general.
12206 Register Reg = cast<RegisterSDNode>(Res.getOperand(1))->getReg();
12207 if (Reg.isVirtual()) {
12208 FuncInfo->ValueMap[&Arg] = Reg;
12209 continue;
12210 }
12211 }
12212 if (!isOnlyUsedInEntryBlock(&Arg, TM.Options.EnableFastISel)) {
12213 FuncInfo->InitializeRegForValue(&Arg);
12214 SDB->CopyToExportRegsIfNeeded(&Arg);
12215 }
12216 }
12217
12218 if (!Chains.empty()) {
12219 Chains.push_back(NewRoot);
12220 NewRoot = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chains);
12221 }
12222
12223 DAG.setRoot(NewRoot);
12224
12225 assert(i == InVals.size() && "Argument register count mismatch!");
12226
12227 // If any argument copy elisions occurred and we have debug info, update the
12228 // stale frame indices used in the dbg.declare variable info table.
12229 if (!ArgCopyElisionFrameIndexMap.empty()) {
12230 for (MachineFunction::VariableDbgInfo &VI :
12231 MF->getInStackSlotVariableDbgInfo()) {
12232 auto I = ArgCopyElisionFrameIndexMap.find(VI.getStackSlot());
12233 if (I != ArgCopyElisionFrameIndexMap.end())
12234 VI.updateStackSlot(I->second);
12235 }
12236 }
12237
12238 // Finally, if the target has anything special to do, allow it to do so.
12240}
12241
12242/// Handle PHI nodes in successor blocks. Emit code into the SelectionDAG to
12243/// ensure constants are generated when needed. Remember the virtual registers
12244/// that need to be added to the Machine PHI nodes as input. We cannot just
12245/// directly add them, because expansion might result in multiple MBB's for one
12246/// BB. As such, the start of the BB might correspond to a different MBB than
12247/// the end.
12248void
12249SelectionDAGBuilder::HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) {
12250 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12251
12252 SmallPtrSet<MachineBasicBlock *, 4> SuccsHandled;
12253
12254 // Check PHI nodes in successors that expect a value to be available from this
12255 // block.
12256 for (const BasicBlock *SuccBB : successors(LLVMBB->getTerminator())) {
12257 if (!isa<PHINode>(SuccBB->begin())) continue;
12258 MachineBasicBlock *SuccMBB = FuncInfo.getMBB(SuccBB);
12259
12260 // If this terminator has multiple identical successors (common for
12261 // switches), only handle each succ once.
12262 if (!SuccsHandled.insert(SuccMBB).second)
12263 continue;
12264
12266
12267 // At this point we know that there is a 1-1 correspondence between LLVM PHI
12268 // nodes and Machine PHI nodes, but the incoming operands have not been
12269 // emitted yet.
12270 for (const PHINode &PN : SuccBB->phis()) {
12271 // Ignore dead phi's.
12272 if (PN.use_empty())
12273 continue;
12274
12275 // Skip empty types
12276 if (PN.getType()->isEmptyTy())
12277 continue;
12278
12279 Register Reg;
12280 const Value *PHIOp = PN.getIncomingValueForBlock(LLVMBB);
12281
12282 if (const auto *C = dyn_cast<Constant>(PHIOp)) {
12283 Register &RegOut = ConstantsOut[C];
12284 if (!RegOut) {
12285 RegOut = FuncInfo.CreateRegs(&PN);
12286 // We need to zero/sign extend ConstantInt phi operands to match
12287 // assumptions in FunctionLoweringInfo::ComputePHILiveOutRegInfo.
12288 ISD::NodeType ExtendType = ISD::ANY_EXTEND;
12289 if (auto *CI = dyn_cast<ConstantInt>(C))
12290 ExtendType = TLI.signExtendConstant(CI) ? ISD::SIGN_EXTEND
12292 CopyValueToVirtualRegister(C, RegOut, ExtendType);
12293 }
12294 Reg = RegOut;
12295 } else {
12297 FuncInfo.ValueMap.find(PHIOp);
12298 if (I != FuncInfo.ValueMap.end())
12299 Reg = I->second;
12300 else {
12301 assert(isa<AllocaInst>(PHIOp) &&
12302 FuncInfo.StaticAllocaMap.count(cast<AllocaInst>(PHIOp)) &&
12303 "Didn't codegen value into a register!??");
12304 Reg = FuncInfo.CreateRegs(&PN);
12306 }
12307 }
12308
12309 // Remember that this register needs to added to the machine PHI node as
12310 // the input for this MBB.
12311 SmallVector<EVT, 4> ValueVTs;
12312 ComputeValueVTs(TLI, DAG.getDataLayout(), PN.getType(), ValueVTs);
12313 for (EVT VT : ValueVTs) {
12314 const unsigned NumRegisters = TLI.getNumRegisters(*DAG.getContext(), VT);
12315 for (unsigned i = 0; i != NumRegisters; ++i)
12316 FuncInfo.PHINodesToUpdate.emplace_back(&*MBBI++, Reg + i);
12317 Reg += NumRegisters;
12318 }
12319 }
12320 }
12321
12322 ConstantsOut.clear();
12323}
12324
12325MachineBasicBlock *SelectionDAGBuilder::NextBlock(MachineBasicBlock *MBB) {
12327 if (++I == FuncInfo.MF->end())
12328 return nullptr;
12329 return &*I;
12330}
12331
12332/// During lowering new call nodes can be created (such as memset, etc.).
12333/// Those will become new roots of the current DAG, but complications arise
12334/// when they are tail calls. In such cases, the call lowering will update
12335/// the root, but the builder still needs to know that a tail call has been
12336/// lowered in order to avoid generating an additional return.
12337void SelectionDAGBuilder::updateDAGForMaybeTailCall(SDValue MaybeTC) {
12338 // If the node is null, we do have a tail call.
12339 if (MaybeTC.getNode() != nullptr)
12340 DAG.setRoot(MaybeTC);
12341 else
12342 HasTailCall = true;
12343}
12344
12345void SelectionDAGBuilder::lowerWorkItem(SwitchWorkListItem W, Value *Cond,
12346 MachineBasicBlock *SwitchMBB,
12347 MachineBasicBlock *DefaultMBB) {
12348 MachineFunction *CurMF = FuncInfo.MF;
12349 MachineBasicBlock *NextMBB = nullptr;
12351 if (++BBI != FuncInfo.MF->end())
12352 NextMBB = &*BBI;
12353
12354 unsigned Size = W.LastCluster - W.FirstCluster + 1;
12355
12356 BranchProbabilityInfo *BPI = FuncInfo.BPI;
12357
12358 if (Size == 2 && W.MBB == SwitchMBB) {
12359 // If any two of the cases has the same destination, and if one value
12360 // is the same as the other, but has one bit unset that the other has set,
12361 // use bit manipulation to do two compares at once. For example:
12362 // "if (X == 6 || X == 4)" -> "if ((X|2) == 6)"
12363 // TODO: This could be extended to merge any 2 cases in switches with 3
12364 // cases.
12365 // TODO: Handle cases where W.CaseBB != SwitchBB.
12366 CaseCluster &Small = *W.FirstCluster;
12367 CaseCluster &Big = *W.LastCluster;
12368
12369 if (Small.Low == Small.High && Big.Low == Big.High &&
12370 Small.MBB == Big.MBB) {
12371 const APInt &SmallValue = Small.Low->getValue();
12372 const APInt &BigValue = Big.Low->getValue();
12373
12374 // Check that there is only one bit different.
12375 APInt CommonBit = BigValue ^ SmallValue;
12376 if (CommonBit.isPowerOf2()) {
12377 SDValue CondLHS = getValue(Cond);
12378 EVT VT = CondLHS.getValueType();
12379 SDLoc DL = getCurSDLoc();
12380
12381 SDValue Or = DAG.getNode(ISD::OR, DL, VT, CondLHS,
12382 DAG.getConstant(CommonBit, DL, VT));
12383 SDValue Cond = DAG.getSetCC(
12384 DL, MVT::i1, Or, DAG.getConstant(BigValue | SmallValue, DL, VT),
12385 ISD::SETEQ);
12386
12387 // Update successor info.
12388 // Both Small and Big will jump to Small.BB, so we sum up the
12389 // probabilities.
12390 addSuccessorWithProb(SwitchMBB, Small.MBB, Small.Prob + Big.Prob);
12391 if (BPI)
12392 addSuccessorWithProb(
12393 SwitchMBB, DefaultMBB,
12394 // The default destination is the first successor in IR.
12395 BPI->getEdgeProbability(SwitchMBB->getBasicBlock(), (unsigned)0));
12396 else
12397 addSuccessorWithProb(SwitchMBB, DefaultMBB);
12398
12399 // Insert the true branch.
12400 SDValue BrCond =
12401 DAG.getNode(ISD::BRCOND, DL, MVT::Other, getControlRoot(), Cond,
12402 DAG.getBasicBlock(Small.MBB));
12403 // Insert the false branch.
12404 BrCond = DAG.getNode(ISD::BR, DL, MVT::Other, BrCond,
12405 DAG.getBasicBlock(DefaultMBB));
12406
12407 DAG.setRoot(BrCond);
12408 return;
12409 }
12410 }
12411 }
12412
12413 if (TM.getOptLevel() != CodeGenOptLevel::None) {
12414 // Here, we order cases by probability so the most likely case will be
12415 // checked first. However, two clusters can have the same probability in
12416 // which case their relative ordering is non-deterministic. So we use Low
12417 // as a tie-breaker as clusters are guaranteed to never overlap.
12418 llvm::sort(W.FirstCluster, W.LastCluster + 1,
12419 [](const CaseCluster &a, const CaseCluster &b) {
12420 return a.Prob != b.Prob ?
12421 a.Prob > b.Prob :
12422 a.Low->getValue().slt(b.Low->getValue());
12423 });
12424
12425 // Rearrange the case blocks so that the last one falls through if possible
12426 // without changing the order of probabilities.
12427 for (CaseClusterIt I = W.LastCluster; I > W.FirstCluster; ) {
12428 --I;
12429 if (I->Prob > W.LastCluster->Prob)
12430 break;
12431 if (I->Kind == CC_Range && I->MBB == NextMBB) {
12432 std::swap(*I, *W.LastCluster);
12433 break;
12434 }
12435 }
12436 }
12437
12438 // Compute total probability.
12439 BranchProbability DefaultProb = W.DefaultProb;
12440 BranchProbability UnhandledProbs = DefaultProb;
12441 for (CaseClusterIt I = W.FirstCluster; I <= W.LastCluster; ++I)
12442 UnhandledProbs += I->Prob;
12443
12444 MachineBasicBlock *CurMBB = W.MBB;
12445 for (CaseClusterIt I = W.FirstCluster, E = W.LastCluster; I <= E; ++I) {
12446 bool FallthroughUnreachable = false;
12447 MachineBasicBlock *Fallthrough;
12448 if (I == W.LastCluster) {
12449 // For the last cluster, fall through to the default destination.
12450 Fallthrough = DefaultMBB;
12451 FallthroughUnreachable = isa<UnreachableInst>(
12452 DefaultMBB->getBasicBlock()->getFirstNonPHIOrDbg());
12453 } else {
12454 Fallthrough = CurMF->CreateMachineBasicBlock(CurMBB->getBasicBlock());
12455 CurMF->insert(BBI, Fallthrough);
12456 // Put Cond in a virtual register to make it available from the new blocks.
12458 }
12459 UnhandledProbs -= I->Prob;
12460
12461 switch (I->Kind) {
12462 case CC_JumpTable: {
12463 // FIXME: Optimize away range check based on pivot comparisons.
12464 JumpTableHeader *JTH = &SL->JTCases[I->JTCasesIndex].first;
12465 SwitchCG::JumpTable *JT = &SL->JTCases[I->JTCasesIndex].second;
12466
12467 // The jump block hasn't been inserted yet; insert it here.
12468 MachineBasicBlock *JumpMBB = JT->MBB;
12469 CurMF->insert(BBI, JumpMBB);
12470
12471 auto JumpProb = I->Prob;
12472 auto FallthroughProb = UnhandledProbs;
12473
12474 // If the default statement is a target of the jump table, we evenly
12475 // distribute the default probability to successors of CurMBB. Also
12476 // update the probability on the edge from JumpMBB to Fallthrough.
12477 for (MachineBasicBlock::succ_iterator SI = JumpMBB->succ_begin(),
12478 SE = JumpMBB->succ_end();
12479 SI != SE; ++SI) {
12480 if (*SI == DefaultMBB) {
12481 JumpProb += DefaultProb / 2;
12482 FallthroughProb -= DefaultProb / 2;
12483 JumpMBB->setSuccProbability(SI, DefaultProb / 2);
12484 JumpMBB->normalizeSuccProbs();
12485 break;
12486 }
12487 }
12488
12489 // If the default clause is unreachable, propagate that knowledge into
12490 // JTH->FallthroughUnreachable which will use it to suppress the range
12491 // check.
12492 //
12493 // However, don't do this if we're doing branch target enforcement,
12494 // because a table branch _without_ a range check can be a tempting JOP
12495 // gadget - out-of-bounds inputs that are impossible in correct
12496 // execution become possible again if an attacker can influence the
12497 // control flow. So if an attacker doesn't already have a BTI bypass
12498 // available, we don't want them to be able to get one out of this
12499 // table branch.
12500 if (FallthroughUnreachable) {
12501 Function &CurFunc = CurMF->getFunction();
12502 if (!CurFunc.hasFnAttribute("branch-target-enforcement"))
12503 JTH->FallthroughUnreachable = true;
12504 }
12505
12506 if (!JTH->FallthroughUnreachable)
12507 addSuccessorWithProb(CurMBB, Fallthrough, FallthroughProb);
12508 addSuccessorWithProb(CurMBB, JumpMBB, JumpProb);
12509 CurMBB->normalizeSuccProbs();
12510
12511 // The jump table header will be inserted in our current block, do the
12512 // range check, and fall through to our fallthrough block.
12513 JTH->HeaderBB = CurMBB;
12514 JT->Default = Fallthrough; // FIXME: Move Default to JumpTableHeader.
12515
12516 // If we're in the right place, emit the jump table header right now.
12517 if (CurMBB == SwitchMBB) {
12518 visitJumpTableHeader(*JT, *JTH, SwitchMBB);
12519 JTH->Emitted = true;
12520 }
12521 break;
12522 }
12523 case CC_BitTests: {
12524 // FIXME: Optimize away range check based on pivot comparisons.
12525 BitTestBlock *BTB = &SL->BitTestCases[I->BTCasesIndex];
12526
12527 // The bit test blocks haven't been inserted yet; insert them here.
12528 for (BitTestCase &BTC : BTB->Cases)
12529 CurMF->insert(BBI, BTC.ThisBB);
12530
12531 // Fill in fields of the BitTestBlock.
12532 BTB->Parent = CurMBB;
12533 BTB->Default = Fallthrough;
12534
12535 BTB->DefaultProb = UnhandledProbs;
12536 // If the cases in bit test don't form a contiguous range, we evenly
12537 // distribute the probability on the edge to Fallthrough to two
12538 // successors of CurMBB.
12539 if (!BTB->ContiguousRange) {
12540 BTB->Prob += DefaultProb / 2;
12541 BTB->DefaultProb -= DefaultProb / 2;
12542 }
12543
12544 if (FallthroughUnreachable)
12545 BTB->FallthroughUnreachable = true;
12546
12547 // If we're in the right place, emit the bit test header right now.
12548 if (CurMBB == SwitchMBB) {
12549 visitBitTestHeader(*BTB, SwitchMBB);
12550 BTB->Emitted = true;
12551 }
12552 break;
12553 }
12554 case CC_Range: {
12555 const Value *RHS, *LHS, *MHS;
12556 ISD::CondCode CC;
12557 if (I->Low == I->High) {
12558 // Check Cond == I->Low.
12559 CC = ISD::SETEQ;
12560 LHS = Cond;
12561 RHS=I->Low;
12562 MHS = nullptr;
12563 } else {
12564 // Check I->Low <= Cond <= I->High.
12565 CC = ISD::SETLE;
12566 LHS = I->Low;
12567 MHS = Cond;
12568 RHS = I->High;
12569 }
12570
12571 // If Fallthrough is unreachable, fold away the comparison.
12572 if (FallthroughUnreachable)
12573 CC = ISD::SETTRUE;
12574
12575 // The false probability is the sum of all unhandled cases.
12576 CaseBlock CB(CC, LHS, RHS, MHS, I->MBB, Fallthrough, CurMBB,
12577 getCurSDLoc(), I->Prob, UnhandledProbs);
12578
12579 if (CurMBB == SwitchMBB)
12580 visitSwitchCase(CB, SwitchMBB);
12581 else
12582 SL->SwitchCases.push_back(CB);
12583
12584 break;
12585 }
12586 }
12587 CurMBB = Fallthrough;
12588 }
12589}
12590
12591void SelectionDAGBuilder::splitWorkItem(SwitchWorkList &WorkList,
12592 const SwitchWorkListItem &W,
12593 Value *Cond,
12594 MachineBasicBlock *SwitchMBB) {
12595 assert(W.FirstCluster->Low->getValue().slt(W.LastCluster->Low->getValue()) &&
12596 "Clusters not sorted?");
12597 assert(W.LastCluster - W.FirstCluster + 1 >= 2 && "Too small to split!");
12598
12599 auto [LastLeft, FirstRight, LeftProb, RightProb] =
12600 SL->computeSplitWorkItemInfo(W);
12601
12602 // Use the first element on the right as pivot since we will make less-than
12603 // comparisons against it.
12604 CaseClusterIt PivotCluster = FirstRight;
12605 assert(PivotCluster > W.FirstCluster);
12606 assert(PivotCluster <= W.LastCluster);
12607
12608 CaseClusterIt FirstLeft = W.FirstCluster;
12609 CaseClusterIt LastRight = W.LastCluster;
12610
12611 const ConstantInt *Pivot = PivotCluster->Low;
12612
12613 // New blocks will be inserted immediately after the current one.
12615 ++BBI;
12616
12617 // We will branch to the LHS if Value < Pivot. If LHS is a single cluster,
12618 // we can branch to its destination directly if it's squeezed exactly in
12619 // between the known lower bound and Pivot - 1.
12620 MachineBasicBlock *LeftMBB;
12621 if (FirstLeft == LastLeft && FirstLeft->Kind == CC_Range &&
12622 FirstLeft->Low == W.GE &&
12623 (FirstLeft->High->getValue() + 1LL) == Pivot->getValue()) {
12624 LeftMBB = FirstLeft->MBB;
12625 } else {
12626 LeftMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
12627 FuncInfo.MF->insert(BBI, LeftMBB);
12628 WorkList.push_back(
12629 {LeftMBB, FirstLeft, LastLeft, W.GE, Pivot, W.DefaultProb / 2});
12630 // Put Cond in a virtual register to make it available from the new blocks.
12632 }
12633
12634 // Similarly, we will branch to the RHS if Value >= Pivot. If RHS is a
12635 // single cluster, RHS.Low == Pivot, and we can branch to its destination
12636 // directly if RHS.High equals the current upper bound.
12637 MachineBasicBlock *RightMBB;
12638 if (FirstRight == LastRight && FirstRight->Kind == CC_Range &&
12639 W.LT && (FirstRight->High->getValue() + 1ULL) == W.LT->getValue()) {
12640 RightMBB = FirstRight->MBB;
12641 } else {
12642 RightMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
12643 FuncInfo.MF->insert(BBI, RightMBB);
12644 WorkList.push_back(
12645 {RightMBB, FirstRight, LastRight, Pivot, W.LT, W.DefaultProb / 2});
12646 // Put Cond in a virtual register to make it available from the new blocks.
12648 }
12649
12650 // Create the CaseBlock record that will be used to lower the branch.
12651 CaseBlock CB(ISD::SETLT, Cond, Pivot, nullptr, LeftMBB, RightMBB, W.MBB,
12652 getCurSDLoc(), LeftProb, RightProb);
12653
12654 if (W.MBB == SwitchMBB)
12655 visitSwitchCase(CB, SwitchMBB);
12656 else
12657 SL->SwitchCases.push_back(CB);
12658}
12659
12660// Scale CaseProb after peeling a case with the probablity of PeeledCaseProb
12661// from the swith statement.
12663 BranchProbability PeeledCaseProb) {
12664 if (PeeledCaseProb == BranchProbability::getOne())
12666 BranchProbability SwitchProb = PeeledCaseProb.getCompl();
12667
12668 uint32_t Numerator = CaseProb.getNumerator();
12669 uint32_t Denominator = SwitchProb.scale(CaseProb.getDenominator());
12670 return BranchProbability(Numerator, std::max(Numerator, Denominator));
12671}
12672
12673// Try to peel the top probability case if it exceeds the threshold.
12674// Return current MachineBasicBlock for the switch statement if the peeling
12675// does not occur.
12676// If the peeling is performed, return the newly created MachineBasicBlock
12677// for the peeled switch statement. Also update Clusters to remove the peeled
12678// case. PeeledCaseProb is the BranchProbability for the peeled case.
12679MachineBasicBlock *SelectionDAGBuilder::peelDominantCaseCluster(
12680 const SwitchInst &SI, CaseClusterVector &Clusters,
12681 BranchProbability &PeeledCaseProb) {
12682 MachineBasicBlock *SwitchMBB = FuncInfo.MBB;
12683 // Don't perform if there is only one cluster or optimizing for size.
12684 if (SwitchPeelThreshold > 100 || !FuncInfo.BPI || Clusters.size() < 2 ||
12685 TM.getOptLevel() == CodeGenOptLevel::None ||
12686 SwitchMBB->getParent()->getFunction().hasMinSize())
12687 return SwitchMBB;
12688
12689 BranchProbability TopCaseProb = BranchProbability(SwitchPeelThreshold, 100);
12690 unsigned PeeledCaseIndex = 0;
12691 bool SwitchPeeled = false;
12692 for (unsigned Index = 0; Index < Clusters.size(); ++Index) {
12693 CaseCluster &CC = Clusters[Index];
12694 if (CC.Prob < TopCaseProb)
12695 continue;
12696 TopCaseProb = CC.Prob;
12697 PeeledCaseIndex = Index;
12698 SwitchPeeled = true;
12699 }
12700 if (!SwitchPeeled)
12701 return SwitchMBB;
12702
12703 LLVM_DEBUG(dbgs() << "Peeled one top case in switch stmt, prob: "
12704 << TopCaseProb << "\n");
12705
12706 // Record the MBB for the peeled switch statement.
12707 MachineFunction::iterator BBI(SwitchMBB);
12708 ++BBI;
12709 MachineBasicBlock *PeeledSwitchMBB =
12710 FuncInfo.MF->CreateMachineBasicBlock(SwitchMBB->getBasicBlock());
12711 FuncInfo.MF->insert(BBI, PeeledSwitchMBB);
12712
12713 ExportFromCurrentBlock(SI.getCondition());
12714 auto PeeledCaseIt = Clusters.begin() + PeeledCaseIndex;
12715 SwitchWorkListItem W = {SwitchMBB, PeeledCaseIt, PeeledCaseIt,
12716 nullptr, nullptr, TopCaseProb.getCompl()};
12717 lowerWorkItem(W, SI.getCondition(), SwitchMBB, PeeledSwitchMBB);
12718
12719 Clusters.erase(PeeledCaseIt);
12720 for (CaseCluster &CC : Clusters) {
12721 LLVM_DEBUG(
12722 dbgs() << "Scale the probablity for one cluster, before scaling: "
12723 << CC.Prob << "\n");
12724 CC.Prob = scaleCaseProbality(CC.Prob, TopCaseProb);
12725 LLVM_DEBUG(dbgs() << "After scaling: " << CC.Prob << "\n");
12726 }
12727 PeeledCaseProb = TopCaseProb;
12728 return PeeledSwitchMBB;
12729}
12730
12731void SelectionDAGBuilder::visitSwitch(const SwitchInst &SI) {
12732 // Extract cases from the switch.
12733 BranchProbabilityInfo *BPI = FuncInfo.BPI;
12734 CaseClusterVector Clusters;
12735 Clusters.reserve(SI.getNumCases());
12736 for (auto I : SI.cases()) {
12737 MachineBasicBlock *Succ = FuncInfo.getMBB(I.getCaseSuccessor());
12738 const ConstantInt *CaseVal = I.getCaseValue();
12739 BranchProbability Prob =
12740 BPI ? BPI->getEdgeProbability(SI.getParent(), I.getSuccessorIndex())
12741 : BranchProbability(1, SI.getNumCases() + 1);
12742 Clusters.push_back(CaseCluster::range(CaseVal, CaseVal, Succ, Prob));
12743 }
12744
12745 MachineBasicBlock *DefaultMBB = FuncInfo.getMBB(SI.getDefaultDest());
12746
12747 // Cluster adjacent cases with the same destination. We do this at all
12748 // optimization levels because it's cheap to do and will make codegen faster
12749 // if there are many clusters.
12750 sortAndRangeify(Clusters);
12751
12752 // The branch probablity of the peeled case.
12753 BranchProbability PeeledCaseProb = BranchProbability::getZero();
12754 MachineBasicBlock *PeeledSwitchMBB =
12755 peelDominantCaseCluster(SI, Clusters, PeeledCaseProb);
12756
12757 // If there is only the default destination, jump there directly.
12758 MachineBasicBlock *SwitchMBB = FuncInfo.MBB;
12759 if (Clusters.empty()) {
12760 assert(PeeledSwitchMBB == SwitchMBB);
12761 SwitchMBB->addSuccessor(DefaultMBB);
12762 if (DefaultMBB != NextBlock(SwitchMBB)) {
12763 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
12764 getControlRoot(), DAG.getBasicBlock(DefaultMBB)));
12765 }
12766 return;
12767 }
12768
12769 SL->findJumpTables(Clusters, &SI, getCurSDLoc(), DefaultMBB, DAG.getPSI(),
12770 DAG.getBFI());
12771 SL->findBitTestClusters(Clusters, &SI);
12772
12773 LLVM_DEBUG({
12774 dbgs() << "Case clusters: ";
12775 for (const CaseCluster &C : Clusters) {
12776 if (C.Kind == CC_JumpTable)
12777 dbgs() << "JT:";
12778 if (C.Kind == CC_BitTests)
12779 dbgs() << "BT:";
12780
12781 C.Low->getValue().print(dbgs(), true);
12782 if (C.Low != C.High) {
12783 dbgs() << '-';
12784 C.High->getValue().print(dbgs(), true);
12785 }
12786 dbgs() << ' ';
12787 }
12788 dbgs() << '\n';
12789 });
12790
12791 assert(!Clusters.empty());
12792 SwitchWorkList WorkList;
12793 CaseClusterIt First = Clusters.begin();
12794 CaseClusterIt Last = Clusters.end() - 1;
12795 auto DefaultProb = getEdgeProbability(PeeledSwitchMBB, DefaultMBB);
12796 // Scale the branchprobability for DefaultMBB if the peel occurs and
12797 // DefaultMBB is not replaced.
12798 if (PeeledCaseProb != BranchProbability::getZero() &&
12799 DefaultMBB == FuncInfo.getMBB(SI.getDefaultDest()))
12800 DefaultProb = scaleCaseProbality(DefaultProb, PeeledCaseProb);
12801 WorkList.push_back(
12802 {PeeledSwitchMBB, First, Last, nullptr, nullptr, DefaultProb});
12803
12804 while (!WorkList.empty()) {
12805 SwitchWorkListItem W = WorkList.pop_back_val();
12806 unsigned NumClusters = W.LastCluster - W.FirstCluster + 1;
12807
12808 if (NumClusters > 3 && TM.getOptLevel() != CodeGenOptLevel::None &&
12809 !DefaultMBB->getParent()->getFunction().hasMinSize()) {
12810 // For optimized builds, lower large range as a balanced binary tree.
12811 splitWorkItem(WorkList, W, SI.getCondition(), SwitchMBB);
12812 continue;
12813 }
12814
12815 lowerWorkItem(W, SI.getCondition(), SwitchMBB, DefaultMBB);
12816 }
12817}
12818
12819void SelectionDAGBuilder::visitStepVector(const CallInst &I) {
12820 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12821 auto DL = getCurSDLoc();
12822 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12823 setValue(&I, DAG.getStepVector(DL, ResultVT));
12824}
12825
12826void SelectionDAGBuilder::visitVectorReverse(const CallInst &I) {
12827 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12828 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12829
12830 SDLoc DL = getCurSDLoc();
12831 SDValue V = getValue(I.getOperand(0));
12832 assert(VT == V.getValueType() && "Malformed vector.reverse!");
12833
12834 if (VT.isScalableVector()) {
12835 setValue(&I, DAG.getNode(ISD::VECTOR_REVERSE, DL, VT, V));
12836 return;
12837 }
12838
12839 // Use VECTOR_SHUFFLE for the fixed-length vector
12840 // to maintain existing behavior.
12841 SmallVector<int, 8> Mask;
12842 unsigned NumElts = VT.getVectorMinNumElements();
12843 for (unsigned i = 0; i != NumElts; ++i)
12844 Mask.push_back(NumElts - 1 - i);
12845
12846 setValue(&I, DAG.getVectorShuffle(VT, DL, V, DAG.getUNDEF(VT), Mask));
12847}
12848
12849void SelectionDAGBuilder::visitVectorDeinterleave(const CallInst &I,
12850 unsigned Factor) {
12851 auto DL = getCurSDLoc();
12852 SDValue InVec = getValue(I.getOperand(0));
12853
12854 SmallVector<EVT, 4> ValueVTs;
12855 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
12856 ValueVTs);
12857
12858 EVT OutVT = ValueVTs[0];
12859 unsigned OutNumElts = OutVT.getVectorMinNumElements();
12860
12861 SmallVector<SDValue, 4> SubVecs(Factor);
12862 for (unsigned i = 0; i != Factor; ++i) {
12863 assert(ValueVTs[i] == OutVT && "Expected VTs to be the same");
12864 SubVecs[i] = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, OutVT, InVec,
12865 DAG.getVectorIdxConstant(OutNumElts * i, DL));
12866 }
12867
12868 // Use VECTOR_SHUFFLE for fixed-length vectors with factor of 2 to benefit
12869 // from existing legalisation and combines.
12870 if (OutVT.isFixedLengthVector() && Factor == 2) {
12871 SDValue Even = DAG.getVectorShuffle(OutVT, DL, SubVecs[0], SubVecs[1],
12872 createStrideMask(0, 2, OutNumElts));
12873 SDValue Odd = DAG.getVectorShuffle(OutVT, DL, SubVecs[0], SubVecs[1],
12874 createStrideMask(1, 2, OutNumElts));
12875 SDValue Res = DAG.getMergeValues({Even, Odd}, getCurSDLoc());
12876 setValue(&I, Res);
12877 return;
12878 }
12879
12880 SDValue Res = DAG.getNode(ISD::VECTOR_DEINTERLEAVE, DL,
12881 DAG.getVTList(ValueVTs), SubVecs);
12882 setValue(&I, Res);
12883}
12884
12885void SelectionDAGBuilder::visitVectorInterleave(const CallInst &I,
12886 unsigned Factor) {
12887 auto DL = getCurSDLoc();
12888 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12889 EVT InVT = getValue(I.getOperand(0)).getValueType();
12890 EVT OutVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12891
12892 SmallVector<SDValue, 8> InVecs(Factor);
12893 for (unsigned i = 0; i < Factor; ++i) {
12894 InVecs[i] = getValue(I.getOperand(i));
12895 assert(InVecs[i].getValueType() == InVecs[0].getValueType() &&
12896 "Expected VTs to be the same");
12897 }
12898
12899 // Use VECTOR_SHUFFLE for fixed-length vectors with factor of 2 to benefit
12900 // from existing legalisation and combines.
12901 if (OutVT.isFixedLengthVector() && Factor == 2) {
12902 unsigned NumElts = InVT.getVectorMinNumElements();
12903 SDValue V = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, InVecs);
12904 setValue(&I, DAG.getVectorShuffle(OutVT, DL, V, DAG.getUNDEF(OutVT),
12905 createInterleaveMask(NumElts, 2)));
12906 return;
12907 }
12908
12909 SmallVector<EVT, 8> ValueVTs(Factor, InVT);
12910 SDValue Res =
12911 DAG.getNode(ISD::VECTOR_INTERLEAVE, DL, DAG.getVTList(ValueVTs), InVecs);
12912
12914 for (unsigned i = 0; i < Factor; ++i)
12915 Results[i] = Res.getValue(i);
12916
12917 Res = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, Results);
12918 setValue(&I, Res);
12919}
12920
12921void SelectionDAGBuilder::visitFreeze(const FreezeInst &I) {
12922 SmallVector<EVT, 4> ValueVTs;
12923 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
12924 ValueVTs);
12925 unsigned NumValues = ValueVTs.size();
12926 if (NumValues == 0) return;
12927
12928 SmallVector<SDValue, 4> Values(NumValues);
12929 SDValue Op = getValue(I.getOperand(0));
12930
12931 for (unsigned i = 0; i != NumValues; ++i)
12932 Values[i] = DAG.getNode(ISD::FREEZE, getCurSDLoc(), ValueVTs[i],
12933 SDValue(Op.getNode(), Op.getResNo() + i));
12934
12936 DAG.getVTList(ValueVTs), Values));
12937}
12938
12939void SelectionDAGBuilder::visitVectorSplice(const CallInst &I) {
12940 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12941 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12942
12943 SDLoc DL = getCurSDLoc();
12944 SDValue V1 = getValue(I.getOperand(0));
12945 SDValue V2 = getValue(I.getOperand(1));
12946 const bool IsLeft = I.getIntrinsicID() == Intrinsic::vector_splice_left;
12947
12948 // VECTOR_SHUFFLE doesn't support a scalable or non-constant mask.
12949 if (VT.isScalableVector() || !isa<ConstantInt>(I.getOperand(2))) {
12950 SDValue Offset = DAG.getZExtOrTrunc(
12951 getValue(I.getOperand(2)), DL, TLI.getVectorIdxTy(DAG.getDataLayout()));
12952 setValue(&I, DAG.getNode(IsLeft ? ISD::VECTOR_SPLICE_LEFT
12954 DL, VT, V1, V2, Offset));
12955 return;
12956 }
12957 uint64_t Imm = cast<ConstantInt>(I.getOperand(2))->getZExtValue();
12958
12959 unsigned NumElts = VT.getVectorNumElements();
12960
12961 uint64_t Idx = IsLeft ? Imm : NumElts - Imm;
12962
12963 // Use VECTOR_SHUFFLE to maintain original behaviour for fixed-length vectors.
12964 SmallVector<int, 8> Mask;
12965 for (unsigned i = 0; i < NumElts; ++i)
12966 Mask.push_back(Idx + i);
12967 setValue(&I, DAG.getVectorShuffle(VT, DL, V1, V2, Mask));
12968}
12969
12970// Consider the following MIR after SelectionDAG, which produces output in
12971// phyregs in the first case or virtregs in the second case.
12972//
12973// INLINEASM_BR ..., implicit-def $ebx, ..., implicit-def $edx
12974// %5:gr32 = COPY $ebx
12975// %6:gr32 = COPY $edx
12976// %1:gr32 = COPY %6:gr32
12977// %0:gr32 = COPY %5:gr32
12978//
12979// INLINEASM_BR ..., def %5:gr32, ..., def %6:gr32
12980// %1:gr32 = COPY %6:gr32
12981// %0:gr32 = COPY %5:gr32
12982//
12983// Given %0, we'd like to return $ebx in the first case and %5 in the second.
12984// Given %1, we'd like to return $edx in the first case and %6 in the second.
12985//
12986// If a callbr has outputs, it will have a single mapping in FuncInfo.ValueMap
12987// to a single virtreg (such as %0). The remaining outputs monotonically
12988// increase in virtreg number from there. If a callbr has no outputs, then it
12989// should not have a corresponding callbr landingpad; in fact, the callbr
12990// landingpad would not even be able to refer to such a callbr.
12993 // There is definitely at least one copy.
12994 assert(MI->getOpcode() == TargetOpcode::COPY &&
12995 "start of copy chain MUST be COPY");
12996 Reg = MI->getOperand(1).getReg();
12997
12998 // If the copied register in the first copy must be virtual.
12999 assert(Reg.isVirtual() && "expected COPY of virtual register");
13000 MI = MRI.def_begin(Reg)->getParent();
13001
13002 // There may be an optional second copy.
13003 if (MI->getOpcode() == TargetOpcode::COPY) {
13004 assert(Reg.isVirtual() && "expected COPY of virtual register");
13005 Reg = MI->getOperand(1).getReg();
13006 assert(Reg.isPhysical() && "expected COPY of physical register");
13007 } else {
13008 // The start of the chain must be an INLINEASM_BR.
13009 assert(MI->getOpcode() == TargetOpcode::INLINEASM_BR &&
13010 "end of copy chain MUST be INLINEASM_BR");
13011 }
13012
13013 return Reg;
13014}
13015
13016// We must do this walk rather than the simpler
13017// setValue(&I, getCopyFromRegs(CBR, CBR->getType()));
13018// otherwise we will end up with copies of virtregs only valid along direct
13019// edges.
13020void SelectionDAGBuilder::visitCallBrLandingPad(const CallInst &I) {
13021 SmallVector<EVT, 8> ResultVTs;
13022 SmallVector<SDValue, 8> ResultValues;
13023 const auto *CBR =
13024 cast<CallBrInst>(I.getParent()->getUniquePredecessor()->getTerminator());
13025
13026 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
13027 const TargetRegisterInfo *TRI = DAG.getSubtarget().getRegisterInfo();
13028 MachineRegisterInfo &MRI = DAG.getMachineFunction().getRegInfo();
13029
13030 Register InitialDef = FuncInfo.ValueMap[CBR];
13031 SDValue Chain = DAG.getRoot();
13032
13033 // Re-parse the asm constraints string.
13034 TargetLowering::AsmOperandInfoVector TargetConstraints =
13035 TLI.ParseConstraints(DAG.getDataLayout(), TRI, *CBR);
13036 for (auto &T : TargetConstraints) {
13037 SDISelAsmOperandInfo OpInfo(T);
13038 if (OpInfo.Type != InlineAsm::isOutput)
13039 continue;
13040
13041 // Pencil in OpInfo.ConstraintType and OpInfo.ConstraintVT based on the
13042 // individual constraint.
13043 TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
13044
13045 switch (OpInfo.ConstraintType) {
13048 // Fill in OpInfo.AssignedRegs.Regs.
13049 getRegistersForValue(DAG, getCurSDLoc(), OpInfo, OpInfo);
13050
13051 // getRegistersForValue may produce 1 to many registers based on whether
13052 // the OpInfo.ConstraintVT is legal on the target or not.
13053 for (Register &Reg : OpInfo.AssignedRegs.Regs) {
13054 Register OriginalDef = FollowCopyChain(MRI, InitialDef++);
13055 if (OriginalDef.isPhysical())
13056 FuncInfo.MBB->addLiveIn(OriginalDef);
13057 // Update the assigned registers to use the original defs.
13058 Reg = OriginalDef;
13059 }
13060
13061 SDValue V = OpInfo.AssignedRegs.getCopyFromRegs(
13062 DAG, FuncInfo, getCurSDLoc(), Chain, nullptr, CBR);
13063 ResultValues.push_back(V);
13064 ResultVTs.push_back(OpInfo.ConstraintVT);
13065 break;
13066 }
13068 SDValue Flag;
13069 SDValue V = TLI.LowerAsmOutputForConstraint(Chain, Flag, getCurSDLoc(),
13070 OpInfo, DAG);
13071 ++InitialDef;
13072 ResultValues.push_back(V);
13073 ResultVTs.push_back(OpInfo.ConstraintVT);
13074 break;
13075 }
13076 default:
13077 break;
13078 }
13079 }
13081 DAG.getVTList(ResultVTs), ResultValues);
13082 setValue(&I, V);
13083}
return SDValue()
static unsigned getIntrinsicID(const SDNode *N)
unsigned RegSize
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static msgpack::DocNode getNode(msgpack::DocNode DN, msgpack::Type Type, MCValue Val)
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
Function Alias Analysis Results
Atomic ordering constants.
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
#define X(NUM, ENUM, NAME)
Definition ELF.h:851
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, bool LookThroughCmp=false)
Returns the "element type" of the given value/instruction V.
This file contains some templates that are useful if you are working with the STL at all.
static bool hasOnlySelectUsers(const Value *Cond)
static SDValue getLoadStackGuard(SelectionDAG &DAG, const SDLoc &DL, SDValue &Chain)
Create a LOAD_STACK_GUARD node, and let it carry the target specific global variable if there exists ...
static bool getUniformBase(const Value *Ptr, SDValue &Base, SDValue &Index, SDValue &Scale, SelectionDAGBuilder *SDB, const BasicBlock *CurBB, uint64_t ElemSize)
static void failForInvalidBundles(const CallBase &I, StringRef Name, ArrayRef< uint32_t > AllowedBundles)
static void addStackMapLiveVars(const CallBase &Call, unsigned StartIdx, const SDLoc &DL, SmallVectorImpl< SDValue > &Ops, SelectionDAGBuilder &Builder)
Add a stack map intrinsic call's live variable operands to a stackmap or patchpoint target node's ope...
static const unsigned MaxParallelChains
static SDValue expandPow(const SDLoc &dl, SDValue LHS, SDValue RHS, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
visitPow - Lower a pow intrinsic.
static const CallBase * FindPreallocatedCall(const Value *PreallocatedSetup)
Given a @llvm.call.preallocated.setup, return the corresponding preallocated call.
static cl::opt< unsigned > SwitchPeelThreshold("switch-peel-threshold", cl::Hidden, cl::init(66), cl::desc("Set the case probability threshold for peeling the case from a " "switch statement. A value greater than 100 will void this " "optimization"))
static cl::opt< bool > InsertAssertAlign("insert-assert-align", cl::init(true), cl::desc("Insert the experimental `assertalign` node."), cl::ReallyHidden)
static unsigned getISDForVPIntrinsic(const VPIntrinsic &VPIntrin)
static bool handleDanglingVariadicDebugInfo(SelectionDAG &DAG, DILocalVariable *Variable, DebugLoc DL, unsigned Order, SmallVectorImpl< Value * > &Values, DIExpression *Expression)
static unsigned findMatchingInlineAsmOperand(unsigned OperandNo, const std::vector< SDValue > &AsmNodeOperands)
static void patchMatchingInput(const SDISelAsmOperandInfo &OpInfo, SDISelAsmOperandInfo &MatchingOpInfo, SelectionDAG &DAG)
Make sure that the output operand OpInfo and its corresponding input operand MatchingOpInfo have comp...
static void findUnwindDestinations(FunctionLoweringInfo &FuncInfo, const BasicBlock *EHPadBB, BranchProbability Prob, SmallVectorImpl< std::pair< MachineBasicBlock *, BranchProbability > > &UnwindDests)
When an invoke or a cleanupret unwinds to the next EH pad, there are many places it could ultimately ...
static unsigned FixedPointIntrinsicToOpcode(unsigned Intrinsic)
static BranchProbability scaleCaseProbality(BranchProbability CaseProb, BranchProbability PeeledCaseProb)
static SDValue expandExp2(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandExp2 - Lower an exp2 intrinsic.
static SDValue expandDivFix(unsigned Opcode, const SDLoc &DL, SDValue LHS, SDValue RHS, SDValue Scale, SelectionDAG &DAG, const TargetLowering &TLI)
static SDValue getF32Constant(SelectionDAG &DAG, unsigned Flt, const SDLoc &dl)
getF32Constant - Get 32-bit floating point constant.
static SDValue widenVectorToPartType(SelectionDAG &DAG, SDValue Val, const SDLoc &DL, EVT PartVT)
static SDValue expandLog10(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandLog10 - Lower a log10 intrinsic.
DenseMap< const Argument *, std::pair< const AllocaInst *, const StoreInst * > > ArgCopyElisionMapTy
static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &dl, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, const Value *V, std::optional< CallingConv::ID > CallConv)
getCopyToPartsVector - Create a series of nodes that contain the specified value split into legal par...
static void getUnderlyingArgRegs(SmallVectorImpl< std::pair< Register, TypeSize > > &Regs, const SDValue &N)
static void getCopyToParts(SelectionDAG &DAG, const SDLoc &DL, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, const Value *V, std::optional< CallingConv::ID > CallConv=std::nullopt, ISD::NodeType ExtendKind=ISD::ANY_EXTEND)
getCopyToParts - Create a series of nodes that contain the specified value split into legal parts.
static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT, SelectionDAGBuilder &Builder)
static SDValue expandLog2(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandLog2 - Lower a log2 intrinsic.
static SDValue getAddressForMemoryInput(SDValue Chain, const SDLoc &Location, SDISelAsmOperandInfo &OpInfo, SelectionDAG &DAG)
Get a direct memory input to behave well as an indirect operand.
static bool isOnlyUsedInEntryBlock(const Argument *A, bool FastISel)
isOnlyUsedInEntryBlock - If the specified argument is only used in the entry block,...
static void diagnosePossiblyInvalidConstraint(LLVMContext &Ctx, const Value *V, const Twine &ErrMsg)
static bool collectInstructionDeps(SmallMapVector< const Instruction *, bool, 8 > *Deps, const Value *V, SmallMapVector< const Instruction *, bool, 8 > *Necessary=nullptr, unsigned Depth=0)
static void findArgumentCopyElisionCandidates(const DataLayout &DL, FunctionLoweringInfo *FuncInfo, ArgCopyElisionMapTy &ArgCopyElisionCandidates)
Scan the entry block of the function in FuncInfo for arguments that look like copies into a local all...
static bool isFunction(SDValue Op)
static SDValue GetExponent(SelectionDAG &DAG, SDValue Op, const TargetLowering &TLI, const SDLoc &dl)
GetExponent - Get the exponent:
static Register FollowCopyChain(MachineRegisterInfo &MRI, Register Reg)
static SDValue ExpandPowI(const SDLoc &DL, SDValue LHS, SDValue RHS, SelectionDAG &DAG)
ExpandPowI - Expand a llvm.powi intrinsic.
static SDValue expandLog(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandLog - Lower a log intrinsic.
static SDValue getCopyFromParts(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V, SDValue InChain, std::optional< CallingConv::ID > CC=std::nullopt, std::optional< ISD::NodeType > AssertOp=std::nullopt)
getCopyFromParts - Create a value that contains the specified legal parts combined into the value the...
static SDValue getLimitedPrecisionExp2(SDValue t0, const SDLoc &dl, SelectionDAG &DAG)
static SDValue GetSignificand(SelectionDAG &DAG, SDValue Op, const SDLoc &dl)
GetSignificand - Get the significand and build it into a floating-point number with exponent of 1:
static SDValue expandExp(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandExp - Lower an exp intrinsic.
static const MDNode * getRangeMetadata(const Instruction &I)
static cl::opt< unsigned, true > LimitFPPrecision("limit-float-precision", cl::desc("Generate low-precision inline sequences " "for some float libcalls"), cl::location(LimitFloatPrecision), cl::Hidden, cl::init(0))
static void tryToElideArgumentCopy(FunctionLoweringInfo &FuncInfo, SmallVectorImpl< SDValue > &Chains, DenseMap< int, int > &ArgCopyElisionFrameIndexMap, SmallPtrSetImpl< const Instruction * > &ElidedArgCopyInstrs, ArgCopyElisionMapTy &ArgCopyElisionCandidates, const Argument &Arg, ArrayRef< SDValue > ArgVals, bool &ArgHasUses)
Try to elide argument copies from memory into a local alloca.
static unsigned LimitFloatPrecision
LimitFloatPrecision - Generate low-precision inline sequences for some float libcalls (6,...
static SDValue getCopyFromPartsVector(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V, SDValue InChain, std::optional< CallingConv::ID > CC)
getCopyFromPartsVector - Create a value that contains the specified legal parts combined into the val...
static bool InBlock(const Value *V, const BasicBlock *BB)
static FPClassTest getNoFPClass(const Instruction &I)
static LLVM_ATTRIBUTE_ALWAYS_INLINE MVT::SimpleValueType getSimpleVT(const uint8_t *MatcherTable, size_t &MatcherIndex)
getSimpleVT - Decode a value in MatcherTable, if it's a VBR encoded value, use GetVBR to decode it.
This file defines the SmallPtrSet class.
This file contains some functions that are useful when dealing with strings.
#define LLVM_DEBUG(...)
Definition Debug.h:114
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
This pass exposes codegen information to IR-level passes.
uint16_t RegSizeInBits(const MCRegisterInfo &MRI, MCRegister RegNo)
Value * RHS
Value * LHS
static const fltSemantics & IEEEsingle()
Definition APFloat.h:296
static LLVM_ABI Semantics SemanticsToEnum(const llvm::fltSemantics &Sem)
Definition APFloat.cpp:145
static LLVM_ABI const fltSemantics * getArbitraryFPSemantics(StringRef Format)
Returns the fltSemantics for a given arbitrary FP format string, or nullptr if invalid.
Definition APFloat.cpp:5998
Class for arbitrary precision integers.
Definition APInt.h:78
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:335
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:441
an instruction to allocate memory on the stack
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
LLVM_ABI std::optional< TypeSize > getAllocationSize(const DataLayout &DL) const
Get allocation size in bytes.
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
LLVM_ABI bool hasAttribute(Attribute::AttrKind Kind) const
Check if an argument has a given attribute.
Definition Function.cpp:338
unsigned getArgNo() const
Return the index of this formal argument in its containing function.
Definition Argument.h:50
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator end() const
Definition ArrayRef.h:131
size_t size() const
size - Get the array size.
Definition ArrayRef.h:142
iterator begin() const
Definition ArrayRef.h:130
bool empty() const
empty - Check if the array is empty.
Definition ArrayRef.h:137
A cache of @llvm.assume calls within a function.
An instruction that atomically checks whether a specified value is in a memory location,...
an instruction that atomically reads a memory location, combines it with another value,...
@ Add
*p = old + v
@ FAdd
*p = old + v
@ USubCond
Subtract only if no unsigned overflow.
@ FMinimum
*p = minimum(old, v) minimum matches the behavior of llvm.minimum.
@ Min
*p = old <signed v ? old : v
@ Sub
*p = old - v
@ And
*p = old & v
@ Xor
*p = old ^ v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ FMaximum
*p = maximum(old, v) maximum matches the behavior of llvm.maximum.
@ FSub
*p = old - v
@ UIncWrap
Increment one up to a maximum value.
@ Max
*p = old >signed v ? old : v
@ UMin
*p = old <unsigned v ? old : v
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
@ UMax
*p = old >unsigned v ? old : v
@ FMaximumNum
*p = maximumnum(old, v) maximumnum matches the behavior of llvm.maximumnum.
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
@ FMinimumNum
*p = minimumnum(old, v) minimumnum matches the behavior of llvm.minimumnum.
@ Nand
*p = ~(old & v)
This class holds the attributes for a particular argument, parameter, function, or return value.
Definition Attributes.h:407
LLVM Basic Block Representation.
Definition BasicBlock.h:62
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
InstListType::const_iterator const_iterator
Definition BasicBlock.h:171
LLVM_ABI bool isEntryBlock() const
Return true if this is the entry block of the containing function.
LLVM_ABI InstListType::const_iterator getFirstNonPHIOrDbg(bool SkipPseudoOp=true) const
Returns a pointer to the first instruction in this block that is not a PHINode or a debug intrinsic,...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
This class represents a no-op cast from one type to another.
The address of a basic block.
Definition Constants.h:1065
Analysis providing branch probability information.
LLVM_ABI BranchProbability getEdgeProbability(const BasicBlock *Src, unsigned IndexInSuccessors) const
Get an edge's probability, relative to other out-edges of the Src.
LLVM_ABI bool isEdgeHot(const BasicBlock *Src, const BasicBlock *Dst) const
Test if an edge is hot relative to other out-edges of the Src.
static uint32_t getDenominator()
static BranchProbability getOne()
static BranchProbability getUnknown()
uint32_t getNumerator() const
LLVM_ABI uint64_t scale(uint64_t Num) const
Scale a large integer.
BranchProbability getCompl() const
static BranchProbability getZero()
static void normalizeProbabilities(ProbabilityIter Begin, ProbabilityIter End)
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
std::optional< OperandBundleUse > getOperandBundle(StringRef Name) const
Return an operand bundle by name, if present.
CallingConv::ID getCallingConv() const
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
LLVM_ABI bool isMustTailCall() const
Tests if this call site must be tail call optimized.
LLVM_ABI bool isIndirectCall() const
Return true if the callsite is an indirect call.
unsigned countOperandBundlesOfType(StringRef Name) const
Return the number of operand bundles with the tag Name attached to this instruction.
Value * getCalledOperand() const
Value * getArgOperand(unsigned i) const
User::op_iterator arg_end()
Return the iterator pointing to the end of the argument list.
bool isConvergent() const
Determine if the invoke is convergent.
FunctionType * getFunctionType() const
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
LLVM_ABI bool isTailCall() const
Tests if this call site is marked as a tail call.
CallBr instruction, tracking function calls that may not return control but instead transfer it to a ...
This class represents a function call, abstracting a target machine's calling convention.
This class is the base class for the comparison instructions.
Definition InstrTypes.h:664
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:676
Conditional Branch instruction.
Class for constant bytes.
Definition Constants.h:281
ConstantDataSequential - A vector or array constant whose element type is a simple 1/2/4/8-byte integ...
Definition Constants.h:736
A constant value that is initialized with an expression using other constant values.
Definition Constants.h:1291
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:420
This is the shared class of boolean and integer constants.
Definition Constants.h:87
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition Constants.h:219
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
Definition Constants.h:168
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
A signed pointer, in the ptrauth sense.
Definition Constants.h:1198
uint64_t getZExtValue() const
Constant Vector Declarations.
Definition Constants.h:660
This is an important base class in LLVM.
Definition Constant.h:43
This is the common base class for constrained floating point intrinsics.
LLVM_ABI std::optional< fp::ExceptionBehavior > getExceptionBehavior() const
LLVM_ABI unsigned getNonMetadataArgCount() const
DWARF expression.
LLVM_ABI bool isEntryValue() const
Check if the expression consists of exactly one entry value operand.
static bool fragmentsOverlap(const FragmentInfo &A, const FragmentInfo &B)
Check if fragments overlap between a pair of FragmentInfos.
static LLVM_ABI DIExpression * appendOpsToArg(const DIExpression *Expr, ArrayRef< uint64_t > Ops, unsigned ArgNo, bool StackValue=false)
Create a copy of Expr by appending the given list of Ops to each instance of the operand DW_OP_LLVM_a...
static LLVM_ABI std::optional< FragmentInfo > getFragmentInfo(expr_op_iterator Start, expr_op_iterator End)
Retrieve the details of this fragment expression.
LLVM_ABI uint64_t getNumLocationOperands() const
Return the number of unique location operands referred to (via DW_OP_LLVM_arg) in this expression; th...
static LLVM_ABI std::optional< DIExpression * > createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits)
Create a DIExpression to describe one part of an aggregate variable that is fragmented across multipl...
static LLVM_ABI const DIExpression * convertToUndefExpression(const DIExpression *Expr)
Removes all elements from Expr that do not apply to an undef debug value, which includes every operat...
static LLVM_ABI DIExpression * prepend(const DIExpression *Expr, uint8_t Flags, int64_t Offset=0)
Prepend DIExpr with a deref and offset operation and optionally turn it into a stack value or/and an ...
static LLVM_ABI DIExpression * prependOpcodes(const DIExpression *Expr, SmallVectorImpl< uint64_t > &Ops, bool StackValue=false, bool EntryValue=false)
Prepend DIExpr with the given opcodes and optionally turn it into a stack value.
Base class for variables.
LLVM_ABI std::optional< uint64_t > getSizeInBits() const
Determines the size of the variable's type.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
bool isBigEndian() const
Definition DataLayout.h:216
Records a position in IR for a source label (DILabel).
Base class for non-instruction debug metadata records that have positions within IR.
DebugLoc getDebugLoc() const
Record of a variable value-assignment, aka a non instruction representation of the dbg....
LLVM_ABI Value * getVariableLocationOp(unsigned OpIdx) const
DIExpression * getExpression() const
DILocalVariable * getVariable() const
LLVM_ABI iterator_range< location_op_iterator > location_ops() const
Get the locations corresponding to the variable referenced by the debug info intrinsic.
A debug info location.
Definition DebugLoc.h:123
LLVM_ABI DILocation * getInlinedAt() const
Definition DebugLoc.cpp:67
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:178
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
Definition DenseMap.h:74
bool empty() const
Definition DenseMap.h:109
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT, true > const_iterator
Definition DenseMap.h:75
iterator end()
Definition DenseMap.h:81
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:241
void reserve(size_type NumEntries)
Grow the densemap so that it can contain at least NumEntries items before resizing again.
Definition DenseMap.h:114
Diagnostic information for inline asm reporting.
static constexpr ElementCount getFixed(ScalarTy MinVal)
Definition TypeSize.h:309
static constexpr ElementCount get(ScalarTy MinVal, bool Scalable)
Definition TypeSize.h:315
constexpr bool isScalar() const
Exactly one element.
Definition TypeSize.h:320
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
Class representing an expression and its matching format.
This instruction extracts a struct member or array element value from an aggregate value.
This instruction compares its operands according to the predicate given to the constructor.
This is a fast-path instruction selection class that generates poor code and doesn't support illegal ...
Definition FastISel.h:66
bool allowReassoc() const
Flag queries.
Definition FMF.h:67
An instruction for ordering other memory operations.
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
Definition Type.cpp:873
This class represents a freeze function that returns random concrete value if an operand is either a ...
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
BranchProbabilityInfo * BPI
MachineBasicBlock * getMBB(const BasicBlock *BB) const
DenseMap< const AllocaInst *, int > StaticAllocaMap
StaticAllocaMap - Keep track of frame indices for fixed sized allocas in the entry block.
const LiveOutInfo * GetLiveOutRegInfo(Register Reg)
GetLiveOutRegInfo - Gets LiveOutInfo for a register, returning NULL if the register is a PHI destinat...
MachineBasicBlock * MBB
MBB - The current block.
Class to represent function types.
unsigned getNumParams() const
Return the number of fixed parameters this function type requires.
Type * getParamType(unsigned i) const
Parameter type accessors.
Type * getReturnType() const
Data structure describing the variable locations in a function.
const BasicBlock & getEntryBlock() const
Definition Function.h:809
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Definition Function.h:211
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
Definition Function.h:246
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition Function.h:711
bool hasParamAttribute(unsigned ArgNo, Attribute::AttrKind Kind) const
check if an attributes is in the list of attributes.
Definition Function.cpp:740
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
Definition Function.h:272
Constant * getPersonalityFn() const
Get the personality function associated with this function.
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:354
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
Definition Function.h:251
size_t arg_size() const
Definition Function.h:901
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:728
Garbage collection metadata for a single function.
Definition GCMetadata.h:80
bool hasNoUnsignedSignedWrap() const
bool hasNoUnsignedWrap() const
bool isInBounds() const
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
bool hasDLLImportStorageClass() const
Module * getParent()
Get the module that this global value is contained inside of...
This instruction compares its operands according to the predicate given to the constructor.
Indirect Branch Instruction.
This instruction inserts a struct field of array element value into an aggregate value.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
LLVM_ABI FastMathFlags getFastMathFlags() const LLVM_READONLY
Convenience function for getting all the fast-math flags, which must be an operator which supports th...
LLVM_ABI AAMDNodes getAAMetadata() const
Returns the AA metadata for this instruction.
@ MIN_INT_BITS
Minimum number of bits that can be specified.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
Invoke instruction.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
LLVM_ABI void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
The landingpad instruction holds all of the information necessary to generate correct exception handl...
A helper class to return the specified delimiter string after the first invocation of operator String...
An instruction for reading from memory.
static LocationSize precise(uint64_t Value)
static constexpr LocationSize beforeOrAfterPointer()
Any location before or after the base pointer (but still within the underlying object).
LLVM_ABI MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
LLVM_ABI MCSymbol * getOrCreateFrameAllocSymbol(const Twine &FuncName, unsigned Idx)
Gets a symbol that will be defined to the final stack offset of a local variable after codegen.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
Metadata node.
Definition Metadata.h:1080
Machine Value Type.
@ INVALID_SIMPLE_VALUE_TYPE
uint64_t getScalarSizeInBits() const
unsigned getVectorNumElements() const
bool isVector() const
Return true if this is a vector value type.
bool isInteger() const
Return true if this is an integer or a vector integer type.
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
ElementCount getVectorElementCount() const
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
bool bitsGE(MVT VT) const
Return true if this has no less bits than VT.
bool isScalarInteger() const
Return true if this is an integer, not including vectors.
static MVT getVectorVT(MVT VT, unsigned NumElements)
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
static MVT getIntegerVT(unsigned BitWidth)
void normalizeSuccProbs()
Normalize probabilities of all successors so that the sum of them becomes one.
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
LLVM_ABI void setSuccProbability(succ_iterator I, BranchProbability Prob)
Set successor probability of a given iterator.
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
SmallVectorImpl< MachineBasicBlock * >::iterator succ_iterator
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
void setIsEHContTarget(bool V=true)
Indicates if this is a target of Windows EH Continuation Guard.
void setIsEHFuncletEntry(bool V=true)
Indicates if this is the entry block of an EH funclet.
MachineInstrBundleIterator< MachineInstr > iterator
void setIsEHScopeEntry(bool V=true)
Indicates if this is the entry block of an EH scope, i.e., the block that that used to have a catchpa...
void setMachineBlockAddressTaken()
Set this block to indicate that its address is used as something other than the target of a terminato...
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
void setIsImmutableObjectIndex(int ObjectIdx, bool IsImmutable)
Marks the immutability of an object.
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
bool hasOpaqueSPAdjustment() const
Returns true if the function contains opaque dynamic stack adjustments.
int getStackProtectorIndex() const
Return the index for the stack protector object.
void setIsAliasedObjectIndex(int ObjectIdx, bool IsAliased)
Set "maybe pointed to by an LLVM IR value" for an object.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
void RemoveStackObject(int ObjectIdx)
Remove or mark dead a statically sized stack object.
void setFunctionContextIndex(int I)
const WinEHFuncInfo * getWinEHFuncInfo() const
getWinEHFuncInfo - Return information about how the current function uses Windows exception handling.
bool useDebugInstrRef() const
Returns true if the function's variable locations are tracked with instruction referencing.
void setCallSiteBeginLabel(MCSymbol *BeginLabel, unsigned Site)
Map the begin label for a call site.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, Align base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MCContext & getContext() const
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
void addCodeViewAnnotation(MCSymbol *Label, MDNode *MD)
Record annotations associated with a particular label.
Function & getFunction()
Return the LLVM function that this machine code represents.
BasicBlockListType::iterator iterator
void setHasEHContTarget(bool V)
void addInvoke(MachineBasicBlock *LandingPad, MCSymbol *BeginLabel, MCSymbol *EndLabel)
Provide the begin and end labels of an invoke style call and associate it with a try landing pad bloc...
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineInstr - Allocate a new MachineInstr.
void insert(iterator MBBI, MachineBasicBlock *MBB)
const MachineInstrBuilder & addSym(MCSymbol *Sym, unsigned char TargetFlags=0) const
const MachineInstrBuilder & addFrameIndex(int Idx) const
Representation of each machine instruction.
A description of a memory reference used in the backend.
Flags
Flags values. These may be or'd together.
@ MOVolatile
The memory access is volatile.
@ MODereferenceable
The memory access is dereferenceable (i.e., doesn't trap).
@ MOLoad
The memory access reads data.
@ MONonTemporal
The memory access is non-temporal.
@ MOInvariant
The memory access always returns the same value (or traps).
@ MOStore
The memory access writes data.
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
static MachineOperand CreateReg(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false, bool isRenamable=false)
static MachineOperand CreateFI(int Idx)
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
def_iterator def_begin(Register RegNo) const
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
LLVM_ABI MCRegister getLiveInPhysReg(Register VReg) const
getLiveInPhysReg - If VReg is a live-in virtual register, return the corresponding live-in physical r...
An SDNode that represents everything that will be needed to construct a MachineInstr.
bool contains(const KeyT &Key) const
Definition MapVector.h:146
std::pair< iterator, bool > try_emplace(const KeyT &Key, Ts &&...Args)
Definition MapVector.h:116
static MemoryLocation getAfter(const Value *Ptr, const AAMDNodes &AATags=AAMDNodes())
Return a location that may access any location after Ptr, while remaining within the underlying objec...
Metadata wrapper in the Value hierarchy.
Definition Metadata.h:184
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:79
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Definition Register.h:83
Resume the propagation of an exception.
Return a value (possibly void), from a function.
Holds the information from a dbg_label node through SDISel.
static SDDbgOperand fromNode(SDNode *Node, unsigned ResNo)
static SDDbgOperand fromFrameIdx(unsigned FrameIdx)
static SDDbgOperand fromVReg(Register VReg)
static SDDbgOperand fromConst(const Value *Const)
Holds the information from a dbg_value node through SDISel.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
iterator_range< value_op_iterator > op_values() const
unsigned getIROrder() const
Return the node ordering.
uint64_t getAsZExtVal() const
Helper method returns the zero-extended integer value of a ConstantSDNode.
unsigned getNumValues() const
Return the number of values defined/returned by this operator.
const SDValue & getOperand(unsigned Num) const
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDNode * getNode() const
get the SDNode which holds the desired result
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
TypeSize getValueSizeInBits() const
Returns the size of the value in bits.
const SDValue & getOperand(unsigned i) const
unsigned getResNo() const
get the index which selects a specific result in the SDNode
MVT getSimpleValueType() const
Return the simple ValueType of the referenced return value.
unsigned getOpcode() const
SelectionDAGBuilder - This is the common target-independent lowering implementation that is parameter...
SDValue getValue(const Value *V)
getValue - Return an SDValue for the given Value.
bool shouldKeepJumpConditionsTogether(const FunctionLoweringInfo &FuncInfo, const CondBrInst &I, Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs, TargetLoweringBase::CondMergingParams Params) const
DenseMap< const Constant *, Register > ConstantsOut
void addDanglingDebugInfo(SmallVectorImpl< Value * > &Values, DILocalVariable *Var, DIExpression *Expr, bool IsVariadic, DebugLoc DL, unsigned Order)
Register a dbg_value which relies on a Value which we have not yet seen.
void visitDbgInfo(const Instruction &I)
void clearDanglingDebugInfo()
Clear the dangling debug information map.
void LowerCallTo(const CallBase &CB, SDValue Callee, bool IsTailCall, bool IsMustTailCall, const BasicBlock *EHPadBB=nullptr, const TargetLowering::PtrAuthInfo *PAI=nullptr)
void clear()
Clear out the current SelectionDAG and the associated state and prepare this SelectionDAGBuilder obje...
void visitBitTestHeader(SwitchCG::BitTestBlock &B, MachineBasicBlock *SwitchBB)
visitBitTestHeader - This function emits necessary code to produce value suitable for "bit tests"
void LowerStatepoint(const GCStatepointInst &I, const BasicBlock *EHPadBB=nullptr)
std::unique_ptr< SDAGSwitchLowering > SL
SDValue lowerRangeToAssertZExt(SelectionDAG &DAG, const Instruction &I, SDValue Op)
bool HasTailCall
This is set to true if a call in the current block has been translated as a tail call.
bool ShouldEmitAsBranches(const std::vector< SwitchCG::CaseBlock > &Cases)
If the set of cases should be emitted as a series of branches, return true.
void EmitBranchForMergedCondition(const Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB, BranchProbability TProb, BranchProbability FProb, bool InvertCond)
EmitBranchForMergedCondition - Helper method for FindMergedConditions.
void LowerDeoptimizeCall(const CallInst *CI)
void LowerCallSiteWithDeoptBundle(const CallBase *Call, SDValue Callee, const BasicBlock *EHPadBB)
SwiftErrorValueTracking & SwiftError
Information about the swifterror values used throughout the function.
SDValue getNonRegisterValue(const Value *V)
getNonRegisterValue - Return an SDValue for the given Value, but don't look in FuncInfo....
const TargetTransformInfo * TTI
DenseMap< MachineBasicBlock *, SmallVector< unsigned, 4 > > LPadToCallSiteMap
Map a landing pad to the call site indexes.
SDValue lowerNoFPClassToAssertNoFPClass(SelectionDAG &DAG, const Instruction &I, SDValue Op)
void handleDebugDeclare(Value *Address, DILocalVariable *Variable, DIExpression *Expression, DebugLoc DL)
StatepointLoweringState StatepointLowering
State used while lowering a statepoint sequence (gc_statepoint, gc_relocate, and gc_result).
void visitBitTestCase(SwitchCG::BitTestBlock &BB, MachineBasicBlock *NextMBB, BranchProbability BranchProbToNext, Register Reg, SwitchCG::BitTestCase &B, MachineBasicBlock *SwitchBB)
visitBitTestCase - this function produces one "bit test"
bool canTailCall(const CallBase &CB) const
void populateCallLoweringInfo(TargetLowering::CallLoweringInfo &CLI, const CallBase *Call, unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy, AttributeSet RetAttrs, bool IsPatchPoint)
Populate a CallLowerinInfo (into CLI) based on the properties of the call being lowered.
void CopyValueToVirtualRegister(const Value *V, Register Reg, ISD::NodeType ExtendType=ISD::ANY_EXTEND)
void salvageUnresolvedDbgValue(const Value *V, DanglingDebugInfo &DDI)
For the given dangling debuginfo record, perform last-ditch efforts to resolve the debuginfo to somet...
SmallVector< SDValue, 8 > PendingLoads
Loads are not emitted to the program immediately.
GCFunctionInfo * GFI
Garbage collection metadata for the function.
void init(GCFunctionInfo *gfi, BatchAAResults *BatchAA, AssumptionCache *AC, const TargetLibraryInfo *li, const TargetTransformInfo &TTI)
SDValue getRoot()
Similar to getMemoryRoot, but also flushes PendingConstrainedFP(Strict) items.
void ExportFromCurrentBlock(const Value *V)
ExportFromCurrentBlock - If this condition isn't known to be exported from the current basic block,...
void resolveOrClearDbgInfo()
Evict any dangling debug information, attempting to salvage it first.
std::pair< SDValue, SDValue > lowerInvokable(TargetLowering::CallLoweringInfo &CLI, const BasicBlock *EHPadBB=nullptr)
SDValue getMemoryRoot()
Return the current virtual root of the Selection DAG, flushing any PendingLoad items.
void resolveDanglingDebugInfo(const Value *V, SDValue Val)
If we saw an earlier dbg_value referring to V, generate the debug data structures now that we've seen...
void visit(const Instruction &I)
void dropDanglingDebugInfo(const DILocalVariable *Variable, const DIExpression *Expr)
If we have dangling debug info that describes Variable, or an overlapping part of variable considerin...
SDValue getCopyFromRegs(const Value *V, Type *Ty)
If there was virtual register allocated for the value V emit CopyFromReg of the specified type Ty.
void CopyToExportRegsIfNeeded(const Value *V)
CopyToExportRegsIfNeeded - If the given value has virtual registers created for it,...
void handleKillDebugValue(DILocalVariable *Var, DIExpression *Expr, DebugLoc DbgLoc, unsigned Order)
Create a record for a kill location debug intrinsic.
void visitJumpTable(SwitchCG::JumpTable &JT)
visitJumpTable - Emit JumpTable node in the current MBB
SDValue getFPOperationRoot(fp::ExceptionBehavior EB)
Return the current virtual root of the Selection DAG, flushing PendingConstrainedFP or PendingConstra...
void visitJumpTableHeader(SwitchCG::JumpTable &JT, SwitchCG::JumpTableHeader &JTH, MachineBasicBlock *SwitchBB)
visitJumpTableHeader - This function emits necessary code to produce index in the JumpTable from swit...
void LowerCallSiteWithPtrAuthBundle(const CallBase &CB, const BasicBlock *EHPadBB)
static const unsigned LowestSDNodeOrder
Lowest valid SDNodeOrder.
FunctionLoweringInfo & FuncInfo
Information about the function as a whole.
void setValue(const Value *V, SDValue NewN)
void FindMergedConditions(const Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB, Instruction::BinaryOps Opc, BranchProbability TProb, BranchProbability FProb, bool InvertCond)
const TargetLibraryInfo * LibInfo
bool isExportableFromCurrentBlock(const Value *V, const BasicBlock *FromBB)
void visitSPDescriptorParent(StackProtectorDescriptor &SPD, MachineBasicBlock *ParentBB)
Codegen a new tail for a stack protector check ParentMBB which has had its tail spliced into a stack ...
bool handleDebugValue(ArrayRef< const Value * > Values, DILocalVariable *Var, DIExpression *Expr, DebugLoc DbgLoc, unsigned Order, bool IsVariadic)
For a given list of Values, attempt to create and record a SDDbgValue in the SelectionDAG.
SDValue getControlRoot()
Similar to getRoot, but instead of flushing all the PendingLoad items, flush all the PendingExports (...
void UpdateSplitBlock(MachineBasicBlock *First, MachineBasicBlock *Last)
When an MBB was split during scheduling, update the references that need to refer to the last resulti...
SDValue getValueImpl(const Value *V)
getValueImpl - Helper function for getValue and getNonRegisterValue.
void visitSwitchCase(SwitchCG::CaseBlock &CB, MachineBasicBlock *SwitchBB)
visitSwitchCase - Emits the necessary code to represent a single node in the binary search tree resul...
void visitSPDescriptorFailure(StackProtectorDescriptor &SPD)
Codegen the failure basic block for a stack protector check.
std::unique_ptr< FunctionLoweringInfo > FuncInfo
SmallPtrSet< const Instruction *, 4 > ElidedArgCopyInstrs
const TargetLowering * TLI
MachineRegisterInfo * RegInfo
std::unique_ptr< SwiftErrorValueTracking > SwiftError
virtual void emitFunctionEntryCode()
std::unique_ptr< SelectionDAGBuilder > SDB
virtual std::pair< SDValue, SDValue > EmitTargetCodeForMemccpy(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, SDValue C, SDValue Size, const CallInst *CI) const
Emit target-specific code that performs a memccpy, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrnlen(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src, SDValue MaxLength, MachinePointerInfo SrcPtrInfo) const
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrlen(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src, const CallInst *CI) const
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrstr(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, const CallInst *CI) const
Emit target-specific code that performs a strstr, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForMemchr(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Src, SDValue Char, SDValue Length, MachinePointerInfo SrcPtrInfo) const
Emit target-specific code that performs a memchr, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrcmp(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, MachinePointerInfo Op1PtrInfo, MachinePointerInfo Op2PtrInfo, const CallInst *CI) const
Emit target-specific code that performs a strcmp, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForMemcmp(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, SDValue Op3, const CallInst *CI) const
Emit target-specific code that performs a memcmp/bcmp, in cases where that is faster than a libcall.
virtual SDValue EmitTargetCodeForSetTag(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Addr, SDValue Size, MachinePointerInfo DstPtrInfo, bool ZeroData) const
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrcpy(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dest, SDValue Src, MachinePointerInfo DestPtrInfo, MachinePointerInfo SrcPtrInfo, bool isStpcpy, const CallInst *CI) const
Emit target-specific code that performs a strcpy or stpcpy, in cases where that is faster than a libc...
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
SDValue getExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT, unsigned Opcode)
Convert Op, which must be of integer type, to the integer type VT, by either any/sign/zero-extending ...
const SDValue & getRoot() const
Return the root tag of the SelectionDAG.
const TargetSubtargetInfo & getSubtarget() const
SDValue getCopyToReg(SDValue Chain, const SDLoc &dl, Register Reg, SDValue N)
LLVM_ABI SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
LLVM_ABI SDValue getShiftAmountConstant(uint64_t Val, EVT VT, const SDLoc &DL)
LLVM_ABI MachineSDNode * getMachineNode(unsigned Opcode, const SDLoc &dl, EVT VT)
These are used for target selectors to create a new node with specified return type(s),...
LLVM_ABI void ExtractVectorElements(SDValue Op, SmallVectorImpl< SDValue > &Args, unsigned Start=0, unsigned Count=0, EVT EltVT=EVT())
Append the extracted elements from Start to Count out of the vector Op in Args.
LLVM_ABI SDValue getConstantPool(const Constant *C, EVT VT, MaybeAlign Align=std::nullopt, int Offs=0, bool isT=false, unsigned TargetFlags=0)
LLVM_ABI SDValue getConstantFP(double Val, const SDLoc &DL, EVT VT, bool isTarget=false)
Create a ConstantFPSDNode wrapping a constant value.
LLVM_ABI SDValue getRegister(Register Reg, EVT VT)
LLVM_ABI SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr)
Loads are not normal binary operators: their result type is not determined by their operands,...
LLVM_ABI Align getEVTAlign(EVT MemoryVT) const
Compute the default alignment value for the given type.
LLVM_ABI bool shouldOptForSize() const
const TargetLowering & getTargetLoweringInfo() const
static constexpr unsigned MaxRecursionDepth
LLVM_ABI void AddDbgValue(SDDbgValue *DB, bool isParameter)
Add a dbg_value SDNode.
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Ops)
Return an ISD::BUILD_VECTOR node.
LLVM_ABI SDValue getBitcast(EVT VT, SDValue V)
Return a bitcast using the SDLoc of the value operand, and casting to the provided type.
LLVM_ABI SDDbgValue * getDbgValueList(DIVariable *Var, DIExpression *Expr, ArrayRef< SDDbgOperand > Locs, ArrayRef< SDNode * > Dependencies, bool IsIndirect, const DebugLoc &DL, unsigned O, bool IsVariadic)
Creates a SDDbgValue node from a list of locations.
SDValue getCopyFromReg(SDValue Chain, const SDLoc &dl, Register Reg, EVT VT)
LLVM_ABI void setNodeMemRefs(MachineSDNode *N, ArrayRef< MachineMemOperand * > NewMemRefs)
Mutate the specified machine node's memory references to the provided list.
const DataLayout & getDataLayout() const
SDValue getTargetFrameIndex(int FI, EVT VT)
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getMemBasePlusOffset(SDValue Base, TypeSize Offset, const SDLoc &DL, const SDNodeFlags Flags=SDNodeFlags())
Returns sum of the base pointer and offset.
LLVM_ABI SDValue getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
LLVM_ABI SDValue getBasicBlock(MachineBasicBlock *MBB)
LLVM_ABI SDValue getPtrExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either truncating it or perform...
LLVM_ABI SDValue getAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either any-extending or truncat...
const LibcallLoweringInfo & getLibcalls() const
LLVM_ABI SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI SDValue getValueType(EVT)
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
LLVM_ABI SDValue getFPExtendOrRound(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of float type, to the float type VT, by either extending or rounding (by tr...
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
LLVM_ABI SDValue getVectorIdxConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
MachineFunction & getMachineFunction() const
LLVM_ABI SDValue getFrameIndex(int FI, EVT VT, bool isTarget=false)
LLVM_ABI SDValue getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either zero-extending or trunca...
LLVMContext * getContext() const
const SDValue & setRoot(SDValue N)
Set the current root tag of the SelectionDAG.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void swap(SmallVectorImpl &RHS)
void resize(size_type N)
void push_back(const T &Elt)
pointer data()
Return a pointer to the vector's buffer, even if empty().
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Encapsulates all of the information needed to generate a stack protector check, and signals to isel w...
MachineBasicBlock * getSuccessMBB()
MachineBasicBlock * getFailureMBB()
MachineBasicBlock * getParentMBB()
bool shouldEmitFunctionBasedCheckStackProtector() const
An instruction for storing to memory.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:140
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:137
Multiway switch.
Information about stack frame layout on the target.
virtual TargetStackID::Value getStackIDForScalableVectors() const
Returns the StackID that scalable vectors should be associated with.
Provides information about what library functions are available for the current target.
virtual Align getByValTypeAlignment(Type *Ty, const DataLayout &DL) const
Returns the desired alignment for ByVal or InAlloca aggregate function arguments in the caller parame...
virtual bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF, EVT) const
Return true if an FMA operation is faster than a pair of fmul and fadd instructions.
EVT getMemValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Function * getSSPStackGuardCheck(const Module &M, const LibcallLoweringInfo &Libcalls) const
If the target has a standard stack protection check function that performs validation and error handl...
EVT getValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Return the EVT corresponding to this LLVM type.
LegalizeAction
This enum indicates whether operations are valid for a target, and if not, what action should be used...
virtual bool useStackGuardXorFP() const
If this function returns true, stack protection checks should XOR the frame pointer (or whichever poi...
virtual const TargetRegisterClass * getRegClassFor(MVT VT, bool isDivergent=false) const
Return the register class that should be used for the specified value type.
virtual bool isLegalScaleForGatherScatter(uint64_t Scale, uint64_t ElemSize) const
virtual bool isSExtCheaperThanZExt(EVT FromTy, EVT ToTy) const
Return true if sign-extension from FromTy to ToTy is cheaper than zero-extension.
MVT getVectorIdxTy(const DataLayout &DL) const
Returns the type to be used for the index operand of: ISD::INSERT_VECTOR_ELT, ISD::EXTRACT_VECTOR_ELT...
virtual unsigned getNumRegistersForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain targets require unusual breakdowns of certain types.
virtual bool isZExtFree(Type *FromTy, Type *ToTy) const
Return true if any actual instruction that defines a value of type FromTy implicitly zero-extends the...
virtual MVT getRegisterTypeForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain combinations of ABIs, Targets and features require that types are legal for some operations a...
virtual unsigned getNumRegisters(LLVMContext &Context, EVT VT, std::optional< MVT > RegisterVT=std::nullopt) const
Return the number of registers that this ValueType will eventually require.
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 signExtendConstant(const ConstantInt *C) const
Return true if this constant should be sign extended when promoting to a larger type.
virtual Value * getSDagStackGuard(const Module &M, const LibcallLoweringInfo &Libcalls) const
Return the variable that's previously inserted by insertSSPDeclarations, if any, otherwise return nul...
LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const
Return how we should legalize values of this type, either it is already legal (return 'Legal') or we ...
virtual Register getExceptionPointerRegister(const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception address on entry to an ...
bool supportsUnalignedAtomics() const
Whether the target supports unaligned atomic operations.
std::vector< ArgListEntry > ArgListTy
bool isBeneficialToExpandPowI(int64_t Exponent, bool OptForSize) const
Return true if it is beneficial to expand an @llvm.powi.
MVT getFrameIndexTy(const DataLayout &DL) const
Return the type for frame index, which is determined by the alloca address space specified through th...
virtual Register getExceptionSelectorRegister(const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception typeid on entry to a la...
virtual MVT getPointerMemTy(const DataLayout &DL, uint32_t AS=0) const
Return the in-memory pointer type for the given address space, defaults to the pointer type from the ...
MVT getRegisterType(MVT VT) const
Return the type of registers that this ValueType will eventually require.
unsigned getVectorTypeBreakdown(LLVMContext &Context, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const
Vector types are broken down into some number of legal first class types.
virtual MVT getVPExplicitVectorLengthTy() const
Returns the type to be used for the EVL/AVL operand of VP nodes: ISD::VP_ADD, ISD::VP_SUB,...
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
virtual bool supportKCFIBundles() const
Return true if the target supports kcfi operand bundles.
virtual bool supportPtrAuthBundles() const
Return true if the target supports ptrauth operand bundles.
virtual bool supportSwiftError() const
Return true if the target supports swifterror attribute.
virtual SDValue visitMaskedLoad(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, MachineMemOperand *MMO, SDValue &NewLoad, SDValue Ptr, SDValue PassThru, SDValue Mask) const
virtual SDValue emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val, const SDLoc &DL) const
virtual EVT getTypeForExtReturn(LLVMContext &Context, EVT VT, ISD::NodeType) const
Return the type that should be used to zero or sign extend a zeroext/signext integer return value.
virtual InlineAsm::ConstraintCode getInlineAsmMemConstraint(StringRef ConstraintCode) const
std::vector< AsmOperandInfo > AsmOperandInfoVector
SDValue expandIS_FPCLASS(EVT ResultVT, SDValue Op, FPClassTest Test, SDNodeFlags Flags, const SDLoc &DL, SelectionDAG &DAG) const
Expand check for floating point class.
virtual SDValue prepareVolatileOrAtomicLoad(SDValue Chain, const SDLoc &DL, SelectionDAG &DAG) const
This callback is used to prepare for a volatile or atomic load.
virtual ConstraintType getConstraintType(StringRef Constraint) const
Given a constraint, return the type of constraint it is for this target.
virtual bool splitValueIntoRegisterParts(SelectionDAG &DAG, const SDLoc &DL, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, std::optional< CallingConv::ID > CC) const
Target-specific splitting of values into parts that fit a register storing a legal type.
virtual SDValue joinRegisterPartsIntoValue(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, std::optional< CallingConv::ID > CC) const
Target-specific combining of register parts into its original value.
virtual SDValue LowerCall(CallLoweringInfo &, SmallVectorImpl< SDValue > &) const
This hook must be implemented to lower calls into the specified DAG.
std::pair< SDValue, SDValue > LowerCallTo(CallLoweringInfo &CLI) const
This function lowers an abstract call to a function into an actual call.
virtual SDValue LowerAsmOutputForConstraint(SDValue &Chain, SDValue &Glue, const SDLoc &DL, const AsmOperandInfo &OpInfo, SelectionDAG &DAG) const
virtual std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const
Given a physical register constraint (e.g.
virtual AsmOperandInfoVector ParseConstraints(const DataLayout &DL, const TargetRegisterInfo *TRI, const CallBase &Call) const
Split up the constraint string from the inline assembly value into the specific constraints and their...
virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const
This callback is invoked for operations that are unsupported by the target, which are registered to u...
virtual bool functionArgumentNeedsConsecutiveRegisters(Type *Ty, CallingConv::ID CallConv, bool isVarArg, const DataLayout &DL) const
For some targets, an LLVM struct type must be broken down into multiple simple types,...
virtual void ComputeConstraintToUse(AsmOperandInfo &OpInfo, SDValue Op, SelectionDAG *DAG=nullptr) const
Determines the constraint code and constraint type to use for the specific AsmOperandInfo,...
virtual void CollectTargetIntrinsicOperands(const CallInst &I, SmallVectorImpl< SDValue > &Ops, SelectionDAG &DAG) const
virtual SDValue visitMaskedStore(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, MachineMemOperand *MMO, SDValue Ptr, SDValue Val, SDValue Mask) const
virtual bool useLoadStackGuardNode(const Module &M) const
If this function returns true, SelectionDAGBuilder emits a LOAD_STACK_GUARD node when it is lowering ...
virtual void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint, std::vector< SDValue > &Ops, SelectionDAG &DAG) const
Lower the specified operand into the Ops vector.
std::pair< SDValue, SDValue > makeLibCall(SelectionDAG &DAG, RTLIB::LibcallImpl LibcallImpl, EVT RetVT, ArrayRef< SDValue > Ops, MakeLibCallOptions CallOptions, const SDLoc &dl, SDValue Chain=SDValue()) const
Returns a pair of (return value, chain).
virtual void LowerOperationWrapper(SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG) const
This callback is invoked by the type legalizer to legalize nodes with an illegal operand type but leg...
virtual bool isInlineAsmTargetBranch(const SmallVectorImpl< StringRef > &AsmStrs, unsigned OpNo) const
On x86, return true if the operand with index OpNo is a CALL or JUMP instruction, which can use eithe...
virtual MVT getJumpTableRegTy(const DataLayout &DL) const
virtual bool CanLowerReturn(CallingConv::ID, MachineFunction &, bool, const SmallVectorImpl< ISD::OutputArg > &, LLVMContext &, const Type *RetTy) const
This hook should be implemented to check whether the return values described by the Outs array can fi...
CodeGenOptLevel getOptLevel() const
Returns the optimization level: None, Less, Default, or Aggressive.
unsigned NoTrapAfterNoreturn
Do not emit a trap instruction for 'unreachable' IR instructions behind noreturn calls,...
unsigned TrapUnreachable
Emit target-specific trap instruction for 'unreachable' IR instructions.
unsigned getID() const
Return the register class ID number.
iterator begin() const
begin/end - Return all of the registers in this class.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
@ TCK_Latency
The latency of instruction.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:343
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
LLVM_ABI bool isEmptyTy() const
Return true if this type is empty, that is, it has no elements or all of its elements are empty.
Definition Type.cpp:184
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:290
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:284
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:286
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:370
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:130
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:310
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:257
bool isTokenTy() const
Return true if this is 'token'.
Definition Type.h:236
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
Definition Type.cpp:317
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Definition Type.h:227
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:141
Unconditional Branch instruction.
This function has undefined behavior.
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
op_iterator op_begin()
Definition User.h:259
Value * getOperand(unsigned i) const
Definition User.h:207
unsigned getNumOperands() const
Definition User.h:229
op_iterator op_end()
Definition User.h:261
This class represents the va_arg llvm instruction, which returns an argument of the specified type gi...
LLVM_ABI CmpInst::Predicate getPredicate() const
This is the common base class for vector predication intrinsics.
static LLVM_ABI std::optional< unsigned > getVectorLengthParamPos(Intrinsic::ID IntrinsicID)
LLVM_ABI MaybeAlign getPointerAlignment() const
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:439
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:258
iterator_range< user_iterator > users()
Definition Value.h:426
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:709
bool use_empty() const
Definition Value.h:346
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:318
Base class of all SIMD vector types.
Type * getElementType() const
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:230
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
const ParentTy * getParent() const
Definition ilist_node.h:34
A raw_ostream that writes to an std::string.
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char SymbolName[]
Key for Kernel::Metadata::mSymbolName.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
Definition CallingConv.h:60
@ AMDGPU_CS_Chain
Used on AMDGPUs to give the middle-end more control over argument placement.
@ X86_VectorCall
MSVC calling convention that passes vectors and vector aggregates in SSE registers.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:41
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition ISDOpcodes.h:261
@ STACKRESTORE
STACKRESTORE has two operands, an input chain and a pointer to restore to it returns an output chain.
@ STACKSAVE
STACKSAVE - STACKSAVE has one operand, an input chain.
@ CTLZ_ZERO_UNDEF
Definition ISDOpcodes.h:788
@ CONVERGENCECTRL_ANCHOR
The llvm.experimental.convergence.* intrinsics.
@ STRICT_FSETCC
STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used for floating-point operands only.
Definition ISDOpcodes.h:511
@ DELETED_NODE
DELETED_NODE - This is an illegal value that is used to catch errors.
Definition ISDOpcodes.h:45
@ SET_FPENV
Sets the current floating-point environment.
@ ATOMIC_LOAD_FMINIMUMNUM
@ LOOP_DEPENDENCE_RAW_MASK
@ VECREDUCE_SEQ_FADD
Generic reduction nodes.
@ COND_LOOP
COND_LOOP is a conditional branch to self, used for implementing efficient conditional traps.
@ EH_SJLJ_LONGJMP
OUTCHAIN = EH_SJLJ_LONGJMP(INCHAIN, buffer) This corresponds to the eh.sjlj.longjmp intrinsic.
Definition ISDOpcodes.h:168
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition ISDOpcodes.h:600
@ STACKADDRESS
STACKADDRESS - Represents the llvm.stackaddress intrinsic.
Definition ISDOpcodes.h:127
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:779
@ SMULFIX
RESULT = [US]MULFIX(LHS, RHS, SCALE) - Perform fixed point multiplication on 2 integers with the same...
Definition ISDOpcodes.h:394
@ VAEND
VAEND, VASTART - VAEND and VASTART have three operands: an input chain, pointer, and a SRCVALUE.
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, val, ptr) This corresponds to "store atomic" instruction.
@ RESET_FPENV
Set floating-point environment to default state.
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:264
@ SMULFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
Definition ISDOpcodes.h:400
@ SET_FPMODE
Sets the current dynamic floating-point control modes.
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:853
@ CTTZ_ELTS
Returns the number of number of trailing (least significant) zero elements in a vector.
@ ATOMIC_LOAD_USUB_COND
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:518
@ VECTOR_FIND_LAST_ACTIVE
Finds the index of the last active mask element Operands: Mask.
@ FMODF
FMODF - Decomposes the operand into integral and fractional parts, each having the same type and sign...
@ FATAN2
FATAN2 - atan2, inspired by libm.
@ FSINCOSPI
FSINCOSPI - Compute both the sine and cosine times pi more accurately than FSINCOS(pi*x),...
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition ISDOpcodes.h:220
@ EH_SJLJ_SETUP_DISPATCH
OUTCHAIN = EH_SJLJ_SETUP_DISPATCH(INCHAIN) The target initializes the dispatch table here.
Definition ISDOpcodes.h:172
@ GlobalAddress
Definition ISDOpcodes.h:88
@ ATOMIC_CMP_SWAP_WITH_SUCCESS
Val, Success, OUTCHAIN = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) N.b.
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
Definition ISDOpcodes.h:880
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition ISDOpcodes.h:584
@ VECREDUCE_FMAX
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:417
@ VECREDUCE_FMAXIMUM
FMINIMUM/FMAXIMUM nodes propatate NaNs and signed zeroes using the llvm.minimum and llvm....
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
Definition ISDOpcodes.h:747
@ ATOMIC_FENCE
OUTCHAIN = ATOMIC_FENCE(INCHAIN, ordering, scope) This corresponds to the fence instruction.
@ RESET_FPMODE
Sets default dynamic floating-point control modes.
@ FMULADD
FMULADD - Performs a * b + c, with, or without, intermediate rounding.
Definition ISDOpcodes.h:528
@ FPTRUNC_ROUND
FPTRUNC_ROUND - This corresponds to the fptrunc_round intrinsic.
Definition ISDOpcodes.h:515
@ FAKE_USE
FAKE_USE represents a use of the operand but does not do anything.
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
Definition ISDOpcodes.h:993
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
Definition ISDOpcodes.h:254
@ CLMUL
Carry-less multiplication operations.
Definition ISDOpcodes.h:774
@ INIT_TRAMPOLINE
INIT_TRAMPOLINE - This corresponds to the init_trampoline intrinsic.
@ FLDEXP
FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
@ SDIVFIX
RESULT = [US]DIVFIX(LHS, RHS, SCALE) - Perform fixed point division on 2 integers with the same width...
Definition ISDOpcodes.h:407
@ CONVERT_FROM_ARBITRARY_FP
CONVERT_FROM_ARBITRARY_FP - This operator converts from an arbitrary floating-point represented as an...
@ EH_LABEL
EH_LABEL - Represents a label in mid basic block used to track locations needed for debug and excepti...
@ ATOMIC_LOAD_USUB_SAT
@ EH_RETURN
OUTCHAIN = EH_RETURN(INCHAIN, OFFSET, HANDLER) - This node represents 'eh_return' gcc dwarf builtin,...
Definition ISDOpcodes.h:156
@ ANNOTATION_LABEL
ANNOTATION_LABEL - Represents a mid basic block label used by annotations.
@ SET_ROUNDING
Set rounding mode.
Definition ISDOpcodes.h:975
@ CONVERGENCECTRL_GLUE
This does not correspond to any convergence control intrinsic.
@ PARTIAL_REDUCE_UMLA
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:844
@ PREALLOCATED_SETUP
PREALLOCATED_SETUP - This has 2 operands: an input chain and a SRCVALUE with the preallocated call Va...
@ READSTEADYCOUNTER
READSTEADYCOUNTER - This corresponds to the readfixedcounter intrinsic.
@ ADDROFRETURNADDR
ADDROFRETURNADDR - Represents the llvm.addressofreturnaddress intrinsic.
Definition ISDOpcodes.h:117
@ CONVERGENCECTRL_ENTRY
@ BR
Control flow instructions. These all have token chains.
@ VECREDUCE_FADD
These reductions have relaxed evaluation order semantics, and have a single vector operand.
@ CTTZ_ZERO_UNDEF
Bit counting operators with an undefined result for zero inputs.
Definition ISDOpcodes.h:787
@ PARTIAL_REDUCE_FMLA
@ PREFETCH
PREFETCH - This corresponds to a prefetch intrinsic.
@ FSINCOS
FSINCOS - Compute both fsin and fcos as a single operation.
@ SSUBO
Same for subtraction.
Definition ISDOpcodes.h:352
@ PREALLOCATED_ARG
PREALLOCATED_ARG - This has 3 operands: an input chain, a SRCVALUE with the preallocated call Value,...
@ BRIND
BRIND - Indirect branch.
@ BR_JT
BR_JT - Jumptable branch.
@ VECTOR_INTERLEAVE
VECTOR_INTERLEAVE(VEC1, VEC2, ...) - Returns N vectors from N input vectors, where N is the factor to...
Definition ISDOpcodes.h:635
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition ISDOpcodes.h:541
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
Definition ISDOpcodes.h:548
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition ISDOpcodes.h:374
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:796
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
Definition ISDOpcodes.h:247
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition ISDOpcodes.h:672
@ VACOPY
VACOPY - VACOPY has 5 operands: an input chain, a destination pointer, a source pointer,...
@ GET_ACTIVE_LANE_MASK
GET_ACTIVE_LANE_MASK - this corrosponds to the llvm.get.active.lane.mask intrinsic.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition ISDOpcodes.h:230
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition ISDOpcodes.h:348
@ ARITH_FENCE
ARITH_FENCE - This corresponds to a arithmetic fence intrinsic.
@ VECREDUCE_ADD
Integer reductions may have a result type larger than the vector element type.
@ GET_ROUNDING
Returns current rounding mode: -1 Undefined 0 Round to 0 1 Round to nearest, ties to even 2 Round to ...
Definition ISDOpcodes.h:970
@ CLEANUPRET
CLEANUPRET - Represents a return from a cleanup block funclet.
@ ATOMIC_LOAD_FMAXIMUM
@ GET_FPMODE
Reads the current dynamic floating-point control modes.
@ GET_FPENV
Gets the current floating-point environment.
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:765
@ AssertNoFPClass
AssertNoFPClass - These nodes record if a register contains a float value that is known to be not som...
Definition ISDOpcodes.h:78
@ PtrAuthGlobalAddress
A ptrauth constant.
Definition ISDOpcodes.h:100
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition ISDOpcodes.h:614
@ EntryToken
EntryToken - This is the marker used to indicate the start of a region.
Definition ISDOpcodes.h:48
@ READ_REGISTER
READ_REGISTER, WRITE_REGISTER - This node represents llvm.register on the DAG, which implements the n...
Definition ISDOpcodes.h:139
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition ISDOpcodes.h:576
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:850
@ DEBUGTRAP
DEBUGTRAP - Trap intended to get the attention of a debugger.
@ VSCALE
VSCALE(IMM) - Returns the runtime scaling factor used to calculate the number of elements within a sc...
@ LOCAL_RECOVER
LOCAL_RECOVER - Represents the llvm.localrecover intrinsic.
Definition ISDOpcodes.h:135
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum maximum on two values, following IEEE-754 definition...
@ UBSANTRAP
UBSANTRAP - Trap with an immediate describing the kind of sanitizer failure.
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
Definition ISDOpcodes.h:386
@ PATCHPOINT
The llvm.experimental.patchpoint.
@ SMULO
Same for multiplication.
Definition ISDOpcodes.h:356
@ ATOMIC_LOAD_FMINIMUM
@ DYNAMIC_STACKALLOC
DYNAMIC_STACKALLOC - Allocate some number of bytes on the stack aligned to a specified boundary.
@ VECTOR_SPLICE_LEFT
VECTOR_SPLICE_LEFT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1, VEC2) left by OFFSET elements an...
Definition ISDOpcodes.h:653
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:727
@ MASKED_UDIV
Masked vector arithmetic that returns poison on disabled lanes.
@ VECTOR_REVERSE
VECTOR_REVERSE(VECTOR) - Returns a vector, of the same type as VECTOR, whose elements are shuffled us...
Definition ISDOpcodes.h:640
@ SDIVFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
Definition ISDOpcodes.h:413
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:978
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition ISDOpcodes.h:805
@ PCMARKER
PCMARKER - This corresponds to the pcmarker intrinsic.
@ INLINEASM_BR
INLINEASM_BR - Branching version of inline asm. Used by asm-goto.
@ ATOMIC_LOAD_FMAXIMUMNUM
@ EH_DWARF_CFA
EH_DWARF_CFA - This node represents the pointer to the DWARF Canonical Frame Address (CFA),...
Definition ISDOpcodes.h:150
@ FRAMEADDR
FRAMEADDR, RETURNADDR - These nodes represent llvm.frameaddress and llvm.returnaddress on the DAG.
Definition ISDOpcodes.h:110
@ ATOMIC_LOAD_UDEC_WRAP
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition ISDOpcodes.h:500
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:926
@ READCYCLECOUNTER
READCYCLECOUNTER - This corresponds to the readcyclecounter intrinsic.
@ RELOC_NONE
Issue a no-op relocation against a given symbol at the current location.
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:739
@ TRAP
TRAP - Trapping instruction.
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition ISDOpcodes.h:205
@ SCMP
[US]CMP - 3-way comparison of signed or unsigned integers.
Definition ISDOpcodes.h:735
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1,VEC2) right by OFFSET elements a...
Definition ISDOpcodes.h:657
@ STRICT_FADD
Constrained versions of the binary floating point operators.
Definition ISDOpcodes.h:427
@ STACKMAP
The llvm.experimental.stackmap intrinsic.
@ FREEZE
FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or is evaluated to UNDEF),...
Definition ISDOpcodes.h:241
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition ISDOpcodes.h:565
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:53
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition ISDOpcodes.h:959
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
Definition ISDOpcodes.h:699
@ SPONENTRY
SPONENTRY - Represents the llvm.sponentry intrinsic.
Definition ISDOpcodes.h:122
@ CLEAR_CACHE
llvm.clear_cache intrinsic Operands: Input Chain, Start Addres, End Address Outputs: Output Chain
@ CONVERGENCECTRL_LOOP
@ INLINEASM
INLINEASM - Represents an inline asm block.
@ FP_TO_SINT_SAT
FP_TO_[US]INT_SAT - Convert floating point value in operand 0 to a signed or unsigned scalar integer ...
Definition ISDOpcodes.h:945
@ VECREDUCE_FMINIMUM
@ EH_SJLJ_SETJMP
RESULT, OUTCHAIN = EH_SJLJ_SETJMP(INCHAIN, buffer) This corresponds to the eh.sjlj....
Definition ISDOpcodes.h:162
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:856
@ BRCOND
BRCOND - Conditional branch.
@ VECREDUCE_SEQ_FMUL
@ CATCHRET
CATCHRET - Represents a return from a catch block funclet.
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition ISDOpcodes.h:62
@ ATOMIC_LOAD_UINC_WRAP
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition ISDOpcodes.h:534
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition ISDOpcodes.h:365
@ VECTOR_DEINTERLEAVE
VECTOR_DEINTERLEAVE(VEC1, VEC2, ...) - Returns N vectors from N input vectors, where N is the factor ...
Definition ISDOpcodes.h:624
@ GET_DYNAMIC_AREA_OFFSET
GET_DYNAMIC_AREA_OFFSET - get offset from native SP to the address of the most recent dynamic alloca.
@ CTTZ_ELTS_ZERO_POISON
@ FMINIMUMNUM
FMINIMUMNUM/FMAXIMUMNUM - minimumnum/maximumnum that is same with FMINNUM_IEEE and FMAXNUM_IEEE besid...
@ ADJUST_TRAMPOLINE
ADJUST_TRAMPOLINE - This corresponds to the adjust_trampoline intrinsic.
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition ISDOpcodes.h:213
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:556
@ LOOP_DEPENDENCE_WAR_MASK
The llvm.loop.dependence.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM.
Flag
These should be considered private to the implementation of the MCInstrDesc class.
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
bool match(Val *V, const Pattern &P)
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
TwoOps_match< Val_t, Idx_t, Instruction::ExtractElement > m_ExtractElt(const Val_t &Val, const Idx_t &Idx)
Matches ExtractElementInst.
IntrinsicID_match m_VScale()
Matches a call to llvm.vscale().
auto m_Value()
Match an arbitrary value and ignore it.
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
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.
@ 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:313
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
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:144
generic_gep_type_iterator<> gep_type_iterator
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
ISD::CondCode getFCmpCondCode(FCmpInst::Predicate Pred)
getFCmpCondCode - Return the ISD condition code corresponding to the given LLVM IR floating-point con...
Definition Analysis.cpp:203
LLVM_ABI EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
LLVM_ABI Value * salvageDebugInfoImpl(Instruction &I, uint64_t CurrentLocOps, SmallVectorImpl< uint64_t > &Ops, SmallVectorImpl< Value * > &AdditionalValues)
Definition Local.cpp:2289
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Global
Append to llvm.global_dtors.
AtomicOrdering
Atomic ordering for LLVM's memory model.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
bool isFuncletEHPersonality(EHPersonality Pers)
Returns true if this is a personality function that invokes handler funclets (which must return to it...
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:221
LLVM_ABI bool isAssignmentTrackingEnabled(const Module &M)
Return true if assignment tracking is enabled for module M.
LLVM_ABI llvm::SmallVector< int, 16 > createInterleaveMask(unsigned VF, unsigned NumVecs)
Create an interleave shuffle mask.
@ UMin
Unsigned integer min implemented in terms of select(cmp()).
@ Or
Bitwise or logical OR of integers.
@ Mul
Product of integers.
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
@ 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:345
@ Default
The result value is 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)