LLVM 22.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"
57#include "llvm/IR/Argument.h"
58#include "llvm/IR/Attributes.h"
59#include "llvm/IR/BasicBlock.h"
60#include "llvm/IR/CFG.h"
61#include "llvm/IR/CallingConv.h"
62#include "llvm/IR/Constant.h"
64#include "llvm/IR/Constants.h"
65#include "llvm/IR/DataLayout.h"
66#include "llvm/IR/DebugInfo.h"
71#include "llvm/IR/Function.h"
73#include "llvm/IR/InlineAsm.h"
74#include "llvm/IR/InstrTypes.h"
77#include "llvm/IR/Intrinsics.h"
78#include "llvm/IR/IntrinsicsAArch64.h"
79#include "llvm/IR/IntrinsicsAMDGPU.h"
80#include "llvm/IR/IntrinsicsWebAssembly.h"
81#include "llvm/IR/LLVMContext.h"
83#include "llvm/IR/Metadata.h"
84#include "llvm/IR/Module.h"
85#include "llvm/IR/Operator.h"
87#include "llvm/IR/Statepoint.h"
88#include "llvm/IR/Type.h"
89#include "llvm/IR/User.h"
90#include "llvm/IR/Value.h"
91#include "llvm/MC/MCContext.h"
96#include "llvm/Support/Debug.h"
104#include <cstddef>
105#include <limits>
106#include <optional>
107#include <tuple>
108
109using namespace llvm;
110using namespace PatternMatch;
111using namespace SwitchCG;
112
113#define DEBUG_TYPE "isel"
114
115/// LimitFloatPrecision - Generate low-precision inline sequences for
116/// some float libcalls (6, 8 or 12 bits).
117static unsigned LimitFloatPrecision;
118
119static cl::opt<bool>
120 InsertAssertAlign("insert-assert-align", cl::init(true),
121 cl::desc("Insert the experimental `assertalign` node."),
123
125 LimitFPPrecision("limit-float-precision",
126 cl::desc("Generate low-precision inline sequences "
127 "for some float libcalls"),
129 cl::init(0));
130
132 "switch-peel-threshold", cl::Hidden, cl::init(66),
133 cl::desc("Set the case probability threshold for peeling the case from a "
134 "switch statement. A value greater than 100 will void this "
135 "optimization"));
136
137// Limit the width of DAG chains. This is important in general to prevent
138// DAG-based analysis from blowing up. For example, alias analysis and
139// load clustering may not complete in reasonable time. It is difficult to
140// recognize and avoid this situation within each individual analysis, and
141// future analyses are likely to have the same behavior. Limiting DAG width is
142// the safe approach and will be especially important with global DAGs.
143//
144// MaxParallelChains default is arbitrarily high to avoid affecting
145// optimization, but could be lowered to improve compile time. Any ld-ld-st-st
146// sequence over this should have been converted to llvm.memcpy by the
147// frontend. It is easy to induce this behavior with .ll code such as:
148// %buffer = alloca [4096 x i8]
149// %data = load [4096 x i8]* %argPtr
150// store [4096 x i8] %data, [4096 x i8]* %buffer
151static const unsigned MaxParallelChains = 64;
152
154 const SDValue *Parts, unsigned NumParts,
155 MVT PartVT, EVT ValueVT, const Value *V,
156 SDValue InChain,
157 std::optional<CallingConv::ID> CC);
158
159/// getCopyFromParts - Create a value that contains the specified legal parts
160/// combined into the value they represent. If the parts combine to a type
161/// larger than ValueVT then AssertOp can be used to specify whether the extra
162/// bits are known to be zero (ISD::AssertZext) or sign extended from ValueVT
163/// (ISD::AssertSext).
164static SDValue
165getCopyFromParts(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts,
166 unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V,
167 SDValue InChain,
168 std::optional<CallingConv::ID> CC = std::nullopt,
169 std::optional<ISD::NodeType> AssertOp = std::nullopt) {
170 // Let the target assemble the parts if it wants to
171 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
172 if (SDValue Val = TLI.joinRegisterPartsIntoValue(DAG, DL, Parts, NumParts,
173 PartVT, ValueVT, CC))
174 return Val;
175
176 if (ValueVT.isVector())
177 return getCopyFromPartsVector(DAG, DL, Parts, NumParts, PartVT, ValueVT, V,
178 InChain, CC);
179
180 assert(NumParts > 0 && "No parts to assemble!");
181 SDValue Val = Parts[0];
182
183 if (NumParts > 1) {
184 // Assemble the value from multiple parts.
185 if (ValueVT.isInteger()) {
186 unsigned PartBits = PartVT.getSizeInBits();
187 unsigned ValueBits = ValueVT.getSizeInBits();
188
189 // Assemble the power of 2 part.
190 unsigned RoundParts = llvm::bit_floor(NumParts);
191 unsigned RoundBits = PartBits * RoundParts;
192 EVT RoundVT = RoundBits == ValueBits ?
193 ValueVT : EVT::getIntegerVT(*DAG.getContext(), RoundBits);
194 SDValue Lo, Hi;
195
196 EVT HalfVT = EVT::getIntegerVT(*DAG.getContext(), RoundBits/2);
197
198 if (RoundParts > 2) {
199 Lo = getCopyFromParts(DAG, DL, Parts, RoundParts / 2, PartVT, HalfVT, V,
200 InChain);
201 Hi = getCopyFromParts(DAG, DL, Parts + RoundParts / 2, RoundParts / 2,
202 PartVT, HalfVT, V, InChain);
203 } else {
204 Lo = DAG.getNode(ISD::BITCAST, DL, HalfVT, Parts[0]);
205 Hi = DAG.getNode(ISD::BITCAST, DL, HalfVT, Parts[1]);
206 }
207
208 if (DAG.getDataLayout().isBigEndian())
209 std::swap(Lo, Hi);
210
211 Val = DAG.getNode(ISD::BUILD_PAIR, DL, RoundVT, Lo, Hi);
212
213 if (RoundParts < NumParts) {
214 // Assemble the trailing non-power-of-2 part.
215 unsigned OddParts = NumParts - RoundParts;
216 EVT OddVT = EVT::getIntegerVT(*DAG.getContext(), OddParts * PartBits);
217 Hi = getCopyFromParts(DAG, DL, Parts + RoundParts, OddParts, PartVT,
218 OddVT, V, InChain, CC);
219
220 // Combine the round and odd parts.
221 Lo = Val;
222 if (DAG.getDataLayout().isBigEndian())
223 std::swap(Lo, Hi);
224 EVT TotalVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
225 Hi = DAG.getNode(ISD::ANY_EXTEND, DL, TotalVT, Hi);
226 Hi = DAG.getNode(
227 ISD::SHL, DL, TotalVT, Hi,
228 DAG.getShiftAmountConstant(Lo.getValueSizeInBits(), TotalVT, DL));
229 Lo = DAG.getNode(ISD::ZERO_EXTEND, DL, TotalVT, Lo);
230 Val = DAG.getNode(ISD::OR, DL, TotalVT, Lo, Hi);
231 }
232 } else if (PartVT.isFloatingPoint()) {
233 // FP split into multiple FP parts (for ppcf128)
234 assert(ValueVT == EVT(MVT::ppcf128) && PartVT == MVT::f64 &&
235 "Unexpected split");
236 SDValue Lo, Hi;
237 Lo = DAG.getNode(ISD::BITCAST, DL, EVT(MVT::f64), Parts[0]);
238 Hi = DAG.getNode(ISD::BITCAST, DL, EVT(MVT::f64), Parts[1]);
239 if (TLI.hasBigEndianPartOrdering(ValueVT, DAG.getDataLayout()))
240 std::swap(Lo, Hi);
241 Val = DAG.getNode(ISD::BUILD_PAIR, DL, ValueVT, Lo, Hi);
242 } else {
243 // FP split into integer parts (soft fp)
244 assert(ValueVT.isFloatingPoint() && PartVT.isInteger() &&
245 !PartVT.isVector() && "Unexpected split");
246 EVT IntVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
247 Val = getCopyFromParts(DAG, DL, Parts, NumParts, PartVT, IntVT, V,
248 InChain, CC);
249 }
250 }
251
252 // There is now one part, held in Val. Correct it to match ValueVT.
253 // PartEVT is the type of the register class that holds the value.
254 // ValueVT is the type of the inline asm operation.
255 EVT PartEVT = Val.getValueType();
256
257 if (PartEVT == ValueVT)
258 return Val;
259
260 if (PartEVT.isInteger() && ValueVT.isFloatingPoint() &&
261 ValueVT.bitsLT(PartEVT)) {
262 // For an FP value in an integer part, we need to truncate to the right
263 // width first.
264 PartEVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
265 Val = DAG.getNode(ISD::TRUNCATE, DL, PartEVT, Val);
266 }
267
268 // Handle types that have the same size.
269 if (PartEVT.getSizeInBits() == ValueVT.getSizeInBits())
270 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
271
272 // Handle types with different sizes.
273 if (PartEVT.isInteger() && ValueVT.isInteger()) {
274 if (ValueVT.bitsLT(PartEVT)) {
275 // For a truncate, see if we have any information to
276 // indicate whether the truncated bits will always be
277 // zero or sign-extension.
278 if (AssertOp)
279 Val = DAG.getNode(*AssertOp, DL, PartEVT, Val,
280 DAG.getValueType(ValueVT));
281 return DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
282 }
283 return DAG.getNode(ISD::ANY_EXTEND, DL, ValueVT, Val);
284 }
285
286 if (PartEVT.isFloatingPoint() && ValueVT.isFloatingPoint()) {
287 // FP_ROUND's are always exact here.
288 if (ValueVT.bitsLT(Val.getValueType())) {
289
290 SDValue NoChange =
292
293 if (DAG.getMachineFunction().getFunction().getAttributes().hasFnAttr(
294 llvm::Attribute::StrictFP)) {
295 return DAG.getNode(ISD::STRICT_FP_ROUND, DL,
296 DAG.getVTList(ValueVT, MVT::Other), InChain, Val,
297 NoChange);
298 }
299
300 return DAG.getNode(ISD::FP_ROUND, DL, ValueVT, Val, NoChange);
301 }
302
303 return DAG.getNode(ISD::FP_EXTEND, DL, ValueVT, Val);
304 }
305
306 // Handle MMX to a narrower integer type by bitcasting MMX to integer and
307 // then truncating.
308 if (PartEVT == MVT::x86mmx && ValueVT.isInteger() &&
309 ValueVT.bitsLT(PartEVT)) {
310 Val = DAG.getNode(ISD::BITCAST, DL, MVT::i64, Val);
311 return DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
312 }
313
314 report_fatal_error("Unknown mismatch in getCopyFromParts!");
315}
316
318 const Twine &ErrMsg) {
320 if (!I)
321 return Ctx.emitError(ErrMsg);
322
323 if (const CallInst *CI = dyn_cast<CallInst>(I))
324 if (CI->isInlineAsm()) {
325 return Ctx.diagnose(DiagnosticInfoInlineAsm(
326 *CI, ErrMsg + ", possible invalid constraint for vector type"));
327 }
328
329 return Ctx.emitError(I, ErrMsg);
330}
331
332/// getCopyFromPartsVector - Create a value that contains the specified legal
333/// parts combined into the value they represent. If the parts combine to a
334/// type larger than ValueVT then AssertOp can be used to specify whether the
335/// extra bits are known to be zero (ISD::AssertZext) or sign extended from
336/// ValueVT (ISD::AssertSext).
338 const SDValue *Parts, unsigned NumParts,
339 MVT PartVT, EVT ValueVT, const Value *V,
340 SDValue InChain,
341 std::optional<CallingConv::ID> CallConv) {
342 assert(ValueVT.isVector() && "Not a vector value");
343 assert(NumParts > 0 && "No parts to assemble!");
344 const bool IsABIRegCopy = CallConv.has_value();
345
346 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
347 SDValue Val = Parts[0];
348
349 // Handle a multi-element vector.
350 if (NumParts > 1) {
351 EVT IntermediateVT;
352 MVT RegisterVT;
353 unsigned NumIntermediates;
354 unsigned NumRegs;
355
356 if (IsABIRegCopy) {
358 *DAG.getContext(), *CallConv, ValueVT, IntermediateVT,
359 NumIntermediates, RegisterVT);
360 } else {
361 NumRegs =
362 TLI.getVectorTypeBreakdown(*DAG.getContext(), ValueVT, IntermediateVT,
363 NumIntermediates, RegisterVT);
364 }
365
366 assert(NumRegs == NumParts && "Part count doesn't match vector breakdown!");
367 NumParts = NumRegs; // Silence a compiler warning.
368 assert(RegisterVT == PartVT && "Part type doesn't match vector breakdown!");
369 assert(RegisterVT.getSizeInBits() ==
370 Parts[0].getSimpleValueType().getSizeInBits() &&
371 "Part type sizes don't match!");
372
373 // Assemble the parts into intermediate operands.
374 SmallVector<SDValue, 8> Ops(NumIntermediates);
375 if (NumIntermediates == NumParts) {
376 // If the register was not expanded, truncate or copy the value,
377 // as appropriate.
378 for (unsigned i = 0; i != NumParts; ++i)
379 Ops[i] = getCopyFromParts(DAG, DL, &Parts[i], 1, PartVT, IntermediateVT,
380 V, InChain, CallConv);
381 } else if (NumParts > 0) {
382 // If the intermediate type was expanded, build the intermediate
383 // operands from the parts.
384 assert(NumParts % NumIntermediates == 0 &&
385 "Must expand into a divisible number of parts!");
386 unsigned Factor = NumParts / NumIntermediates;
387 for (unsigned i = 0; i != NumIntermediates; ++i)
388 Ops[i] = getCopyFromParts(DAG, DL, &Parts[i * Factor], Factor, PartVT,
389 IntermediateVT, V, InChain, CallConv);
390 }
391
392 // Build a vector with BUILD_VECTOR or CONCAT_VECTORS from the
393 // intermediate operands.
394 EVT BuiltVectorTy =
395 IntermediateVT.isVector()
397 *DAG.getContext(), IntermediateVT.getScalarType(),
398 IntermediateVT.getVectorElementCount() * NumParts)
400 IntermediateVT.getScalarType(),
401 NumIntermediates);
402 Val = DAG.getNode(IntermediateVT.isVector() ? ISD::CONCAT_VECTORS
404 DL, BuiltVectorTy, Ops);
405 }
406
407 // There is now one part, held in Val. Correct it to match ValueVT.
408 EVT PartEVT = Val.getValueType();
409
410 if (PartEVT == ValueVT)
411 return Val;
412
413 if (PartEVT.isVector()) {
414 // Vector/Vector bitcast.
415 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits())
416 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
417
418 // If the parts vector has more elements than the value vector, then we
419 // have a vector widening case (e.g. <2 x float> -> <4 x float>).
420 // Extract the elements we want.
421 if (PartEVT.getVectorElementCount() != ValueVT.getVectorElementCount()) {
424 (PartEVT.getVectorElementCount().isScalable() ==
425 ValueVT.getVectorElementCount().isScalable()) &&
426 "Cannot narrow, it would be a lossy transformation");
427 PartEVT =
429 ValueVT.getVectorElementCount());
430 Val = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, PartEVT, Val,
431 DAG.getVectorIdxConstant(0, DL));
432 if (PartEVT == ValueVT)
433 return Val;
434 if (PartEVT.isInteger() && ValueVT.isFloatingPoint())
435 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
436
437 // Vector/Vector bitcast (e.g. <2 x bfloat> -> <2 x half>).
438 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits())
439 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
440 }
441
442 // Promoted vector extract
443 return DAG.getAnyExtOrTrunc(Val, DL, ValueVT);
444 }
445
446 // Trivial bitcast if the types are the same size and the destination
447 // vector type is legal.
448 if (PartEVT.getSizeInBits() == ValueVT.getSizeInBits() &&
449 TLI.isTypeLegal(ValueVT))
450 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
451
452 if (ValueVT.getVectorNumElements() != 1) {
453 // Certain ABIs require that vectors are passed as integers. For vectors
454 // are the same size, this is an obvious bitcast.
455 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits()) {
456 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
457 } else if (ValueVT.bitsLT(PartEVT)) {
458 const uint64_t ValueSize = ValueVT.getFixedSizeInBits();
459 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
460 // Drop the extra bits.
461 Val = DAG.getNode(ISD::TRUNCATE, DL, IntermediateType, Val);
462 return DAG.getBitcast(ValueVT, Val);
463 }
464
466 *DAG.getContext(), V, "non-trivial scalar-to-vector conversion");
467 return DAG.getUNDEF(ValueVT);
468 }
469
470 // Handle cases such as i8 -> <1 x i1>
471 EVT ValueSVT = ValueVT.getVectorElementType();
472 if (ValueVT.getVectorNumElements() == 1 && ValueSVT != PartEVT) {
473 unsigned ValueSize = ValueSVT.getSizeInBits();
474 if (ValueSize == PartEVT.getSizeInBits()) {
475 Val = DAG.getNode(ISD::BITCAST, DL, ValueSVT, Val);
476 } else if (ValueSVT.isFloatingPoint() && PartEVT.isInteger()) {
477 // It's possible a scalar floating point type gets softened to integer and
478 // then promoted to a larger integer. If PartEVT is the larger integer
479 // we need to truncate it and then bitcast to the FP type.
480 assert(ValueSVT.bitsLT(PartEVT) && "Unexpected types");
481 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
482 Val = DAG.getNode(ISD::TRUNCATE, DL, IntermediateType, Val);
483 Val = DAG.getBitcast(ValueSVT, Val);
484 } else {
485 Val = ValueVT.isFloatingPoint()
486 ? DAG.getFPExtendOrRound(Val, DL, ValueSVT)
487 : DAG.getAnyExtOrTrunc(Val, DL, ValueSVT);
488 }
489 }
490
491 return DAG.getBuildVector(ValueVT, DL, Val);
492}
493
494static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &dl,
495 SDValue Val, SDValue *Parts, unsigned NumParts,
496 MVT PartVT, const Value *V,
497 std::optional<CallingConv::ID> CallConv);
498
499/// getCopyToParts - Create a series of nodes that contain the specified value
500/// split into legal parts. If the parts contain more bits than Val, then, for
501/// integers, ExtendKind can be used to specify how to generate the extra bits.
502static void
504 unsigned NumParts, MVT PartVT, const Value *V,
505 std::optional<CallingConv::ID> CallConv = std::nullopt,
506 ISD::NodeType ExtendKind = ISD::ANY_EXTEND) {
507 // Let the target split the parts if it wants to
508 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
509 if (TLI.splitValueIntoRegisterParts(DAG, DL, Val, Parts, NumParts, PartVT,
510 CallConv))
511 return;
512 EVT ValueVT = Val.getValueType();
513
514 // Handle the vector case separately.
515 if (ValueVT.isVector())
516 return getCopyToPartsVector(DAG, DL, Val, Parts, NumParts, PartVT, V,
517 CallConv);
518
519 unsigned OrigNumParts = NumParts;
521 "Copying to an illegal type!");
522
523 if (NumParts == 0)
524 return;
525
526 assert(!ValueVT.isVector() && "Vector case handled elsewhere");
527 EVT PartEVT = PartVT;
528 if (PartEVT == ValueVT) {
529 assert(NumParts == 1 && "No-op copy with multiple parts!");
530 Parts[0] = Val;
531 return;
532 }
533
534 unsigned PartBits = PartVT.getSizeInBits();
535 if (NumParts * PartBits > ValueVT.getSizeInBits()) {
536 // If the parts cover more bits than the value has, promote the value.
537 if (PartVT.isFloatingPoint() && ValueVT.isFloatingPoint()) {
538 assert(NumParts == 1 && "Do not know what to promote to!");
539 Val = DAG.getNode(ISD::FP_EXTEND, DL, PartVT, Val);
540 } else {
541 if (ValueVT.isFloatingPoint()) {
542 // FP values need to be bitcast, then extended if they are being put
543 // into a larger container.
544 ValueVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
545 Val = DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
546 }
547 assert((PartVT.isInteger() || PartVT == MVT::x86mmx) &&
548 ValueVT.isInteger() &&
549 "Unknown mismatch!");
550 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
551 Val = DAG.getNode(ExtendKind, DL, ValueVT, Val);
552 if (PartVT == MVT::x86mmx)
553 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
554 }
555 } else if (PartBits == ValueVT.getSizeInBits()) {
556 // Different types of the same size.
557 assert(NumParts == 1 && PartEVT != ValueVT);
558 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
559 } else if (NumParts * PartBits < ValueVT.getSizeInBits()) {
560 // If the parts cover less bits than value has, truncate the value.
561 assert((PartVT.isInteger() || PartVT == MVT::x86mmx) &&
562 ValueVT.isInteger() &&
563 "Unknown mismatch!");
564 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
565 Val = DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
566 if (PartVT == MVT::x86mmx)
567 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
568 }
569
570 // The value may have changed - recompute ValueVT.
571 ValueVT = Val.getValueType();
572 assert(NumParts * PartBits == ValueVT.getSizeInBits() &&
573 "Failed to tile the value with PartVT!");
574
575 if (NumParts == 1) {
576 if (PartEVT != ValueVT) {
578 "scalar-to-vector conversion failed");
579 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
580 }
581
582 Parts[0] = Val;
583 return;
584 }
585
586 // Expand the value into multiple parts.
587 if (NumParts & (NumParts - 1)) {
588 // The number of parts is not a power of 2. Split off and copy the tail.
589 assert(PartVT.isInteger() && ValueVT.isInteger() &&
590 "Do not know what to expand to!");
591 unsigned RoundParts = llvm::bit_floor(NumParts);
592 unsigned RoundBits = RoundParts * PartBits;
593 unsigned OddParts = NumParts - RoundParts;
594 SDValue OddVal = DAG.getNode(ISD::SRL, DL, ValueVT, Val,
595 DAG.getShiftAmountConstant(RoundBits, ValueVT, DL));
596
597 getCopyToParts(DAG, DL, OddVal, Parts + RoundParts, OddParts, PartVT, V,
598 CallConv);
599
600 if (DAG.getDataLayout().isBigEndian())
601 // The odd parts were reversed by getCopyToParts - unreverse them.
602 std::reverse(Parts + RoundParts, Parts + NumParts);
603
604 NumParts = RoundParts;
605 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
606 Val = DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
607 }
608
609 // The number of parts is a power of 2. Repeatedly bisect the value using
610 // EXTRACT_ELEMENT.
611 Parts[0] = DAG.getNode(ISD::BITCAST, DL,
613 ValueVT.getSizeInBits()),
614 Val);
615
616 for (unsigned StepSize = NumParts; StepSize > 1; StepSize /= 2) {
617 for (unsigned i = 0; i < NumParts; i += StepSize) {
618 unsigned ThisBits = StepSize * PartBits / 2;
619 EVT ThisVT = EVT::getIntegerVT(*DAG.getContext(), ThisBits);
620 SDValue &Part0 = Parts[i];
621 SDValue &Part1 = Parts[i+StepSize/2];
622
623 Part1 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL,
624 ThisVT, Part0, DAG.getIntPtrConstant(1, DL));
625 Part0 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL,
626 ThisVT, Part0, DAG.getIntPtrConstant(0, DL));
627
628 if (ThisBits == PartBits && ThisVT != PartVT) {
629 Part0 = DAG.getNode(ISD::BITCAST, DL, PartVT, Part0);
630 Part1 = DAG.getNode(ISD::BITCAST, DL, PartVT, Part1);
631 }
632 }
633 }
634
635 if (DAG.getDataLayout().isBigEndian())
636 std::reverse(Parts, Parts + OrigNumParts);
637}
638
640 const SDLoc &DL, EVT PartVT) {
641 if (!PartVT.isVector())
642 return SDValue();
643
644 EVT ValueVT = Val.getValueType();
645 EVT PartEVT = PartVT.getVectorElementType();
646 EVT ValueEVT = ValueVT.getVectorElementType();
647 ElementCount PartNumElts = PartVT.getVectorElementCount();
648 ElementCount ValueNumElts = ValueVT.getVectorElementCount();
649
650 // We only support widening vectors with equivalent element types and
651 // fixed/scalable properties. If a target needs to widen a fixed-length type
652 // to a scalable one, it should be possible to use INSERT_SUBVECTOR below.
653 if (ElementCount::isKnownLE(PartNumElts, ValueNumElts) ||
654 PartNumElts.isScalable() != ValueNumElts.isScalable())
655 return SDValue();
656
657 // Have a try for bf16 because some targets share its ABI with fp16.
658 if (ValueEVT == MVT::bf16 && PartEVT == MVT::f16) {
660 "Cannot widen to illegal type");
661 Val = DAG.getNode(ISD::BITCAST, DL,
662 ValueVT.changeVectorElementType(MVT::f16), Val);
663 } else if (PartEVT != ValueEVT) {
664 return SDValue();
665 }
666
667 // Widening a scalable vector to another scalable vector is done by inserting
668 // the vector into a larger undef one.
669 if (PartNumElts.isScalable())
670 return DAG.getNode(ISD::INSERT_SUBVECTOR, DL, PartVT, DAG.getUNDEF(PartVT),
671 Val, DAG.getVectorIdxConstant(0, DL));
672
673 // Vector widening case, e.g. <2 x float> -> <4 x float>. Shuffle in
674 // undef elements.
676 DAG.ExtractVectorElements(Val, Ops);
677 SDValue EltUndef = DAG.getUNDEF(PartEVT);
678 Ops.append((PartNumElts - ValueNumElts).getFixedValue(), EltUndef);
679
680 // FIXME: Use CONCAT for 2x -> 4x.
681 return DAG.getBuildVector(PartVT, DL, Ops);
682}
683
684/// getCopyToPartsVector - Create a series of nodes that contain the specified
685/// value split into legal parts.
686static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &DL,
687 SDValue Val, SDValue *Parts, unsigned NumParts,
688 MVT PartVT, const Value *V,
689 std::optional<CallingConv::ID> CallConv) {
690 EVT ValueVT = Val.getValueType();
691 assert(ValueVT.isVector() && "Not a vector");
692 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
693 const bool IsABIRegCopy = CallConv.has_value();
694
695 if (NumParts == 1) {
696 EVT PartEVT = PartVT;
697 if (PartEVT == ValueVT) {
698 // Nothing to do.
699 } else if (PartVT.getSizeInBits() == ValueVT.getSizeInBits()) {
700 // Bitconvert vector->vector case.
701 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
702 } else if (SDValue Widened = widenVectorToPartType(DAG, Val, DL, PartVT)) {
703 Val = Widened;
704 } else if (PartVT.isVector() &&
706 ValueVT.getVectorElementType()) &&
707 PartEVT.getVectorElementCount() ==
708 ValueVT.getVectorElementCount()) {
709
710 // Promoted vector extract
711 Val = DAG.getAnyExtOrTrunc(Val, DL, PartVT);
712 } else if (PartEVT.isVector() &&
713 PartEVT.getVectorElementType() !=
714 ValueVT.getVectorElementType() &&
715 TLI.getTypeAction(*DAG.getContext(), ValueVT) ==
717 // Combination of widening and promotion.
718 EVT WidenVT =
720 PartVT.getVectorElementCount());
721 SDValue Widened = widenVectorToPartType(DAG, Val, DL, WidenVT);
722 Val = DAG.getAnyExtOrTrunc(Widened, DL, PartVT);
723 } else {
724 // Don't extract an integer from a float vector. This can happen if the
725 // FP type gets softened to integer and then promoted. The promotion
726 // prevents it from being picked up by the earlier bitcast case.
727 if (ValueVT.getVectorElementCount().isScalar() &&
728 (!ValueVT.isFloatingPoint() || !PartVT.isInteger())) {
729 // If we reach this condition and PartVT is FP, this means that
730 // ValueVT is also FP and both have a different size, otherwise we
731 // would have bitcasted them. Producing an EXTRACT_VECTOR_ELT here
732 // would be invalid since that would mean the smaller FP type has to
733 // be extended to the larger one.
734 if (PartVT.isFloatingPoint()) {
735 Val = DAG.getBitcast(ValueVT.getScalarType(), Val);
736 Val = DAG.getNode(ISD::FP_EXTEND, DL, PartVT, Val);
737 } else
738 Val = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, PartVT, Val,
739 DAG.getVectorIdxConstant(0, DL));
740 } else {
741 uint64_t ValueSize = ValueVT.getFixedSizeInBits();
742 assert(PartVT.getFixedSizeInBits() > ValueSize &&
743 "lossy conversion of vector to scalar type");
744 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
745 Val = DAG.getBitcast(IntermediateType, Val);
746 Val = DAG.getAnyExtOrTrunc(Val, DL, PartVT);
747 }
748 }
749
750 assert(Val.getValueType() == PartVT && "Unexpected vector part value type");
751 Parts[0] = Val;
752 return;
753 }
754
755 // Handle a multi-element vector.
756 EVT IntermediateVT;
757 MVT RegisterVT;
758 unsigned NumIntermediates;
759 unsigned NumRegs;
760 if (IsABIRegCopy) {
762 *DAG.getContext(), *CallConv, ValueVT, IntermediateVT, NumIntermediates,
763 RegisterVT);
764 } else {
765 NumRegs =
766 TLI.getVectorTypeBreakdown(*DAG.getContext(), ValueVT, IntermediateVT,
767 NumIntermediates, RegisterVT);
768 }
769
770 assert(NumRegs == NumParts && "Part count doesn't match vector breakdown!");
771 NumParts = NumRegs; // Silence a compiler warning.
772 assert(RegisterVT == PartVT && "Part type doesn't match vector breakdown!");
773
774 assert(IntermediateVT.isScalableVector() == ValueVT.isScalableVector() &&
775 "Mixing scalable and fixed vectors when copying in parts");
776
777 std::optional<ElementCount> DestEltCnt;
778
779 if (IntermediateVT.isVector())
780 DestEltCnt = IntermediateVT.getVectorElementCount() * NumIntermediates;
781 else
782 DestEltCnt = ElementCount::getFixed(NumIntermediates);
783
784 EVT BuiltVectorTy = EVT::getVectorVT(
785 *DAG.getContext(), IntermediateVT.getScalarType(), *DestEltCnt);
786
787 if (ValueVT == BuiltVectorTy) {
788 // Nothing to do.
789 } else if (ValueVT.getSizeInBits() == BuiltVectorTy.getSizeInBits()) {
790 // Bitconvert vector->vector case.
791 Val = DAG.getNode(ISD::BITCAST, DL, BuiltVectorTy, Val);
792 } else {
793 if (BuiltVectorTy.getVectorElementType().bitsGT(
794 ValueVT.getVectorElementType())) {
795 // Integer promotion.
796 ValueVT = EVT::getVectorVT(*DAG.getContext(),
797 BuiltVectorTy.getVectorElementType(),
798 ValueVT.getVectorElementCount());
799 Val = DAG.getNode(ISD::ANY_EXTEND, DL, ValueVT, Val);
800 }
801
802 if (SDValue Widened = widenVectorToPartType(DAG, Val, DL, BuiltVectorTy)) {
803 Val = Widened;
804 }
805 }
806
807 assert(Val.getValueType() == BuiltVectorTy && "Unexpected vector value type");
808
809 // Split the vector into intermediate operands.
810 SmallVector<SDValue, 8> Ops(NumIntermediates);
811 for (unsigned i = 0; i != NumIntermediates; ++i) {
812 if (IntermediateVT.isVector()) {
813 // This does something sensible for scalable vectors - see the
814 // definition of EXTRACT_SUBVECTOR for further details.
815 unsigned IntermediateNumElts = IntermediateVT.getVectorMinNumElements();
816 Ops[i] =
817 DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, IntermediateVT, Val,
818 DAG.getVectorIdxConstant(i * IntermediateNumElts, DL));
819 } else {
820 Ops[i] = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, IntermediateVT, Val,
821 DAG.getVectorIdxConstant(i, DL));
822 }
823 }
824
825 // Split the intermediate operands into legal parts.
826 if (NumParts == NumIntermediates) {
827 // If the register was not expanded, promote or copy the value,
828 // as appropriate.
829 for (unsigned i = 0; i != NumParts; ++i)
830 getCopyToParts(DAG, DL, Ops[i], &Parts[i], 1, PartVT, V, CallConv);
831 } else if (NumParts > 0) {
832 // If the intermediate type was expanded, split each the value into
833 // legal parts.
834 assert(NumIntermediates != 0 && "division by zero");
835 assert(NumParts % NumIntermediates == 0 &&
836 "Must expand into a divisible number of parts!");
837 unsigned Factor = NumParts / NumIntermediates;
838 for (unsigned i = 0; i != NumIntermediates; ++i)
839 getCopyToParts(DAG, DL, Ops[i], &Parts[i * Factor], Factor, PartVT, V,
840 CallConv);
841 }
842}
843
844static void failForInvalidBundles(const CallBase &I, StringRef Name,
845 ArrayRef<uint32_t> AllowedBundles) {
846 if (I.hasOperandBundlesOtherThan(AllowedBundles)) {
847 ListSeparator LS;
848 std::string Error;
850 for (unsigned i = 0, e = I.getNumOperandBundles(); i != e; ++i) {
851 OperandBundleUse U = I.getOperandBundleAt(i);
852 if (!is_contained(AllowedBundles, U.getTagID()))
853 OS << LS << U.getTagName();
854 }
856 Twine("cannot lower ", Name)
857 .concat(Twine(" with arbitrary operand bundles: ", Error)));
858 }
859}
860
862 EVT valuevt, std::optional<CallingConv::ID> CC)
863 : ValueVTs(1, valuevt), RegVTs(1, regvt), Regs(regs),
864 RegCount(1, regs.size()), CallConv(CC) {}
865
867 const DataLayout &DL, Register Reg, Type *Ty,
868 std::optional<CallingConv::ID> CC) {
869 ComputeValueVTs(TLI, DL, Ty, ValueVTs);
870
871 CallConv = CC;
872
873 for (EVT ValueVT : ValueVTs) {
874 unsigned NumRegs =
876 ? TLI.getNumRegistersForCallingConv(Context, *CC, ValueVT)
877 : TLI.getNumRegisters(Context, ValueVT);
878 MVT RegisterVT =
880 ? TLI.getRegisterTypeForCallingConv(Context, *CC, ValueVT)
881 : TLI.getRegisterType(Context, ValueVT);
882 for (unsigned i = 0; i != NumRegs; ++i)
883 Regs.push_back(Reg + i);
884 RegVTs.push_back(RegisterVT);
885 RegCount.push_back(NumRegs);
886 Reg = Reg.id() + NumRegs;
887 }
888}
889
891 FunctionLoweringInfo &FuncInfo,
892 const SDLoc &dl, SDValue &Chain,
893 SDValue *Glue, const Value *V) const {
894 // A Value with type {} or [0 x %t] needs no registers.
895 if (ValueVTs.empty())
896 return SDValue();
897
898 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
899
900 // Assemble the legal parts into the final values.
901 SmallVector<SDValue, 4> Values(ValueVTs.size());
903 for (unsigned Value = 0, Part = 0, e = ValueVTs.size(); Value != e; ++Value) {
904 // Copy the legal parts from the registers.
905 EVT ValueVT = ValueVTs[Value];
906 unsigned NumRegs = RegCount[Value];
907 MVT RegisterVT = isABIMangled()
909 *DAG.getContext(), *CallConv, RegVTs[Value])
910 : RegVTs[Value];
911
912 Parts.resize(NumRegs);
913 for (unsigned i = 0; i != NumRegs; ++i) {
914 SDValue P;
915 if (!Glue) {
916 P = DAG.getCopyFromReg(Chain, dl, Regs[Part+i], RegisterVT);
917 } else {
918 P = DAG.getCopyFromReg(Chain, dl, Regs[Part+i], RegisterVT, *Glue);
919 *Glue = P.getValue(2);
920 }
921
922 Chain = P.getValue(1);
923 Parts[i] = P;
924
925 // If the source register was virtual and if we know something about it,
926 // add an assert node.
927 if (!Regs[Part + i].isVirtual() || !RegisterVT.isInteger())
928 continue;
929
931 FuncInfo.GetLiveOutRegInfo(Regs[Part+i]);
932 if (!LOI)
933 continue;
934
935 unsigned RegSize = RegisterVT.getScalarSizeInBits();
936 unsigned NumSignBits = LOI->NumSignBits;
937 unsigned NumZeroBits = LOI->Known.countMinLeadingZeros();
938
939 if (NumZeroBits == RegSize) {
940 // The current value is a zero.
941 // Explicitly express that as it would be easier for
942 // optimizations to kick in.
943 Parts[i] = DAG.getConstant(0, dl, RegisterVT);
944 continue;
945 }
946
947 // FIXME: We capture more information than the dag can represent. For
948 // now, just use the tightest assertzext/assertsext possible.
949 bool isSExt;
950 EVT FromVT(MVT::Other);
951 if (NumZeroBits) {
952 FromVT = EVT::getIntegerVT(*DAG.getContext(), RegSize - NumZeroBits);
953 isSExt = false;
954 } else if (NumSignBits > 1) {
955 FromVT =
956 EVT::getIntegerVT(*DAG.getContext(), RegSize - NumSignBits + 1);
957 isSExt = true;
958 } else {
959 continue;
960 }
961 // Add an assertion node.
962 assert(FromVT != MVT::Other);
963 Parts[i] = DAG.getNode(isSExt ? ISD::AssertSext : ISD::AssertZext, dl,
964 RegisterVT, P, DAG.getValueType(FromVT));
965 }
966
967 Values[Value] = getCopyFromParts(DAG, dl, Parts.begin(), NumRegs,
968 RegisterVT, ValueVT, V, Chain, CallConv);
969 Part += NumRegs;
970 Parts.clear();
971 }
972
973 return DAG.getNode(ISD::MERGE_VALUES, dl, DAG.getVTList(ValueVTs), Values);
974}
975
977 const SDLoc &dl, SDValue &Chain, SDValue *Glue,
978 const Value *V,
979 ISD::NodeType PreferredExtendType) const {
980 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
981 ISD::NodeType ExtendKind = PreferredExtendType;
982
983 // Get the list of the values's legal parts.
984 unsigned NumRegs = Regs.size();
985 SmallVector<SDValue, 8> Parts(NumRegs);
986 for (unsigned Value = 0, Part = 0, e = ValueVTs.size(); Value != e; ++Value) {
987 unsigned NumParts = RegCount[Value];
988
989 MVT RegisterVT = isABIMangled()
991 *DAG.getContext(), *CallConv, RegVTs[Value])
992 : RegVTs[Value];
993
994 if (ExtendKind == ISD::ANY_EXTEND && TLI.isZExtFree(Val, RegisterVT))
995 ExtendKind = ISD::ZERO_EXTEND;
996
997 getCopyToParts(DAG, dl, Val.getValue(Val.getResNo() + Value), &Parts[Part],
998 NumParts, RegisterVT, V, CallConv, ExtendKind);
999 Part += NumParts;
1000 }
1001
1002 // Copy the parts into the registers.
1003 SmallVector<SDValue, 8> Chains(NumRegs);
1004 for (unsigned i = 0; i != NumRegs; ++i) {
1005 SDValue Part;
1006 if (!Glue) {
1007 Part = DAG.getCopyToReg(Chain, dl, Regs[i], Parts[i]);
1008 } else {
1009 Part = DAG.getCopyToReg(Chain, dl, Regs[i], Parts[i], *Glue);
1010 *Glue = Part.getValue(1);
1011 }
1012
1013 Chains[i] = Part.getValue(0);
1014 }
1015
1016 if (NumRegs == 1 || Glue)
1017 // If NumRegs > 1 && Glue is used then the use of the last CopyToReg is
1018 // flagged to it. That is the CopyToReg nodes and the user are considered
1019 // a single scheduling unit. If we create a TokenFactor and return it as
1020 // chain, then the TokenFactor is both a predecessor (operand) of the
1021 // user as well as a successor (the TF operands are flagged to the user).
1022 // c1, f1 = CopyToReg
1023 // c2, f2 = CopyToReg
1024 // c3 = TokenFactor c1, c2
1025 // ...
1026 // = op c3, ..., f2
1027 Chain = Chains[NumRegs-1];
1028 else
1029 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chains);
1030}
1031
1033 unsigned MatchingIdx, const SDLoc &dl,
1034 SelectionDAG &DAG,
1035 std::vector<SDValue> &Ops) const {
1036 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1037
1038 InlineAsm::Flag Flag(Code, Regs.size());
1039 if (HasMatching)
1040 Flag.setMatchingOp(MatchingIdx);
1041 else if (!Regs.empty() && Regs.front().isVirtual()) {
1042 // Put the register class of the virtual registers in the flag word. That
1043 // way, later passes can recompute register class constraints for inline
1044 // assembly as well as normal instructions.
1045 // Don't do this for tied operands that can use the regclass information
1046 // from the def.
1048 const TargetRegisterClass *RC = MRI.getRegClass(Regs.front());
1049 Flag.setRegClass(RC->getID());
1050 }
1051
1052 SDValue Res = DAG.getTargetConstant(Flag, dl, MVT::i32);
1053 Ops.push_back(Res);
1054
1055 if (Code == InlineAsm::Kind::Clobber) {
1056 // Clobbers should always have a 1:1 mapping with registers, and may
1057 // reference registers that have illegal (e.g. vector) types. Hence, we
1058 // shouldn't try to apply any sort of splitting logic to them.
1059 assert(Regs.size() == RegVTs.size() && Regs.size() == ValueVTs.size() &&
1060 "No 1:1 mapping from clobbers to regs?");
1062 (void)SP;
1063 for (unsigned I = 0, E = ValueVTs.size(); I != E; ++I) {
1064 Ops.push_back(DAG.getRegister(Regs[I], RegVTs[I]));
1065 assert(
1066 (Regs[I] != SP ||
1068 "If we clobbered the stack pointer, MFI should know about it.");
1069 }
1070 return;
1071 }
1072
1073 for (unsigned Value = 0, Reg = 0, e = ValueVTs.size(); Value != e; ++Value) {
1074 MVT RegisterVT = RegVTs[Value];
1075 unsigned NumRegs = TLI.getNumRegisters(*DAG.getContext(), ValueVTs[Value],
1076 RegisterVT);
1077 for (unsigned i = 0; i != NumRegs; ++i) {
1078 assert(Reg < Regs.size() && "Mismatch in # registers expected");
1079 Register TheReg = Regs[Reg++];
1080 Ops.push_back(DAG.getRegister(TheReg, RegisterVT));
1081 }
1082 }
1083}
1084
1088 unsigned I = 0;
1089 for (auto CountAndVT : zip_first(RegCount, RegVTs)) {
1090 unsigned RegCount = std::get<0>(CountAndVT);
1091 MVT RegisterVT = std::get<1>(CountAndVT);
1092 TypeSize RegisterSize = RegisterVT.getSizeInBits();
1093 for (unsigned E = I + RegCount; I != E; ++I)
1094 OutVec.push_back(std::make_pair(Regs[I], RegisterSize));
1095 }
1096 return OutVec;
1097}
1098
1100 AssumptionCache *ac,
1101 const TargetLibraryInfo *li) {
1102 BatchAA = aa;
1103 AC = ac;
1104 GFI = gfi;
1105 LibInfo = li;
1106 Context = DAG.getContext();
1107 LPadToCallSiteMap.clear();
1108 SL->init(DAG.getTargetLoweringInfo(), TM, DAG.getDataLayout());
1109 AssignmentTrackingEnabled = isAssignmentTrackingEnabled(
1110 *DAG.getMachineFunction().getFunction().getParent());
1111}
1112
1114 NodeMap.clear();
1115 UnusedArgNodeMap.clear();
1116 PendingLoads.clear();
1117 PendingExports.clear();
1118 PendingConstrainedFP.clear();
1119 PendingConstrainedFPStrict.clear();
1120 CurInst = nullptr;
1121 HasTailCall = false;
1122 SDNodeOrder = LowestSDNodeOrder;
1123 StatepointLowering.clear();
1124}
1125
1127 DanglingDebugInfoMap.clear();
1128}
1129
1130// Update DAG root to include dependencies on Pending chains.
1131SDValue SelectionDAGBuilder::updateRoot(SmallVectorImpl<SDValue> &Pending) {
1132 SDValue Root = DAG.getRoot();
1133
1134 if (Pending.empty())
1135 return Root;
1136
1137 // Add current root to PendingChains, unless we already indirectly
1138 // depend on it.
1139 if (Root.getOpcode() != ISD::EntryToken) {
1140 unsigned i = 0, e = Pending.size();
1141 for (; i != e; ++i) {
1142 assert(Pending[i].getNode()->getNumOperands() > 1);
1143 if (Pending[i].getNode()->getOperand(0) == Root)
1144 break; // Don't add the root if we already indirectly depend on it.
1145 }
1146
1147 if (i == e)
1148 Pending.push_back(Root);
1149 }
1150
1151 if (Pending.size() == 1)
1152 Root = Pending[0];
1153 else
1154 Root = DAG.getTokenFactor(getCurSDLoc(), Pending);
1155
1156 DAG.setRoot(Root);
1157 Pending.clear();
1158 return Root;
1159}
1160
1164
1166 // If the new exception behavior differs from that of the pending
1167 // ones, chain up them and update the root.
1168 switch (EB) {
1171 // Floating-point exceptions produced by such operations are not intended
1172 // to be observed, so the sequence of these operations does not need to be
1173 // preserved.
1174 //
1175 // They however must not be mixed with the instructions that have strict
1176 // exception behavior. Placing an operation with 'ebIgnore' behavior between
1177 // 'ebStrict' operations could distort the observed exception behavior.
1178 if (!PendingConstrainedFPStrict.empty()) {
1179 assert(PendingConstrainedFP.empty());
1180 updateRoot(PendingConstrainedFPStrict);
1181 }
1182 break;
1184 // Floating-point exception produced by these operations may be observed, so
1185 // they must be correctly chained. If trapping on FP exceptions is
1186 // disabled, the exceptions can be observed only by functions that read
1187 // exception flags, like 'llvm.get_fpenv' or 'fetestexcept'. It means that
1188 // the order of operations is not significant between barriers.
1189 //
1190 // If trapping is enabled, each operation becomes an implicit observation
1191 // point, so the operations must be sequenced according their original
1192 // source order.
1193 if (!PendingConstrainedFP.empty()) {
1194 assert(PendingConstrainedFPStrict.empty());
1195 updateRoot(PendingConstrainedFP);
1196 }
1197 // TODO: Add support for trapping-enabled scenarios.
1198 }
1199 return DAG.getRoot();
1200}
1201
1203 // Chain up all pending constrained intrinsics together with all
1204 // pending loads, by simply appending them to PendingLoads and
1205 // then calling getMemoryRoot().
1206 PendingLoads.reserve(PendingLoads.size() +
1207 PendingConstrainedFP.size() +
1208 PendingConstrainedFPStrict.size());
1209 PendingLoads.append(PendingConstrainedFP.begin(),
1210 PendingConstrainedFP.end());
1211 PendingLoads.append(PendingConstrainedFPStrict.begin(),
1212 PendingConstrainedFPStrict.end());
1213 PendingConstrainedFP.clear();
1214 PendingConstrainedFPStrict.clear();
1215 return getMemoryRoot();
1216}
1217
1219 // We need to emit pending fpexcept.strict constrained intrinsics,
1220 // so append them to the PendingExports list.
1221 PendingExports.append(PendingConstrainedFPStrict.begin(),
1222 PendingConstrainedFPStrict.end());
1223 PendingConstrainedFPStrict.clear();
1224 return updateRoot(PendingExports);
1225}
1226
1228 DILocalVariable *Variable,
1230 DebugLoc DL) {
1231 assert(Variable && "Missing variable");
1232
1233 // Check if address has undef value.
1234 if (!Address || isa<UndefValue>(Address) ||
1235 (Address->use_empty() && !isa<Argument>(Address))) {
1236 LLVM_DEBUG(
1237 dbgs()
1238 << "dbg_declare: Dropping debug info (bad/undef/unused-arg address)\n");
1239 return;
1240 }
1241
1242 bool IsParameter = Variable->isParameter() || isa<Argument>(Address);
1243
1244 SDValue &N = NodeMap[Address];
1245 if (!N.getNode() && isa<Argument>(Address))
1246 // Check unused arguments map.
1247 N = UnusedArgNodeMap[Address];
1248 SDDbgValue *SDV;
1249 if (N.getNode()) {
1250 if (const BitCastInst *BCI = dyn_cast<BitCastInst>(Address))
1251 Address = BCI->getOperand(0);
1252 // Parameters are handled specially.
1253 auto *FINode = dyn_cast<FrameIndexSDNode>(N.getNode());
1254 if (IsParameter && FINode) {
1255 // Byval parameter. We have a frame index at this point.
1256 SDV = DAG.getFrameIndexDbgValue(Variable, Expression, FINode->getIndex(),
1257 /*IsIndirect*/ true, DL, SDNodeOrder);
1258 } else if (isa<Argument>(Address)) {
1259 // Address is an argument, so try to emit its dbg value using
1260 // virtual register info from the FuncInfo.ValueMap.
1261 EmitFuncArgumentDbgValue(Address, Variable, Expression, DL,
1262 FuncArgumentDbgValueKind::Declare, N);
1263 return;
1264 } else {
1265 SDV = DAG.getDbgValue(Variable, Expression, N.getNode(), N.getResNo(),
1266 true, DL, SDNodeOrder);
1267 }
1268 DAG.AddDbgValue(SDV, IsParameter);
1269 } else {
1270 // If Address is an argument then try to emit its dbg value using
1271 // virtual register info from the FuncInfo.ValueMap.
1272 if (!EmitFuncArgumentDbgValue(Address, Variable, Expression, DL,
1273 FuncArgumentDbgValueKind::Declare, N)) {
1274 LLVM_DEBUG(dbgs() << "dbg_declare: Dropping debug info"
1275 << " (could not emit func-arg dbg_value)\n");
1276 }
1277 }
1278}
1279
1281 // Add SDDbgValue nodes for any var locs here. Do so before updating
1282 // SDNodeOrder, as this mapping is {Inst -> Locs BEFORE Inst}.
1283 if (FunctionVarLocs const *FnVarLocs = DAG.getFunctionVarLocs()) {
1284 // Add SDDbgValue nodes for any var locs here. Do so before updating
1285 // SDNodeOrder, as this mapping is {Inst -> Locs BEFORE Inst}.
1286 for (auto It = FnVarLocs->locs_begin(&I), End = FnVarLocs->locs_end(&I);
1287 It != End; ++It) {
1288 auto *Var = FnVarLocs->getDILocalVariable(It->VariableID);
1289 dropDanglingDebugInfo(Var, It->Expr);
1290 if (It->Values.isKillLocation(It->Expr)) {
1291 handleKillDebugValue(Var, It->Expr, It->DL, SDNodeOrder);
1292 continue;
1293 }
1294 SmallVector<Value *> Values(It->Values.location_ops());
1295 if (!handleDebugValue(Values, Var, It->Expr, It->DL, SDNodeOrder,
1296 It->Values.hasArgList())) {
1297 SmallVector<Value *, 4> Vals(It->Values.location_ops());
1299 FnVarLocs->getDILocalVariable(It->VariableID),
1300 It->Expr, Vals.size() > 1, It->DL, SDNodeOrder);
1301 }
1302 }
1303 }
1304
1305 // We must skip DbgVariableRecords if they've already been processed above as
1306 // we have just emitted the debug values resulting from assignment tracking
1307 // analysis, making any existing DbgVariableRecords redundant (and probably
1308 // less correct). We still need to process DbgLabelRecords. This does sink
1309 // DbgLabelRecords to the bottom of the group of debug records. That sholdn't
1310 // be important as it does so deterministcally and ordering between
1311 // DbgLabelRecords and DbgVariableRecords is immaterial (other than for MIR/IR
1312 // printing).
1313 bool SkipDbgVariableRecords = DAG.getFunctionVarLocs();
1314 // Is there is any debug-info attached to this instruction, in the form of
1315 // DbgRecord non-instruction debug-info records.
1316 for (DbgRecord &DR : I.getDbgRecordRange()) {
1317 if (DbgLabelRecord *DLR = dyn_cast<DbgLabelRecord>(&DR)) {
1318 assert(DLR->getLabel() && "Missing label");
1319 SDDbgLabel *SDV =
1320 DAG.getDbgLabel(DLR->getLabel(), DLR->getDebugLoc(), SDNodeOrder);
1321 DAG.AddDbgLabel(SDV);
1322 continue;
1323 }
1324
1325 if (SkipDbgVariableRecords)
1326 continue;
1328 DILocalVariable *Variable = DVR.getVariable();
1331
1333 if (FuncInfo.PreprocessedDVRDeclares.contains(&DVR))
1334 continue;
1335 LLVM_DEBUG(dbgs() << "SelectionDAG visiting dbg_declare: " << DVR
1336 << "\n");
1338 DVR.getDebugLoc());
1339 continue;
1340 }
1341
1342 // A DbgVariableRecord with no locations is a kill location.
1344 if (Values.empty()) {
1346 SDNodeOrder);
1347 continue;
1348 }
1349
1350 // A DbgVariableRecord with an undef or absent location is also a kill
1351 // location.
1352 if (llvm::any_of(Values,
1353 [](Value *V) { return !V || isa<UndefValue>(V); })) {
1355 SDNodeOrder);
1356 continue;
1357 }
1358
1359 bool IsVariadic = DVR.hasArgList();
1360 if (!handleDebugValue(Values, Variable, Expression, DVR.getDebugLoc(),
1361 SDNodeOrder, IsVariadic)) {
1362 addDanglingDebugInfo(Values, Variable, Expression, IsVariadic,
1363 DVR.getDebugLoc(), SDNodeOrder);
1364 }
1365 }
1366}
1367
1369 visitDbgInfo(I);
1370
1371 // Set up outgoing PHI node register values before emitting the terminator.
1372 if (I.isTerminator()) {
1373 HandlePHINodesInSuccessorBlocks(I.getParent());
1374 }
1375
1376 ++SDNodeOrder;
1377 CurInst = &I;
1378
1379 // Set inserted listener only if required.
1380 bool NodeInserted = false;
1381 std::unique_ptr<SelectionDAG::DAGNodeInsertedListener> InsertedListener;
1382 MDNode *PCSectionsMD = I.getMetadata(LLVMContext::MD_pcsections);
1383 MDNode *MMRA = I.getMetadata(LLVMContext::MD_mmra);
1384 if (PCSectionsMD || MMRA) {
1385 InsertedListener = std::make_unique<SelectionDAG::DAGNodeInsertedListener>(
1386 DAG, [&](SDNode *) { NodeInserted = true; });
1387 }
1388
1389 visit(I.getOpcode(), I);
1390
1391 if (!I.isTerminator() && !HasTailCall &&
1392 !isa<GCStatepointInst>(I)) // statepoints handle their exports internally
1394
1395 // Handle metadata.
1396 if (PCSectionsMD || MMRA) {
1397 auto It = NodeMap.find(&I);
1398 if (It != NodeMap.end()) {
1399 if (PCSectionsMD)
1400 DAG.addPCSections(It->second.getNode(), PCSectionsMD);
1401 if (MMRA)
1402 DAG.addMMRAMetadata(It->second.getNode(), MMRA);
1403 } else if (NodeInserted) {
1404 // This should not happen; if it does, don't let it go unnoticed so we can
1405 // fix it. Relevant visit*() function is probably missing a setValue().
1406 errs() << "warning: loosing !pcsections and/or !mmra metadata ["
1407 << I.getModule()->getName() << "]\n";
1408 LLVM_DEBUG(I.dump());
1409 assert(false);
1410 }
1411 }
1412
1413 CurInst = nullptr;
1414}
1415
1416void SelectionDAGBuilder::visitPHI(const PHINode &) {
1417 llvm_unreachable("SelectionDAGBuilder shouldn't visit PHI nodes!");
1418}
1419
1420void SelectionDAGBuilder::visit(unsigned Opcode, const User &I) {
1421 // Note: this doesn't use InstVisitor, because it has to work with
1422 // ConstantExpr's in addition to instructions.
1423 switch (Opcode) {
1424 default: llvm_unreachable("Unknown instruction type encountered!");
1425 // Build the switch statement using the Instruction.def file.
1426#define HANDLE_INST(NUM, OPCODE, CLASS) \
1427 case Instruction::OPCODE: visit##OPCODE((const CLASS&)I); break;
1428#include "llvm/IR/Instruction.def"
1429 }
1430}
1431
1433 DILocalVariable *Variable,
1434 DebugLoc DL, unsigned Order,
1437 // For variadic dbg_values we will now insert poison.
1438 // FIXME: We can potentially recover these!
1440 for (const Value *V : Values) {
1441 auto *Poison = PoisonValue::get(V->getType());
1443 }
1444 SDDbgValue *SDV = DAG.getDbgValueList(Variable, Expression, Locs, {},
1445 /*IsIndirect=*/false, DL, Order,
1446 /*IsVariadic=*/true);
1447 DAG.AddDbgValue(SDV, /*isParameter=*/false);
1448 return true;
1449}
1450
1452 DILocalVariable *Var,
1453 DIExpression *Expr,
1454 bool IsVariadic, DebugLoc DL,
1455 unsigned Order) {
1456 if (IsVariadic) {
1457 handleDanglingVariadicDebugInfo(DAG, Var, DL, Order, Values, Expr);
1458 return;
1459 }
1460 // TODO: Dangling debug info will eventually either be resolved or produce
1461 // a poison DBG_VALUE. However in the resolution case, a gap may appear
1462 // between the original dbg.value location and its resolved DBG_VALUE,
1463 // which we should ideally fill with an extra poison DBG_VALUE.
1464 assert(Values.size() == 1);
1465 DanglingDebugInfoMap[Values[0]].emplace_back(Var, Expr, DL, Order);
1466}
1467
1469 const DIExpression *Expr) {
1470 auto isMatchingDbgValue = [&](DanglingDebugInfo &DDI) {
1471 DIVariable *DanglingVariable = DDI.getVariable();
1472 DIExpression *DanglingExpr = DDI.getExpression();
1473 if (DanglingVariable == Variable && Expr->fragmentsOverlap(DanglingExpr)) {
1474 LLVM_DEBUG(dbgs() << "Dropping dangling debug info for "
1475 << printDDI(nullptr, DDI) << "\n");
1476 return true;
1477 }
1478 return false;
1479 };
1480
1481 for (auto &DDIMI : DanglingDebugInfoMap) {
1482 DanglingDebugInfoVector &DDIV = DDIMI.second;
1483
1484 // If debug info is to be dropped, run it through final checks to see
1485 // whether it can be salvaged.
1486 for (auto &DDI : DDIV)
1487 if (isMatchingDbgValue(DDI))
1488 salvageUnresolvedDbgValue(DDIMI.first, DDI);
1489
1490 erase_if(DDIV, isMatchingDbgValue);
1491 }
1492}
1493
1494// resolveDanglingDebugInfo - if we saw an earlier dbg_value referring to V,
1495// generate the debug data structures now that we've seen its definition.
1497 SDValue Val) {
1498 auto DanglingDbgInfoIt = DanglingDebugInfoMap.find(V);
1499 if (DanglingDbgInfoIt == DanglingDebugInfoMap.end())
1500 return;
1501
1502 DanglingDebugInfoVector &DDIV = DanglingDbgInfoIt->second;
1503 for (auto &DDI : DDIV) {
1504 DebugLoc DL = DDI.getDebugLoc();
1505 unsigned ValSDNodeOrder = Val.getNode()->getIROrder();
1506 unsigned DbgSDNodeOrder = DDI.getSDNodeOrder();
1507 DILocalVariable *Variable = DDI.getVariable();
1508 DIExpression *Expr = DDI.getExpression();
1509 assert(Variable->isValidLocationForIntrinsic(DL) &&
1510 "Expected inlined-at fields to agree");
1511 SDDbgValue *SDV;
1512 if (Val.getNode()) {
1513 // FIXME: I doubt that it is correct to resolve a dangling DbgValue as a
1514 // FuncArgumentDbgValue (it would be hoisted to the function entry, and if
1515 // we couldn't resolve it directly when examining the DbgValue intrinsic
1516 // in the first place we should not be more successful here). Unless we
1517 // have some test case that prove this to be correct we should avoid
1518 // calling EmitFuncArgumentDbgValue here.
1519 if (!EmitFuncArgumentDbgValue(V, Variable, Expr, DL,
1520 FuncArgumentDbgValueKind::Value, Val)) {
1521 LLVM_DEBUG(dbgs() << "Resolve dangling debug info for "
1522 << printDDI(V, DDI) << "\n");
1523 LLVM_DEBUG(dbgs() << " By mapping to:\n "; Val.dump());
1524 // Increase the SDNodeOrder for the DbgValue here to make sure it is
1525 // inserted after the definition of Val when emitting the instructions
1526 // after ISel. An alternative could be to teach
1527 // ScheduleDAGSDNodes::EmitSchedule to delay the insertion properly.
1528 LLVM_DEBUG(if (ValSDNodeOrder > DbgSDNodeOrder) dbgs()
1529 << "changing SDNodeOrder from " << DbgSDNodeOrder << " to "
1530 << ValSDNodeOrder << "\n");
1531 SDV = getDbgValue(Val, Variable, Expr, DL,
1532 std::max(DbgSDNodeOrder, ValSDNodeOrder));
1533 DAG.AddDbgValue(SDV, false);
1534 } else
1535 LLVM_DEBUG(dbgs() << "Resolved dangling debug info for "
1536 << printDDI(V, DDI)
1537 << " in EmitFuncArgumentDbgValue\n");
1538 } else {
1539 LLVM_DEBUG(dbgs() << "Dropping debug info for " << printDDI(V, DDI)
1540 << "\n");
1541 auto Poison = PoisonValue::get(V->getType());
1542 auto SDV =
1543 DAG.getConstantDbgValue(Variable, Expr, Poison, DL, DbgSDNodeOrder);
1544 DAG.AddDbgValue(SDV, false);
1545 }
1546 }
1547 DDIV.clear();
1548}
1549
1551 DanglingDebugInfo &DDI) {
1552 // TODO: For the variadic implementation, instead of only checking the fail
1553 // state of `handleDebugValue`, we need know specifically which values were
1554 // invalid, so that we attempt to salvage only those values when processing
1555 // a DIArgList.
1556 const Value *OrigV = V;
1557 DILocalVariable *Var = DDI.getVariable();
1558 DIExpression *Expr = DDI.getExpression();
1559 DebugLoc DL = DDI.getDebugLoc();
1560 unsigned SDOrder = DDI.getSDNodeOrder();
1561
1562 // Currently we consider only dbg.value intrinsics -- we tell the salvager
1563 // that DW_OP_stack_value is desired.
1564 bool StackValue = true;
1565
1566 // Can this Value can be encoded without any further work?
1567 if (handleDebugValue(V, Var, Expr, DL, SDOrder, /*IsVariadic=*/false))
1568 return;
1569
1570 // Attempt to salvage back through as many instructions as possible. Bail if
1571 // a non-instruction is seen, such as a constant expression or global
1572 // variable. FIXME: Further work could recover those too.
1573 while (isa<Instruction>(V)) {
1574 const Instruction &VAsInst = *cast<const Instruction>(V);
1575 // Temporary "0", awaiting real implementation.
1577 SmallVector<Value *, 4> AdditionalValues;
1578 V = salvageDebugInfoImpl(const_cast<Instruction &>(VAsInst),
1579 Expr->getNumLocationOperands(), Ops,
1580 AdditionalValues);
1581 // If we cannot salvage any further, and haven't yet found a suitable debug
1582 // expression, bail out.
1583 if (!V)
1584 break;
1585
1586 // TODO: If AdditionalValues isn't empty, then the salvage can only be
1587 // represented with a DBG_VALUE_LIST, so we give up. When we have support
1588 // here for variadic dbg_values, remove that condition.
1589 if (!AdditionalValues.empty())
1590 break;
1591
1592 // New value and expr now represent this debuginfo.
1593 Expr = DIExpression::appendOpsToArg(Expr, Ops, 0, StackValue);
1594
1595 // Some kind of simplification occurred: check whether the operand of the
1596 // salvaged debug expression can be encoded in this DAG.
1597 if (handleDebugValue(V, Var, Expr, DL, SDOrder, /*IsVariadic=*/false)) {
1598 LLVM_DEBUG(
1599 dbgs() << "Salvaged debug location info for:\n " << *Var << "\n"
1600 << *OrigV << "\nBy stripping back to:\n " << *V << "\n");
1601 return;
1602 }
1603 }
1604
1605 // This was the final opportunity to salvage this debug information, and it
1606 // couldn't be done. Place a poison DBG_VALUE at this location to terminate
1607 // any earlier variable location.
1608 assert(OrigV && "V shouldn't be null");
1609 auto *Poison = PoisonValue::get(OrigV->getType());
1610 auto *SDV = DAG.getConstantDbgValue(Var, Expr, Poison, DL, SDNodeOrder);
1611 DAG.AddDbgValue(SDV, false);
1612 LLVM_DEBUG(dbgs() << "Dropping debug value info for:\n "
1613 << printDDI(OrigV, DDI) << "\n");
1614}
1615
1617 DIExpression *Expr,
1618 DebugLoc DbgLoc,
1619 unsigned Order) {
1623 handleDebugValue(Poison, Var, NewExpr, DbgLoc, Order,
1624 /*IsVariadic*/ false);
1625}
1626
1628 DILocalVariable *Var,
1629 DIExpression *Expr, DebugLoc DbgLoc,
1630 unsigned Order, bool IsVariadic) {
1631 if (Values.empty())
1632 return true;
1633
1634 // Filter EntryValue locations out early.
1635 if (visitEntryValueDbgValue(Values, Var, Expr, DbgLoc))
1636 return true;
1637
1638 SmallVector<SDDbgOperand> LocationOps;
1639 SmallVector<SDNode *> Dependencies;
1640 for (const Value *V : Values) {
1641 // Constant value.
1644 LocationOps.emplace_back(SDDbgOperand::fromConst(V));
1645 continue;
1646 }
1647
1648 // Look through IntToPtr constants.
1649 if (auto *CE = dyn_cast<ConstantExpr>(V))
1650 if (CE->getOpcode() == Instruction::IntToPtr) {
1651 LocationOps.emplace_back(SDDbgOperand::fromConst(CE->getOperand(0)));
1652 continue;
1653 }
1654
1655 // If the Value is a frame index, we can create a FrameIndex debug value
1656 // without relying on the DAG at all.
1657 if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
1658 auto SI = FuncInfo.StaticAllocaMap.find(AI);
1659 if (SI != FuncInfo.StaticAllocaMap.end()) {
1660 LocationOps.emplace_back(SDDbgOperand::fromFrameIdx(SI->second));
1661 continue;
1662 }
1663 }
1664
1665 // Do not use getValue() in here; we don't want to generate code at
1666 // this point if it hasn't been done yet.
1667 SDValue N = NodeMap[V];
1668 if (!N.getNode() && isa<Argument>(V)) // Check unused arguments map.
1669 N = UnusedArgNodeMap[V];
1670
1671 if (N.getNode()) {
1672 // Only emit func arg dbg value for non-variadic dbg.values for now.
1673 if (!IsVariadic &&
1674 EmitFuncArgumentDbgValue(V, Var, Expr, DbgLoc,
1675 FuncArgumentDbgValueKind::Value, N))
1676 return true;
1677 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(N.getNode())) {
1678 // Construct a FrameIndexDbgValue for FrameIndexSDNodes so we can
1679 // describe stack slot locations.
1680 //
1681 // Consider "int x = 0; int *px = &x;". There are two kinds of
1682 // interesting debug values here after optimization:
1683 //
1684 // dbg.value(i32* %px, !"int *px", !DIExpression()), and
1685 // dbg.value(i32* %px, !"int x", !DIExpression(DW_OP_deref))
1686 //
1687 // Both describe the direct values of their associated variables.
1688 Dependencies.push_back(N.getNode());
1689 LocationOps.emplace_back(SDDbgOperand::fromFrameIdx(FISDN->getIndex()));
1690 continue;
1691 }
1692 LocationOps.emplace_back(
1693 SDDbgOperand::fromNode(N.getNode(), N.getResNo()));
1694 continue;
1695 }
1696
1697 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1698 // Special rules apply for the first dbg.values of parameter variables in a
1699 // function. Identify them by the fact they reference Argument Values, that
1700 // they're parameters, and they are parameters of the current function. We
1701 // need to let them dangle until they get an SDNode.
1702 bool IsParamOfFunc =
1703 isa<Argument>(V) && Var->isParameter() && !DbgLoc.getInlinedAt();
1704 if (IsParamOfFunc)
1705 return false;
1706
1707 // The value is not used in this block yet (or it would have an SDNode).
1708 // We still want the value to appear for the user if possible -- if it has
1709 // an associated VReg, we can refer to that instead.
1710 auto VMI = FuncInfo.ValueMap.find(V);
1711 if (VMI != FuncInfo.ValueMap.end()) {
1712 Register Reg = VMI->second;
1713 // If this is a PHI node, it may be split up into several MI PHI nodes
1714 // (in FunctionLoweringInfo::set).
1715 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), Reg,
1716 V->getType(), std::nullopt);
1717 if (RFV.occupiesMultipleRegs()) {
1718 // FIXME: We could potentially support variadic dbg_values here.
1719 if (IsVariadic)
1720 return false;
1721 unsigned Offset = 0;
1722 unsigned BitsToDescribe = 0;
1723 if (auto VarSize = Var->getSizeInBits())
1724 BitsToDescribe = *VarSize;
1725 if (auto Fragment = Expr->getFragmentInfo())
1726 BitsToDescribe = Fragment->SizeInBits;
1727 for (const auto &RegAndSize : RFV.getRegsAndSizes()) {
1728 // Bail out if all bits are described already.
1729 if (Offset >= BitsToDescribe)
1730 break;
1731 // TODO: handle scalable vectors.
1732 unsigned RegisterSize = RegAndSize.second;
1733 unsigned FragmentSize = (Offset + RegisterSize > BitsToDescribe)
1734 ? BitsToDescribe - Offset
1735 : RegisterSize;
1736 auto FragmentExpr = DIExpression::createFragmentExpression(
1737 Expr, Offset, FragmentSize);
1738 if (!FragmentExpr)
1739 continue;
1740 SDDbgValue *SDV = DAG.getVRegDbgValue(
1741 Var, *FragmentExpr, RegAndSize.first, false, DbgLoc, Order);
1742 DAG.AddDbgValue(SDV, false);
1743 Offset += RegisterSize;
1744 }
1745 return true;
1746 }
1747 // We can use simple vreg locations for variadic dbg_values as well.
1748 LocationOps.emplace_back(SDDbgOperand::fromVReg(Reg));
1749 continue;
1750 }
1751 // We failed to create a SDDbgOperand for V.
1752 return false;
1753 }
1754
1755 // We have created a SDDbgOperand for each Value in Values.
1756 assert(!LocationOps.empty());
1757 SDDbgValue *SDV =
1758 DAG.getDbgValueList(Var, Expr, LocationOps, Dependencies,
1759 /*IsIndirect=*/false, DbgLoc, Order, IsVariadic);
1760 DAG.AddDbgValue(SDV, /*isParameter=*/false);
1761 return true;
1762}
1763
1765 // Try to fixup any remaining dangling debug info -- and drop it if we can't.
1766 for (auto &Pair : DanglingDebugInfoMap)
1767 for (auto &DDI : Pair.second)
1768 salvageUnresolvedDbgValue(const_cast<Value *>(Pair.first), DDI);
1770}
1771
1772/// getCopyFromRegs - If there was virtual register allocated for the value V
1773/// emit CopyFromReg of the specified type Ty. Return empty SDValue() otherwise.
1776 SDValue Result;
1777
1778 if (It != FuncInfo.ValueMap.end()) {
1779 Register InReg = It->second;
1780
1781 RegsForValue RFV(*DAG.getContext(), DAG.getTargetLoweringInfo(),
1782 DAG.getDataLayout(), InReg, Ty,
1783 std::nullopt); // This is not an ABI copy.
1784 SDValue Chain = DAG.getEntryNode();
1785 Result = RFV.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(), Chain, nullptr,
1786 V);
1787 resolveDanglingDebugInfo(V, Result);
1788 }
1789
1790 return Result;
1791}
1792
1793/// getValue - Return an SDValue for the given Value.
1795 // If we already have an SDValue for this value, use it. It's important
1796 // to do this first, so that we don't create a CopyFromReg if we already
1797 // have a regular SDValue.
1798 SDValue &N = NodeMap[V];
1799 if (N.getNode()) return N;
1800
1801 // If there's a virtual register allocated and initialized for this
1802 // value, use it.
1803 if (SDValue copyFromReg = getCopyFromRegs(V, V->getType()))
1804 return copyFromReg;
1805
1806 // Otherwise create a new SDValue and remember it.
1807 SDValue Val = getValueImpl(V);
1808 NodeMap[V] = Val;
1810 return Val;
1811}
1812
1813/// getNonRegisterValue - Return an SDValue for the given Value, but
1814/// don't look in FuncInfo.ValueMap for a virtual register.
1816 // If we already have an SDValue for this value, use it.
1817 SDValue &N = NodeMap[V];
1818 if (N.getNode()) {
1819 if (isIntOrFPConstant(N)) {
1820 // Remove the debug location from the node as the node is about to be used
1821 // in a location which may differ from the original debug location. This
1822 // is relevant to Constant and ConstantFP nodes because they can appear
1823 // as constant expressions inside PHI nodes.
1824 N->setDebugLoc(DebugLoc());
1825 }
1826 return N;
1827 }
1828
1829 // Otherwise create a new SDValue and remember it.
1830 SDValue Val = getValueImpl(V);
1831 NodeMap[V] = Val;
1833 return Val;
1834}
1835
1836/// getValueImpl - Helper function for getValue and getNonRegisterValue.
1837/// Create an SDValue for the given value.
1839 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1840
1841 if (const Constant *C = dyn_cast<Constant>(V)) {
1842 EVT VT = TLI.getValueType(DAG.getDataLayout(), V->getType(), true);
1843
1844 if (const ConstantInt *CI = dyn_cast<ConstantInt>(C)) {
1845 SDLoc DL = getCurSDLoc();
1846
1847 // DAG.getConstant() may attempt to legalise the vector constant which can
1848 // significantly change the combines applied to the DAG. To reduce the
1849 // divergence when enabling ConstantInt based vectors we try to construct
1850 // the DAG in the same way as shufflevector based splats. TODO: The
1851 // divergence sometimes leads to better optimisations. Ideally we should
1852 // prevent DAG.getConstant() from legalising too early but there are some
1853 // degradations preventing this.
1854 if (VT.isScalableVector())
1855 return DAG.getNode(
1856 ISD::SPLAT_VECTOR, DL, VT,
1857 DAG.getConstant(CI->getValue(), DL, VT.getVectorElementType()));
1858 if (VT.isFixedLengthVector())
1859 return DAG.getSplatBuildVector(
1860 VT, DL,
1861 DAG.getConstant(CI->getValue(), DL, VT.getVectorElementType()));
1862 return DAG.getConstant(*CI, DL, VT);
1863 }
1864
1865 if (const GlobalValue *GV = dyn_cast<GlobalValue>(C))
1866 return DAG.getGlobalAddress(GV, getCurSDLoc(), VT);
1867
1868 if (const ConstantPtrAuth *CPA = dyn_cast<ConstantPtrAuth>(C)) {
1869 return DAG.getNode(ISD::PtrAuthGlobalAddress, getCurSDLoc(), VT,
1870 getValue(CPA->getPointer()), getValue(CPA->getKey()),
1871 getValue(CPA->getAddrDiscriminator()),
1872 getValue(CPA->getDiscriminator()));
1873 }
1874
1876 return DAG.getConstant(0, getCurSDLoc(), VT);
1877
1878 if (match(C, m_VScale()))
1879 return DAG.getVScale(getCurSDLoc(), VT, APInt(VT.getSizeInBits(), 1));
1880
1881 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C))
1882 return DAG.getConstantFP(*CFP, getCurSDLoc(), VT);
1883
1884 if (isa<UndefValue>(C) && !V->getType()->isAggregateType())
1885 return isa<PoisonValue>(C) ? DAG.getPOISON(VT) : DAG.getUNDEF(VT);
1886
1887 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
1888 visit(CE->getOpcode(), *CE);
1889 SDValue N1 = NodeMap[V];
1890 assert(N1.getNode() && "visit didn't populate the NodeMap!");
1891 return N1;
1892 }
1893
1895 SmallVector<SDValue, 4> Constants;
1896 for (const Use &U : C->operands()) {
1897 SDNode *Val = getValue(U).getNode();
1898 // If the operand is an empty aggregate, there are no values.
1899 if (!Val) continue;
1900 // Add each leaf value from the operand to the Constants list
1901 // to form a flattened list of all the values.
1902 for (unsigned i = 0, e = Val->getNumValues(); i != e; ++i)
1903 Constants.push_back(SDValue(Val, i));
1904 }
1905
1906 return DAG.getMergeValues(Constants, getCurSDLoc());
1907 }
1908
1909 if (const ConstantDataSequential *CDS =
1912 for (uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i) {
1913 SDNode *Val = getValue(CDS->getElementAsConstant(i)).getNode();
1914 // Add each leaf value from the operand to the Constants list
1915 // to form a flattened list of all the values.
1916 for (unsigned i = 0, e = Val->getNumValues(); i != e; ++i)
1917 Ops.push_back(SDValue(Val, i));
1918 }
1919
1920 if (isa<ArrayType>(CDS->getType()))
1921 return DAG.getMergeValues(Ops, getCurSDLoc());
1922 return DAG.getBuildVector(VT, getCurSDLoc(), Ops);
1923 }
1924
1925 if (C->getType()->isStructTy() || C->getType()->isArrayTy()) {
1927 "Unknown struct or array constant!");
1928
1929 SmallVector<EVT, 4> ValueVTs;
1930 ComputeValueVTs(TLI, DAG.getDataLayout(), C->getType(), ValueVTs);
1931 unsigned NumElts = ValueVTs.size();
1932 if (NumElts == 0)
1933 return SDValue(); // empty struct
1934 SmallVector<SDValue, 4> Constants(NumElts);
1935 for (unsigned i = 0; i != NumElts; ++i) {
1936 EVT EltVT = ValueVTs[i];
1937 if (isa<UndefValue>(C))
1938 Constants[i] = DAG.getUNDEF(EltVT);
1939 else if (EltVT.isFloatingPoint())
1940 Constants[i] = DAG.getConstantFP(0, getCurSDLoc(), EltVT);
1941 else
1942 Constants[i] = DAG.getConstant(0, getCurSDLoc(), EltVT);
1943 }
1944
1945 return DAG.getMergeValues(Constants, getCurSDLoc());
1946 }
1947
1948 if (const BlockAddress *BA = dyn_cast<BlockAddress>(C))
1949 return DAG.getBlockAddress(BA, VT);
1950
1951 if (const auto *Equiv = dyn_cast<DSOLocalEquivalent>(C))
1952 return getValue(Equiv->getGlobalValue());
1953
1954 if (const auto *NC = dyn_cast<NoCFIValue>(C))
1955 return getValue(NC->getGlobalValue());
1956
1957 if (VT == MVT::aarch64svcount) {
1958 assert(C->isNullValue() && "Can only zero this target type!");
1959 return DAG.getNode(ISD::BITCAST, getCurSDLoc(), VT,
1960 DAG.getConstant(0, getCurSDLoc(), MVT::nxv16i1));
1961 }
1962
1963 if (VT.isRISCVVectorTuple()) {
1964 assert(C->isNullValue() && "Can only zero this target type!");
1965 return DAG.getNode(
1966 ISD::BITCAST, getCurSDLoc(), VT,
1967 DAG.getNode(
1969 EVT::getVectorVT(*DAG.getContext(), MVT::i8,
1970 VT.getSizeInBits().getKnownMinValue() / 8, true),
1971 DAG.getConstant(0, getCurSDLoc(), MVT::getIntegerVT(8))));
1972 }
1973
1974 VectorType *VecTy = cast<VectorType>(V->getType());
1975
1976 // Now that we know the number and type of the elements, get that number of
1977 // elements into the Ops array based on what kind of constant it is.
1978 if (const ConstantVector *CV = dyn_cast<ConstantVector>(C)) {
1980 unsigned NumElements = cast<FixedVectorType>(VecTy)->getNumElements();
1981 for (unsigned i = 0; i != NumElements; ++i)
1982 Ops.push_back(getValue(CV->getOperand(i)));
1983
1984 return DAG.getBuildVector(VT, getCurSDLoc(), Ops);
1985 }
1986
1988 EVT EltVT =
1989 TLI.getValueType(DAG.getDataLayout(), VecTy->getElementType());
1990
1991 SDValue Op;
1992 if (EltVT.isFloatingPoint())
1993 Op = DAG.getConstantFP(0, getCurSDLoc(), EltVT);
1994 else
1995 Op = DAG.getConstant(0, getCurSDLoc(), EltVT);
1996
1997 return DAG.getSplat(VT, getCurSDLoc(), Op);
1998 }
1999
2000 llvm_unreachable("Unknown vector constant");
2001 }
2002
2003 // If this is a static alloca, generate it as the frameindex instead of
2004 // computation.
2005 if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
2007 FuncInfo.StaticAllocaMap.find(AI);
2008 if (SI != FuncInfo.StaticAllocaMap.end())
2009 return DAG.getFrameIndex(
2010 SI->second, TLI.getValueType(DAG.getDataLayout(), AI->getType()));
2011 }
2012
2013 // If this is an instruction which fast-isel has deferred, select it now.
2014 if (const Instruction *Inst = dyn_cast<Instruction>(V)) {
2015 Register InReg = FuncInfo.InitializeRegForValue(Inst);
2016
2017 std::optional<CallingConv::ID> CallConv;
2018 auto *CB = dyn_cast<CallBase>(Inst);
2019 if (CB && !CB->isInlineAsm())
2020 CallConv = CB->getCallingConv();
2021
2022 RegsForValue RFV(*DAG.getContext(), TLI, DAG.getDataLayout(), InReg,
2023 Inst->getType(), CallConv);
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 (TM.Options.NoNaNsFPMath)
2481 Condition = getFCmpCodeWithoutNaN(Condition);
2482 }
2483
2484 CaseBlock CB(Condition, BOp->getOperand(0), BOp->getOperand(1), nullptr,
2485 TBB, FBB, CurBB, getCurSDLoc(), TProb, FProb);
2486 SL->SwitchCases.push_back(CB);
2487 return;
2488 }
2489 }
2490
2491 // Create a CaseBlock record representing this branch.
2492 ISD::CondCode Opc = InvertCond ? ISD::SETNE : ISD::SETEQ;
2493 CaseBlock CB(Opc, Cond, ConstantInt::getTrue(*DAG.getContext()),
2494 nullptr, TBB, FBB, CurBB, getCurSDLoc(), TProb, FProb);
2495 SL->SwitchCases.push_back(CB);
2496}
2497
2498// Collect dependencies on V recursively. This is used for the cost analysis in
2499// `shouldKeepJumpConditionsTogether`.
2503 unsigned Depth = 0) {
2504 // Return false if we have an incomplete count.
2506 return false;
2507
2508 auto *I = dyn_cast<Instruction>(V);
2509 if (I == nullptr)
2510 return true;
2511
2512 if (Necessary != nullptr) {
2513 // This instruction is necessary for the other side of the condition so
2514 // don't count it.
2515 if (Necessary->contains(I))
2516 return true;
2517 }
2518
2519 // Already added this dep.
2520 if (!Deps->try_emplace(I, false).second)
2521 return true;
2522
2523 for (unsigned OpIdx = 0, E = I->getNumOperands(); OpIdx < E; ++OpIdx)
2524 if (!collectInstructionDeps(Deps, I->getOperand(OpIdx), Necessary,
2525 Depth + 1))
2526 return false;
2527 return true;
2528}
2529
2532 Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs,
2534 if (I.getNumSuccessors() != 2)
2535 return false;
2536
2537 if (!I.isConditional())
2538 return false;
2539
2540 if (Params.BaseCost < 0)
2541 return false;
2542
2543 // Baseline cost.
2544 InstructionCost CostThresh = Params.BaseCost;
2545
2546 BranchProbabilityInfo *BPI = nullptr;
2547 if (Params.LikelyBias || Params.UnlikelyBias)
2548 BPI = FuncInfo.BPI;
2549 if (BPI != nullptr) {
2550 // See if we are either likely to get an early out or compute both lhs/rhs
2551 // of the condition.
2552 BasicBlock *IfFalse = I.getSuccessor(0);
2553 BasicBlock *IfTrue = I.getSuccessor(1);
2554
2555 std::optional<bool> Likely;
2556 if (BPI->isEdgeHot(I.getParent(), IfTrue))
2557 Likely = true;
2558 else if (BPI->isEdgeHot(I.getParent(), IfFalse))
2559 Likely = false;
2560
2561 if (Likely) {
2562 if (Opc == (*Likely ? Instruction::And : Instruction::Or))
2563 // Its likely we will have to compute both lhs and rhs of condition
2564 CostThresh += Params.LikelyBias;
2565 else {
2566 if (Params.UnlikelyBias < 0)
2567 return false;
2568 // Its likely we will get an early out.
2569 CostThresh -= Params.UnlikelyBias;
2570 }
2571 }
2572 }
2573
2574 if (CostThresh <= 0)
2575 return false;
2576
2577 // Collect "all" instructions that lhs condition is dependent on.
2578 // Use map for stable iteration (to avoid non-determanism of iteration of
2579 // SmallPtrSet). The `bool` value is just a dummy.
2581 collectInstructionDeps(&LhsDeps, Lhs);
2582 // Collect "all" instructions that rhs condition is dependent on AND are
2583 // dependencies of lhs. This gives us an estimate on which instructions we
2584 // stand to save by splitting the condition.
2585 if (!collectInstructionDeps(&RhsDeps, Rhs, &LhsDeps))
2586 return false;
2587 // Add the compare instruction itself unless its a dependency on the LHS.
2588 if (const auto *RhsI = dyn_cast<Instruction>(Rhs))
2589 if (!LhsDeps.contains(RhsI))
2590 RhsDeps.try_emplace(RhsI, false);
2591
2592 const auto &TLI = DAG.getTargetLoweringInfo();
2593 const auto &TTI =
2594 TLI.getTargetMachine().getTargetTransformInfo(*I.getFunction());
2595
2596 InstructionCost CostOfIncluding = 0;
2597 // See if this instruction will need to computed independently of whether RHS
2598 // is.
2599 Value *BrCond = I.getCondition();
2600 auto ShouldCountInsn = [&RhsDeps, &BrCond](const Instruction *Ins) {
2601 for (const auto *U : Ins->users()) {
2602 // If user is independent of RHS calculation we don't need to count it.
2603 if (auto *UIns = dyn_cast<Instruction>(U))
2604 if (UIns != BrCond && !RhsDeps.contains(UIns))
2605 return false;
2606 }
2607 return true;
2608 };
2609
2610 // Prune instructions from RHS Deps that are dependencies of unrelated
2611 // instructions. The value (SelectionDAG::MaxRecursionDepth) is fairly
2612 // arbitrary and just meant to cap the how much time we spend in the pruning
2613 // loop. Its highly unlikely to come into affect.
2614 const unsigned MaxPruneIters = SelectionDAG::MaxRecursionDepth;
2615 // Stop after a certain point. No incorrectness from including too many
2616 // instructions.
2617 for (unsigned PruneIters = 0; PruneIters < MaxPruneIters; ++PruneIters) {
2618 const Instruction *ToDrop = nullptr;
2619 for (const auto &InsPair : RhsDeps) {
2620 if (!ShouldCountInsn(InsPair.first)) {
2621 ToDrop = InsPair.first;
2622 break;
2623 }
2624 }
2625 if (ToDrop == nullptr)
2626 break;
2627 RhsDeps.erase(ToDrop);
2628 }
2629
2630 for (const auto &InsPair : RhsDeps) {
2631 // Finally accumulate latency that we can only attribute to computing the
2632 // RHS condition. Use latency because we are essentially trying to calculate
2633 // the cost of the dependency chain.
2634 // Possible TODO: We could try to estimate ILP and make this more precise.
2635 CostOfIncluding +=
2636 TTI.getInstructionCost(InsPair.first, TargetTransformInfo::TCK_Latency);
2637
2638 if (CostOfIncluding > CostThresh)
2639 return false;
2640 }
2641 return true;
2642}
2643
2646 MachineBasicBlock *FBB,
2647 MachineBasicBlock *CurBB,
2648 MachineBasicBlock *SwitchBB,
2650 BranchProbability TProb,
2651 BranchProbability FProb,
2652 bool InvertCond) {
2653 // Skip over not part of the tree and remember to invert op and operands at
2654 // next level.
2655 Value *NotCond;
2656 if (match(Cond, m_OneUse(m_Not(m_Value(NotCond)))) &&
2657 InBlock(NotCond, CurBB->getBasicBlock())) {
2658 FindMergedConditions(NotCond, TBB, FBB, CurBB, SwitchBB, Opc, TProb, FProb,
2659 !InvertCond);
2660 return;
2661 }
2662
2664 const Value *BOpOp0, *BOpOp1;
2665 // Compute the effective opcode for Cond, taking into account whether it needs
2666 // to be inverted, e.g.
2667 // and (not (or A, B)), C
2668 // gets lowered as
2669 // and (and (not A, not B), C)
2671 if (BOp) {
2672 BOpc = match(BOp, m_LogicalAnd(m_Value(BOpOp0), m_Value(BOpOp1)))
2673 ? Instruction::And
2674 : (match(BOp, m_LogicalOr(m_Value(BOpOp0), m_Value(BOpOp1)))
2675 ? Instruction::Or
2677 if (InvertCond) {
2678 if (BOpc == Instruction::And)
2679 BOpc = Instruction::Or;
2680 else if (BOpc == Instruction::Or)
2681 BOpc = Instruction::And;
2682 }
2683 }
2684
2685 // If this node is not part of the or/and tree, emit it as a branch.
2686 // Note that all nodes in the tree should have same opcode.
2687 bool BOpIsInOrAndTree = BOpc && BOpc == Opc && BOp->hasOneUse();
2688 if (!BOpIsInOrAndTree || BOp->getParent() != CurBB->getBasicBlock() ||
2689 !InBlock(BOpOp0, CurBB->getBasicBlock()) ||
2690 !InBlock(BOpOp1, CurBB->getBasicBlock())) {
2691 EmitBranchForMergedCondition(Cond, TBB, FBB, CurBB, SwitchBB,
2692 TProb, FProb, InvertCond);
2693 return;
2694 }
2695
2696 // Create TmpBB after CurBB.
2697 MachineFunction::iterator BBI(CurBB);
2698 MachineFunction &MF = DAG.getMachineFunction();
2700 CurBB->getParent()->insert(++BBI, TmpBB);
2701
2702 if (Opc == Instruction::Or) {
2703 // Codegen X | Y as:
2704 // BB1:
2705 // jmp_if_X TBB
2706 // jmp TmpBB
2707 // TmpBB:
2708 // jmp_if_Y TBB
2709 // jmp FBB
2710 //
2711
2712 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
2713 // The requirement is that
2714 // TrueProb for BB1 + (FalseProb for BB1 * TrueProb for TmpBB)
2715 // = TrueProb for original BB.
2716 // Assuming the original probabilities are A and B, one choice is to set
2717 // BB1's probabilities to A/2 and A/2+B, and set TmpBB's probabilities to
2718 // A/(1+B) and 2B/(1+B). This choice assumes that
2719 // TrueProb for BB1 == FalseProb for BB1 * TrueProb for TmpBB.
2720 // Another choice is to assume TrueProb for BB1 equals to TrueProb for
2721 // TmpBB, but the math is more complicated.
2722
2723 auto NewTrueProb = TProb / 2;
2724 auto NewFalseProb = TProb / 2 + FProb;
2725 // Emit the LHS condition.
2726 FindMergedConditions(BOpOp0, TBB, TmpBB, CurBB, SwitchBB, Opc, NewTrueProb,
2727 NewFalseProb, InvertCond);
2728
2729 // Normalize A/2 and B to get A/(1+B) and 2B/(1+B).
2730 SmallVector<BranchProbability, 2> Probs{TProb / 2, FProb};
2732 // Emit the RHS condition into TmpBB.
2733 FindMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
2734 Probs[1], InvertCond);
2735 } else {
2736 assert(Opc == Instruction::And && "Unknown merge op!");
2737 // Codegen X & Y as:
2738 // BB1:
2739 // jmp_if_X TmpBB
2740 // jmp FBB
2741 // TmpBB:
2742 // jmp_if_Y TBB
2743 // jmp FBB
2744 //
2745 // This requires creation of TmpBB after CurBB.
2746
2747 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
2748 // The requirement is that
2749 // FalseProb for BB1 + (TrueProb for BB1 * FalseProb for TmpBB)
2750 // = FalseProb for original BB.
2751 // Assuming the original probabilities are A and B, one choice is to set
2752 // BB1's probabilities to A+B/2 and B/2, and set TmpBB's probabilities to
2753 // 2A/(1+A) and B/(1+A). This choice assumes that FalseProb for BB1 ==
2754 // TrueProb for BB1 * FalseProb for TmpBB.
2755
2756 auto NewTrueProb = TProb + FProb / 2;
2757 auto NewFalseProb = FProb / 2;
2758 // Emit the LHS condition.
2759 FindMergedConditions(BOpOp0, TmpBB, FBB, CurBB, SwitchBB, Opc, NewTrueProb,
2760 NewFalseProb, InvertCond);
2761
2762 // Normalize A and B/2 to get 2A/(1+A) and B/(1+A).
2763 SmallVector<BranchProbability, 2> Probs{TProb, FProb / 2};
2765 // Emit the RHS condition into TmpBB.
2766 FindMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
2767 Probs[1], InvertCond);
2768 }
2769}
2770
2771/// If the set of cases should be emitted as a series of branches, return true.
2772/// If we should emit this as a bunch of and/or'd together conditions, return
2773/// false.
2774bool
2775SelectionDAGBuilder::ShouldEmitAsBranches(const std::vector<CaseBlock> &Cases) {
2776 if (Cases.size() != 2) return true;
2777
2778 // If this is two comparisons of the same values or'd or and'd together, they
2779 // will get folded into a single comparison, so don't emit two blocks.
2780 if ((Cases[0].CmpLHS == Cases[1].CmpLHS &&
2781 Cases[0].CmpRHS == Cases[1].CmpRHS) ||
2782 (Cases[0].CmpRHS == Cases[1].CmpLHS &&
2783 Cases[0].CmpLHS == Cases[1].CmpRHS)) {
2784 return false;
2785 }
2786
2787 // Handle: (X != null) | (Y != null) --> (X|Y) != 0
2788 // Handle: (X == null) & (Y == null) --> (X|Y) == 0
2789 if (Cases[0].CmpRHS == Cases[1].CmpRHS &&
2790 Cases[0].CC == Cases[1].CC &&
2791 isa<Constant>(Cases[0].CmpRHS) &&
2792 cast<Constant>(Cases[0].CmpRHS)->isNullValue()) {
2793 if (Cases[0].CC == ISD::SETEQ && Cases[0].TrueBB == Cases[1].ThisBB)
2794 return false;
2795 if (Cases[0].CC == ISD::SETNE && Cases[0].FalseBB == Cases[1].ThisBB)
2796 return false;
2797 }
2798
2799 return true;
2800}
2801
2802void SelectionDAGBuilder::visitBr(const BranchInst &I) {
2804
2805 // Update machine-CFG edges.
2806 MachineBasicBlock *Succ0MBB = FuncInfo.getMBB(I.getSuccessor(0));
2807
2808 if (I.isUnconditional()) {
2809 // Update machine-CFG edges.
2810 BrMBB->addSuccessor(Succ0MBB);
2811
2812 // If this is not a fall-through branch or optimizations are switched off,
2813 // emit the branch.
2814 if (Succ0MBB != NextBlock(BrMBB) ||
2816 auto Br = DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
2817 getControlRoot(), DAG.getBasicBlock(Succ0MBB));
2818 setValue(&I, Br);
2819 DAG.setRoot(Br);
2820 }
2821
2822 return;
2823 }
2824
2825 // If this condition is one of the special cases we handle, do special stuff
2826 // now.
2827 const Value *CondVal = I.getCondition();
2828 MachineBasicBlock *Succ1MBB = FuncInfo.getMBB(I.getSuccessor(1));
2829
2830 // If this is a series of conditions that are or'd or and'd together, emit
2831 // this as a sequence of branches instead of setcc's with and/or operations.
2832 // As long as jumps are not expensive (exceptions for multi-use logic ops,
2833 // unpredictable branches, and vector extracts because those jumps are likely
2834 // expensive for any target), this should improve performance.
2835 // For example, instead of something like:
2836 // cmp A, B
2837 // C = seteq
2838 // cmp D, E
2839 // F = setle
2840 // or C, F
2841 // jnz foo
2842 // Emit:
2843 // cmp A, B
2844 // je foo
2845 // cmp D, E
2846 // jle foo
2847 bool IsUnpredictable = I.hasMetadata(LLVMContext::MD_unpredictable);
2848 const Instruction *BOp = dyn_cast<Instruction>(CondVal);
2849 if (!DAG.getTargetLoweringInfo().isJumpExpensive() && BOp &&
2850 BOp->hasOneUse() && !IsUnpredictable) {
2851 Value *Vec;
2852 const Value *BOp0, *BOp1;
2854 if (match(BOp, m_LogicalAnd(m_Value(BOp0), m_Value(BOp1))))
2855 Opcode = Instruction::And;
2856 else if (match(BOp, m_LogicalOr(m_Value(BOp0), m_Value(BOp1))))
2857 Opcode = Instruction::Or;
2858
2859 if (Opcode &&
2860 !(match(BOp0, m_ExtractElt(m_Value(Vec), m_Value())) &&
2861 match(BOp1, m_ExtractElt(m_Specific(Vec), m_Value()))) &&
2863 FuncInfo, I, Opcode, BOp0, BOp1,
2864 DAG.getTargetLoweringInfo().getJumpConditionMergingParams(
2865 Opcode, BOp0, BOp1))) {
2866 FindMergedConditions(BOp, Succ0MBB, Succ1MBB, BrMBB, BrMBB, Opcode,
2867 getEdgeProbability(BrMBB, Succ0MBB),
2868 getEdgeProbability(BrMBB, Succ1MBB),
2869 /*InvertCond=*/false);
2870 // If the compares in later blocks need to use values not currently
2871 // exported from this block, export them now. This block should always
2872 // be the first entry.
2873 assert(SL->SwitchCases[0].ThisBB == BrMBB && "Unexpected lowering!");
2874
2875 // Allow some cases to be rejected.
2876 if (ShouldEmitAsBranches(SL->SwitchCases)) {
2877 for (unsigned i = 1, e = SL->SwitchCases.size(); i != e; ++i) {
2878 ExportFromCurrentBlock(SL->SwitchCases[i].CmpLHS);
2879 ExportFromCurrentBlock(SL->SwitchCases[i].CmpRHS);
2880 }
2881
2882 // Emit the branch for this block.
2883 visitSwitchCase(SL->SwitchCases[0], BrMBB);
2884 SL->SwitchCases.erase(SL->SwitchCases.begin());
2885 return;
2886 }
2887
2888 // Okay, we decided not to do this, remove any inserted MBB's and clear
2889 // SwitchCases.
2890 for (unsigned i = 1, e = SL->SwitchCases.size(); i != e; ++i)
2891 FuncInfo.MF->erase(SL->SwitchCases[i].ThisBB);
2892
2893 SL->SwitchCases.clear();
2894 }
2895 }
2896
2897 // Create a CaseBlock record representing this branch.
2898 CaseBlock CB(ISD::SETEQ, CondVal, ConstantInt::getTrue(*DAG.getContext()),
2899 nullptr, Succ0MBB, Succ1MBB, BrMBB, getCurSDLoc(),
2901 IsUnpredictable);
2902
2903 // Use visitSwitchCase to actually insert the fast branch sequence for this
2904 // cond branch.
2905 visitSwitchCase(CB, BrMBB);
2906}
2907
2908/// visitSwitchCase - Emits the necessary code to represent a single node in
2909/// the binary search tree resulting from lowering a switch instruction.
2911 MachineBasicBlock *SwitchBB) {
2912 SDValue Cond;
2913 SDValue CondLHS = getValue(CB.CmpLHS);
2914 SDLoc dl = CB.DL;
2915
2916 if (CB.CC == ISD::SETTRUE) {
2917 // Branch or fall through to TrueBB.
2918 addSuccessorWithProb(SwitchBB, CB.TrueBB, CB.TrueProb);
2919 SwitchBB->normalizeSuccProbs();
2920 if (CB.TrueBB != NextBlock(SwitchBB)) {
2921 DAG.setRoot(DAG.getNode(ISD::BR, dl, MVT::Other, getControlRoot(),
2922 DAG.getBasicBlock(CB.TrueBB)));
2923 }
2924 return;
2925 }
2926
2927 auto &TLI = DAG.getTargetLoweringInfo();
2928 EVT MemVT = TLI.getMemValueType(DAG.getDataLayout(), CB.CmpLHS->getType());
2929
2930 // Build the setcc now.
2931 if (!CB.CmpMHS) {
2932 // Fold "(X == true)" to X and "(X == false)" to !X to
2933 // handle common cases produced by branch lowering.
2934 if (CB.CmpRHS == ConstantInt::getTrue(*DAG.getContext()) &&
2935 CB.CC == ISD::SETEQ)
2936 Cond = CondLHS;
2937 else if (CB.CmpRHS == ConstantInt::getFalse(*DAG.getContext()) &&
2938 CB.CC == ISD::SETEQ) {
2939 SDValue True = DAG.getConstant(1, dl, CondLHS.getValueType());
2940 Cond = DAG.getNode(ISD::XOR, dl, CondLHS.getValueType(), CondLHS, True);
2941 } else {
2942 SDValue CondRHS = getValue(CB.CmpRHS);
2943
2944 // If a pointer's DAG type is larger than its memory type then the DAG
2945 // values are zero-extended. This breaks signed comparisons so truncate
2946 // back to the underlying type before doing the compare.
2947 if (CondLHS.getValueType() != MemVT) {
2948 CondLHS = DAG.getPtrExtOrTrunc(CondLHS, getCurSDLoc(), MemVT);
2949 CondRHS = DAG.getPtrExtOrTrunc(CondRHS, getCurSDLoc(), MemVT);
2950 }
2951 Cond = DAG.getSetCC(dl, MVT::i1, CondLHS, CondRHS, CB.CC);
2952 }
2953 } else {
2954 assert(CB.CC == ISD::SETLE && "Can handle only LE ranges now");
2955
2956 const APInt& Low = cast<ConstantInt>(CB.CmpLHS)->getValue();
2957 const APInt& High = cast<ConstantInt>(CB.CmpRHS)->getValue();
2958
2959 SDValue CmpOp = getValue(CB.CmpMHS);
2960 EVT VT = CmpOp.getValueType();
2961
2962 if (cast<ConstantInt>(CB.CmpLHS)->isMinValue(true)) {
2963 Cond = DAG.getSetCC(dl, MVT::i1, CmpOp, DAG.getConstant(High, dl, VT),
2964 ISD::SETLE);
2965 } else {
2966 SDValue SUB = DAG.getNode(ISD::SUB, dl,
2967 VT, CmpOp, DAG.getConstant(Low, dl, VT));
2968 Cond = DAG.getSetCC(dl, MVT::i1, SUB,
2969 DAG.getConstant(High-Low, dl, VT), ISD::SETULE);
2970 }
2971 }
2972
2973 // Update successor info
2974 addSuccessorWithProb(SwitchBB, CB.TrueBB, CB.TrueProb);
2975 // TrueBB and FalseBB are always different unless the incoming IR is
2976 // degenerate. This only happens when running llc on weird IR.
2977 if (CB.TrueBB != CB.FalseBB)
2978 addSuccessorWithProb(SwitchBB, CB.FalseBB, CB.FalseProb);
2979 SwitchBB->normalizeSuccProbs();
2980
2981 // If the lhs block is the next block, invert the condition so that we can
2982 // fall through to the lhs instead of the rhs block.
2983 if (CB.TrueBB == NextBlock(SwitchBB)) {
2984 std::swap(CB.TrueBB, CB.FalseBB);
2985 SDValue True = DAG.getConstant(1, dl, Cond.getValueType());
2986 Cond = DAG.getNode(ISD::XOR, dl, Cond.getValueType(), Cond, True);
2987 }
2988
2989 SDNodeFlags Flags;
2991 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl, MVT::Other, getControlRoot(),
2992 Cond, DAG.getBasicBlock(CB.TrueBB), Flags);
2993
2994 setValue(CurInst, BrCond);
2995
2996 // Insert the false branch. Do this even if it's a fall through branch,
2997 // this makes it easier to do DAG optimizations which require inverting
2998 // the branch condition.
2999 BrCond = DAG.getNode(ISD::BR, dl, MVT::Other, BrCond,
3000 DAG.getBasicBlock(CB.FalseBB));
3001
3002 DAG.setRoot(BrCond);
3003}
3004
3005/// visitJumpTable - Emit JumpTable node in the current MBB
3007 // Emit the code for the jump table
3008 assert(JT.SL && "Should set SDLoc for SelectionDAG!");
3009 assert(JT.Reg && "Should lower JT Header first!");
3010 EVT PTy = DAG.getTargetLoweringInfo().getJumpTableRegTy(DAG.getDataLayout());
3011 SDValue Index = DAG.getCopyFromReg(getControlRoot(), *JT.SL, JT.Reg, PTy);
3012 SDValue Table = DAG.getJumpTable(JT.JTI, PTy);
3013 SDValue BrJumpTable = DAG.getNode(ISD::BR_JT, *JT.SL, MVT::Other,
3014 Index.getValue(1), Table, Index);
3015 DAG.setRoot(BrJumpTable);
3016}
3017
3018/// visitJumpTableHeader - This function emits necessary code to produce index
3019/// in the JumpTable from switch case.
3021 JumpTableHeader &JTH,
3022 MachineBasicBlock *SwitchBB) {
3023 assert(JT.SL && "Should set SDLoc for SelectionDAG!");
3024 const SDLoc &dl = *JT.SL;
3025
3026 // Subtract the lowest switch case value from the value being switched on.
3027 SDValue SwitchOp = getValue(JTH.SValue);
3028 EVT VT = SwitchOp.getValueType();
3029 SDValue Sub = DAG.getNode(ISD::SUB, dl, VT, SwitchOp,
3030 DAG.getConstant(JTH.First, dl, VT));
3031
3032 // The SDNode we just created, which holds the value being switched on minus
3033 // the smallest case value, needs to be copied to a virtual register so it
3034 // can be used as an index into the jump table in a subsequent basic block.
3035 // This value may be smaller or larger than the target's pointer type, and
3036 // therefore require extension or truncating.
3037 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3038 SwitchOp =
3039 DAG.getZExtOrTrunc(Sub, dl, TLI.getJumpTableRegTy(DAG.getDataLayout()));
3040
3041 Register JumpTableReg =
3042 FuncInfo.CreateReg(TLI.getJumpTableRegTy(DAG.getDataLayout()));
3043 SDValue CopyTo =
3044 DAG.getCopyToReg(getControlRoot(), dl, JumpTableReg, SwitchOp);
3045 JT.Reg = JumpTableReg;
3046
3047 if (!JTH.FallthroughUnreachable) {
3048 // Emit the range check for the jump table, and branch to the default block
3049 // for the switch statement if the value being switched on exceeds the
3050 // largest case in the switch.
3051 SDValue CMP = DAG.getSetCC(
3052 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
3053 Sub.getValueType()),
3054 Sub, DAG.getConstant(JTH.Last - JTH.First, dl, VT), ISD::SETUGT);
3055
3056 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl,
3057 MVT::Other, CopyTo, CMP,
3058 DAG.getBasicBlock(JT.Default));
3059
3060 // Avoid emitting unnecessary branches to the next block.
3061 if (JT.MBB != NextBlock(SwitchBB))
3062 BrCond = DAG.getNode(ISD::BR, dl, MVT::Other, BrCond,
3063 DAG.getBasicBlock(JT.MBB));
3064
3065 DAG.setRoot(BrCond);
3066 } else {
3067 // Avoid emitting unnecessary branches to the next block.
3068 if (JT.MBB != NextBlock(SwitchBB))
3069 DAG.setRoot(DAG.getNode(ISD::BR, dl, MVT::Other, CopyTo,
3070 DAG.getBasicBlock(JT.MBB)));
3071 else
3072 DAG.setRoot(CopyTo);
3073 }
3074}
3075
3076/// Create a LOAD_STACK_GUARD node, and let it carry the target specific global
3077/// variable if there exists one.
3079 SDValue &Chain) {
3080 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3081 EVT PtrTy = TLI.getPointerTy(DAG.getDataLayout());
3082 EVT PtrMemTy = TLI.getPointerMemTy(DAG.getDataLayout());
3086 DAG.getMachineNode(TargetOpcode::LOAD_STACK_GUARD, DL, PtrTy, Chain);
3087 if (Global) {
3088 MachinePointerInfo MPInfo(Global);
3092 MPInfo, Flags, PtrTy.getSizeInBits() / 8, DAG.getEVTAlign(PtrTy));
3093 DAG.setNodeMemRefs(Node, {MemRef});
3094 }
3095 if (PtrTy != PtrMemTy)
3096 return DAG.getPtrExtOrTrunc(SDValue(Node, 0), DL, PtrMemTy);
3097 return SDValue(Node, 0);
3098}
3099
3100/// Codegen a new tail for a stack protector check ParentMBB which has had its
3101/// tail spliced into a stack protector check success bb.
3102///
3103/// For a high level explanation of how this fits into the stack protector
3104/// generation see the comment on the declaration of class
3105/// StackProtectorDescriptor.
3107 MachineBasicBlock *ParentBB) {
3108
3109 // First create the loads to the guard/stack slot for the comparison.
3110 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3111 auto &DL = DAG.getDataLayout();
3112 EVT PtrTy = TLI.getFrameIndexTy(DL);
3113 EVT PtrMemTy = TLI.getPointerMemTy(DL, DL.getAllocaAddrSpace());
3114
3115 MachineFrameInfo &MFI = ParentBB->getParent()->getFrameInfo();
3116 int FI = MFI.getStackProtectorIndex();
3117
3118 SDValue Guard;
3119 SDLoc dl = getCurSDLoc();
3120 SDValue StackSlotPtr = DAG.getFrameIndex(FI, PtrTy);
3121 const Module &M = *ParentBB->getParent()->getFunction().getParent();
3122 Align Align = DL.getPrefTypeAlign(
3123 PointerType::get(M.getContext(), DL.getAllocaAddrSpace()));
3124
3125 // Generate code to load the content of the guard slot.
3126 SDValue GuardVal = DAG.getLoad(
3127 PtrMemTy, dl, DAG.getEntryNode(), StackSlotPtr,
3128 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI), Align,
3130
3131 if (TLI.useStackGuardXorFP())
3132 GuardVal = TLI.emitStackGuardXorFP(DAG, GuardVal, dl);
3133
3134 // If we're using function-based instrumentation, call the guard check
3135 // function
3137 // Get the guard check function from the target and verify it exists since
3138 // we're using function-based instrumentation
3139 const Function *GuardCheckFn = TLI.getSSPStackGuardCheck(M);
3140 assert(GuardCheckFn && "Guard check function is null");
3141
3142 // The target provides a guard check function to validate the guard value.
3143 // Generate a call to that function with the content of the guard slot as
3144 // argument.
3145 FunctionType *FnTy = GuardCheckFn->getFunctionType();
3146 assert(FnTy->getNumParams() == 1 && "Invalid function signature");
3147
3149 TargetLowering::ArgListEntry Entry(GuardVal, FnTy->getParamType(0));
3150 if (GuardCheckFn->hasParamAttribute(0, Attribute::AttrKind::InReg))
3151 Entry.IsInReg = true;
3152 Args.push_back(Entry);
3153
3156 .setChain(DAG.getEntryNode())
3157 .setCallee(GuardCheckFn->getCallingConv(), FnTy->getReturnType(),
3158 getValue(GuardCheckFn), std::move(Args));
3159
3160 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
3161 DAG.setRoot(Result.second);
3162 return;
3163 }
3164
3165 // If useLoadStackGuardNode returns true, generate LOAD_STACK_GUARD.
3166 // Otherwise, emit a volatile load to retrieve the stack guard value.
3167 SDValue Chain = DAG.getEntryNode();
3168 if (TLI.useLoadStackGuardNode(M)) {
3169 Guard = getLoadStackGuard(DAG, dl, Chain);
3170 } else {
3171 if (const Value *IRGuard = TLI.getSDagStackGuard(M)) {
3172 SDValue GuardPtr = getValue(IRGuard);
3173 Guard = DAG.getLoad(PtrMemTy, dl, Chain, GuardPtr,
3174 MachinePointerInfo(IRGuard, 0), Align,
3176 } else {
3177 LLVMContext &Ctx = *DAG.getContext();
3178 Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
3179 Guard = DAG.getPOISON(PtrMemTy);
3180 }
3181 }
3182
3183 // Perform the comparison via a getsetcc.
3184 SDValue Cmp = DAG.getSetCC(
3185 dl, TLI.getSetCCResultType(DL, *DAG.getContext(), Guard.getValueType()),
3186 Guard, GuardVal, ISD::SETNE);
3187
3188 // If the guard/stackslot do not equal, branch to failure MBB.
3189 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl,
3190 MVT::Other, GuardVal.getOperand(0),
3191 Cmp, DAG.getBasicBlock(SPD.getFailureMBB()));
3192 // Otherwise branch to success MBB.
3193 SDValue Br = DAG.getNode(ISD::BR, dl,
3194 MVT::Other, BrCond,
3195 DAG.getBasicBlock(SPD.getSuccessMBB()));
3196
3197 DAG.setRoot(Br);
3198}
3199
3200/// Codegen the failure basic block for a stack protector check.
3201///
3202/// A failure stack protector machine basic block consists simply of a call to
3203/// __stack_chk_fail().
3204///
3205/// For a high level explanation of how this fits into the stack protector
3206/// generation see the comment on the declaration of class
3207/// StackProtectorDescriptor.
3210
3211 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3212 MachineBasicBlock *ParentBB = SPD.getParentMBB();
3213 const Module &M = *ParentBB->getParent()->getFunction().getParent();
3214 SDValue Chain;
3215
3216 // For -Oz builds with a guard check function, we use function-based
3217 // instrumentation. Otherwise, if we have a guard check function, we call it
3218 // in the failure block.
3219 auto *GuardCheckFn = TLI.getSSPStackGuardCheck(M);
3220 if (GuardCheckFn && !SPD.shouldEmitFunctionBasedCheckStackProtector()) {
3221 // First create the loads to the guard/stack slot for the comparison.
3222 auto &DL = DAG.getDataLayout();
3223 EVT PtrTy = TLI.getFrameIndexTy(DL);
3224 EVT PtrMemTy = TLI.getPointerMemTy(DL, DL.getAllocaAddrSpace());
3225
3226 MachineFrameInfo &MFI = ParentBB->getParent()->getFrameInfo();
3227 int FI = MFI.getStackProtectorIndex();
3228
3229 SDLoc dl = getCurSDLoc();
3230 SDValue StackSlotPtr = DAG.getFrameIndex(FI, PtrTy);
3231 Align Align = DL.getPrefTypeAlign(
3232 PointerType::get(M.getContext(), DL.getAllocaAddrSpace()));
3233
3234 // Generate code to load the content of the guard slot.
3235 SDValue GuardVal = DAG.getLoad(
3236 PtrMemTy, dl, DAG.getEntryNode(), StackSlotPtr,
3237 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI), Align,
3239
3240 if (TLI.useStackGuardXorFP())
3241 GuardVal = TLI.emitStackGuardXorFP(DAG, GuardVal, dl);
3242
3243 // The target provides a guard check function to validate the guard value.
3244 // Generate a call to that function with the content of the guard slot as
3245 // argument.
3246 FunctionType *FnTy = GuardCheckFn->getFunctionType();
3247 assert(FnTy->getNumParams() == 1 && "Invalid function signature");
3248
3250 TargetLowering::ArgListEntry Entry(GuardVal, FnTy->getParamType(0));
3251 if (GuardCheckFn->hasParamAttribute(0, Attribute::AttrKind::InReg))
3252 Entry.IsInReg = true;
3253 Args.push_back(Entry);
3254
3257 .setChain(DAG.getEntryNode())
3258 .setCallee(GuardCheckFn->getCallingConv(), FnTy->getReturnType(),
3259 getValue(GuardCheckFn), std::move(Args));
3260
3261 Chain = TLI.LowerCallTo(CLI).second;
3262 } else {
3264 CallOptions.setDiscardResult(true);
3265 Chain = TLI.makeLibCall(DAG, RTLIB::STACKPROTECTOR_CHECK_FAIL, MVT::isVoid,
3266 {}, CallOptions, getCurSDLoc())
3267 .second;
3268 }
3269
3270 // Emit a trap instruction if we are required to do so.
3271 const TargetOptions &TargetOpts = DAG.getTarget().Options;
3272 if (TargetOpts.TrapUnreachable && !TargetOpts.NoTrapAfterNoreturn)
3273 Chain = DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, Chain);
3274
3275 DAG.setRoot(Chain);
3276}
3277
3278/// visitBitTestHeader - This function emits necessary code to produce value
3279/// suitable for "bit tests"
3281 MachineBasicBlock *SwitchBB) {
3282 SDLoc dl = getCurSDLoc();
3283
3284 // Subtract the minimum value.
3285 SDValue SwitchOp = getValue(B.SValue);
3286 EVT VT = SwitchOp.getValueType();
3287 SDValue RangeSub =
3288 DAG.getNode(ISD::SUB, dl, VT, SwitchOp, DAG.getConstant(B.First, dl, VT));
3289
3290 // Determine the type of the test operands.
3291 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3292 bool UsePtrType = false;
3293 if (!TLI.isTypeLegal(VT)) {
3294 UsePtrType = true;
3295 } else {
3296 for (const BitTestCase &Case : B.Cases)
3297 if (!isUIntN(VT.getSizeInBits(), Case.Mask)) {
3298 // Switch table case range are encoded into series of masks.
3299 // Just use pointer type, it's guaranteed to fit.
3300 UsePtrType = true;
3301 break;
3302 }
3303 }
3304 SDValue Sub = RangeSub;
3305 if (UsePtrType) {
3306 VT = TLI.getPointerTy(DAG.getDataLayout());
3307 Sub = DAG.getZExtOrTrunc(Sub, dl, VT);
3308 }
3309
3310 B.RegVT = VT.getSimpleVT();
3311 B.Reg = FuncInfo.CreateReg(B.RegVT);
3312 SDValue CopyTo = DAG.getCopyToReg(getControlRoot(), dl, B.Reg, Sub);
3313
3314 MachineBasicBlock* MBB = B.Cases[0].ThisBB;
3315
3316 if (!B.FallthroughUnreachable)
3317 addSuccessorWithProb(SwitchBB, B.Default, B.DefaultProb);
3318 addSuccessorWithProb(SwitchBB, MBB, B.Prob);
3319 SwitchBB->normalizeSuccProbs();
3320
3321 SDValue Root = CopyTo;
3322 if (!B.FallthroughUnreachable) {
3323 // Conditional branch to the default block.
3324 SDValue RangeCmp = DAG.getSetCC(dl,
3325 TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
3326 RangeSub.getValueType()),
3327 RangeSub, DAG.getConstant(B.Range, dl, RangeSub.getValueType()),
3328 ISD::SETUGT);
3329
3330 Root = DAG.getNode(ISD::BRCOND, dl, MVT::Other, Root, RangeCmp,
3331 DAG.getBasicBlock(B.Default));
3332 }
3333
3334 // Avoid emitting unnecessary branches to the next block.
3335 if (MBB != NextBlock(SwitchBB))
3336 Root = DAG.getNode(ISD::BR, dl, MVT::Other, Root, DAG.getBasicBlock(MBB));
3337
3338 DAG.setRoot(Root);
3339}
3340
3341/// visitBitTestCase - this function produces one "bit test"
3343 MachineBasicBlock *NextMBB,
3344 BranchProbability BranchProbToNext,
3345 Register Reg, BitTestCase &B,
3346 MachineBasicBlock *SwitchBB) {
3347 SDLoc dl = getCurSDLoc();
3348 MVT VT = BB.RegVT;
3349 SDValue ShiftOp = DAG.getCopyFromReg(getControlRoot(), dl, Reg, VT);
3350 SDValue Cmp;
3351 unsigned PopCount = llvm::popcount(B.Mask);
3352 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3353 if (PopCount == 1) {
3354 // Testing for a single bit; just compare the shift count with what it
3355 // would need to be to shift a 1 bit in that position.
3356 Cmp = DAG.getSetCC(
3357 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3358 ShiftOp, DAG.getConstant(llvm::countr_zero(B.Mask), dl, VT),
3359 ISD::SETEQ);
3360 } else if (PopCount == BB.Range) {
3361 // There is only one zero bit in the range, test for it directly.
3362 Cmp = DAG.getSetCC(
3363 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3364 ShiftOp, DAG.getConstant(llvm::countr_one(B.Mask), dl, VT), ISD::SETNE);
3365 } else {
3366 // Make desired shift
3367 SDValue SwitchVal = DAG.getNode(ISD::SHL, dl, VT,
3368 DAG.getConstant(1, dl, VT), ShiftOp);
3369
3370 // Emit bit tests and jumps
3371 SDValue AndOp = DAG.getNode(ISD::AND, dl,
3372 VT, SwitchVal, DAG.getConstant(B.Mask, dl, VT));
3373 Cmp = DAG.getSetCC(
3374 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3375 AndOp, DAG.getConstant(0, dl, VT), ISD::SETNE);
3376 }
3377
3378 // The branch probability from SwitchBB to B.TargetBB is B.ExtraProb.
3379 addSuccessorWithProb(SwitchBB, B.TargetBB, B.ExtraProb);
3380 // The branch probability from SwitchBB to NextMBB is BranchProbToNext.
3381 addSuccessorWithProb(SwitchBB, NextMBB, BranchProbToNext);
3382 // It is not guaranteed that the sum of B.ExtraProb and BranchProbToNext is
3383 // one as they are relative probabilities (and thus work more like weights),
3384 // and hence we need to normalize them to let the sum of them become one.
3385 SwitchBB->normalizeSuccProbs();
3386
3387 SDValue BrAnd = DAG.getNode(ISD::BRCOND, dl,
3388 MVT::Other, getControlRoot(),
3389 Cmp, DAG.getBasicBlock(B.TargetBB));
3390
3391 // Avoid emitting unnecessary branches to the next block.
3392 if (NextMBB != NextBlock(SwitchBB))
3393 BrAnd = DAG.getNode(ISD::BR, dl, MVT::Other, BrAnd,
3394 DAG.getBasicBlock(NextMBB));
3395
3396 DAG.setRoot(BrAnd);
3397}
3398
3399void SelectionDAGBuilder::visitInvoke(const InvokeInst &I) {
3400 MachineBasicBlock *InvokeMBB = FuncInfo.MBB;
3401
3402 // Retrieve successors. Look through artificial IR level blocks like
3403 // catchswitch for successors.
3404 MachineBasicBlock *Return = FuncInfo.getMBB(I.getSuccessor(0));
3405 const BasicBlock *EHPadBB = I.getSuccessor(1);
3406 MachineBasicBlock *EHPadMBB = FuncInfo.getMBB(EHPadBB);
3407
3408 // Deopt and ptrauth bundles are lowered in helper functions, and we don't
3409 // have to do anything here to lower funclet bundles.
3410 failForInvalidBundles(I, "invokes",
3416
3417 const Value *Callee(I.getCalledOperand());
3418 const Function *Fn = dyn_cast<Function>(Callee);
3419 if (isa<InlineAsm>(Callee))
3420 visitInlineAsm(I, EHPadBB);
3421 else if (Fn && Fn->isIntrinsic()) {
3422 switch (Fn->getIntrinsicID()) {
3423 default:
3424 llvm_unreachable("Cannot invoke this intrinsic");
3425 case Intrinsic::donothing:
3426 // Ignore invokes to @llvm.donothing: jump directly to the next BB.
3427 case Intrinsic::seh_try_begin:
3428 case Intrinsic::seh_scope_begin:
3429 case Intrinsic::seh_try_end:
3430 case Intrinsic::seh_scope_end:
3431 if (EHPadMBB)
3432 // a block referenced by EH table
3433 // so dtor-funclet not removed by opts
3434 EHPadMBB->setMachineBlockAddressTaken();
3435 break;
3436 case Intrinsic::experimental_patchpoint_void:
3437 case Intrinsic::experimental_patchpoint:
3438 visitPatchpoint(I, EHPadBB);
3439 break;
3440 case Intrinsic::experimental_gc_statepoint:
3442 break;
3443 // wasm_throw, wasm_rethrow: This is usually done in visitTargetIntrinsic,
3444 // but these intrinsics are special because they can be invoked, so we
3445 // manually lower it to a DAG node here.
3446 case Intrinsic::wasm_throw: {
3448 std::array<SDValue, 4> Ops = {
3449 getControlRoot(), // inchain for the terminator node
3450 DAG.getTargetConstant(Intrinsic::wasm_throw, getCurSDLoc(),
3452 getValue(I.getArgOperand(0)), // tag
3453 getValue(I.getArgOperand(1)) // thrown value
3454 };
3455 SDVTList VTs = DAG.getVTList(ArrayRef<EVT>({MVT::Other})); // outchain
3456 DAG.setRoot(DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops));
3457 break;
3458 }
3459 case Intrinsic::wasm_rethrow: {
3460 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3461 std::array<SDValue, 2> Ops = {
3462 getControlRoot(), // inchain for the terminator node
3463 DAG.getTargetConstant(Intrinsic::wasm_rethrow, getCurSDLoc(),
3464 TLI.getPointerTy(DAG.getDataLayout()))};
3465 SDVTList VTs = DAG.getVTList(ArrayRef<EVT>({MVT::Other})); // outchain
3466 DAG.setRoot(DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops));
3467 break;
3468 }
3469 }
3470 } else if (I.hasDeoptState()) {
3471 // Currently we do not lower any intrinsic calls with deopt operand bundles.
3472 // Eventually we will support lowering the @llvm.experimental.deoptimize
3473 // intrinsic, and right now there are no plans to support other intrinsics
3474 // with deopt state.
3475 LowerCallSiteWithDeoptBundle(&I, getValue(Callee), EHPadBB);
3476 } else if (I.countOperandBundlesOfType(LLVMContext::OB_ptrauth)) {
3478 } else {
3479 LowerCallTo(I, getValue(Callee), false, false, EHPadBB);
3480 }
3481
3482 // If the value of the invoke is used outside of its defining block, make it
3483 // available as a virtual register.
3484 // We already took care of the exported value for the statepoint instruction
3485 // during call to the LowerStatepoint.
3486 if (!isa<GCStatepointInst>(I)) {
3488 }
3489
3491 BranchProbabilityInfo *BPI = FuncInfo.BPI;
3492 BranchProbability EHPadBBProb =
3493 BPI ? BPI->getEdgeProbability(InvokeMBB->getBasicBlock(), EHPadBB)
3495 findUnwindDestinations(FuncInfo, EHPadBB, EHPadBBProb, UnwindDests);
3496
3497 // Update successor info.
3498 addSuccessorWithProb(InvokeMBB, Return);
3499 for (auto &UnwindDest : UnwindDests) {
3500 UnwindDest.first->setIsEHPad();
3501 addSuccessorWithProb(InvokeMBB, UnwindDest.first, UnwindDest.second);
3502 }
3503 InvokeMBB->normalizeSuccProbs();
3504
3505 // Drop into normal successor.
3506 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other, getControlRoot(),
3507 DAG.getBasicBlock(Return)));
3508}
3509
3510void SelectionDAGBuilder::visitCallBr(const CallBrInst &I) {
3511 MachineBasicBlock *CallBrMBB = FuncInfo.MBB;
3512
3513 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
3514 // have to do anything here to lower funclet bundles.
3515 failForInvalidBundles(I, "callbrs",
3517
3518 assert(I.isInlineAsm() && "Only know how to handle inlineasm callbr");
3519 visitInlineAsm(I);
3521
3522 // Retrieve successors.
3523 SmallPtrSet<BasicBlock *, 8> Dests;
3524 Dests.insert(I.getDefaultDest());
3525 MachineBasicBlock *Return = FuncInfo.getMBB(I.getDefaultDest());
3526
3527 // Update successor info.
3528 addSuccessorWithProb(CallBrMBB, Return, BranchProbability::getOne());
3529 for (BasicBlock *Dest : I.getIndirectDests()) {
3530 MachineBasicBlock *Target = FuncInfo.getMBB(Dest);
3531 Target->setIsInlineAsmBrIndirectTarget();
3532 // If we introduce a type of asm goto statement that is permitted to use an
3533 // indirect call instruction to jump to its labels, then we should add a
3534 // call to Target->setMachineBlockAddressTaken() here, to mark the target
3535 // block as requiring a BTI.
3536
3537 Target->setLabelMustBeEmitted();
3538 // Don't add duplicate machine successors.
3539 if (Dests.insert(Dest).second)
3540 addSuccessorWithProb(CallBrMBB, Target, BranchProbability::getZero());
3541 }
3542 CallBrMBB->normalizeSuccProbs();
3543
3544 // Drop into default successor.
3545 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(),
3546 MVT::Other, getControlRoot(),
3547 DAG.getBasicBlock(Return)));
3548}
3549
3550void SelectionDAGBuilder::visitResume(const ResumeInst &RI) {
3551 llvm_unreachable("SelectionDAGBuilder shouldn't visit resume instructions!");
3552}
3553
3554void SelectionDAGBuilder::visitLandingPad(const LandingPadInst &LP) {
3555 assert(FuncInfo.MBB->isEHPad() &&
3556 "Call to landingpad not in landing pad!");
3557
3558 // If there aren't registers to copy the values into (e.g., during SjLj
3559 // exceptions), then don't bother to create these DAG nodes.
3560 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3561 const Constant *PersonalityFn = FuncInfo.Fn->getPersonalityFn();
3562 if (TLI.getExceptionPointerRegister(PersonalityFn) == 0 &&
3563 TLI.getExceptionSelectorRegister(PersonalityFn) == 0)
3564 return;
3565
3566 // If landingpad's return type is token type, we don't create DAG nodes
3567 // for its exception pointer and selector value. The extraction of exception
3568 // pointer or selector value from token type landingpads is not currently
3569 // supported.
3570 if (LP.getType()->isTokenTy())
3571 return;
3572
3573 SmallVector<EVT, 2> ValueVTs;
3574 SDLoc dl = getCurSDLoc();
3575 ComputeValueVTs(TLI, DAG.getDataLayout(), LP.getType(), ValueVTs);
3576 assert(ValueVTs.size() == 2 && "Only two-valued landingpads are supported");
3577
3578 // Get the two live-in registers as SDValues. The physregs have already been
3579 // copied into virtual registers.
3580 SDValue Ops[2];
3581 if (FuncInfo.ExceptionPointerVirtReg) {
3582 Ops[0] = DAG.getZExtOrTrunc(
3583 DAG.getCopyFromReg(DAG.getEntryNode(), dl,
3584 FuncInfo.ExceptionPointerVirtReg,
3585 TLI.getPointerTy(DAG.getDataLayout())),
3586 dl, ValueVTs[0]);
3587 } else {
3588 Ops[0] = DAG.getConstant(0, dl, TLI.getPointerTy(DAG.getDataLayout()));
3589 }
3590 Ops[1] = DAG.getZExtOrTrunc(
3591 DAG.getCopyFromReg(DAG.getEntryNode(), dl,
3592 FuncInfo.ExceptionSelectorVirtReg,
3593 TLI.getPointerTy(DAG.getDataLayout())),
3594 dl, ValueVTs[1]);
3595
3596 // Merge into one.
3597 SDValue Res = DAG.getNode(ISD::MERGE_VALUES, dl,
3598 DAG.getVTList(ValueVTs), Ops);
3599 setValue(&LP, Res);
3600}
3601
3604 // Update JTCases.
3605 for (JumpTableBlock &JTB : SL->JTCases)
3606 if (JTB.first.HeaderBB == First)
3607 JTB.first.HeaderBB = Last;
3608
3609 // Update BitTestCases.
3610 for (BitTestBlock &BTB : SL->BitTestCases)
3611 if (BTB.Parent == First)
3612 BTB.Parent = Last;
3613}
3614
3615void SelectionDAGBuilder::visitIndirectBr(const IndirectBrInst &I) {
3616 MachineBasicBlock *IndirectBrMBB = FuncInfo.MBB;
3617
3618 // Update machine-CFG edges with unique successors.
3620 for (unsigned i = 0, e = I.getNumSuccessors(); i != e; ++i) {
3621 BasicBlock *BB = I.getSuccessor(i);
3622 bool Inserted = Done.insert(BB).second;
3623 if (!Inserted)
3624 continue;
3625
3626 MachineBasicBlock *Succ = FuncInfo.getMBB(BB);
3627 addSuccessorWithProb(IndirectBrMBB, Succ);
3628 }
3629 IndirectBrMBB->normalizeSuccProbs();
3630
3631 DAG.setRoot(DAG.getNode(ISD::BRIND, getCurSDLoc(),
3632 MVT::Other, getControlRoot(),
3633 getValue(I.getAddress())));
3634}
3635
3636void SelectionDAGBuilder::visitUnreachable(const UnreachableInst &I) {
3637 if (!I.shouldLowerToTrap(DAG.getTarget().Options.TrapUnreachable,
3638 DAG.getTarget().Options.NoTrapAfterNoreturn))
3639 return;
3640
3641 DAG.setRoot(DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, DAG.getRoot()));
3642}
3643
3644void SelectionDAGBuilder::visitUnary(const User &I, unsigned Opcode) {
3645 SDNodeFlags Flags;
3646 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3647 Flags.copyFMF(*FPOp);
3648
3649 SDValue Op = getValue(I.getOperand(0));
3650 SDValue UnNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op.getValueType(),
3651 Op, Flags);
3652 setValue(&I, UnNodeValue);
3653}
3654
3655void SelectionDAGBuilder::visitBinary(const User &I, unsigned Opcode) {
3656 SDNodeFlags Flags;
3657 if (auto *OFBinOp = dyn_cast<OverflowingBinaryOperator>(&I)) {
3658 Flags.setNoSignedWrap(OFBinOp->hasNoSignedWrap());
3659 Flags.setNoUnsignedWrap(OFBinOp->hasNoUnsignedWrap());
3660 }
3661 if (auto *ExactOp = dyn_cast<PossiblyExactOperator>(&I))
3662 Flags.setExact(ExactOp->isExact());
3663 if (auto *DisjointOp = dyn_cast<PossiblyDisjointInst>(&I))
3664 Flags.setDisjoint(DisjointOp->isDisjoint());
3665 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3666 Flags.copyFMF(*FPOp);
3667
3668 SDValue Op1 = getValue(I.getOperand(0));
3669 SDValue Op2 = getValue(I.getOperand(1));
3670 SDValue BinNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(),
3671 Op1, Op2, Flags);
3672 setValue(&I, BinNodeValue);
3673}
3674
3675void SelectionDAGBuilder::visitShift(const User &I, unsigned Opcode) {
3676 SDValue Op1 = getValue(I.getOperand(0));
3677 SDValue Op2 = getValue(I.getOperand(1));
3678
3679 EVT ShiftTy = DAG.getTargetLoweringInfo().getShiftAmountTy(
3680 Op1.getValueType(), DAG.getDataLayout());
3681
3682 // Coerce the shift amount to the right type if we can. This exposes the
3683 // truncate or zext to optimization early.
3684 if (!I.getType()->isVectorTy() && Op2.getValueType() != ShiftTy) {
3686 "Unexpected shift type");
3687 Op2 = DAG.getZExtOrTrunc(Op2, getCurSDLoc(), ShiftTy);
3688 }
3689
3690 bool nuw = false;
3691 bool nsw = false;
3692 bool exact = false;
3693
3694 if (Opcode == ISD::SRL || Opcode == ISD::SRA || Opcode == ISD::SHL) {
3695
3696 if (const OverflowingBinaryOperator *OFBinOp =
3698 nuw = OFBinOp->hasNoUnsignedWrap();
3699 nsw = OFBinOp->hasNoSignedWrap();
3700 }
3701 if (const PossiblyExactOperator *ExactOp =
3703 exact = ExactOp->isExact();
3704 }
3705 SDNodeFlags Flags;
3706 Flags.setExact(exact);
3707 Flags.setNoSignedWrap(nsw);
3708 Flags.setNoUnsignedWrap(nuw);
3709 SDValue Res = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(), Op1, Op2,
3710 Flags);
3711 setValue(&I, Res);
3712}
3713
3714void SelectionDAGBuilder::visitSDiv(const User &I) {
3715 SDValue Op1 = getValue(I.getOperand(0));
3716 SDValue Op2 = getValue(I.getOperand(1));
3717
3718 SDNodeFlags Flags;
3719 Flags.setExact(isa<PossiblyExactOperator>(&I) &&
3720 cast<PossiblyExactOperator>(&I)->isExact());
3721 setValue(&I, DAG.getNode(ISD::SDIV, getCurSDLoc(), Op1.getValueType(), Op1,
3722 Op2, Flags));
3723}
3724
3725void SelectionDAGBuilder::visitICmp(const ICmpInst &I) {
3726 ICmpInst::Predicate predicate = I.getPredicate();
3727 SDValue Op1 = getValue(I.getOperand(0));
3728 SDValue Op2 = getValue(I.getOperand(1));
3729 ISD::CondCode Opcode = getICmpCondCode(predicate);
3730
3731 auto &TLI = DAG.getTargetLoweringInfo();
3732 EVT MemVT =
3733 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
3734
3735 // If a pointer's DAG type is larger than its memory type then the DAG values
3736 // are zero-extended. This breaks signed comparisons so truncate back to the
3737 // underlying type before doing the compare.
3738 if (Op1.getValueType() != MemVT) {
3739 Op1 = DAG.getPtrExtOrTrunc(Op1, getCurSDLoc(), MemVT);
3740 Op2 = DAG.getPtrExtOrTrunc(Op2, getCurSDLoc(), MemVT);
3741 }
3742
3743 SDNodeFlags Flags;
3744 Flags.setSameSign(I.hasSameSign());
3745 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
3746
3747 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3748 I.getType());
3749 setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Opcode));
3750}
3751
3752void SelectionDAGBuilder::visitFCmp(const FCmpInst &I) {
3753 FCmpInst::Predicate predicate = I.getPredicate();
3754 SDValue Op1 = getValue(I.getOperand(0));
3755 SDValue Op2 = getValue(I.getOperand(1));
3756
3757 ISD::CondCode Condition = getFCmpCondCode(predicate);
3758 auto *FPMO = cast<FPMathOperator>(&I);
3759 if (FPMO->hasNoNaNs() || TM.Options.NoNaNsFPMath)
3760 Condition = getFCmpCodeWithoutNaN(Condition);
3761
3762 SDNodeFlags Flags;
3763 Flags.copyFMF(*FPMO);
3764 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
3765
3766 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3767 I.getType());
3768 setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Condition));
3769}
3770
3771// Check if the condition of the select has one use or two users that are both
3772// selects with the same condition.
3773static bool hasOnlySelectUsers(const Value *Cond) {
3774 return llvm::all_of(Cond->users(), [](const Value *V) {
3775 return isa<SelectInst>(V);
3776 });
3777}
3778
3779void SelectionDAGBuilder::visitSelect(const User &I) {
3780 SmallVector<EVT, 4> ValueVTs;
3781 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
3782 ValueVTs);
3783 unsigned NumValues = ValueVTs.size();
3784 if (NumValues == 0) return;
3785
3786 SmallVector<SDValue, 4> Values(NumValues);
3787 SDValue Cond = getValue(I.getOperand(0));
3788 SDValue LHSVal = getValue(I.getOperand(1));
3789 SDValue RHSVal = getValue(I.getOperand(2));
3790 SmallVector<SDValue, 1> BaseOps(1, Cond);
3792 Cond.getValueType().isVector() ? ISD::VSELECT : ISD::SELECT;
3793
3794 bool IsUnaryAbs = false;
3795 bool Negate = false;
3796
3797 SDNodeFlags Flags;
3798 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3799 Flags.copyFMF(*FPOp);
3800
3801 Flags.setUnpredictable(
3802 cast<SelectInst>(I).getMetadata(LLVMContext::MD_unpredictable));
3803
3804 // Min/max matching is only viable if all output VTs are the same.
3805 if (all_equal(ValueVTs)) {
3806 EVT VT = ValueVTs[0];
3807 LLVMContext &Ctx = *DAG.getContext();
3808 auto &TLI = DAG.getTargetLoweringInfo();
3809
3810 // We care about the legality of the operation after it has been type
3811 // legalized.
3812 while (TLI.getTypeAction(Ctx, VT) != TargetLoweringBase::TypeLegal)
3813 VT = TLI.getTypeToTransformTo(Ctx, VT);
3814
3815 // If the vselect is legal, assume we want to leave this as a vector setcc +
3816 // vselect. Otherwise, if this is going to be scalarized, we want to see if
3817 // min/max is legal on the scalar type.
3818 bool UseScalarMinMax = VT.isVector() &&
3820
3821 // ValueTracking's select pattern matching does not account for -0.0,
3822 // so we can't lower to FMINIMUM/FMAXIMUM because those nodes specify that
3823 // -0.0 is less than +0.0.
3824 const Value *LHS, *RHS;
3825 auto SPR = matchSelectPattern(&I, LHS, RHS);
3827 switch (SPR.Flavor) {
3828 case SPF_UMAX: Opc = ISD::UMAX; break;
3829 case SPF_UMIN: Opc = ISD::UMIN; break;
3830 case SPF_SMAX: Opc = ISD::SMAX; break;
3831 case SPF_SMIN: Opc = ISD::SMIN; break;
3832 case SPF_FMINNUM:
3833 switch (SPR.NaNBehavior) {
3834 case SPNB_NA: llvm_unreachable("No NaN behavior for FP op?");
3835 case SPNB_RETURNS_NAN: break;
3836 case SPNB_RETURNS_OTHER: Opc = ISD::FMINNUM; break;
3837 case SPNB_RETURNS_ANY:
3838 if (TLI.isOperationLegalOrCustom(ISD::FMINNUM, VT) ||
3839 (UseScalarMinMax &&
3840 TLI.isOperationLegalOrCustom(ISD::FMINNUM, VT.getScalarType())))
3841 Opc = ISD::FMINNUM;
3842 break;
3843 }
3844 break;
3845 case SPF_FMAXNUM:
3846 switch (SPR.NaNBehavior) {
3847 case SPNB_NA: llvm_unreachable("No NaN behavior for FP op?");
3848 case SPNB_RETURNS_NAN: break;
3849 case SPNB_RETURNS_OTHER: Opc = ISD::FMAXNUM; break;
3850 case SPNB_RETURNS_ANY:
3851 if (TLI.isOperationLegalOrCustom(ISD::FMAXNUM, VT) ||
3852 (UseScalarMinMax &&
3853 TLI.isOperationLegalOrCustom(ISD::FMAXNUM, VT.getScalarType())))
3854 Opc = ISD::FMAXNUM;
3855 break;
3856 }
3857 break;
3858 case SPF_NABS:
3859 Negate = true;
3860 [[fallthrough]];
3861 case SPF_ABS:
3862 IsUnaryAbs = true;
3863 Opc = ISD::ABS;
3864 break;
3865 default: break;
3866 }
3867
3868 if (!IsUnaryAbs && Opc != ISD::DELETED_NODE &&
3869 (TLI.isOperationLegalOrCustom(Opc, VT) ||
3870 (UseScalarMinMax &&
3872 // If the underlying comparison instruction is used by any other
3873 // instruction, the consumed instructions won't be destroyed, so it is
3874 // not profitable to convert to a min/max.
3876 OpCode = Opc;
3877 LHSVal = getValue(LHS);
3878 RHSVal = getValue(RHS);
3879 BaseOps.clear();
3880 }
3881
3882 if (IsUnaryAbs) {
3883 OpCode = Opc;
3884 LHSVal = getValue(LHS);
3885 BaseOps.clear();
3886 }
3887 }
3888
3889 if (IsUnaryAbs) {
3890 for (unsigned i = 0; i != NumValues; ++i) {
3891 SDLoc dl = getCurSDLoc();
3892 EVT VT = LHSVal.getNode()->getValueType(LHSVal.getResNo() + i);
3893 Values[i] =
3894 DAG.getNode(OpCode, dl, VT, LHSVal.getValue(LHSVal.getResNo() + i));
3895 if (Negate)
3896 Values[i] = DAG.getNegative(Values[i], dl, VT);
3897 }
3898 } else {
3899 for (unsigned i = 0; i != NumValues; ++i) {
3900 SmallVector<SDValue, 3> Ops(BaseOps.begin(), BaseOps.end());
3901 Ops.push_back(SDValue(LHSVal.getNode(), LHSVal.getResNo() + i));
3902 Ops.push_back(SDValue(RHSVal.getNode(), RHSVal.getResNo() + i));
3903 Values[i] = DAG.getNode(
3904 OpCode, getCurSDLoc(),
3905 LHSVal.getNode()->getValueType(LHSVal.getResNo() + i), Ops, Flags);
3906 }
3907 }
3908
3910 DAG.getVTList(ValueVTs), Values));
3911}
3912
3913void SelectionDAGBuilder::visitTrunc(const User &I) {
3914 // TruncInst cannot be a no-op cast because sizeof(src) > sizeof(dest).
3915 SDValue N = getValue(I.getOperand(0));
3916 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3917 I.getType());
3918 SDNodeFlags Flags;
3919 if (auto *Trunc = dyn_cast<TruncInst>(&I)) {
3920 Flags.setNoSignedWrap(Trunc->hasNoSignedWrap());
3921 Flags.setNoUnsignedWrap(Trunc->hasNoUnsignedWrap());
3922 }
3923
3924 setValue(&I, DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), DestVT, N, Flags));
3925}
3926
3927void SelectionDAGBuilder::visitZExt(const User &I) {
3928 // ZExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
3929 // ZExt also can't be a cast to bool for same reason. So, nothing much to do
3930 SDValue N = getValue(I.getOperand(0));
3931 auto &TLI = DAG.getTargetLoweringInfo();
3932 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
3933
3934 SDNodeFlags Flags;
3935 if (auto *PNI = dyn_cast<PossiblyNonNegInst>(&I))
3936 Flags.setNonNeg(PNI->hasNonNeg());
3937
3938 // Eagerly use nonneg information to canonicalize towards sign_extend if
3939 // that is the target's preference.
3940 // TODO: Let the target do this later.
3941 if (Flags.hasNonNeg() &&
3942 TLI.isSExtCheaperThanZExt(N.getValueType(), DestVT)) {
3943 setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));
3944 return;
3945 }
3946
3947 setValue(&I, DAG.getNode(ISD::ZERO_EXTEND, getCurSDLoc(), DestVT, N, Flags));
3948}
3949
3950void SelectionDAGBuilder::visitSExt(const User &I) {
3951 // SExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
3952 // SExt also can't be a cast to bool for same reason. So, nothing much to do
3953 SDValue N = getValue(I.getOperand(0));
3954 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3955 I.getType());
3956 setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));
3957}
3958
3959void SelectionDAGBuilder::visitFPTrunc(const User &I) {
3960 // FPTrunc is never a no-op cast, no need to check
3961 SDValue N = getValue(I.getOperand(0));
3962 SDLoc dl = getCurSDLoc();
3963 SDNodeFlags Flags;
3964 if (auto *TruncInst = dyn_cast<FPMathOperator>(&I))
3965 Flags.copyFMF(*TruncInst);
3966 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3967 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
3968 setValue(&I, DAG.getNode(ISD::FP_ROUND, dl, DestVT, N,
3969 DAG.getTargetConstant(
3970 0, dl, TLI.getPointerTy(DAG.getDataLayout())),
3971 Flags));
3972}
3973
3974void SelectionDAGBuilder::visitFPExt(const User &I) {
3975 // FPExt is never a no-op cast, no need to check
3976 SDValue N = getValue(I.getOperand(0));
3977 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3978 I.getType());
3979 setValue(&I, DAG.getNode(ISD::FP_EXTEND, getCurSDLoc(), DestVT, N));
3980}
3981
3982void SelectionDAGBuilder::visitFPToUI(const User &I) {
3983 // FPToUI is never a no-op cast, no need to check
3984 SDValue N = getValue(I.getOperand(0));
3985 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3986 I.getType());
3987 setValue(&I, DAG.getNode(ISD::FP_TO_UINT, getCurSDLoc(), DestVT, N));
3988}
3989
3990void SelectionDAGBuilder::visitFPToSI(const User &I) {
3991 // FPToSI is never a no-op cast, no need to check
3992 SDValue N = getValue(I.getOperand(0));
3993 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3994 I.getType());
3995 setValue(&I, DAG.getNode(ISD::FP_TO_SINT, getCurSDLoc(), DestVT, N));
3996}
3997
3998void SelectionDAGBuilder::visitUIToFP(const User &I) {
3999 // UIToFP is never a no-op cast, no need to check
4000 SDValue N = getValue(I.getOperand(0));
4001 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4002 I.getType());
4003 SDNodeFlags Flags;
4004 if (auto *PNI = dyn_cast<PossiblyNonNegInst>(&I))
4005 Flags.setNonNeg(PNI->hasNonNeg());
4006
4007 setValue(&I, DAG.getNode(ISD::UINT_TO_FP, getCurSDLoc(), DestVT, N, Flags));
4008}
4009
4010void SelectionDAGBuilder::visitSIToFP(const User &I) {
4011 // SIToFP is never a no-op cast, no need to check
4012 SDValue N = getValue(I.getOperand(0));
4013 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4014 I.getType());
4015 setValue(&I, DAG.getNode(ISD::SINT_TO_FP, getCurSDLoc(), DestVT, N));
4016}
4017
4018void SelectionDAGBuilder::visitPtrToAddr(const User &I) {
4019 SDValue N = getValue(I.getOperand(0));
4020 // By definition the type of the ptrtoaddr must be equal to the address type.
4021 const auto &TLI = DAG.getTargetLoweringInfo();
4022 EVT AddrVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4023 // The address width must be smaller or equal to the pointer representation
4024 // width, so we lower ptrtoaddr as a truncate (possibly folded to a no-op).
4025 N = DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), AddrVT, N);
4026 setValue(&I, N);
4027}
4028
4029void SelectionDAGBuilder::visitPtrToInt(const User &I) {
4030 // What to do depends on the size of the integer and the size of the pointer.
4031 // We can either truncate, zero extend, or no-op, accordingly.
4032 SDValue N = getValue(I.getOperand(0));
4033 auto &TLI = DAG.getTargetLoweringInfo();
4034 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4035 I.getType());
4036 EVT PtrMemVT =
4037 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
4038 N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), PtrMemVT);
4039 N = DAG.getZExtOrTrunc(N, getCurSDLoc(), DestVT);
4040 setValue(&I, N);
4041}
4042
4043void SelectionDAGBuilder::visitIntToPtr(const User &I) {
4044 // What to do depends on the size of the integer and the size of the pointer.
4045 // We can either truncate, zero extend, or no-op, accordingly.
4046 SDValue N = getValue(I.getOperand(0));
4047 auto &TLI = DAG.getTargetLoweringInfo();
4048 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4049 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(), I.getType());
4050 N = DAG.getZExtOrTrunc(N, getCurSDLoc(), PtrMemVT);
4051 N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), DestVT);
4052 setValue(&I, N);
4053}
4054
4055void SelectionDAGBuilder::visitBitCast(const User &I) {
4056 SDValue N = getValue(I.getOperand(0));
4057 SDLoc dl = getCurSDLoc();
4058 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4059 I.getType());
4060
4061 // BitCast assures us that source and destination are the same size so this is
4062 // either a BITCAST or a no-op.
4063 if (DestVT != N.getValueType())
4064 setValue(&I, DAG.getNode(ISD::BITCAST, dl,
4065 DestVT, N)); // convert types.
4066 // Check if the original LLVM IR Operand was a ConstantInt, because getValue()
4067 // might fold any kind of constant expression to an integer constant and that
4068 // is not what we are looking for. Only recognize a bitcast of a genuine
4069 // constant integer as an opaque constant.
4070 else if(ConstantInt *C = dyn_cast<ConstantInt>(I.getOperand(0)))
4071 setValue(&I, DAG.getConstant(C->getValue(), dl, DestVT, /*isTarget=*/false,
4072 /*isOpaque*/true));
4073 else
4074 setValue(&I, N); // noop cast.
4075}
4076
4077void SelectionDAGBuilder::visitAddrSpaceCast(const User &I) {
4078 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4079 const Value *SV = I.getOperand(0);
4080 SDValue N = getValue(SV);
4081 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4082
4083 unsigned SrcAS = SV->getType()->getPointerAddressSpace();
4084 unsigned DestAS = I.getType()->getPointerAddressSpace();
4085
4086 if (!TM.isNoopAddrSpaceCast(SrcAS, DestAS))
4087 N = DAG.getAddrSpaceCast(getCurSDLoc(), DestVT, N, SrcAS, DestAS);
4088
4089 setValue(&I, N);
4090}
4091
4092void SelectionDAGBuilder::visitInsertElement(const User &I) {
4093 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4094 SDValue InVec = getValue(I.getOperand(0));
4095 SDValue InVal = getValue(I.getOperand(1));
4096 SDValue InIdx = DAG.getZExtOrTrunc(getValue(I.getOperand(2)), getCurSDLoc(),
4097 TLI.getVectorIdxTy(DAG.getDataLayout()));
4099 TLI.getValueType(DAG.getDataLayout(), I.getType()),
4100 InVec, InVal, InIdx));
4101}
4102
4103void SelectionDAGBuilder::visitExtractElement(const User &I) {
4104 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4105 SDValue InVec = getValue(I.getOperand(0));
4106 SDValue InIdx = DAG.getZExtOrTrunc(getValue(I.getOperand(1)), getCurSDLoc(),
4107 TLI.getVectorIdxTy(DAG.getDataLayout()));
4109 TLI.getValueType(DAG.getDataLayout(), I.getType()),
4110 InVec, InIdx));
4111}
4112
4113void SelectionDAGBuilder::visitShuffleVector(const User &I) {
4114 SDValue Src1 = getValue(I.getOperand(0));
4115 SDValue Src2 = getValue(I.getOperand(1));
4116 ArrayRef<int> Mask;
4117 if (auto *SVI = dyn_cast<ShuffleVectorInst>(&I))
4118 Mask = SVI->getShuffleMask();
4119 else
4120 Mask = cast<ConstantExpr>(I).getShuffleMask();
4121 SDLoc DL = getCurSDLoc();
4122 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4123 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4124 EVT SrcVT = Src1.getValueType();
4125
4126 if (all_of(Mask, [](int Elem) { return Elem == 0; }) &&
4127 VT.isScalableVector()) {
4128 // Canonical splat form of first element of first input vector.
4129 SDValue FirstElt =
4130 DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, SrcVT.getScalarType(), Src1,
4131 DAG.getVectorIdxConstant(0, DL));
4132 setValue(&I, DAG.getNode(ISD::SPLAT_VECTOR, DL, VT, FirstElt));
4133 return;
4134 }
4135
4136 // For now, we only handle splats for scalable vectors.
4137 // The DAGCombiner will perform a BUILD_VECTOR -> SPLAT_VECTOR transformation
4138 // for targets that support a SPLAT_VECTOR for non-scalable vector types.
4139 assert(!VT.isScalableVector() && "Unsupported scalable vector shuffle");
4140
4141 unsigned SrcNumElts = SrcVT.getVectorNumElements();
4142 unsigned MaskNumElts = Mask.size();
4143
4144 if (SrcNumElts == MaskNumElts) {
4145 setValue(&I, DAG.getVectorShuffle(VT, DL, Src1, Src2, Mask));
4146 return;
4147 }
4148
4149 // Normalize the shuffle vector since mask and vector length don't match.
4150 if (SrcNumElts < MaskNumElts) {
4151 // Mask is longer than the source vectors. We can use concatenate vector to
4152 // make the mask and vectors lengths match.
4153
4154 if (MaskNumElts % SrcNumElts == 0) {
4155 // Mask length is a multiple of the source vector length.
4156 // Check if the shuffle is some kind of concatenation of the input
4157 // vectors.
4158 unsigned NumConcat = MaskNumElts / SrcNumElts;
4159 bool IsConcat = true;
4160 SmallVector<int, 8> ConcatSrcs(NumConcat, -1);
4161 for (unsigned i = 0; i != MaskNumElts; ++i) {
4162 int Idx = Mask[i];
4163 if (Idx < 0)
4164 continue;
4165 // Ensure the indices in each SrcVT sized piece are sequential and that
4166 // the same source is used for the whole piece.
4167 if ((Idx % SrcNumElts != (i % SrcNumElts)) ||
4168 (ConcatSrcs[i / SrcNumElts] >= 0 &&
4169 ConcatSrcs[i / SrcNumElts] != (int)(Idx / SrcNumElts))) {
4170 IsConcat = false;
4171 break;
4172 }
4173 // Remember which source this index came from.
4174 ConcatSrcs[i / SrcNumElts] = Idx / SrcNumElts;
4175 }
4176
4177 // The shuffle is concatenating multiple vectors together. Just emit
4178 // a CONCAT_VECTORS operation.
4179 if (IsConcat) {
4180 SmallVector<SDValue, 8> ConcatOps;
4181 for (auto Src : ConcatSrcs) {
4182 if (Src < 0)
4183 ConcatOps.push_back(DAG.getUNDEF(SrcVT));
4184 else if (Src == 0)
4185 ConcatOps.push_back(Src1);
4186 else
4187 ConcatOps.push_back(Src2);
4188 }
4189 setValue(&I, DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, ConcatOps));
4190 return;
4191 }
4192 }
4193
4194 unsigned PaddedMaskNumElts = alignTo(MaskNumElts, SrcNumElts);
4195 unsigned NumConcat = PaddedMaskNumElts / SrcNumElts;
4196 EVT PaddedVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(),
4197 PaddedMaskNumElts);
4198
4199 // Pad both vectors with undefs to make them the same length as the mask.
4200 SDValue UndefVal = DAG.getUNDEF(SrcVT);
4201
4202 SmallVector<SDValue, 8> MOps1(NumConcat, UndefVal);
4203 SmallVector<SDValue, 8> MOps2(NumConcat, UndefVal);
4204 MOps1[0] = Src1;
4205 MOps2[0] = Src2;
4206
4207 Src1 = DAG.getNode(ISD::CONCAT_VECTORS, DL, PaddedVT, MOps1);
4208 Src2 = DAG.getNode(ISD::CONCAT_VECTORS, DL, PaddedVT, MOps2);
4209
4210 // Readjust mask for new input vector length.
4211 SmallVector<int, 8> MappedOps(PaddedMaskNumElts, -1);
4212 for (unsigned i = 0; i != MaskNumElts; ++i) {
4213 int Idx = Mask[i];
4214 if (Idx >= (int)SrcNumElts)
4215 Idx -= SrcNumElts - PaddedMaskNumElts;
4216 MappedOps[i] = Idx;
4217 }
4218
4219 SDValue Result = DAG.getVectorShuffle(PaddedVT, DL, Src1, Src2, MappedOps);
4220
4221 // If the concatenated vector was padded, extract a subvector with the
4222 // correct number of elements.
4223 if (MaskNumElts != PaddedMaskNumElts)
4224 Result = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Result,
4225 DAG.getVectorIdxConstant(0, DL));
4226
4227 setValue(&I, Result);
4228 return;
4229 }
4230
4231 assert(SrcNumElts > MaskNumElts);
4232
4233 // Analyze the access pattern of the vector to see if we can extract
4234 // two subvectors and do the shuffle.
4235 int StartIdx[2] = {-1, -1}; // StartIdx to extract from
4236 bool CanExtract = true;
4237 for (int Idx : Mask) {
4238 unsigned Input = 0;
4239 if (Idx < 0)
4240 continue;
4241
4242 if (Idx >= (int)SrcNumElts) {
4243 Input = 1;
4244 Idx -= SrcNumElts;
4245 }
4246
4247 // If all the indices come from the same MaskNumElts sized portion of
4248 // the sources we can use extract. Also make sure the extract wouldn't
4249 // extract past the end of the source.
4250 int NewStartIdx = alignDown(Idx, MaskNumElts);
4251 if (NewStartIdx + MaskNumElts > SrcNumElts ||
4252 (StartIdx[Input] >= 0 && StartIdx[Input] != NewStartIdx))
4253 CanExtract = false;
4254 // Make sure we always update StartIdx as we use it to track if all
4255 // elements are undef.
4256 StartIdx[Input] = NewStartIdx;
4257 }
4258
4259 if (StartIdx[0] < 0 && StartIdx[1] < 0) {
4260 setValue(&I, DAG.getUNDEF(VT)); // Vectors are not used.
4261 return;
4262 }
4263 if (CanExtract) {
4264 // Extract appropriate subvector and generate a vector shuffle
4265 for (unsigned Input = 0; Input < 2; ++Input) {
4266 SDValue &Src = Input == 0 ? Src1 : Src2;
4267 if (StartIdx[Input] < 0)
4268 Src = DAG.getUNDEF(VT);
4269 else {
4270 Src = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Src,
4271 DAG.getVectorIdxConstant(StartIdx[Input], DL));
4272 }
4273 }
4274
4275 // Calculate new mask.
4276 SmallVector<int, 8> MappedOps(Mask);
4277 for (int &Idx : MappedOps) {
4278 if (Idx >= (int)SrcNumElts)
4279 Idx -= SrcNumElts + StartIdx[1] - MaskNumElts;
4280 else if (Idx >= 0)
4281 Idx -= StartIdx[0];
4282 }
4283
4284 setValue(&I, DAG.getVectorShuffle(VT, DL, Src1, Src2, MappedOps));
4285 return;
4286 }
4287
4288 // We can't use either concat vectors or extract subvectors so fall back to
4289 // replacing the shuffle with extract and build vector.
4290 // to insert and build vector.
4291 EVT EltVT = VT.getVectorElementType();
4293 for (int Idx : Mask) {
4294 SDValue Res;
4295
4296 if (Idx < 0) {
4297 Res = DAG.getUNDEF(EltVT);
4298 } else {
4299 SDValue &Src = Idx < (int)SrcNumElts ? Src1 : Src2;
4300 if (Idx >= (int)SrcNumElts) Idx -= SrcNumElts;
4301
4302 Res = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Src,
4303 DAG.getVectorIdxConstant(Idx, DL));
4304 }
4305
4306 Ops.push_back(Res);
4307 }
4308
4309 setValue(&I, DAG.getBuildVector(VT, DL, Ops));
4310}
4311
4312void SelectionDAGBuilder::visitInsertValue(const InsertValueInst &I) {
4313 ArrayRef<unsigned> Indices = I.getIndices();
4314 const Value *Op0 = I.getOperand(0);
4315 const Value *Op1 = I.getOperand(1);
4316 Type *AggTy = I.getType();
4317 Type *ValTy = Op1->getType();
4318 bool IntoUndef = isa<UndefValue>(Op0);
4319 bool FromUndef = isa<UndefValue>(Op1);
4320
4321 unsigned LinearIndex = ComputeLinearIndex(AggTy, Indices);
4322
4323 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4324 SmallVector<EVT, 4> AggValueVTs;
4325 ComputeValueVTs(TLI, DAG.getDataLayout(), AggTy, AggValueVTs);
4326 SmallVector<EVT, 4> ValValueVTs;
4327 ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);
4328
4329 unsigned NumAggValues = AggValueVTs.size();
4330 unsigned NumValValues = ValValueVTs.size();
4331 SmallVector<SDValue, 4> Values(NumAggValues);
4332
4333 // Ignore an insertvalue that produces an empty object
4334 if (!NumAggValues) {
4335 setValue(&I, DAG.getUNDEF(MVT(MVT::Other)));
4336 return;
4337 }
4338
4339 SDValue Agg = getValue(Op0);
4340 unsigned i = 0;
4341 // Copy the beginning value(s) from the original aggregate.
4342 for (; i != LinearIndex; ++i)
4343 Values[i] = IntoUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4344 SDValue(Agg.getNode(), Agg.getResNo() + i);
4345 // Copy values from the inserted value(s).
4346 if (NumValValues) {
4347 SDValue Val = getValue(Op1);
4348 for (; i != LinearIndex + NumValValues; ++i)
4349 Values[i] = FromUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4350 SDValue(Val.getNode(), Val.getResNo() + i - LinearIndex);
4351 }
4352 // Copy remaining value(s) from the original aggregate.
4353 for (; i != NumAggValues; ++i)
4354 Values[i] = IntoUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4355 SDValue(Agg.getNode(), Agg.getResNo() + i);
4356
4358 DAG.getVTList(AggValueVTs), Values));
4359}
4360
4361void SelectionDAGBuilder::visitExtractValue(const ExtractValueInst &I) {
4362 ArrayRef<unsigned> Indices = I.getIndices();
4363 const Value *Op0 = I.getOperand(0);
4364 Type *AggTy = Op0->getType();
4365 Type *ValTy = I.getType();
4366 bool OutOfUndef = isa<UndefValue>(Op0);
4367
4368 unsigned LinearIndex = ComputeLinearIndex(AggTy, Indices);
4369
4370 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4371 SmallVector<EVT, 4> ValValueVTs;
4372 ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);
4373
4374 unsigned NumValValues = ValValueVTs.size();
4375
4376 // Ignore a extractvalue that produces an empty object
4377 if (!NumValValues) {
4378 setValue(&I, DAG.getUNDEF(MVT(MVT::Other)));
4379 return;
4380 }
4381
4382 SmallVector<SDValue, 4> Values(NumValValues);
4383
4384 SDValue Agg = getValue(Op0);
4385 // Copy out the selected value(s).
4386 for (unsigned i = LinearIndex; i != LinearIndex + NumValValues; ++i)
4387 Values[i - LinearIndex] =
4388 OutOfUndef ?
4389 DAG.getUNDEF(Agg.getNode()->getValueType(Agg.getResNo() + i)) :
4390 SDValue(Agg.getNode(), Agg.getResNo() + i);
4391
4393 DAG.getVTList(ValValueVTs), Values));
4394}
4395
4396void SelectionDAGBuilder::visitGetElementPtr(const User &I) {
4397 Value *Op0 = I.getOperand(0);
4398 // Note that the pointer operand may be a vector of pointers. Take the scalar
4399 // element which holds a pointer.
4400 unsigned AS = Op0->getType()->getScalarType()->getPointerAddressSpace();
4401 SDValue N = getValue(Op0);
4402 SDLoc dl = getCurSDLoc();
4403 auto &TLI = DAG.getTargetLoweringInfo();
4404 GEPNoWrapFlags NW = cast<GEPOperator>(I).getNoWrapFlags();
4405
4406 // For a vector GEP, keep the prefix scalar as long as possible, then
4407 // convert any scalars encountered after the first vector operand to vectors.
4408 bool IsVectorGEP = I.getType()->isVectorTy();
4409 ElementCount VectorElementCount =
4410 IsVectorGEP ? cast<VectorType>(I.getType())->getElementCount()
4412
4414 GTI != E; ++GTI) {
4415 const Value *Idx = GTI.getOperand();
4416 if (StructType *StTy = GTI.getStructTypeOrNull()) {
4417 unsigned Field = cast<Constant>(Idx)->getUniqueInteger().getZExtValue();
4418 if (Field) {
4419 // N = N + Offset
4420 uint64_t Offset =
4421 DAG.getDataLayout().getStructLayout(StTy)->getElementOffset(Field);
4422
4423 // In an inbounds GEP with an offset that is nonnegative even when
4424 // interpreted as signed, assume there is no unsigned overflow.
4425 SDNodeFlags Flags;
4426 if (NW.hasNoUnsignedWrap() ||
4427 (int64_t(Offset) >= 0 && NW.hasNoUnsignedSignedWrap()))
4429 Flags.setInBounds(NW.isInBounds());
4430
4431 N = DAG.getMemBasePlusOffset(
4432 N, DAG.getConstant(Offset, dl, N.getValueType()), dl, Flags);
4433 }
4434 } else {
4435 // IdxSize is the width of the arithmetic according to IR semantics.
4436 // In SelectionDAG, we may prefer to do arithmetic in a wider bitwidth
4437 // (and fix up the result later).
4438 unsigned IdxSize = DAG.getDataLayout().getIndexSizeInBits(AS);
4439 MVT IdxTy = MVT::getIntegerVT(IdxSize);
4440 TypeSize ElementSize =
4441 GTI.getSequentialElementStride(DAG.getDataLayout());
4442 // We intentionally mask away the high bits here; ElementSize may not
4443 // fit in IdxTy.
4444 APInt ElementMul(IdxSize, ElementSize.getKnownMinValue(),
4445 /*isSigned=*/false, /*implicitTrunc=*/true);
4446 bool ElementScalable = ElementSize.isScalable();
4447
4448 // If this is a scalar constant or a splat vector of constants,
4449 // handle it quickly.
4450 const auto *C = dyn_cast<Constant>(Idx);
4451 if (C && isa<VectorType>(C->getType()))
4452 C = C->getSplatValue();
4453
4454 const auto *CI = dyn_cast_or_null<ConstantInt>(C);
4455 if (CI && CI->isZero())
4456 continue;
4457 if (CI && !ElementScalable) {
4458 APInt Offs = ElementMul * CI->getValue().sextOrTrunc(IdxSize);
4459 LLVMContext &Context = *DAG.getContext();
4460 SDValue OffsVal;
4461 if (N.getValueType().isVector())
4462 OffsVal = DAG.getConstant(
4463 Offs, dl, EVT::getVectorVT(Context, IdxTy, VectorElementCount));
4464 else
4465 OffsVal = DAG.getConstant(Offs, dl, IdxTy);
4466
4467 // In an inbounds GEP with an offset that is nonnegative even when
4468 // interpreted as signed, assume there is no unsigned overflow.
4469 SDNodeFlags Flags;
4470 if (NW.hasNoUnsignedWrap() ||
4471 (Offs.isNonNegative() && NW.hasNoUnsignedSignedWrap()))
4472 Flags.setNoUnsignedWrap(true);
4473 Flags.setInBounds(NW.isInBounds());
4474
4475 OffsVal = DAG.getSExtOrTrunc(OffsVal, dl, N.getValueType());
4476
4477 N = DAG.getMemBasePlusOffset(N, OffsVal, dl, Flags);
4478 continue;
4479 }
4480
4481 // N = N + Idx * ElementMul;
4482 SDValue IdxN = getValue(Idx);
4483
4484 if (IdxN.getValueType().isVector() != N.getValueType().isVector()) {
4485 if (N.getValueType().isVector()) {
4486 EVT VT = EVT::getVectorVT(*Context, IdxN.getValueType(),
4487 VectorElementCount);
4488 IdxN = DAG.getSplat(VT, dl, IdxN);
4489 } else {
4490 EVT VT =
4491 EVT::getVectorVT(*Context, N.getValueType(), VectorElementCount);
4492 N = DAG.getSplat(VT, dl, N);
4493 }
4494 }
4495
4496 // If the index is smaller or larger than intptr_t, truncate or extend
4497 // it.
4498 IdxN = DAG.getSExtOrTrunc(IdxN, dl, N.getValueType());
4499
4500 SDNodeFlags ScaleFlags;
4501 // The multiplication of an index by the type size does not wrap the
4502 // pointer index type in a signed sense (mul nsw).
4504
4505 // The multiplication of an index by the type size does not wrap the
4506 // pointer index type in an unsigned sense (mul nuw).
4507 ScaleFlags.setNoUnsignedWrap(NW.hasNoUnsignedWrap());
4508
4509 if (ElementScalable) {
4510 EVT VScaleTy = N.getValueType().getScalarType();
4511 SDValue VScale = DAG.getNode(
4512 ISD::VSCALE, dl, VScaleTy,
4513 DAG.getConstant(ElementMul.getZExtValue(), dl, VScaleTy));
4514 if (N.getValueType().isVector())
4515 VScale = DAG.getSplatVector(N.getValueType(), dl, VScale);
4516 IdxN = DAG.getNode(ISD::MUL, dl, N.getValueType(), IdxN, VScale,
4517 ScaleFlags);
4518 } else {
4519 // If this is a multiply by a power of two, turn it into a shl
4520 // immediately. This is a very common case.
4521 if (ElementMul != 1) {
4522 if (ElementMul.isPowerOf2()) {
4523 unsigned Amt = ElementMul.logBase2();
4524 IdxN = DAG.getNode(
4525 ISD::SHL, dl, N.getValueType(), IdxN,
4526 DAG.getShiftAmountConstant(Amt, N.getValueType(), dl),
4527 ScaleFlags);
4528 } else {
4529 SDValue Scale = DAG.getConstant(ElementMul.getZExtValue(), dl,
4530 IdxN.getValueType());
4531 IdxN = DAG.getNode(ISD::MUL, dl, N.getValueType(), IdxN, Scale,
4532 ScaleFlags);
4533 }
4534 }
4535 }
4536
4537 // The successive addition of the current address, truncated to the
4538 // pointer index type and interpreted as an unsigned number, and each
4539 // offset, also interpreted as an unsigned number, does not wrap the
4540 // pointer index type (add nuw).
4541 SDNodeFlags AddFlags;
4542 AddFlags.setNoUnsignedWrap(NW.hasNoUnsignedWrap());
4543 AddFlags.setInBounds(NW.isInBounds());
4544
4545 N = DAG.getMemBasePlusOffset(N, IdxN, dl, AddFlags);
4546 }
4547 }
4548
4549 if (IsVectorGEP && !N.getValueType().isVector()) {
4550 EVT VT = EVT::getVectorVT(*Context, N.getValueType(), VectorElementCount);
4551 N = DAG.getSplat(VT, dl, N);
4552 }
4553
4554 MVT PtrTy = TLI.getPointerTy(DAG.getDataLayout(), AS);
4555 MVT PtrMemTy = TLI.getPointerMemTy(DAG.getDataLayout(), AS);
4556 if (IsVectorGEP) {
4557 PtrTy = MVT::getVectorVT(PtrTy, VectorElementCount);
4558 PtrMemTy = MVT::getVectorVT(PtrMemTy, VectorElementCount);
4559 }
4560
4561 if (PtrMemTy != PtrTy && !cast<GEPOperator>(I).isInBounds())
4562 N = DAG.getPtrExtendInReg(N, dl, PtrMemTy);
4563
4564 setValue(&I, N);
4565}
4566
4567void SelectionDAGBuilder::visitAlloca(const AllocaInst &I) {
4568 // If this is a fixed sized alloca in the entry block of the function,
4569 // allocate it statically on the stack.
4570 if (FuncInfo.StaticAllocaMap.count(&I))
4571 return; // getValue will auto-populate this.
4572
4573 SDLoc dl = getCurSDLoc();
4574 Type *Ty = I.getAllocatedType();
4575 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4576 auto &DL = DAG.getDataLayout();
4577 TypeSize TySize = DL.getTypeAllocSize(Ty);
4578 MaybeAlign Alignment = std::max(DL.getPrefTypeAlign(Ty), I.getAlign());
4579
4580 SDValue AllocSize = getValue(I.getArraySize());
4581
4582 EVT IntPtr = TLI.getPointerTy(DL, I.getAddressSpace());
4583 if (AllocSize.getValueType() != IntPtr)
4584 AllocSize = DAG.getZExtOrTrunc(AllocSize, dl, IntPtr);
4585
4586 if (TySize.isScalable())
4587 AllocSize = DAG.getNode(ISD::MUL, dl, IntPtr, AllocSize,
4588 DAG.getVScale(dl, IntPtr,
4589 APInt(IntPtr.getScalarSizeInBits(),
4590 TySize.getKnownMinValue())));
4591 else {
4592 SDValue TySizeValue =
4593 DAG.getConstant(TySize.getFixedValue(), dl, MVT::getIntegerVT(64));
4594 AllocSize = DAG.getNode(ISD::MUL, dl, IntPtr, AllocSize,
4595 DAG.getZExtOrTrunc(TySizeValue, dl, IntPtr));
4596 }
4597
4598 // Handle alignment. If the requested alignment is less than or equal to
4599 // the stack alignment, ignore it. If the size is greater than or equal to
4600 // the stack alignment, we note this in the DYNAMIC_STACKALLOC node.
4601 Align StackAlign = DAG.getSubtarget().getFrameLowering()->getStackAlign();
4602 if (*Alignment <= StackAlign)
4603 Alignment = std::nullopt;
4604
4605 const uint64_t StackAlignMask = StackAlign.value() - 1U;
4606 // Round the size of the allocation up to the stack alignment size
4607 // by add SA-1 to the size. This doesn't overflow because we're computing
4608 // an address inside an alloca.
4609 AllocSize = DAG.getNode(ISD::ADD, dl, AllocSize.getValueType(), AllocSize,
4610 DAG.getConstant(StackAlignMask, dl, IntPtr),
4612
4613 // Mask out the low bits for alignment purposes.
4614 AllocSize = DAG.getNode(ISD::AND, dl, AllocSize.getValueType(), AllocSize,
4615 DAG.getSignedConstant(~StackAlignMask, dl, IntPtr));
4616
4617 SDValue Ops[] = {
4618 getRoot(), AllocSize,
4619 DAG.getConstant(Alignment ? Alignment->value() : 0, dl, IntPtr)};
4620 SDVTList VTs = DAG.getVTList(AllocSize.getValueType(), MVT::Other);
4621 SDValue DSA = DAG.getNode(ISD::DYNAMIC_STACKALLOC, dl, VTs, Ops);
4622 setValue(&I, DSA);
4623 DAG.setRoot(DSA.getValue(1));
4624
4625 assert(FuncInfo.MF->getFrameInfo().hasVarSizedObjects());
4626}
4627
4628static const MDNode *getRangeMetadata(const Instruction &I) {
4629 return I.getMetadata(LLVMContext::MD_range);
4630}
4631
4632static std::optional<ConstantRange> getRange(const Instruction &I) {
4633 if (const auto *CB = dyn_cast<CallBase>(&I))
4634 if (std::optional<ConstantRange> CR = CB->getRange())
4635 return CR;
4636 if (const MDNode *Range = getRangeMetadata(I))
4638 return std::nullopt;
4639}
4640
4642 if (const auto *CB = dyn_cast<CallBase>(&I))
4643 return CB->getRetNoFPClass();
4644 return fcNone;
4645}
4646
4647void SelectionDAGBuilder::visitLoad(const LoadInst &I) {
4648 if (I.isAtomic())
4649 return visitAtomicLoad(I);
4650
4651 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4652 const Value *SV = I.getOperand(0);
4653 if (TLI.supportSwiftError()) {
4654 // Swifterror values can come from either a function parameter with
4655 // swifterror attribute or an alloca with swifterror attribute.
4656 if (const Argument *Arg = dyn_cast<Argument>(SV)) {
4657 if (Arg->hasSwiftErrorAttr())
4658 return visitLoadFromSwiftError(I);
4659 }
4660
4661 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(SV)) {
4662 if (Alloca->isSwiftError())
4663 return visitLoadFromSwiftError(I);
4664 }
4665 }
4666
4667 SDValue Ptr = getValue(SV);
4668
4669 Type *Ty = I.getType();
4670 SmallVector<EVT, 4> ValueVTs, MemVTs;
4672 ComputeValueVTs(TLI, DAG.getDataLayout(), Ty, ValueVTs, &MemVTs, &Offsets);
4673 unsigned NumValues = ValueVTs.size();
4674 if (NumValues == 0)
4675 return;
4676
4677 Align Alignment = I.getAlign();
4678 AAMDNodes AAInfo = I.getAAMetadata();
4679 const MDNode *Ranges = getRangeMetadata(I);
4680 bool isVolatile = I.isVolatile();
4681 MachineMemOperand::Flags MMOFlags =
4682 TLI.getLoadMemOperandFlags(I, DAG.getDataLayout(), AC, LibInfo);
4683
4684 SDValue Root;
4685 bool ConstantMemory = false;
4686 if (isVolatile)
4687 // Serialize volatile loads with other side effects.
4688 Root = getRoot();
4689 else if (NumValues > MaxParallelChains)
4690 Root = getMemoryRoot();
4691 else if (BatchAA &&
4692 BatchAA->pointsToConstantMemory(MemoryLocation(
4693 SV,
4694 LocationSize::precise(DAG.getDataLayout().getTypeStoreSize(Ty)),
4695 AAInfo))) {
4696 // Do not serialize (non-volatile) loads of constant memory with anything.
4697 Root = DAG.getEntryNode();
4698 ConstantMemory = true;
4700 } else {
4701 // Do not serialize non-volatile loads against each other.
4702 Root = DAG.getRoot();
4703 }
4704
4705 SDLoc dl = getCurSDLoc();
4706
4707 if (isVolatile)
4708 Root = TLI.prepareVolatileOrAtomicLoad(Root, dl, DAG);
4709
4710 SmallVector<SDValue, 4> Values(NumValues);
4711 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4712
4713 unsigned ChainI = 0;
4714 for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
4715 // Serializing loads here may result in excessive register pressure, and
4716 // TokenFactor places arbitrary choke points on the scheduler. SD scheduling
4717 // could recover a bit by hoisting nodes upward in the chain by recognizing
4718 // they are side-effect free or do not alias. The optimizer should really
4719 // avoid this case by converting large object/array copies to llvm.memcpy
4720 // (MaxParallelChains should always remain as failsafe).
4721 if (ChainI == MaxParallelChains) {
4722 assert(PendingLoads.empty() && "PendingLoads must be serialized first");
4723 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4724 ArrayRef(Chains.data(), ChainI));
4725 Root = Chain;
4726 ChainI = 0;
4727 }
4728
4729 // TODO: MachinePointerInfo only supports a fixed length offset.
4730 MachinePointerInfo PtrInfo =
4731 !Offsets[i].isScalable() || Offsets[i].isZero()
4732 ? MachinePointerInfo(SV, Offsets[i].getKnownMinValue())
4733 : MachinePointerInfo();
4734
4735 SDValue A = DAG.getObjectPtrOffset(dl, Ptr, Offsets[i]);
4736 SDValue L = DAG.getLoad(MemVTs[i], dl, Root, A, PtrInfo, Alignment,
4737 MMOFlags, AAInfo, Ranges);
4738 Chains[ChainI] = L.getValue(1);
4739
4740 if (MemVTs[i] != ValueVTs[i])
4741 L = DAG.getPtrExtOrTrunc(L, dl, ValueVTs[i]);
4742
4743 Values[i] = L;
4744 }
4745
4746 if (!ConstantMemory) {
4747 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4748 ArrayRef(Chains.data(), ChainI));
4749 if (isVolatile)
4750 DAG.setRoot(Chain);
4751 else
4752 PendingLoads.push_back(Chain);
4753 }
4754
4755 setValue(&I, DAG.getNode(ISD::MERGE_VALUES, dl,
4756 DAG.getVTList(ValueVTs), Values));
4757}
4758
4759void SelectionDAGBuilder::visitStoreToSwiftError(const StoreInst &I) {
4760 assert(DAG.getTargetLoweringInfo().supportSwiftError() &&
4761 "call visitStoreToSwiftError when backend supports swifterror");
4762
4763 SmallVector<EVT, 4> ValueVTs;
4764 SmallVector<uint64_t, 4> Offsets;
4765 const Value *SrcV = I.getOperand(0);
4766 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(),
4767 SrcV->getType(), ValueVTs, /*MemVTs=*/nullptr, &Offsets, 0);
4768 assert(ValueVTs.size() == 1 && Offsets[0] == 0 &&
4769 "expect a single EVT for swifterror");
4770
4771 SDValue Src = getValue(SrcV);
4772 // Create a virtual register, then update the virtual register.
4773 Register VReg =
4774 SwiftError.getOrCreateVRegDefAt(&I, FuncInfo.MBB, I.getPointerOperand());
4775 // Chain, DL, Reg, N or Chain, DL, Reg, N, Glue
4776 // Chain can be getRoot or getControlRoot.
4777 SDValue CopyNode = DAG.getCopyToReg(getRoot(), getCurSDLoc(), VReg,
4778 SDValue(Src.getNode(), Src.getResNo()));
4779 DAG.setRoot(CopyNode);
4780}
4781
4782void SelectionDAGBuilder::visitLoadFromSwiftError(const LoadInst &I) {
4783 assert(DAG.getTargetLoweringInfo().supportSwiftError() &&
4784 "call visitLoadFromSwiftError when backend supports swifterror");
4785
4786 assert(!I.isVolatile() &&
4787 !I.hasMetadata(LLVMContext::MD_nontemporal) &&
4788 !I.hasMetadata(LLVMContext::MD_invariant_load) &&
4789 "Support volatile, non temporal, invariant for load_from_swift_error");
4790
4791 const Value *SV = I.getOperand(0);
4792 Type *Ty = I.getType();
4793 assert(
4794 (!BatchAA ||
4795 !BatchAA->pointsToConstantMemory(MemoryLocation(
4796 SV, LocationSize::precise(DAG.getDataLayout().getTypeStoreSize(Ty)),
4797 I.getAAMetadata()))) &&
4798 "load_from_swift_error should not be constant memory");
4799
4800 SmallVector<EVT, 4> ValueVTs;
4801 SmallVector<uint64_t, 4> Offsets;
4802 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), Ty,
4803 ValueVTs, /*MemVTs=*/nullptr, &Offsets, 0);
4804 assert(ValueVTs.size() == 1 && Offsets[0] == 0 &&
4805 "expect a single EVT for swifterror");
4806
4807 // Chain, DL, Reg, VT, Glue or Chain, DL, Reg, VT
4808 SDValue L = DAG.getCopyFromReg(
4809 getRoot(), getCurSDLoc(),
4810 SwiftError.getOrCreateVRegUseAt(&I, FuncInfo.MBB, SV), ValueVTs[0]);
4811
4812 setValue(&I, L);
4813}
4814
4815void SelectionDAGBuilder::visitStore(const StoreInst &I) {
4816 if (I.isAtomic())
4817 return visitAtomicStore(I);
4818
4819 const Value *SrcV = I.getOperand(0);
4820 const Value *PtrV = I.getOperand(1);
4821
4822 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4823 if (TLI.supportSwiftError()) {
4824 // Swifterror values can come from either a function parameter with
4825 // swifterror attribute or an alloca with swifterror attribute.
4826 if (const Argument *Arg = dyn_cast<Argument>(PtrV)) {
4827 if (Arg->hasSwiftErrorAttr())
4828 return visitStoreToSwiftError(I);
4829 }
4830
4831 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(PtrV)) {
4832 if (Alloca->isSwiftError())
4833 return visitStoreToSwiftError(I);
4834 }
4835 }
4836
4837 SmallVector<EVT, 4> ValueVTs, MemVTs;
4839 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(),
4840 SrcV->getType(), ValueVTs, &MemVTs, &Offsets);
4841 unsigned NumValues = ValueVTs.size();
4842 if (NumValues == 0)
4843 return;
4844
4845 // Get the lowered operands. Note that we do this after
4846 // checking if NumResults is zero, because with zero results
4847 // the operands won't have values in the map.
4848 SDValue Src = getValue(SrcV);
4849 SDValue Ptr = getValue(PtrV);
4850
4851 SDValue Root = I.isVolatile() ? getRoot() : getMemoryRoot();
4852 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4853 SDLoc dl = getCurSDLoc();
4854 Align Alignment = I.getAlign();
4855 AAMDNodes AAInfo = I.getAAMetadata();
4856
4857 auto MMOFlags = TLI.getStoreMemOperandFlags(I, DAG.getDataLayout());
4858
4859 unsigned ChainI = 0;
4860 for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
4861 // See visitLoad comments.
4862 if (ChainI == MaxParallelChains) {
4863 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4864 ArrayRef(Chains.data(), ChainI));
4865 Root = Chain;
4866 ChainI = 0;
4867 }
4868
4869 // TODO: MachinePointerInfo only supports a fixed length offset.
4870 MachinePointerInfo PtrInfo =
4871 !Offsets[i].isScalable() || Offsets[i].isZero()
4872 ? MachinePointerInfo(PtrV, Offsets[i].getKnownMinValue())
4873 : MachinePointerInfo();
4874
4875 SDValue Add = DAG.getObjectPtrOffset(dl, Ptr, Offsets[i]);
4876 SDValue Val = SDValue(Src.getNode(), Src.getResNo() + i);
4877 if (MemVTs[i] != ValueVTs[i])
4878 Val = DAG.getPtrExtOrTrunc(Val, dl, MemVTs[i]);
4879 SDValue St =
4880 DAG.getStore(Root, dl, Val, Add, PtrInfo, Alignment, MMOFlags, AAInfo);
4881 Chains[ChainI] = St;
4882 }
4883
4884 SDValue StoreNode = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4885 ArrayRef(Chains.data(), ChainI));
4886 setValue(&I, StoreNode);
4887 DAG.setRoot(StoreNode);
4888}
4889
4890void SelectionDAGBuilder::visitMaskedStore(const CallInst &I,
4891 bool IsCompressing) {
4892 SDLoc sdl = getCurSDLoc();
4893
4894 Value *Src0Operand = I.getArgOperand(0);
4895 Value *PtrOperand = I.getArgOperand(1);
4896 Value *MaskOperand = I.getArgOperand(2);
4897 Align Alignment = I.getParamAlign(1).valueOrOne();
4898
4899 SDValue Ptr = getValue(PtrOperand);
4900 SDValue Src0 = getValue(Src0Operand);
4901 SDValue Mask = getValue(MaskOperand);
4902 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
4903
4904 EVT VT = Src0.getValueType();
4905
4906 auto MMOFlags = MachineMemOperand::MOStore;
4907 if (I.hasMetadata(LLVMContext::MD_nontemporal))
4909
4910 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
4911 MachinePointerInfo(PtrOperand), MMOFlags,
4912 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata());
4913
4914 const auto &TLI = DAG.getTargetLoweringInfo();
4915 const auto &TTI =
4916 TLI.getTargetMachine().getTargetTransformInfo(*I.getFunction());
4917 SDValue StoreNode =
4918 !IsCompressing && TTI.hasConditionalLoadStoreForType(
4919 I.getArgOperand(0)->getType(), /*IsStore=*/true)
4920 ? TLI.visitMaskedStore(DAG, sdl, getMemoryRoot(), MMO, Ptr, Src0,
4921 Mask)
4922 : DAG.getMaskedStore(getMemoryRoot(), sdl, Src0, Ptr, Offset, Mask,
4923 VT, MMO, ISD::UNINDEXED, /*Truncating=*/false,
4924 IsCompressing);
4925 DAG.setRoot(StoreNode);
4926 setValue(&I, StoreNode);
4927}
4928
4929// Get a uniform base for the Gather/Scatter intrinsic.
4930// The first argument of the Gather/Scatter intrinsic is a vector of pointers.
4931// We try to represent it as a base pointer + vector of indices.
4932// Usually, the vector of pointers comes from a 'getelementptr' instruction.
4933// The first operand of the GEP may be a single pointer or a vector of pointers
4934// Example:
4935// %gep.ptr = getelementptr i32, <8 x i32*> %vptr, <8 x i32> %ind
4936// or
4937// %gep.ptr = getelementptr i32, i32* %ptr, <8 x i32> %ind
4938// %res = call <8 x i32> @llvm.masked.gather.v8i32(<8 x i32*> %gep.ptr, ..
4939//
4940// When the first GEP operand is a single pointer - it is the uniform base we
4941// are looking for. If first operand of the GEP is a splat vector - we
4942// extract the splat value and use it as a uniform base.
4943// In all other cases the function returns 'false'.
4944static bool getUniformBase(const Value *Ptr, SDValue &Base, SDValue &Index,
4945 SDValue &Scale, SelectionDAGBuilder *SDB,
4946 const BasicBlock *CurBB, uint64_t ElemSize) {
4947 SelectionDAG& DAG = SDB->DAG;
4948 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4949 const DataLayout &DL = DAG.getDataLayout();
4950
4951 assert(Ptr->getType()->isVectorTy() && "Unexpected pointer type");
4952
4953 // Handle splat constant pointer.
4954 if (auto *C = dyn_cast<Constant>(Ptr)) {
4955 C = C->getSplatValue();
4956 if (!C)
4957 return false;
4958
4959 Base = SDB->getValue(C);
4960
4961 ElementCount NumElts = cast<VectorType>(Ptr->getType())->getElementCount();
4962 EVT VT = EVT::getVectorVT(*DAG.getContext(), TLI.getPointerTy(DL), NumElts);
4963 Index = DAG.getConstant(0, SDB->getCurSDLoc(), VT);
4964 Scale = DAG.getTargetConstant(1, SDB->getCurSDLoc(), TLI.getPointerTy(DL));
4965 return true;
4966 }
4967
4969 if (!GEP || GEP->getParent() != CurBB)
4970 return false;
4971
4972 if (GEP->getNumOperands() != 2)
4973 return false;
4974
4975 const Value *BasePtr = GEP->getPointerOperand();
4976 const Value *IndexVal = GEP->getOperand(GEP->getNumOperands() - 1);
4977
4978 // Make sure the base is scalar and the index is a vector.
4979 if (BasePtr->getType()->isVectorTy() || !IndexVal->getType()->isVectorTy())
4980 return false;
4981
4982 TypeSize ScaleVal = DL.getTypeAllocSize(GEP->getResultElementType());
4983 if (ScaleVal.isScalable())
4984 return false;
4985
4986 // Target may not support the required addressing mode.
4987 if (ScaleVal != 1 &&
4988 !TLI.isLegalScaleForGatherScatter(ScaleVal.getFixedValue(), ElemSize))
4989 return false;
4990
4991 Base = SDB->getValue(BasePtr);
4992 Index = SDB->getValue(IndexVal);
4993
4994 Scale =
4995 DAG.getTargetConstant(ScaleVal, SDB->getCurSDLoc(), TLI.getPointerTy(DL));
4996 return true;
4997}
4998
4999void SelectionDAGBuilder::visitMaskedScatter(const CallInst &I) {
5000 SDLoc sdl = getCurSDLoc();
5001
5002 // llvm.masked.scatter.*(Src0, Ptrs, Mask)
5003 const Value *Ptr = I.getArgOperand(1);
5004 SDValue Src0 = getValue(I.getArgOperand(0));
5005 SDValue Mask = getValue(I.getArgOperand(2));
5006 EVT VT = Src0.getValueType();
5007 Align Alignment = I.getParamAlign(1).valueOrOne();
5008 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5009
5010 SDValue Base;
5011 SDValue Index;
5012 SDValue Scale;
5013 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
5014 I.getParent(), VT.getScalarStoreSize());
5015
5016 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
5017 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5018 MachinePointerInfo(AS), MachineMemOperand::MOStore,
5019 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata());
5020 if (!UniformBase) {
5021 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5022 Index = getValue(Ptr);
5023 Scale =
5024 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5025 }
5026
5027 EVT IdxVT = Index.getValueType();
5028 EVT EltTy = IdxVT.getVectorElementType();
5029 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
5030 EVT NewIdxVT = IdxVT.changeVectorElementType(EltTy);
5031 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
5032 }
5033
5034 SDValue Ops[] = { getMemoryRoot(), Src0, Mask, Base, Index, Scale };
5035 SDValue Scatter = DAG.getMaskedScatter(DAG.getVTList(MVT::Other), VT, sdl,
5036 Ops, MMO, ISD::SIGNED_SCALED, false);
5037 DAG.setRoot(Scatter);
5038 setValue(&I, Scatter);
5039}
5040
5041void SelectionDAGBuilder::visitMaskedLoad(const CallInst &I, bool IsExpanding) {
5042 SDLoc sdl = getCurSDLoc();
5043
5044 Value *PtrOperand = I.getArgOperand(0);
5045 Value *MaskOperand = I.getArgOperand(1);
5046 Value *Src0Operand = I.getArgOperand(2);
5047 Align Alignment = I.getParamAlign(0).valueOrOne();
5048
5049 SDValue Ptr = getValue(PtrOperand);
5050 SDValue Src0 = getValue(Src0Operand);
5051 SDValue Mask = getValue(MaskOperand);
5052 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
5053
5054 EVT VT = Src0.getValueType();
5055 AAMDNodes AAInfo = I.getAAMetadata();
5056 const MDNode *Ranges = getRangeMetadata(I);
5057
5058 // Do not serialize masked loads of constant memory with anything.
5059 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
5060 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
5061
5062 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
5063
5064 auto MMOFlags = MachineMemOperand::MOLoad;
5065 if (I.hasMetadata(LLVMContext::MD_nontemporal))
5067
5068 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5069 MachinePointerInfo(PtrOperand), MMOFlags,
5070 LocationSize::beforeOrAfterPointer(), Alignment, AAInfo, Ranges);
5071
5072 const auto &TLI = DAG.getTargetLoweringInfo();
5073 const auto &TTI =
5074 TLI.getTargetMachine().getTargetTransformInfo(*I.getFunction());
5075 // The Load/Res may point to different values and both of them are output
5076 // variables.
5077 SDValue Load;
5078 SDValue Res;
5079 if (!IsExpanding && TTI.hasConditionalLoadStoreForType(Src0Operand->getType(),
5080 /*IsStore=*/false))
5081 Res = TLI.visitMaskedLoad(DAG, sdl, InChain, MMO, Load, Ptr, Src0, Mask);
5082 else
5083 Res = Load =
5084 DAG.getMaskedLoad(VT, sdl, InChain, Ptr, Offset, Mask, Src0, VT, MMO,
5085 ISD::UNINDEXED, ISD::NON_EXTLOAD, IsExpanding);
5086 if (AddToChain)
5087 PendingLoads.push_back(Load.getValue(1));
5088 setValue(&I, Res);
5089}
5090
5091void SelectionDAGBuilder::visitMaskedGather(const CallInst &I) {
5092 SDLoc sdl = getCurSDLoc();
5093
5094 // @llvm.masked.gather.*(Ptrs, Mask, Src0)
5095 const Value *Ptr = I.getArgOperand(0);
5096 SDValue Src0 = getValue(I.getArgOperand(2));
5097 SDValue Mask = getValue(I.getArgOperand(1));
5098
5099 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5100 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
5101 Align Alignment = I.getParamAlign(0).valueOrOne();
5102
5103 const MDNode *Ranges = getRangeMetadata(I);
5104
5105 SDValue Root = DAG.getRoot();
5106 SDValue Base;
5107 SDValue Index;
5108 SDValue Scale;
5109 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
5110 I.getParent(), VT.getScalarStoreSize());
5111 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
5112 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5113 MachinePointerInfo(AS), MachineMemOperand::MOLoad,
5114 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata(),
5115 Ranges);
5116
5117 if (!UniformBase) {
5118 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5119 Index = getValue(Ptr);
5120 Scale =
5121 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5122 }
5123
5124 EVT IdxVT = Index.getValueType();
5125 EVT EltTy = IdxVT.getVectorElementType();
5126 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
5127 EVT NewIdxVT = IdxVT.changeVectorElementType(EltTy);
5128 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
5129 }
5130
5131 SDValue Ops[] = { Root, Src0, Mask, Base, Index, Scale };
5132 SDValue Gather =
5133 DAG.getMaskedGather(DAG.getVTList(VT, MVT::Other), VT, sdl, Ops, MMO,
5135
5136 PendingLoads.push_back(Gather.getValue(1));
5137 setValue(&I, Gather);
5138}
5139
5140void SelectionDAGBuilder::visitAtomicCmpXchg(const AtomicCmpXchgInst &I) {
5141 SDLoc dl = getCurSDLoc();
5142 AtomicOrdering SuccessOrdering = I.getSuccessOrdering();
5143 AtomicOrdering FailureOrdering = I.getFailureOrdering();
5144 SyncScope::ID SSID = I.getSyncScopeID();
5145
5146 SDValue InChain = getRoot();
5147
5148 MVT MemVT = getValue(I.getCompareOperand()).getSimpleValueType();
5149 SDVTList VTs = DAG.getVTList(MemVT, MVT::i1, MVT::Other);
5150
5151 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5152 auto Flags = TLI.getAtomicMemOperandFlags(I, DAG.getDataLayout());
5153
5154 MachineFunction &MF = DAG.getMachineFunction();
5155 MachineMemOperand *MMO = MF.getMachineMemOperand(
5156 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5157 DAG.getEVTAlign(MemVT), AAMDNodes(), nullptr, SSID, SuccessOrdering,
5158 FailureOrdering);
5159
5160 SDValue L = DAG.getAtomicCmpSwap(ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS,
5161 dl, MemVT, VTs, InChain,
5162 getValue(I.getPointerOperand()),
5163 getValue(I.getCompareOperand()),
5164 getValue(I.getNewValOperand()), MMO);
5165
5166 SDValue OutChain = L.getValue(2);
5167
5168 setValue(&I, L);
5169 DAG.setRoot(OutChain);
5170}
5171
5172void SelectionDAGBuilder::visitAtomicRMW(const AtomicRMWInst &I) {
5173 SDLoc dl = getCurSDLoc();
5175 switch (I.getOperation()) {
5176 default: llvm_unreachable("Unknown atomicrmw operation");
5177 case AtomicRMWInst::Xchg: NT = ISD::ATOMIC_SWAP; break;
5178 case AtomicRMWInst::Add: NT = ISD::ATOMIC_LOAD_ADD; break;
5179 case AtomicRMWInst::Sub: NT = ISD::ATOMIC_LOAD_SUB; break;
5180 case AtomicRMWInst::And: NT = ISD::ATOMIC_LOAD_AND; break;
5181 case AtomicRMWInst::Nand: NT = ISD::ATOMIC_LOAD_NAND; break;
5182 case AtomicRMWInst::Or: NT = ISD::ATOMIC_LOAD_OR; break;
5183 case AtomicRMWInst::Xor: NT = ISD::ATOMIC_LOAD_XOR; break;
5184 case AtomicRMWInst::Max: NT = ISD::ATOMIC_LOAD_MAX; break;
5185 case AtomicRMWInst::Min: NT = ISD::ATOMIC_LOAD_MIN; break;
5186 case AtomicRMWInst::UMax: NT = ISD::ATOMIC_LOAD_UMAX; break;
5187 case AtomicRMWInst::UMin: NT = ISD::ATOMIC_LOAD_UMIN; break;
5188 case AtomicRMWInst::FAdd: NT = ISD::ATOMIC_LOAD_FADD; break;
5189 case AtomicRMWInst::FSub: NT = ISD::ATOMIC_LOAD_FSUB; break;
5190 case AtomicRMWInst::FMax: NT = ISD::ATOMIC_LOAD_FMAX; break;
5191 case AtomicRMWInst::FMin: NT = ISD::ATOMIC_LOAD_FMIN; break;
5193 NT = ISD::ATOMIC_LOAD_FMAXIMUM;
5194 break;
5196 NT = ISD::ATOMIC_LOAD_FMINIMUM;
5197 break;
5199 NT = ISD::ATOMIC_LOAD_UINC_WRAP;
5200 break;
5202 NT = ISD::ATOMIC_LOAD_UDEC_WRAP;
5203 break;
5205 NT = ISD::ATOMIC_LOAD_USUB_COND;
5206 break;
5208 NT = ISD::ATOMIC_LOAD_USUB_SAT;
5209 break;
5210 }
5211 AtomicOrdering Ordering = I.getOrdering();
5212 SyncScope::ID SSID = I.getSyncScopeID();
5213
5214 SDValue InChain = getRoot();
5215
5216 auto MemVT = getValue(I.getValOperand()).getSimpleValueType();
5217 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5218 auto Flags = TLI.getAtomicMemOperandFlags(I, DAG.getDataLayout());
5219
5220 MachineFunction &MF = DAG.getMachineFunction();
5221 MachineMemOperand *MMO = MF.getMachineMemOperand(
5222 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5223 DAG.getEVTAlign(MemVT), AAMDNodes(), nullptr, SSID, Ordering);
5224
5225 SDValue L =
5226 DAG.getAtomic(NT, dl, MemVT, InChain,
5227 getValue(I.getPointerOperand()), getValue(I.getValOperand()),
5228 MMO);
5229
5230 SDValue OutChain = L.getValue(1);
5231
5232 setValue(&I, L);
5233 DAG.setRoot(OutChain);
5234}
5235
5236void SelectionDAGBuilder::visitFence(const FenceInst &I) {
5237 SDLoc dl = getCurSDLoc();
5238 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5239 SDValue Ops[3];
5240 Ops[0] = getRoot();
5241 Ops[1] = DAG.getTargetConstant((unsigned)I.getOrdering(), dl,
5242 TLI.getFenceOperandTy(DAG.getDataLayout()));
5243 Ops[2] = DAG.getTargetConstant(I.getSyncScopeID(), dl,
5244 TLI.getFenceOperandTy(DAG.getDataLayout()));
5245 SDValue N = DAG.getNode(ISD::ATOMIC_FENCE, dl, MVT::Other, Ops);
5246 setValue(&I, N);
5247 DAG.setRoot(N);
5248}
5249
5250void SelectionDAGBuilder::visitAtomicLoad(const LoadInst &I) {
5251 SDLoc dl = getCurSDLoc();
5252 AtomicOrdering Order = I.getOrdering();
5253 SyncScope::ID SSID = I.getSyncScopeID();
5254
5255 SDValue InChain = getRoot();
5256
5257 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5258 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
5259 EVT MemVT = TLI.getMemValueType(DAG.getDataLayout(), I.getType());
5260
5261 if (!TLI.supportsUnalignedAtomics() &&
5262 I.getAlign().value() < MemVT.getSizeInBits() / 8)
5263 report_fatal_error("Cannot generate unaligned atomic load");
5264
5265 auto Flags = TLI.getLoadMemOperandFlags(I, DAG.getDataLayout(), AC, LibInfo);
5266
5267 const MDNode *Ranges = getRangeMetadata(I);
5268 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5269 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5270 I.getAlign(), AAMDNodes(), Ranges, SSID, Order);
5271
5272 InChain = TLI.prepareVolatileOrAtomicLoad(InChain, dl, DAG);
5273
5274 SDValue Ptr = getValue(I.getPointerOperand());
5275 SDValue L =
5276 DAG.getAtomicLoad(ISD::NON_EXTLOAD, dl, MemVT, MemVT, InChain, Ptr, MMO);
5277
5278 SDValue OutChain = L.getValue(1);
5279 if (MemVT != VT)
5280 L = DAG.getPtrExtOrTrunc(L, dl, VT);
5281
5282 setValue(&I, L);
5283 DAG.setRoot(OutChain);
5284}
5285
5286void SelectionDAGBuilder::visitAtomicStore(const StoreInst &I) {
5287 SDLoc dl = getCurSDLoc();
5288
5289 AtomicOrdering Ordering = I.getOrdering();
5290 SyncScope::ID SSID = I.getSyncScopeID();
5291
5292 SDValue InChain = getRoot();
5293
5294 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5295 EVT MemVT =
5296 TLI.getMemValueType(DAG.getDataLayout(), I.getValueOperand()->getType());
5297
5298 if (!TLI.supportsUnalignedAtomics() &&
5299 I.getAlign().value() < MemVT.getSizeInBits() / 8)
5300 report_fatal_error("Cannot generate unaligned atomic store");
5301
5302 auto Flags = TLI.getStoreMemOperandFlags(I, DAG.getDataLayout());
5303
5304 MachineFunction &MF = DAG.getMachineFunction();
5305 MachineMemOperand *MMO = MF.getMachineMemOperand(
5306 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5307 I.getAlign(), AAMDNodes(), nullptr, SSID, Ordering);
5308
5309 SDValue Val = getValue(I.getValueOperand());
5310 if (Val.getValueType() != MemVT)
5311 Val = DAG.getPtrExtOrTrunc(Val, dl, MemVT);
5312 SDValue Ptr = getValue(I.getPointerOperand());
5313
5314 SDValue OutChain =
5315 DAG.getAtomic(ISD::ATOMIC_STORE, dl, MemVT, InChain, Val, Ptr, MMO);
5316
5317 setValue(&I, OutChain);
5318 DAG.setRoot(OutChain);
5319}
5320
5321/// Check if this intrinsic call depends on the chain (1st return value)
5322/// and if it only *loads* memory.
5323/// Ignore the callsite's attributes. A specific call site may be marked with
5324/// readnone, but the lowering code will expect the chain based on the
5325/// definition.
5326std::pair<bool, bool>
5327SelectionDAGBuilder::getTargetIntrinsicCallProperties(const CallBase &I) {
5328 const Function *F = I.getCalledFunction();
5329 bool HasChain = !F->doesNotAccessMemory();
5330 bool OnlyLoad =
5331 HasChain && F->onlyReadsMemory() && F->willReturn() && F->doesNotThrow();
5332
5333 return {HasChain, OnlyLoad};
5334}
5335
5336SmallVector<SDValue, 8> SelectionDAGBuilder::getTargetIntrinsicOperands(
5337 const CallBase &I, bool HasChain, bool OnlyLoad,
5338 TargetLowering::IntrinsicInfo *TgtMemIntrinsicInfo) {
5339 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5340
5341 // Build the operand list.
5343 if (HasChain) { // If this intrinsic has side-effects, chainify it.
5344 if (OnlyLoad) {
5345 // We don't need to serialize loads against other loads.
5346 Ops.push_back(DAG.getRoot());
5347 } else {
5348 Ops.push_back(getRoot());
5349 }
5350 }
5351
5352 // Add the intrinsic ID as an integer operand if it's not a target intrinsic.
5353 if (!TgtMemIntrinsicInfo || TgtMemIntrinsicInfo->opc == ISD::INTRINSIC_VOID ||
5354 TgtMemIntrinsicInfo->opc == ISD::INTRINSIC_W_CHAIN)
5355 Ops.push_back(DAG.getTargetConstant(I.getIntrinsicID(), getCurSDLoc(),
5356 TLI.getPointerTy(DAG.getDataLayout())));
5357
5358 // Add all operands of the call to the operand list.
5359 for (unsigned i = 0, e = I.arg_size(); i != e; ++i) {
5360 const Value *Arg = I.getArgOperand(i);
5361 if (!I.paramHasAttr(i, Attribute::ImmArg)) {
5362 Ops.push_back(getValue(Arg));
5363 continue;
5364 }
5365
5366 // Use TargetConstant instead of a regular constant for immarg.
5367 EVT VT = TLI.getValueType(DAG.getDataLayout(), Arg->getType(), true);
5368 if (const ConstantInt *CI = dyn_cast<ConstantInt>(Arg)) {
5369 assert(CI->getBitWidth() <= 64 &&
5370 "large intrinsic immediates not handled");
5371 Ops.push_back(DAG.getTargetConstant(*CI, SDLoc(), VT));
5372 } else {
5373 Ops.push_back(
5374 DAG.getTargetConstantFP(*cast<ConstantFP>(Arg), SDLoc(), VT));
5375 }
5376 }
5377
5378 if (std::optional<OperandBundleUse> Bundle =
5379 I.getOperandBundle(LLVMContext::OB_convergencectrl)) {
5380 Value *Token = Bundle->Inputs[0].get();
5381 SDValue ConvControlToken = getValue(Token);
5382 assert(Ops.back().getValueType() != MVT::Glue &&
5383 "Did not expect another glue node here.");
5384 ConvControlToken =
5385 DAG.getNode(ISD::CONVERGENCECTRL_GLUE, {}, MVT::Glue, ConvControlToken);
5386 Ops.push_back(ConvControlToken);
5387 }
5388
5389 return Ops;
5390}
5391
5392SDVTList SelectionDAGBuilder::getTargetIntrinsicVTList(const CallBase &I,
5393 bool HasChain) {
5394 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5395
5396 SmallVector<EVT, 4> ValueVTs;
5397 ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);
5398
5399 if (HasChain)
5400 ValueVTs.push_back(MVT::Other);
5401
5402 return DAG.getVTList(ValueVTs);
5403}
5404
5405/// Get an INTRINSIC node for a target intrinsic which does not touch memory.
5406SDValue SelectionDAGBuilder::getTargetNonMemIntrinsicNode(
5407 const Type &IntrinsicVT, bool HasChain, ArrayRef<SDValue> Ops,
5408 const SDVTList &VTs) {
5409 if (!HasChain)
5410 return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, getCurSDLoc(), VTs, Ops);
5411 if (!IntrinsicVT.isVoidTy())
5412 return DAG.getNode(ISD::INTRINSIC_W_CHAIN, getCurSDLoc(), VTs, Ops);
5413 return DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops);
5414}
5415
5416/// Set root, convert return type if necessary and check alignment.
5417SDValue SelectionDAGBuilder::handleTargetIntrinsicRet(const CallBase &I,
5418 bool HasChain,
5419 bool OnlyLoad,
5420 SDValue Result) {
5421 if (HasChain) {
5422 SDValue Chain = Result.getValue(Result.getNode()->getNumValues() - 1);
5423 if (OnlyLoad)
5424 PendingLoads.push_back(Chain);
5425 else
5426 DAG.setRoot(Chain);
5427 }
5428
5429 if (I.getType()->isVoidTy())
5430 return Result;
5431
5432 if (MaybeAlign Alignment = I.getRetAlign(); InsertAssertAlign && Alignment) {
5433 // Insert `assertalign` node if there's an alignment.
5434 Result = DAG.getAssertAlign(getCurSDLoc(), Result, Alignment.valueOrOne());
5435 } else if (!isa<VectorType>(I.getType())) {
5436 Result = lowerRangeToAssertZExt(DAG, I, Result);
5437 }
5438
5439 return Result;
5440}
5441
5442/// visitTargetIntrinsic - Lower a call of a target intrinsic to an INTRINSIC
5443/// node.
5444void SelectionDAGBuilder::visitTargetIntrinsic(const CallInst &I,
5445 unsigned Intrinsic) {
5446 auto [HasChain, OnlyLoad] = getTargetIntrinsicCallProperties(I);
5447
5448 // Info is set by getTgtMemIntrinsic
5449 TargetLowering::IntrinsicInfo Info;
5450 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5451 bool IsTgtMemIntrinsic =
5452 TLI.getTgtMemIntrinsic(Info, I, DAG.getMachineFunction(), Intrinsic);
5453
5454 SmallVector<SDValue, 8> Ops = getTargetIntrinsicOperands(
5455 I, HasChain, OnlyLoad, IsTgtMemIntrinsic ? &Info : nullptr);
5456 SDVTList VTs = getTargetIntrinsicVTList(I, HasChain);
5457
5458 // Propagate fast-math-flags from IR to node(s).
5459 SDNodeFlags Flags;
5460 if (auto *FPMO = dyn_cast<FPMathOperator>(&I))
5461 Flags.copyFMF(*FPMO);
5462 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
5463
5464 // Create the node.
5466
5467 // In some cases, custom collection of operands from CallInst I may be needed.
5469 if (IsTgtMemIntrinsic) {
5470 // This is target intrinsic that touches memory
5471 //
5472 // TODO: We currently just fallback to address space 0 if getTgtMemIntrinsic
5473 // didn't yield anything useful.
5474 MachinePointerInfo MPI;
5475 if (Info.ptrVal)
5476 MPI = MachinePointerInfo(Info.ptrVal, Info.offset);
5477 else if (Info.fallbackAddressSpace)
5478 MPI = MachinePointerInfo(*Info.fallbackAddressSpace);
5479 EVT MemVT = Info.memVT;
5480 LocationSize Size = LocationSize::precise(Info.size);
5481 if (Size.hasValue() && !Size.getValue())
5483 Align Alignment = Info.align.value_or(DAG.getEVTAlign(MemVT));
5484 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5485 MPI, Info.flags, Size, Alignment, I.getAAMetadata(), /*Ranges=*/nullptr,
5486 Info.ssid, Info.order, Info.failureOrder);
5487 Result =
5488 DAG.getMemIntrinsicNode(Info.opc, getCurSDLoc(), VTs, Ops, MemVT, MMO);
5489 } else {
5490 Result = getTargetNonMemIntrinsicNode(*I.getType(), HasChain, Ops, VTs);
5491 }
5492
5493 Result = handleTargetIntrinsicRet(I, HasChain, OnlyLoad, Result);
5494
5495 setValue(&I, Result);
5496}
5497
5498/// GetSignificand - Get the significand and build it into a floating-point
5499/// number with exponent of 1:
5500///
5501/// Op = (Op & 0x007fffff) | 0x3f800000;
5502///
5503/// where Op is the hexadecimal representation of floating point value.
5505 SDValue t1 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
5506 DAG.getConstant(0x007fffff, dl, MVT::i32));
5507 SDValue t2 = DAG.getNode(ISD::OR, dl, MVT::i32, t1,
5508 DAG.getConstant(0x3f800000, dl, MVT::i32));
5509 return DAG.getNode(ISD::BITCAST, dl, MVT::f32, t2);
5510}
5511
5512/// GetExponent - Get the exponent:
5513///
5514/// (float)(int)(((Op & 0x7f800000) >> 23) - 127);
5515///
5516/// where Op is the hexadecimal representation of floating point value.
5518 const TargetLowering &TLI, const SDLoc &dl) {
5519 SDValue t0 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
5520 DAG.getConstant(0x7f800000, dl, MVT::i32));
5521 SDValue t1 = DAG.getNode(ISD::SRL, dl, MVT::i32, t0,
5522 DAG.getShiftAmountConstant(23, MVT::i32, dl));
5523 SDValue t2 = DAG.getNode(ISD::SUB, dl, MVT::i32, t1,
5524 DAG.getConstant(127, dl, MVT::i32));
5525 return DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, t2);
5526}
5527
5528/// getF32Constant - Get 32-bit floating point constant.
5530 const SDLoc &dl) {
5531 return DAG.getConstantFP(APFloat(APFloat::IEEEsingle(), APInt(32, Flt)), dl,
5532 MVT::f32);
5533}
5534
5536 SelectionDAG &DAG) {
5537 // TODO: What fast-math-flags should be set on the floating-point nodes?
5538
5539 // IntegerPartOfX = ((int32_t)(t0);
5540 SDValue IntegerPartOfX = DAG.getNode(ISD::FP_TO_SINT, dl, MVT::i32, t0);
5541
5542 // FractionalPartOfX = t0 - (float)IntegerPartOfX;
5543 SDValue t1 = DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, IntegerPartOfX);
5544 SDValue X = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0, t1);
5545
5546 // IntegerPartOfX <<= 23;
5547 IntegerPartOfX = DAG.getNode(ISD::SHL, dl, MVT::i32, IntegerPartOfX,
5548 DAG.getShiftAmountConstant(23, MVT::i32, dl));
5549
5550 SDValue TwoToFractionalPartOfX;
5551 if (LimitFloatPrecision <= 6) {
5552 // For floating-point precision of 6:
5553 //
5554 // TwoToFractionalPartOfX =
5555 // 0.997535578f +
5556 // (0.735607626f + 0.252464424f * x) * x;
5557 //
5558 // error 0.0144103317, which is 6 bits
5559 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5560 getF32Constant(DAG, 0x3e814304, dl));
5561 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5562 getF32Constant(DAG, 0x3f3c50c8, dl));
5563 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5564 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5565 getF32Constant(DAG, 0x3f7f5e7e, dl));
5566 } else if (LimitFloatPrecision <= 12) {
5567 // For floating-point precision of 12:
5568 //
5569 // TwoToFractionalPartOfX =
5570 // 0.999892986f +
5571 // (0.696457318f +
5572 // (0.224338339f + 0.792043434e-1f * x) * x) * x;
5573 //
5574 // error 0.000107046256, which is 13 to 14 bits
5575 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5576 getF32Constant(DAG, 0x3da235e3, dl));
5577 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5578 getF32Constant(DAG, 0x3e65b8f3, dl));
5579 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5580 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5581 getF32Constant(DAG, 0x3f324b07, dl));
5582 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5583 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5584 getF32Constant(DAG, 0x3f7ff8fd, dl));
5585 } else { // LimitFloatPrecision <= 18
5586 // For floating-point precision of 18:
5587 //
5588 // TwoToFractionalPartOfX =
5589 // 0.999999982f +
5590 // (0.693148872f +
5591 // (0.240227044f +
5592 // (0.554906021e-1f +
5593 // (0.961591928e-2f +
5594 // (0.136028312e-2f + 0.157059148e-3f *x)*x)*x)*x)*x)*x;
5595 // error 2.47208000*10^(-7), which is better than 18 bits
5596 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5597 getF32Constant(DAG, 0x3924b03e, dl));
5598 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5599 getF32Constant(DAG, 0x3ab24b87, dl));
5600 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5601 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5602 getF32Constant(DAG, 0x3c1d8c17, dl));
5603 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5604 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5605 getF32Constant(DAG, 0x3d634a1d, dl));
5606 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5607 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5608 getF32Constant(DAG, 0x3e75fe14, dl));
5609 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5610 SDValue t11 = DAG.getNode(ISD::FADD, dl, MVT::f32, t10,
5611 getF32Constant(DAG, 0x3f317234, dl));
5612 SDValue t12 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t11, X);
5613 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t12,
5614 getF32Constant(DAG, 0x3f800000, dl));
5615 }
5616
5617 // Add the exponent into the result in integer domain.
5618 SDValue t13 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, TwoToFractionalPartOfX);
5619 return DAG.getNode(ISD::BITCAST, dl, MVT::f32,
5620 DAG.getNode(ISD::ADD, dl, MVT::i32, t13, IntegerPartOfX));
5621}
5622
5623/// expandExp - Lower an exp intrinsic. Handles the special sequences for
5624/// limited-precision mode.
5626 const TargetLowering &TLI, SDNodeFlags Flags) {
5627 if (Op.getValueType() == MVT::f32 &&
5629
5630 // Put the exponent in the right bit position for later addition to the
5631 // final result:
5632 //
5633 // t0 = Op * log2(e)
5634
5635 // TODO: What fast-math-flags should be set here?
5636 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, Op,
5637 DAG.getConstantFP(numbers::log2ef, dl, MVT::f32));
5638 return getLimitedPrecisionExp2(t0, dl, DAG);
5639 }
5640
5641 // No special expansion.
5642 return DAG.getNode(ISD::FEXP, dl, Op.getValueType(), Op, Flags);
5643}
5644
5645/// expandLog - Lower a log intrinsic. Handles the special sequences for
5646/// limited-precision mode.
5648 const TargetLowering &TLI, SDNodeFlags Flags) {
5649 // TODO: What fast-math-flags should be set on the floating-point nodes?
5650
5651 if (Op.getValueType() == MVT::f32 &&
5653 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5654
5655 // Scale the exponent by log(2).
5656 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5657 SDValue LogOfExponent =
5658 DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5659 DAG.getConstantFP(numbers::ln2f, dl, MVT::f32));
5660
5661 // Get the significand and build it into a floating-point number with
5662 // exponent of 1.
5663 SDValue X = GetSignificand(DAG, Op1, dl);
5664
5665 SDValue LogOfMantissa;
5666 if (LimitFloatPrecision <= 6) {
5667 // For floating-point precision of 6:
5668 //
5669 // LogofMantissa =
5670 // -1.1609546f +
5671 // (1.4034025f - 0.23903021f * x) * x;
5672 //
5673 // error 0.0034276066, which is better than 8 bits
5674 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5675 getF32Constant(DAG, 0xbe74c456, dl));
5676 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5677 getF32Constant(DAG, 0x3fb3a2b1, dl));
5678 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5679 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5680 getF32Constant(DAG, 0x3f949a29, dl));
5681 } else if (LimitFloatPrecision <= 12) {
5682 // For floating-point precision of 12:
5683 //
5684 // LogOfMantissa =
5685 // -1.7417939f +
5686 // (2.8212026f +
5687 // (-1.4699568f +
5688 // (0.44717955f - 0.56570851e-1f * x) * x) * x) * x;
5689 //
5690 // error 0.000061011436, which is 14 bits
5691 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5692 getF32Constant(DAG, 0xbd67b6d6, dl));
5693 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5694 getF32Constant(DAG, 0x3ee4f4b8, dl));
5695 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5696 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5697 getF32Constant(DAG, 0x3fbc278b, dl));
5698 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5699 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5700 getF32Constant(DAG, 0x40348e95, dl));
5701 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5702 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5703 getF32Constant(DAG, 0x3fdef31a, dl));
5704 } else { // LimitFloatPrecision <= 18
5705 // For floating-point precision of 18:
5706 //
5707 // LogOfMantissa =
5708 // -2.1072184f +
5709 // (4.2372794f +
5710 // (-3.7029485f +
5711 // (2.2781945f +
5712 // (-0.87823314f +
5713 // (0.19073739f - 0.17809712e-1f * x) * x) * x) * x) * x)*x;
5714 //
5715 // error 0.0000023660568, which is better than 18 bits
5716 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5717 getF32Constant(DAG, 0xbc91e5ac, dl));
5718 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5719 getF32Constant(DAG, 0x3e4350aa, dl));
5720 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5721 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5722 getF32Constant(DAG, 0x3f60d3e3, dl));
5723 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5724 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5725 getF32Constant(DAG, 0x4011cdf0, dl));
5726 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5727 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5728 getF32Constant(DAG, 0x406cfd1c, dl));
5729 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5730 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5731 getF32Constant(DAG, 0x408797cb, dl));
5732 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5733 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t10,
5734 getF32Constant(DAG, 0x4006dcab, dl));
5735 }
5736
5737 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, LogOfMantissa);
5738 }
5739
5740 // No special expansion.
5741 return DAG.getNode(ISD::FLOG, dl, Op.getValueType(), Op, Flags);
5742}
5743
5744/// expandLog2 - Lower a log2 intrinsic. Handles the special sequences for
5745/// limited-precision mode.
5747 const TargetLowering &TLI, SDNodeFlags Flags) {
5748 // TODO: What fast-math-flags should be set on the floating-point nodes?
5749
5750 if (Op.getValueType() == MVT::f32 &&
5752 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5753
5754 // Get the exponent.
5755 SDValue LogOfExponent = GetExponent(DAG, Op1, TLI, dl);
5756
5757 // Get the significand and build it into a floating-point number with
5758 // exponent of 1.
5759 SDValue X = GetSignificand(DAG, Op1, dl);
5760
5761 // Different possible minimax approximations of significand in
5762 // floating-point for various degrees of accuracy over [1,2].
5763 SDValue Log2ofMantissa;
5764 if (LimitFloatPrecision <= 6) {
5765 // For floating-point precision of 6:
5766 //
5767 // Log2ofMantissa = -1.6749035f + (2.0246817f - .34484768f * x) * x;
5768 //
5769 // error 0.0049451742, which is more than 7 bits
5770 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5771 getF32Constant(DAG, 0xbeb08fe0, dl));
5772 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5773 getF32Constant(DAG, 0x40019463, dl));
5774 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5775 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5776 getF32Constant(DAG, 0x3fd6633d, dl));
5777 } else if (LimitFloatPrecision <= 12) {
5778 // For floating-point precision of 12:
5779 //
5780 // Log2ofMantissa =
5781 // -2.51285454f +
5782 // (4.07009056f +
5783 // (-2.12067489f +
5784 // (.645142248f - 0.816157886e-1f * x) * x) * x) * x;
5785 //
5786 // error 0.0000876136000, which is better than 13 bits
5787 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5788 getF32Constant(DAG, 0xbda7262e, dl));
5789 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5790 getF32Constant(DAG, 0x3f25280b, dl));
5791 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5792 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5793 getF32Constant(DAG, 0x4007b923, dl));
5794 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5795 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5796 getF32Constant(DAG, 0x40823e2f, dl));
5797 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5798 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5799 getF32Constant(DAG, 0x4020d29c, dl));
5800 } else { // LimitFloatPrecision <= 18
5801 // For floating-point precision of 18:
5802 //
5803 // Log2ofMantissa =
5804 // -3.0400495f +
5805 // (6.1129976f +
5806 // (-5.3420409f +
5807 // (3.2865683f +
5808 // (-1.2669343f +
5809 // (0.27515199f -
5810 // 0.25691327e-1f * x) * x) * x) * x) * x) * x;
5811 //
5812 // error 0.0000018516, which is better than 18 bits
5813 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5814 getF32Constant(DAG, 0xbcd2769e, dl));
5815 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5816 getF32Constant(DAG, 0x3e8ce0b9, dl));
5817 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5818 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5819 getF32Constant(DAG, 0x3fa22ae7, dl));
5820 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5821 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5822 getF32Constant(DAG, 0x40525723, dl));
5823 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5824 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5825 getF32Constant(DAG, 0x40aaf200, dl));
5826 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5827 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5828 getF32Constant(DAG, 0x40c39dad, dl));
5829 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5830 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t10,
5831 getF32Constant(DAG, 0x4042902c, dl));
5832 }
5833
5834 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, Log2ofMantissa);
5835 }
5836
5837 // No special expansion.
5838 return DAG.getNode(ISD::FLOG2, dl, Op.getValueType(), Op, Flags);
5839}
5840
5841/// expandLog10 - Lower a log10 intrinsic. Handles the special sequences for
5842/// limited-precision mode.
5844 const TargetLowering &TLI, SDNodeFlags Flags) {
5845 // TODO: What fast-math-flags should be set on the floating-point nodes?
5846
5847 if (Op.getValueType() == MVT::f32 &&
5849 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5850
5851 // Scale the exponent by log10(2) [0.30102999f].
5852 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5853 SDValue LogOfExponent = DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5854 getF32Constant(DAG, 0x3e9a209a, dl));
5855
5856 // Get the significand and build it into a floating-point number with
5857 // exponent of 1.
5858 SDValue X = GetSignificand(DAG, Op1, dl);
5859
5860 SDValue Log10ofMantissa;
5861 if (LimitFloatPrecision <= 6) {
5862 // For floating-point precision of 6:
5863 //
5864 // Log10ofMantissa =
5865 // -0.50419619f +
5866 // (0.60948995f - 0.10380950f * x) * x;
5867 //
5868 // error 0.0014886165, which is 6 bits
5869 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5870 getF32Constant(DAG, 0xbdd49a13, dl));
5871 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5872 getF32Constant(DAG, 0x3f1c0789, dl));
5873 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5874 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5875 getF32Constant(DAG, 0x3f011300, dl));
5876 } else if (LimitFloatPrecision <= 12) {
5877 // For floating-point precision of 12:
5878 //
5879 // Log10ofMantissa =
5880 // -0.64831180f +
5881 // (0.91751397f +
5882 // (-0.31664806f + 0.47637168e-1f * x) * x) * x;
5883 //
5884 // error 0.00019228036, which is better than 12 bits
5885 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5886 getF32Constant(DAG, 0x3d431f31, dl));
5887 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
5888 getF32Constant(DAG, 0x3ea21fb2, dl));
5889 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5890 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5891 getF32Constant(DAG, 0x3f6ae232, dl));
5892 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5893 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
5894 getF32Constant(DAG, 0x3f25f7c3, dl));
5895 } else { // LimitFloatPrecision <= 18
5896 // For floating-point precision of 18:
5897 //
5898 // Log10ofMantissa =
5899 // -0.84299375f +
5900 // (1.5327582f +
5901 // (-1.0688956f +
5902 // (0.49102474f +
5903 // (-0.12539807f + 0.13508273e-1f * x) * x) * x) * x) * x;
5904 //
5905 // error 0.0000037995730, which is better than 18 bits
5906 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5907 getF32Constant(DAG, 0x3c5d51ce, dl));
5908 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
5909 getF32Constant(DAG, 0x3e00685a, dl));
5910 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5911 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5912 getF32Constant(DAG, 0x3efb6798, dl));
5913 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5914 SDValue t5 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
5915 getF32Constant(DAG, 0x3f88d192, dl));
5916 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5917 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5918 getF32Constant(DAG, 0x3fc4316c, dl));
5919 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5920 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t8,
5921 getF32Constant(DAG, 0x3f57ce70, dl));
5922 }
5923
5924 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, Log10ofMantissa);
5925 }
5926
5927 // No special expansion.
5928 return DAG.getNode(ISD::FLOG10, dl, Op.getValueType(), Op, Flags);
5929}
5930
5931/// expandExp2 - Lower an exp2 intrinsic. Handles the special sequences for
5932/// limited-precision mode.
5934 const TargetLowering &TLI, SDNodeFlags Flags) {
5935 if (Op.getValueType() == MVT::f32 &&
5937 return getLimitedPrecisionExp2(Op, dl, DAG);
5938
5939 // No special expansion.
5940 return DAG.getNode(ISD::FEXP2, dl, Op.getValueType(), Op, Flags);
5941}
5942
5943/// visitPow - Lower a pow intrinsic. Handles the special sequences for
5944/// limited-precision mode with x == 10.0f.
5946 SelectionDAG &DAG, const TargetLowering &TLI,
5947 SDNodeFlags Flags) {
5948 bool IsExp10 = false;
5949 if (LHS.getValueType() == MVT::f32 && RHS.getValueType() == MVT::f32 &&
5952 APFloat Ten(10.0f);
5953 IsExp10 = LHSC->isExactlyValue(Ten);
5954 }
5955 }
5956
5957 // TODO: What fast-math-flags should be set on the FMUL node?
5958 if (IsExp10) {
5959 // Put the exponent in the right bit position for later addition to the
5960 // final result:
5961 //
5962 // #define LOG2OF10 3.3219281f
5963 // t0 = Op * LOG2OF10;
5964 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, RHS,
5965 getF32Constant(DAG, 0x40549a78, dl));
5966 return getLimitedPrecisionExp2(t0, dl, DAG);
5967 }
5968
5969 // No special expansion.
5970 return DAG.getNode(ISD::FPOW, dl, LHS.getValueType(), LHS, RHS, Flags);
5971}
5972
5973/// ExpandPowI - Expand a llvm.powi intrinsic.
5975 SelectionDAG &DAG) {
5976 // If RHS is a constant, we can expand this out to a multiplication tree if
5977 // it's beneficial on the target, otherwise we end up lowering to a call to
5978 // __powidf2 (for example).
5980 unsigned Val = RHSC->getSExtValue();
5981
5982 // powi(x, 0) -> 1.0
5983 if (Val == 0)
5984 return DAG.getConstantFP(1.0, DL, LHS.getValueType());
5985
5987 Val, DAG.shouldOptForSize())) {
5988 // Get the exponent as a positive value.
5989 if ((int)Val < 0)
5990 Val = -Val;
5991 // We use the simple binary decomposition method to generate the multiply
5992 // sequence. There are more optimal ways to do this (for example,
5993 // powi(x,15) generates one more multiply than it should), but this has
5994 // the benefit of being both really simple and much better than a libcall.
5995 SDValue Res; // Logically starts equal to 1.0
5996 SDValue CurSquare = LHS;
5997 // TODO: Intrinsics should have fast-math-flags that propagate to these
5998 // nodes.
5999 while (Val) {
6000 if (Val & 1) {
6001 if (Res.getNode())
6002 Res =
6003 DAG.getNode(ISD::FMUL, DL, Res.getValueType(), Res, CurSquare);
6004 else
6005 Res = CurSquare; // 1.0*CurSquare.
6006 }
6007
6008 CurSquare = DAG.getNode(ISD::FMUL, DL, CurSquare.getValueType(),
6009 CurSquare, CurSquare);
6010 Val >>= 1;
6011 }
6012
6013 // If the original was negative, invert the result, producing 1/(x*x*x).
6014 if (RHSC->getSExtValue() < 0)
6015 Res = DAG.getNode(ISD::FDIV, DL, LHS.getValueType(),
6016 DAG.getConstantFP(1.0, DL, LHS.getValueType()), Res);
6017 return Res;
6018 }
6019 }
6020
6021 // Otherwise, expand to a libcall.
6022 return DAG.getNode(ISD::FPOWI, DL, LHS.getValueType(), LHS, RHS);
6023}
6024
6025static SDValue expandDivFix(unsigned Opcode, const SDLoc &DL,
6026 SDValue LHS, SDValue RHS, SDValue Scale,
6027 SelectionDAG &DAG, const TargetLowering &TLI) {
6028 EVT VT = LHS.getValueType();
6029 bool Signed = Opcode == ISD::SDIVFIX || Opcode == ISD::SDIVFIXSAT;
6030 bool Saturating = Opcode == ISD::SDIVFIXSAT || Opcode == ISD::UDIVFIXSAT;
6031 LLVMContext &Ctx = *DAG.getContext();
6032
6033 // If the type is legal but the operation isn't, this node might survive all
6034 // the way to operation legalization. If we end up there and we do not have
6035 // the ability to widen the type (if VT*2 is not legal), we cannot expand the
6036 // node.
6037
6038 // Coax the legalizer into expanding the node during type legalization instead
6039 // by bumping the size by one bit. This will force it to Promote, enabling the
6040 // early expansion and avoiding the need to expand later.
6041
6042 // We don't have to do this if Scale is 0; that can always be expanded, unless
6043 // it's a saturating signed operation. Those can experience true integer
6044 // division overflow, a case which we must avoid.
6045
6046 // FIXME: We wouldn't have to do this (or any of the early
6047 // expansion/promotion) if it was possible to expand a libcall of an
6048 // illegal type during operation legalization. But it's not, so things
6049 // get a bit hacky.
6050 unsigned ScaleInt = Scale->getAsZExtVal();
6051 if ((ScaleInt > 0 || (Saturating && Signed)) &&
6052 (TLI.isTypeLegal(VT) ||
6053 (VT.isVector() && TLI.isTypeLegal(VT.getVectorElementType())))) {
6055 Opcode, VT, ScaleInt);
6056 if (Action != TargetLowering::Legal && Action != TargetLowering::Custom) {
6057 EVT PromVT;
6058 if (VT.isScalarInteger())
6059 PromVT = EVT::getIntegerVT(Ctx, VT.getSizeInBits() + 1);
6060 else if (VT.isVector()) {
6061 PromVT = VT.getVectorElementType();
6062 PromVT = EVT::getIntegerVT(Ctx, PromVT.getSizeInBits() + 1);
6063 PromVT = EVT::getVectorVT(Ctx, PromVT, VT.getVectorElementCount());
6064 } else
6065 llvm_unreachable("Wrong VT for DIVFIX?");
6066 LHS = DAG.getExtOrTrunc(Signed, LHS, DL, PromVT);
6067 RHS = DAG.getExtOrTrunc(Signed, RHS, DL, PromVT);
6068 EVT ShiftTy = TLI.getShiftAmountTy(PromVT, DAG.getDataLayout());
6069 // For saturating operations, we need to shift up the LHS to get the
6070 // proper saturation width, and then shift down again afterwards.
6071 if (Saturating)
6072 LHS = DAG.getNode(ISD::SHL, DL, PromVT, LHS,
6073 DAG.getConstant(1, DL, ShiftTy));
6074 SDValue Res = DAG.getNode(Opcode, DL, PromVT, LHS, RHS, Scale);
6075 if (Saturating)
6076 Res = DAG.getNode(Signed ? ISD::SRA : ISD::SRL, DL, PromVT, Res,
6077 DAG.getConstant(1, DL, ShiftTy));
6078 return DAG.getZExtOrTrunc(Res, DL, VT);
6079 }
6080 }
6081
6082 return DAG.getNode(Opcode, DL, VT, LHS, RHS, Scale);
6083}
6084
6085// getUnderlyingArgRegs - Find underlying registers used for a truncated,
6086// bitcasted, or split argument. Returns a list of <Register, size in bits>
6087static void
6088getUnderlyingArgRegs(SmallVectorImpl<std::pair<Register, TypeSize>> &Regs,
6089 const SDValue &N) {
6090 switch (N.getOpcode()) {
6091 case ISD::CopyFromReg: {
6092 SDValue Op = N.getOperand(1);
6093 Regs.emplace_back(cast<RegisterSDNode>(Op)->getReg(),
6094 Op.getValueType().getSizeInBits());
6095 return;
6096 }
6097 case ISD::BITCAST:
6098 case ISD::AssertZext:
6099 case ISD::AssertSext:
6100 case ISD::TRUNCATE:
6101 getUnderlyingArgRegs(Regs, N.getOperand(0));
6102 return;
6103 case ISD::BUILD_PAIR:
6104 case ISD::BUILD_VECTOR:
6106 for (SDValue Op : N->op_values())
6107 getUnderlyingArgRegs(Regs, Op);
6108 return;
6109 default:
6110 return;
6111 }
6112}
6113
6114/// If the DbgValueInst is a dbg_value of a function argument, create the
6115/// corresponding DBG_VALUE machine instruction for it now. At the end of
6116/// instruction selection, they will be inserted to the entry BB.
6117/// We don't currently support this for variadic dbg_values, as they shouldn't
6118/// appear for function arguments or in the prologue.
6119bool SelectionDAGBuilder::EmitFuncArgumentDbgValue(
6120 const Value *V, DILocalVariable *Variable, DIExpression *Expr,
6121 DILocation *DL, FuncArgumentDbgValueKind Kind, const SDValue &N) {
6122 const Argument *Arg = dyn_cast<Argument>(V);
6123 if (!Arg)
6124 return false;
6125
6126 MachineFunction &MF = DAG.getMachineFunction();
6127 const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo();
6128
6129 // Helper to create DBG_INSTR_REFs or DBG_VALUEs, depending on what kind
6130 // we've been asked to pursue.
6131 auto MakeVRegDbgValue = [&](Register Reg, DIExpression *FragExpr,
6132 bool Indirect) {
6133 if (Reg.isVirtual() && MF.useDebugInstrRef()) {
6134 // For VRegs, in instruction referencing mode, create a DBG_INSTR_REF
6135 // pointing at the VReg, which will be patched up later.
6136 auto &Inst = TII->get(TargetOpcode::DBG_INSTR_REF);
6138 /* Reg */ Reg, /* isDef */ false, /* isImp */ false,
6139 /* isKill */ false, /* isDead */ false,
6140 /* isUndef */ false, /* isEarlyClobber */ false,
6141 /* SubReg */ 0, /* isDebug */ true)});
6142
6143 auto *NewDIExpr = FragExpr;
6144 // We don't have an "Indirect" field in DBG_INSTR_REF, fold that into
6145 // the DIExpression.
6146 if (Indirect)
6147 NewDIExpr = DIExpression::prepend(FragExpr, DIExpression::DerefBefore);
6149 NewDIExpr = DIExpression::prependOpcodes(NewDIExpr, Ops);
6150 return BuildMI(MF, DL, Inst, false, MOs, Variable, NewDIExpr);
6151 } else {
6152 // Create a completely standard DBG_VALUE.
6153 auto &Inst = TII->get(TargetOpcode::DBG_VALUE);
6154 return BuildMI(MF, DL, Inst, Indirect, Reg, Variable, FragExpr);
6155 }
6156 };
6157
6158 if (Kind == FuncArgumentDbgValueKind::Value) {
6159 // ArgDbgValues are hoisted to the beginning of the entry block. So we
6160 // should only emit as ArgDbgValue if the dbg.value intrinsic is found in
6161 // the entry block.
6162 bool IsInEntryBlock = FuncInfo.MBB == &FuncInfo.MF->front();
6163 if (!IsInEntryBlock)
6164 return false;
6165
6166 // ArgDbgValues are hoisted to the beginning of the entry block. So we
6167 // should only emit as ArgDbgValue if the dbg.value intrinsic describes a
6168 // variable that also is a param.
6169 //
6170 // Although, if we are at the top of the entry block already, we can still
6171 // emit using ArgDbgValue. This might catch some situations when the
6172 // dbg.value refers to an argument that isn't used in the entry block, so
6173 // any CopyToReg node would be optimized out and the only way to express
6174 // this DBG_VALUE is by using the physical reg (or FI) as done in this
6175 // method. ArgDbgValues are hoisted to the beginning of the entry block. So
6176 // we should only emit as ArgDbgValue if the Variable is an argument to the
6177 // current function, and the dbg.value intrinsic is found in the entry
6178 // block.
6179 bool VariableIsFunctionInputArg = Variable->isParameter() &&
6180 !DL->getInlinedAt();
6181 bool IsInPrologue = SDNodeOrder == LowestSDNodeOrder;
6182 if (!IsInPrologue && !VariableIsFunctionInputArg)
6183 return false;
6184
6185 // Here we assume that a function argument on IR level only can be used to
6186 // describe one input parameter on source level. If we for example have
6187 // source code like this
6188 //
6189 // struct A { long x, y; };
6190 // void foo(struct A a, long b) {
6191 // ...
6192 // b = a.x;
6193 // ...
6194 // }
6195 //
6196 // and IR like this
6197 //
6198 // define void @foo(i32 %a1, i32 %a2, i32 %b) {
6199 // entry:
6200 // call void @llvm.dbg.value(metadata i32 %a1, "a", DW_OP_LLVM_fragment
6201 // call void @llvm.dbg.value(metadata i32 %a2, "a", DW_OP_LLVM_fragment
6202 // call void @llvm.dbg.value(metadata i32 %b, "b",
6203 // ...
6204 // call void @llvm.dbg.value(metadata i32 %a1, "b"
6205 // ...
6206 //
6207 // then the last dbg.value is describing a parameter "b" using a value that
6208 // is an argument. But since we already has used %a1 to describe a parameter
6209 // we should not handle that last dbg.value here (that would result in an
6210 // incorrect hoisting of the DBG_VALUE to the function entry).
6211 // Notice that we allow one dbg.value per IR level argument, to accommodate
6212 // for the situation with fragments above.
6213 // If there is no node for the value being handled, we return true to skip
6214 // the normal generation of debug info, as it would kill existing debug
6215 // info for the parameter in case of duplicates.
6216 if (VariableIsFunctionInputArg) {
6217 unsigned ArgNo = Arg->getArgNo();
6218 if (ArgNo >= FuncInfo.DescribedArgs.size())
6219 FuncInfo.DescribedArgs.resize(ArgNo + 1, false);
6220 else if (!IsInPrologue && FuncInfo.DescribedArgs.test(ArgNo))
6221 return !NodeMap[V].getNode();
6222 FuncInfo.DescribedArgs.set(ArgNo);
6223 }
6224 }
6225
6226 bool IsIndirect = false;
6227 std::optional<MachineOperand> Op;
6228 // Some arguments' frame index is recorded during argument lowering.
6229 int FI = FuncInfo.getArgumentFrameIndex(Arg);
6230 if (FI != std::numeric_limits<int>::max())
6232
6234 if (!Op && N.getNode()) {
6235 getUnderlyingArgRegs(ArgRegsAndSizes, N);
6236 Register Reg;
6237 if (ArgRegsAndSizes.size() == 1)
6238 Reg = ArgRegsAndSizes.front().first;
6239
6240 if (Reg && Reg.isVirtual()) {
6241 MachineRegisterInfo &RegInfo = MF.getRegInfo();
6242 Register PR = RegInfo.getLiveInPhysReg(Reg);
6243 if (PR)
6244 Reg = PR;
6245 }
6246 if (Reg) {
6248 IsIndirect = Kind != FuncArgumentDbgValueKind::Value;
6249 }
6250 }
6251
6252 if (!Op && N.getNode()) {
6253 // Check if frame index is available.
6254 SDValue LCandidate = peekThroughBitcasts(N);
6255 if (LoadSDNode *LNode = dyn_cast<LoadSDNode>(LCandidate.getNode()))
6256 if (FrameIndexSDNode *FINode =
6257 dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
6258 Op = MachineOperand::CreateFI(FINode->getIndex());
6259 }
6260
6261 if (!Op) {
6262 // Create a DBG_VALUE for each decomposed value in ArgRegs to cover Reg
6263 auto splitMultiRegDbgValue = [&](ArrayRef<std::pair<Register, TypeSize>>
6264 SplitRegs) {
6265 unsigned Offset = 0;
6266 for (const auto &RegAndSize : SplitRegs) {
6267 // If the expression is already a fragment, the current register
6268 // offset+size might extend beyond the fragment. In this case, only
6269 // the register bits that are inside the fragment are relevant.
6270 int RegFragmentSizeInBits = RegAndSize.second;
6271 if (auto ExprFragmentInfo = Expr->getFragmentInfo()) {
6272 uint64_t ExprFragmentSizeInBits = ExprFragmentInfo->SizeInBits;
6273 // The register is entirely outside the expression fragment,
6274 // so is irrelevant for debug info.
6275 if (Offset >= ExprFragmentSizeInBits)
6276 break;
6277 // The register is partially outside the expression fragment, only
6278 // the low bits within the fragment are relevant for debug info.
6279 if (Offset + RegFragmentSizeInBits > ExprFragmentSizeInBits) {
6280 RegFragmentSizeInBits = ExprFragmentSizeInBits - Offset;
6281 }
6282 }
6283
6284 auto FragmentExpr = DIExpression::createFragmentExpression(
6285 Expr, Offset, RegFragmentSizeInBits);
6286 Offset += RegAndSize.second;
6287 // If a valid fragment expression cannot be created, the variable's
6288 // correct value cannot be determined and so it is set as poison.
6289 if (!FragmentExpr) {
6290 SDDbgValue *SDV = DAG.getConstantDbgValue(
6291 Variable, Expr, PoisonValue::get(V->getType()), DL, SDNodeOrder);
6292 DAG.AddDbgValue(SDV, false);
6293 continue;
6294 }
6295 MachineInstr *NewMI =
6296 MakeVRegDbgValue(RegAndSize.first, *FragmentExpr,
6297 Kind != FuncArgumentDbgValueKind::Value);
6298 FuncInfo.ArgDbgValues.push_back(NewMI);
6299 }
6300 };
6301
6302 // Check if ValueMap has reg number.
6304 VMI = FuncInfo.ValueMap.find(V);
6305 if (VMI != FuncInfo.ValueMap.end()) {
6306 const auto &TLI = DAG.getTargetLoweringInfo();
6307 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), VMI->second,
6308 V->getType(), std::nullopt);
6309 if (RFV.occupiesMultipleRegs()) {
6310 splitMultiRegDbgValue(RFV.getRegsAndSizes());
6311 return true;
6312 }
6313
6314 Op = MachineOperand::CreateReg(VMI->second, false);
6315 IsIndirect = Kind != FuncArgumentDbgValueKind::Value;
6316 } else if (ArgRegsAndSizes.size() > 1) {
6317 // This was split due to the calling convention, and no virtual register
6318 // mapping exists for the value.
6319 splitMultiRegDbgValue(ArgRegsAndSizes);
6320 return true;
6321 }
6322 }
6323
6324 if (!Op)
6325 return false;
6326
6327 assert(Variable->isValidLocationForIntrinsic(DL) &&
6328 "Expected inlined-at fields to agree");
6329 MachineInstr *NewMI = nullptr;
6330
6331 if (Op->isReg())
6332 NewMI = MakeVRegDbgValue(Op->getReg(), Expr, IsIndirect);
6333 else
6334 NewMI = BuildMI(MF, DL, TII->get(TargetOpcode::DBG_VALUE), true, *Op,
6335 Variable, Expr);
6336
6337 // Otherwise, use ArgDbgValues.
6338 FuncInfo.ArgDbgValues.push_back(NewMI);
6339 return true;
6340}
6341
6342/// Return the appropriate SDDbgValue based on N.
6343SDDbgValue *SelectionDAGBuilder::getDbgValue(SDValue N,
6344 DILocalVariable *Variable,
6345 DIExpression *Expr,
6346 const DebugLoc &dl,
6347 unsigned DbgSDNodeOrder) {
6348 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(N.getNode())) {
6349 // Construct a FrameIndexDbgValue for FrameIndexSDNodes so we can describe
6350 // stack slot locations.
6351 //
6352 // Consider "int x = 0; int *px = &x;". There are two kinds of interesting
6353 // debug values here after optimization:
6354 //
6355 // dbg.value(i32* %px, !"int *px", !DIExpression()), and
6356 // dbg.value(i32* %px, !"int x", !DIExpression(DW_OP_deref))
6357 //
6358 // Both describe the direct values of their associated variables.
6359 return DAG.getFrameIndexDbgValue(Variable, Expr, FISDN->getIndex(),
6360 /*IsIndirect*/ false, dl, DbgSDNodeOrder);
6361 }
6362 return DAG.getDbgValue(Variable, Expr, N.getNode(), N.getResNo(),
6363 /*IsIndirect*/ false, dl, DbgSDNodeOrder);
6364}
6365
6366static unsigned FixedPointIntrinsicToOpcode(unsigned Intrinsic) {
6367 switch (Intrinsic) {
6368 case Intrinsic::smul_fix:
6369 return ISD::SMULFIX;
6370 case Intrinsic::umul_fix:
6371 return ISD::UMULFIX;
6372 case Intrinsic::smul_fix_sat:
6373 return ISD::SMULFIXSAT;
6374 case Intrinsic::umul_fix_sat:
6375 return ISD::UMULFIXSAT;
6376 case Intrinsic::sdiv_fix:
6377 return ISD::SDIVFIX;
6378 case Intrinsic::udiv_fix:
6379 return ISD::UDIVFIX;
6380 case Intrinsic::sdiv_fix_sat:
6381 return ISD::SDIVFIXSAT;
6382 case Intrinsic::udiv_fix_sat:
6383 return ISD::UDIVFIXSAT;
6384 default:
6385 llvm_unreachable("Unhandled fixed point intrinsic");
6386 }
6387}
6388
6389/// Given a @llvm.call.preallocated.setup, return the corresponding
6390/// preallocated call.
6391static const CallBase *FindPreallocatedCall(const Value *PreallocatedSetup) {
6392 assert(cast<CallBase>(PreallocatedSetup)
6394 ->getIntrinsicID() == Intrinsic::call_preallocated_setup &&
6395 "expected call_preallocated_setup Value");
6396 for (const auto *U : PreallocatedSetup->users()) {
6397 auto *UseCall = cast<CallBase>(U);
6398 const Function *Fn = UseCall->getCalledFunction();
6399 if (!Fn || Fn->getIntrinsicID() != Intrinsic::call_preallocated_arg) {
6400 return UseCall;
6401 }
6402 }
6403 llvm_unreachable("expected corresponding call to preallocated setup/arg");
6404}
6405
6406/// If DI is a debug value with an EntryValue expression, lower it using the
6407/// corresponding physical register of the associated Argument value
6408/// (guaranteed to exist by the verifier).
6409bool SelectionDAGBuilder::visitEntryValueDbgValue(
6410 ArrayRef<const Value *> Values, DILocalVariable *Variable,
6411 DIExpression *Expr, DebugLoc DbgLoc) {
6412 if (!Expr->isEntryValue() || !hasSingleElement(Values))
6413 return false;
6414
6415 // These properties are guaranteed by the verifier.
6416 const Argument *Arg = cast<Argument>(Values[0]);
6417 assert(Arg->hasAttribute(Attribute::AttrKind::SwiftAsync));
6418
6419 auto ArgIt = FuncInfo.ValueMap.find(Arg);
6420 if (ArgIt == FuncInfo.ValueMap.end()) {
6421 LLVM_DEBUG(
6422 dbgs() << "Dropping dbg.value: expression is entry_value but "
6423 "couldn't find an associated register for the Argument\n");
6424 return true;
6425 }
6426 Register ArgVReg = ArgIt->getSecond();
6427
6428 for (auto [PhysReg, VirtReg] : FuncInfo.RegInfo->liveins())
6429 if (ArgVReg == VirtReg || ArgVReg == PhysReg) {
6430 SDDbgValue *SDV = DAG.getVRegDbgValue(
6431 Variable, Expr, PhysReg, false /*IsIndidrect*/, DbgLoc, SDNodeOrder);
6432 DAG.AddDbgValue(SDV, false /*treat as dbg.declare byval parameter*/);
6433 return true;
6434 }
6435 LLVM_DEBUG(dbgs() << "Dropping dbg.value: expression is entry_value but "
6436 "couldn't find a physical register\n");
6437 return true;
6438}
6439
6440/// Lower the call to the specified intrinsic function.
6441void SelectionDAGBuilder::visitConvergenceControl(const CallInst &I,
6442 unsigned Intrinsic) {
6443 SDLoc sdl = getCurSDLoc();
6444 switch (Intrinsic) {
6445 case Intrinsic::experimental_convergence_anchor:
6446 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_ANCHOR, sdl, MVT::Untyped));
6447 break;
6448 case Intrinsic::experimental_convergence_entry:
6449 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_ENTRY, sdl, MVT::Untyped));
6450 break;
6451 case Intrinsic::experimental_convergence_loop: {
6452 auto Bundle = I.getOperandBundle(LLVMContext::OB_convergencectrl);
6453 auto *Token = Bundle->Inputs[0].get();
6454 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_LOOP, sdl, MVT::Untyped,
6455 getValue(Token)));
6456 break;
6457 }
6458 }
6459}
6460
6461void SelectionDAGBuilder::visitVectorHistogram(const CallInst &I,
6462 unsigned IntrinsicID) {
6463 // For now, we're only lowering an 'add' histogram.
6464 // We can add others later, e.g. saturating adds, min/max.
6465 assert(IntrinsicID == Intrinsic::experimental_vector_histogram_add &&
6466 "Tried to lower unsupported histogram type");
6467 SDLoc sdl = getCurSDLoc();
6468 Value *Ptr = I.getOperand(0);
6469 SDValue Inc = getValue(I.getOperand(1));
6470 SDValue Mask = getValue(I.getOperand(2));
6471
6472 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6473 DataLayout TargetDL = DAG.getDataLayout();
6474 EVT VT = Inc.getValueType();
6475 Align Alignment = DAG.getEVTAlign(VT);
6476
6477 const MDNode *Ranges = getRangeMetadata(I);
6478
6479 SDValue Root = DAG.getRoot();
6480 SDValue Base;
6481 SDValue Index;
6482 SDValue Scale;
6483 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
6484 I.getParent(), VT.getScalarStoreSize());
6485
6486 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
6487
6488 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
6489 MachinePointerInfo(AS),
6491 MemoryLocation::UnknownSize, Alignment, I.getAAMetadata(), Ranges);
6492
6493 if (!UniformBase) {
6494 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
6495 Index = getValue(Ptr);
6496 Scale =
6497 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
6498 }
6499
6500 EVT IdxVT = Index.getValueType();
6501 EVT EltTy = IdxVT.getVectorElementType();
6502 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
6503 EVT NewIdxVT = IdxVT.changeVectorElementType(EltTy);
6504 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
6505 }
6506
6507 SDValue ID = DAG.getTargetConstant(IntrinsicID, sdl, MVT::i32);
6508
6509 SDValue Ops[] = {Root, Inc, Mask, Base, Index, Scale, ID};
6510 SDValue Histogram = DAG.getMaskedHistogram(DAG.getVTList(MVT::Other), VT, sdl,
6511 Ops, MMO, ISD::SIGNED_SCALED);
6512
6513 setValue(&I, Histogram);
6514 DAG.setRoot(Histogram);
6515}
6516
6517void SelectionDAGBuilder::visitVectorExtractLastActive(const CallInst &I,
6518 unsigned Intrinsic) {
6519 assert(Intrinsic == Intrinsic::experimental_vector_extract_last_active &&
6520 "Tried lowering invalid vector extract last");
6521 SDLoc sdl = getCurSDLoc();
6522 const DataLayout &Layout = DAG.getDataLayout();
6523 SDValue Data = getValue(I.getOperand(0));
6524 SDValue Mask = getValue(I.getOperand(1));
6525
6526 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6527 EVT ResVT = TLI.getValueType(Layout, I.getType());
6528
6529 EVT ExtVT = TLI.getVectorIdxTy(Layout);
6530 SDValue Idx = DAG.getNode(ISD::VECTOR_FIND_LAST_ACTIVE, sdl, ExtVT, Mask);
6531 SDValue Result = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, sdl, ResVT, Data, Idx);
6532
6533 Value *Default = I.getOperand(2);
6535 SDValue PassThru = getValue(Default);
6536 EVT BoolVT = Mask.getValueType().getScalarType();
6537 SDValue AnyActive = DAG.getNode(ISD::VECREDUCE_OR, sdl, BoolVT, Mask);
6538 Result = DAG.getSelect(sdl, ResVT, AnyActive, Result, PassThru);
6539 }
6540
6541 setValue(&I, Result);
6542}
6543
6544/// Lower the call to the specified intrinsic function.
6545void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
6546 unsigned Intrinsic) {
6547 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6548 SDLoc sdl = getCurSDLoc();
6549 DebugLoc dl = getCurDebugLoc();
6550 SDValue Res;
6551
6552 SDNodeFlags Flags;
6553 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
6554 Flags.copyFMF(*FPOp);
6555
6556 switch (Intrinsic) {
6557 default:
6558 // By default, turn this into a target intrinsic node.
6559 visitTargetIntrinsic(I, Intrinsic);
6560 return;
6561 case Intrinsic::vscale: {
6562 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6563 setValue(&I, DAG.getVScale(sdl, VT, APInt(VT.getSizeInBits(), 1)));
6564 return;
6565 }
6566 case Intrinsic::vastart: visitVAStart(I); return;
6567 case Intrinsic::vaend: visitVAEnd(I); return;
6568 case Intrinsic::vacopy: visitVACopy(I); return;
6569 case Intrinsic::returnaddress:
6570 setValue(&I, DAG.getNode(ISD::RETURNADDR, sdl,
6571 TLI.getValueType(DAG.getDataLayout(), I.getType()),
6572 getValue(I.getArgOperand(0))));
6573 return;
6574 case Intrinsic::addressofreturnaddress:
6575 setValue(&I,
6576 DAG.getNode(ISD::ADDROFRETURNADDR, sdl,
6577 TLI.getValueType(DAG.getDataLayout(), I.getType())));
6578 return;
6579 case Intrinsic::sponentry:
6580 setValue(&I,
6581 DAG.getNode(ISD::SPONENTRY, sdl,
6582 TLI.getValueType(DAG.getDataLayout(), I.getType())));
6583 return;
6584 case Intrinsic::frameaddress:
6585 setValue(&I, DAG.getNode(ISD::FRAMEADDR, sdl,
6586 TLI.getFrameIndexTy(DAG.getDataLayout()),
6587 getValue(I.getArgOperand(0))));
6588 return;
6589 case Intrinsic::read_volatile_register:
6590 case Intrinsic::read_register: {
6591 Value *Reg = I.getArgOperand(0);
6592 SDValue Chain = getRoot();
6594 DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
6595 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6596 Res = DAG.getNode(ISD::READ_REGISTER, sdl,
6597 DAG.getVTList(VT, MVT::Other), Chain, RegName);
6598 setValue(&I, Res);
6599 DAG.setRoot(Res.getValue(1));
6600 return;
6601 }
6602 case Intrinsic::write_register: {
6603 Value *Reg = I.getArgOperand(0);
6604 Value *RegValue = I.getArgOperand(1);
6605 SDValue Chain = getRoot();
6607 DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
6608 DAG.setRoot(DAG.getNode(ISD::WRITE_REGISTER, sdl, MVT::Other, Chain,
6609 RegName, getValue(RegValue)));
6610 return;
6611 }
6612 case Intrinsic::memcpy:
6613 case Intrinsic::memcpy_inline: {
6614 const auto &MCI = cast<MemCpyInst>(I);
6615 SDValue Dst = getValue(I.getArgOperand(0));
6616 SDValue Src = getValue(I.getArgOperand(1));
6617 SDValue Size = getValue(I.getArgOperand(2));
6618 assert((!MCI.isForceInlined() || isa<ConstantSDNode>(Size)) &&
6619 "memcpy_inline needs constant size");
6620 // @llvm.memcpy.inline defines 0 and 1 to both mean no alignment.
6621 Align DstAlign = MCI.getDestAlign().valueOrOne();
6622 Align SrcAlign = MCI.getSourceAlign().valueOrOne();
6623 Align Alignment = std::min(DstAlign, SrcAlign);
6624 bool isVol = MCI.isVolatile();
6625 // FIXME: Support passing different dest/src alignments to the memcpy DAG
6626 // node.
6627 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6628 SDValue MC = DAG.getMemcpy(Root, sdl, Dst, Src, Size, Alignment, isVol,
6629 MCI.isForceInlined(), &I, std::nullopt,
6630 MachinePointerInfo(I.getArgOperand(0)),
6631 MachinePointerInfo(I.getArgOperand(1)),
6632 I.getAAMetadata(), BatchAA);
6633 updateDAGForMaybeTailCall(MC);
6634 return;
6635 }
6636 case Intrinsic::memset:
6637 case Intrinsic::memset_inline: {
6638 const auto &MSII = cast<MemSetInst>(I);
6639 SDValue Dst = getValue(I.getArgOperand(0));
6640 SDValue Value = getValue(I.getArgOperand(1));
6641 SDValue Size = getValue(I.getArgOperand(2));
6642 assert((!MSII.isForceInlined() || isa<ConstantSDNode>(Size)) &&
6643 "memset_inline needs constant size");
6644 // @llvm.memset defines 0 and 1 to both mean no alignment.
6645 Align DstAlign = MSII.getDestAlign().valueOrOne();
6646 bool isVol = MSII.isVolatile();
6647 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6648 SDValue MC = DAG.getMemset(
6649 Root, sdl, Dst, Value, Size, DstAlign, isVol, MSII.isForceInlined(),
6650 &I, MachinePointerInfo(I.getArgOperand(0)), I.getAAMetadata());
6651 updateDAGForMaybeTailCall(MC);
6652 return;
6653 }
6654 case Intrinsic::memmove: {
6655 const auto &MMI = cast<MemMoveInst>(I);
6656 SDValue Op1 = getValue(I.getArgOperand(0));
6657 SDValue Op2 = getValue(I.getArgOperand(1));
6658 SDValue Op3 = getValue(I.getArgOperand(2));
6659 // @llvm.memmove defines 0 and 1 to both mean no alignment.
6660 Align DstAlign = MMI.getDestAlign().valueOrOne();
6661 Align SrcAlign = MMI.getSourceAlign().valueOrOne();
6662 Align Alignment = std::min(DstAlign, SrcAlign);
6663 bool isVol = MMI.isVolatile();
6664 // FIXME: Support passing different dest/src alignments to the memmove DAG
6665 // node.
6666 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6667 SDValue MM = DAG.getMemmove(Root, sdl, Op1, Op2, Op3, Alignment, isVol, &I,
6668 /* OverrideTailCall */ std::nullopt,
6669 MachinePointerInfo(I.getArgOperand(0)),
6670 MachinePointerInfo(I.getArgOperand(1)),
6671 I.getAAMetadata(), BatchAA);
6672 updateDAGForMaybeTailCall(MM);
6673 return;
6674 }
6675 case Intrinsic::memcpy_element_unordered_atomic: {
6676 auto &MI = cast<AnyMemCpyInst>(I);
6677 SDValue Dst = getValue(MI.getRawDest());
6678 SDValue Src = getValue(MI.getRawSource());
6679 SDValue Length = getValue(MI.getLength());
6680
6681 Type *LengthTy = MI.getLength()->getType();
6682 unsigned ElemSz = MI.getElementSizeInBytes();
6683 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6684 SDValue MC =
6685 DAG.getAtomicMemcpy(getRoot(), sdl, Dst, Src, Length, LengthTy, ElemSz,
6686 isTC, MachinePointerInfo(MI.getRawDest()),
6687 MachinePointerInfo(MI.getRawSource()));
6688 updateDAGForMaybeTailCall(MC);
6689 return;
6690 }
6691 case Intrinsic::memmove_element_unordered_atomic: {
6692 auto &MI = cast<AnyMemMoveInst>(I);
6693 SDValue Dst = getValue(MI.getRawDest());
6694 SDValue Src = getValue(MI.getRawSource());
6695 SDValue Length = getValue(MI.getLength());
6696
6697 Type *LengthTy = MI.getLength()->getType();
6698 unsigned ElemSz = MI.getElementSizeInBytes();
6699 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6700 SDValue MC =
6701 DAG.getAtomicMemmove(getRoot(), sdl, Dst, Src, Length, LengthTy, ElemSz,
6702 isTC, MachinePointerInfo(MI.getRawDest()),
6703 MachinePointerInfo(MI.getRawSource()));
6704 updateDAGForMaybeTailCall(MC);
6705 return;
6706 }
6707 case Intrinsic::memset_element_unordered_atomic: {
6708 auto &MI = cast<AnyMemSetInst>(I);
6709 SDValue Dst = getValue(MI.getRawDest());
6710 SDValue Val = getValue(MI.getValue());
6711 SDValue Length = getValue(MI.getLength());
6712
6713 Type *LengthTy = MI.getLength()->getType();
6714 unsigned ElemSz = MI.getElementSizeInBytes();
6715 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6716 SDValue MC =
6717 DAG.getAtomicMemset(getRoot(), sdl, Dst, Val, Length, LengthTy, ElemSz,
6718 isTC, MachinePointerInfo(MI.getRawDest()));
6719 updateDAGForMaybeTailCall(MC);
6720 return;
6721 }
6722 case Intrinsic::call_preallocated_setup: {
6723 const CallBase *PreallocatedCall = FindPreallocatedCall(&I);
6724 SDValue SrcValue = DAG.getSrcValue(PreallocatedCall);
6725 SDValue Res = DAG.getNode(ISD::PREALLOCATED_SETUP, sdl, MVT::Other,
6726 getRoot(), SrcValue);
6727 setValue(&I, Res);
6728 DAG.setRoot(Res);
6729 return;
6730 }
6731 case Intrinsic::call_preallocated_arg: {
6732 const CallBase *PreallocatedCall = FindPreallocatedCall(I.getOperand(0));
6733 SDValue SrcValue = DAG.getSrcValue(PreallocatedCall);
6734 SDValue Ops[3];
6735 Ops[0] = getRoot();
6736 Ops[1] = SrcValue;
6737 Ops[2] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(1)), sdl,
6738 MVT::i32); // arg index
6739 SDValue Res = DAG.getNode(
6740 ISD::PREALLOCATED_ARG, sdl,
6741 DAG.getVTList(TLI.getPointerTy(DAG.getDataLayout()), MVT::Other), Ops);
6742 setValue(&I, Res);
6743 DAG.setRoot(Res.getValue(1));
6744 return;
6745 }
6746
6747 case Intrinsic::eh_typeid_for: {
6748 // Find the type id for the given typeinfo.
6749 GlobalValue *GV = ExtractTypeInfo(I.getArgOperand(0));
6750 unsigned TypeID = DAG.getMachineFunction().getTypeIDFor(GV);
6751 Res = DAG.getConstant(TypeID, sdl, MVT::i32);
6752 setValue(&I, Res);
6753 return;
6754 }
6755
6756 case Intrinsic::eh_return_i32:
6757 case Intrinsic::eh_return_i64:
6758 DAG.getMachineFunction().setCallsEHReturn(true);
6759 DAG.setRoot(DAG.getNode(ISD::EH_RETURN, sdl,
6760 MVT::Other,
6762 getValue(I.getArgOperand(0)),
6763 getValue(I.getArgOperand(1))));
6764 return;
6765 case Intrinsic::eh_unwind_init:
6766 DAG.getMachineFunction().setCallsUnwindInit(true);
6767 return;
6768 case Intrinsic::eh_dwarf_cfa:
6769 setValue(&I, DAG.getNode(ISD::EH_DWARF_CFA, sdl,
6770 TLI.getPointerTy(DAG.getDataLayout()),
6771 getValue(I.getArgOperand(0))));
6772 return;
6773 case Intrinsic::eh_sjlj_callsite: {
6774 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(0));
6775 assert(FuncInfo.getCurrentCallSite() == 0 && "Overlapping call sites!");
6776
6777 FuncInfo.setCurrentCallSite(CI->getZExtValue());
6778 return;
6779 }
6780 case Intrinsic::eh_sjlj_functioncontext: {
6781 // Get and store the index of the function context.
6782 MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo();
6783 AllocaInst *FnCtx =
6784 cast<AllocaInst>(I.getArgOperand(0)->stripPointerCasts());
6785 int FI = FuncInfo.StaticAllocaMap[FnCtx];
6787 return;
6788 }
6789 case Intrinsic::eh_sjlj_setjmp: {
6790 SDValue Ops[2];
6791 Ops[0] = getRoot();
6792 Ops[1] = getValue(I.getArgOperand(0));
6793 SDValue Op = DAG.getNode(ISD::EH_SJLJ_SETJMP, sdl,
6794 DAG.getVTList(MVT::i32, MVT::Other), Ops);
6795 setValue(&I, Op.getValue(0));
6796 DAG.setRoot(Op.getValue(1));
6797 return;
6798 }
6799 case Intrinsic::eh_sjlj_longjmp:
6800 DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_LONGJMP, sdl, MVT::Other,
6801 getRoot(), getValue(I.getArgOperand(0))));
6802 return;
6803 case Intrinsic::eh_sjlj_setup_dispatch:
6804 DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_SETUP_DISPATCH, sdl, MVT::Other,
6805 getRoot()));
6806 return;
6807 case Intrinsic::masked_gather:
6808 visitMaskedGather(I);
6809 return;
6810 case Intrinsic::masked_load:
6811 visitMaskedLoad(I);
6812 return;
6813 case Intrinsic::masked_scatter:
6814 visitMaskedScatter(I);
6815 return;
6816 case Intrinsic::masked_store:
6817 visitMaskedStore(I);
6818 return;
6819 case Intrinsic::masked_expandload:
6820 visitMaskedLoad(I, true /* IsExpanding */);
6821 return;
6822 case Intrinsic::masked_compressstore:
6823 visitMaskedStore(I, true /* IsCompressing */);
6824 return;
6825 case Intrinsic::powi:
6826 setValue(&I, ExpandPowI(sdl, getValue(I.getArgOperand(0)),
6827 getValue(I.getArgOperand(1)), DAG));
6828 return;
6829 case Intrinsic::log:
6830 setValue(&I, expandLog(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6831 return;
6832 case Intrinsic::log2:
6833 setValue(&I,
6834 expandLog2(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6835 return;
6836 case Intrinsic::log10:
6837 setValue(&I,
6838 expandLog10(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6839 return;
6840 case Intrinsic::exp:
6841 setValue(&I, expandExp(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6842 return;
6843 case Intrinsic::exp2:
6844 setValue(&I,
6845 expandExp2(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
6846 return;
6847 case Intrinsic::pow:
6848 setValue(&I, expandPow(sdl, getValue(I.getArgOperand(0)),
6849 getValue(I.getArgOperand(1)), DAG, TLI, Flags));
6850 return;
6851 case Intrinsic::sqrt:
6852 case Intrinsic::fabs:
6853 case Intrinsic::sin:
6854 case Intrinsic::cos:
6855 case Intrinsic::tan:
6856 case Intrinsic::asin:
6857 case Intrinsic::acos:
6858 case Intrinsic::atan:
6859 case Intrinsic::sinh:
6860 case Intrinsic::cosh:
6861 case Intrinsic::tanh:
6862 case Intrinsic::exp10:
6863 case Intrinsic::floor:
6864 case Intrinsic::ceil:
6865 case Intrinsic::trunc:
6866 case Intrinsic::rint:
6867 case Intrinsic::nearbyint:
6868 case Intrinsic::round:
6869 case Intrinsic::roundeven:
6870 case Intrinsic::canonicalize: {
6871 unsigned Opcode;
6872 // clang-format off
6873 switch (Intrinsic) {
6874 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
6875 case Intrinsic::sqrt: Opcode = ISD::FSQRT; break;
6876 case Intrinsic::fabs: Opcode = ISD::FABS; break;
6877 case Intrinsic::sin: Opcode = ISD::FSIN; break;
6878 case Intrinsic::cos: Opcode = ISD::FCOS; break;
6879 case Intrinsic::tan: Opcode = ISD::FTAN; break;
6880 case Intrinsic::asin: Opcode = ISD::FASIN; break;
6881 case Intrinsic::acos: Opcode = ISD::FACOS; break;
6882 case Intrinsic::atan: Opcode = ISD::FATAN; break;
6883 case Intrinsic::sinh: Opcode = ISD::FSINH; break;
6884 case Intrinsic::cosh: Opcode = ISD::FCOSH; break;
6885 case Intrinsic::tanh: Opcode = ISD::FTANH; break;
6886 case Intrinsic::exp10: Opcode = ISD::FEXP10; break;
6887 case Intrinsic::floor: Opcode = ISD::FFLOOR; break;
6888 case Intrinsic::ceil: Opcode = ISD::FCEIL; break;
6889 case Intrinsic::trunc: Opcode = ISD::FTRUNC; break;
6890 case Intrinsic::rint: Opcode = ISD::FRINT; break;
6891 case Intrinsic::nearbyint: Opcode = ISD::FNEARBYINT; break;
6892 case Intrinsic::round: Opcode = ISD::FROUND; break;
6893 case Intrinsic::roundeven: Opcode = ISD::FROUNDEVEN; break;
6894 case Intrinsic::canonicalize: Opcode = ISD::FCANONICALIZE; break;
6895 }
6896 // clang-format on
6897
6898 setValue(&I, DAG.getNode(Opcode, sdl,
6899 getValue(I.getArgOperand(0)).getValueType(),
6900 getValue(I.getArgOperand(0)), Flags));
6901 return;
6902 }
6903 case Intrinsic::atan2:
6904 setValue(&I, DAG.getNode(ISD::FATAN2, sdl,
6905 getValue(I.getArgOperand(0)).getValueType(),
6906 getValue(I.getArgOperand(0)),
6907 getValue(I.getArgOperand(1)), Flags));
6908 return;
6909 case Intrinsic::lround:
6910 case Intrinsic::llround:
6911 case Intrinsic::lrint:
6912 case Intrinsic::llrint: {
6913 unsigned Opcode;
6914 // clang-format off
6915 switch (Intrinsic) {
6916 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
6917 case Intrinsic::lround: Opcode = ISD::LROUND; break;
6918 case Intrinsic::llround: Opcode = ISD::LLROUND; break;
6919 case Intrinsic::lrint: Opcode = ISD::LRINT; break;
6920 case Intrinsic::llrint: Opcode = ISD::LLRINT; break;
6921 }
6922 // clang-format on
6923
6924 EVT RetVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6925 setValue(&I, DAG.getNode(Opcode, sdl, RetVT,
6926 getValue(I.getArgOperand(0))));
6927 return;
6928 }
6929 case Intrinsic::minnum:
6930 setValue(&I, DAG.getNode(ISD::FMINNUM, sdl,
6931 getValue(I.getArgOperand(0)).getValueType(),
6932 getValue(I.getArgOperand(0)),
6933 getValue(I.getArgOperand(1)), Flags));
6934 return;
6935 case Intrinsic::maxnum:
6936 setValue(&I, DAG.getNode(ISD::FMAXNUM, sdl,
6937 getValue(I.getArgOperand(0)).getValueType(),
6938 getValue(I.getArgOperand(0)),
6939 getValue(I.getArgOperand(1)), Flags));
6940 return;
6941 case Intrinsic::minimum:
6942 setValue(&I, DAG.getNode(ISD::FMINIMUM, sdl,
6943 getValue(I.getArgOperand(0)).getValueType(),
6944 getValue(I.getArgOperand(0)),
6945 getValue(I.getArgOperand(1)), Flags));
6946 return;
6947 case Intrinsic::maximum:
6948 setValue(&I, DAG.getNode(ISD::FMAXIMUM, sdl,
6949 getValue(I.getArgOperand(0)).getValueType(),
6950 getValue(I.getArgOperand(0)),
6951 getValue(I.getArgOperand(1)), Flags));
6952 return;
6953 case Intrinsic::minimumnum:
6954 setValue(&I, DAG.getNode(ISD::FMINIMUMNUM, sdl,
6955 getValue(I.getArgOperand(0)).getValueType(),
6956 getValue(I.getArgOperand(0)),
6957 getValue(I.getArgOperand(1)), Flags));
6958 return;
6959 case Intrinsic::maximumnum:
6960 setValue(&I, DAG.getNode(ISD::FMAXIMUMNUM, sdl,
6961 getValue(I.getArgOperand(0)).getValueType(),
6962 getValue(I.getArgOperand(0)),
6963 getValue(I.getArgOperand(1)), Flags));
6964 return;
6965 case Intrinsic::copysign:
6966 setValue(&I, DAG.getNode(ISD::FCOPYSIGN, sdl,
6967 getValue(I.getArgOperand(0)).getValueType(),
6968 getValue(I.getArgOperand(0)),
6969 getValue(I.getArgOperand(1)), Flags));
6970 return;
6971 case Intrinsic::ldexp:
6972 setValue(&I, DAG.getNode(ISD::FLDEXP, sdl,
6973 getValue(I.getArgOperand(0)).getValueType(),
6974 getValue(I.getArgOperand(0)),
6975 getValue(I.getArgOperand(1)), Flags));
6976 return;
6977 case Intrinsic::modf:
6978 case Intrinsic::sincos:
6979 case Intrinsic::sincospi:
6980 case Intrinsic::frexp: {
6981 unsigned Opcode;
6982 switch (Intrinsic) {
6983 default:
6984 llvm_unreachable("unexpected intrinsic");
6985 case Intrinsic::sincos:
6986 Opcode = ISD::FSINCOS;
6987 break;
6988 case Intrinsic::sincospi:
6989 Opcode = ISD::FSINCOSPI;
6990 break;
6991 case Intrinsic::modf:
6992 Opcode = ISD::FMODF;
6993 break;
6994 case Intrinsic::frexp:
6995 Opcode = ISD::FFREXP;
6996 break;
6997 }
6998 SmallVector<EVT, 2> ValueVTs;
6999 ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);
7000 SDVTList VTs = DAG.getVTList(ValueVTs);
7001 setValue(
7002 &I, DAG.getNode(Opcode, sdl, VTs, getValue(I.getArgOperand(0)), Flags));
7003 return;
7004 }
7005 case Intrinsic::arithmetic_fence: {
7006 setValue(&I, DAG.getNode(ISD::ARITH_FENCE, sdl,
7007 getValue(I.getArgOperand(0)).getValueType(),
7008 getValue(I.getArgOperand(0)), Flags));
7009 return;
7010 }
7011 case Intrinsic::fma:
7012 setValue(&I, DAG.getNode(
7013 ISD::FMA, sdl, getValue(I.getArgOperand(0)).getValueType(),
7014 getValue(I.getArgOperand(0)), getValue(I.getArgOperand(1)),
7015 getValue(I.getArgOperand(2)), Flags));
7016 return;
7017#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
7018 case Intrinsic::INTRINSIC:
7019#include "llvm/IR/ConstrainedOps.def"
7020 visitConstrainedFPIntrinsic(cast<ConstrainedFPIntrinsic>(I));
7021 return;
7022#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID:
7023#include "llvm/IR/VPIntrinsics.def"
7024 visitVectorPredicationIntrinsic(cast<VPIntrinsic>(I));
7025 return;
7026 case Intrinsic::fptrunc_round: {
7027 // Get the last argument, the metadata and convert it to an integer in the
7028 // call
7029 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(1))->getMetadata();
7030 std::optional<RoundingMode> RoundMode =
7031 convertStrToRoundingMode(cast<MDString>(MD)->getString());
7032
7033 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7034
7035 // Propagate fast-math-flags from IR to node(s).
7036 SDNodeFlags Flags;
7037 Flags.copyFMF(*cast<FPMathOperator>(&I));
7038 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
7039
7041 Result = DAG.getNode(
7042 ISD::FPTRUNC_ROUND, sdl, VT, getValue(I.getArgOperand(0)),
7043 DAG.getTargetConstant((int)*RoundMode, sdl, MVT::i32));
7044 setValue(&I, Result);
7045
7046 return;
7047 }
7048 case Intrinsic::fmuladd: {
7049 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7050 if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
7051 TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), VT)) {
7052 setValue(&I, DAG.getNode(ISD::FMA, sdl,
7053 getValue(I.getArgOperand(0)).getValueType(),
7054 getValue(I.getArgOperand(0)),
7055 getValue(I.getArgOperand(1)),
7056 getValue(I.getArgOperand(2)), Flags));
7057 } else if (TLI.isOperationLegalOrCustom(ISD::FMULADD, VT)) {
7058 // TODO: Support splitting the vector.
7059 setValue(&I, DAG.getNode(ISD::FMULADD, sdl,
7060 getValue(I.getArgOperand(0)).getValueType(),
7061 getValue(I.getArgOperand(0)),
7062 getValue(I.getArgOperand(1)),
7063 getValue(I.getArgOperand(2)), Flags));
7064 } else {
7065 // TODO: Intrinsic calls should have fast-math-flags.
7066 SDValue Mul = DAG.getNode(
7067 ISD::FMUL, sdl, getValue(I.getArgOperand(0)).getValueType(),
7068 getValue(I.getArgOperand(0)), getValue(I.getArgOperand(1)), Flags);
7069 SDValue Add = DAG.getNode(ISD::FADD, sdl,
7070 getValue(I.getArgOperand(0)).getValueType(),
7071 Mul, getValue(I.getArgOperand(2)), Flags);
7072 setValue(&I, Add);
7073 }
7074 return;
7075 }
7076 case Intrinsic::convert_to_fp16:
7077 setValue(&I, DAG.getNode(ISD::BITCAST, sdl, MVT::i16,
7078 DAG.getNode(ISD::FP_ROUND, sdl, MVT::f16,
7079 getValue(I.getArgOperand(0)),
7080 DAG.getTargetConstant(0, sdl,
7081 MVT::i32))));
7082 return;
7083 case Intrinsic::convert_from_fp16:
7084 setValue(&I, DAG.getNode(ISD::FP_EXTEND, sdl,
7085 TLI.getValueType(DAG.getDataLayout(), I.getType()),
7086 DAG.getNode(ISD::BITCAST, sdl, MVT::f16,
7087 getValue(I.getArgOperand(0)))));
7088 return;
7089 case Intrinsic::fptosi_sat: {
7090 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7091 setValue(&I, DAG.getNode(ISD::FP_TO_SINT_SAT, sdl, VT,
7092 getValue(I.getArgOperand(0)),
7093 DAG.getValueType(VT.getScalarType())));
7094 return;
7095 }
7096 case Intrinsic::fptoui_sat: {
7097 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7098 setValue(&I, DAG.getNode(ISD::FP_TO_UINT_SAT, sdl, VT,
7099 getValue(I.getArgOperand(0)),
7100 DAG.getValueType(VT.getScalarType())));
7101 return;
7102 }
7103 case Intrinsic::set_rounding:
7104 Res = DAG.getNode(ISD::SET_ROUNDING, sdl, MVT::Other,
7105 {getRoot(), getValue(I.getArgOperand(0))});
7106 setValue(&I, Res);
7107 DAG.setRoot(Res.getValue(0));
7108 return;
7109 case Intrinsic::is_fpclass: {
7110 const DataLayout DLayout = DAG.getDataLayout();
7111 EVT DestVT = TLI.getValueType(DLayout, I.getType());
7112 EVT ArgVT = TLI.getValueType(DLayout, I.getArgOperand(0)->getType());
7113 FPClassTest Test = static_cast<FPClassTest>(
7114 cast<ConstantInt>(I.getArgOperand(1))->getZExtValue());
7115 MachineFunction &MF = DAG.getMachineFunction();
7116 const Function &F = MF.getFunction();
7117 SDValue Op = getValue(I.getArgOperand(0));
7118 SDNodeFlags Flags;
7119 Flags.setNoFPExcept(
7120 !F.getAttributes().hasFnAttr(llvm::Attribute::StrictFP));
7121 // If ISD::IS_FPCLASS should be expanded, do it right now, because the
7122 // expansion can use illegal types. Making expansion early allows
7123 // legalizing these types prior to selection.
7124 if (!TLI.isOperationLegal(ISD::IS_FPCLASS, ArgVT) &&
7125 !TLI.isOperationCustom(ISD::IS_FPCLASS, ArgVT)) {
7126 SDValue Result = TLI.expandIS_FPCLASS(DestVT, Op, Test, Flags, sdl, DAG);
7127 setValue(&I, Result);
7128 return;
7129 }
7130
7131 SDValue Check = DAG.getTargetConstant(Test, sdl, MVT::i32);
7132 SDValue V = DAG.getNode(ISD::IS_FPCLASS, sdl, DestVT, {Op, Check}, Flags);
7133 setValue(&I, V);
7134 return;
7135 }
7136 case Intrinsic::get_fpenv: {
7137 const DataLayout DLayout = DAG.getDataLayout();
7138 EVT EnvVT = TLI.getValueType(DLayout, I.getType());
7139 Align TempAlign = DAG.getEVTAlign(EnvVT);
7140 SDValue Chain = getRoot();
7141 // Use GET_FPENV if it is legal or custom. Otherwise use memory-based node
7142 // and temporary storage in stack.
7143 if (TLI.isOperationLegalOrCustom(ISD::GET_FPENV, EnvVT)) {
7144 Res = DAG.getNode(
7145 ISD::GET_FPENV, sdl,
7146 DAG.getVTList(TLI.getValueType(DAG.getDataLayout(), I.getType()),
7147 MVT::Other),
7148 Chain);
7149 } else {
7150 SDValue Temp = DAG.CreateStackTemporary(EnvVT, TempAlign.value());
7151 int SPFI = cast<FrameIndexSDNode>(Temp.getNode())->getIndex();
7152 auto MPI =
7153 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI);
7154 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
7156 TempAlign);
7157 Chain = DAG.getGetFPEnv(Chain, sdl, Temp, EnvVT, MMO);
7158 Res = DAG.getLoad(EnvVT, sdl, Chain, Temp, MPI);
7159 }
7160 setValue(&I, Res);
7161 DAG.setRoot(Res.getValue(1));
7162 return;
7163 }
7164 case Intrinsic::set_fpenv: {
7165 const DataLayout DLayout = DAG.getDataLayout();
7166 SDValue Env = getValue(I.getArgOperand(0));
7167 EVT EnvVT = Env.getValueType();
7168 Align TempAlign = DAG.getEVTAlign(EnvVT);
7169 SDValue Chain = getRoot();
7170 // If SET_FPENV is custom or legal, use it. Otherwise use loading
7171 // environment from memory.
7172 if (TLI.isOperationLegalOrCustom(ISD::SET_FPENV, EnvVT)) {
7173 Chain = DAG.getNode(ISD::SET_FPENV, sdl, MVT::Other, Chain, Env);
7174 } else {
7175 // Allocate space in stack, copy environment bits into it and use this
7176 // memory in SET_FPENV_MEM.
7177 SDValue Temp = DAG.CreateStackTemporary(EnvVT, TempAlign.value());
7178 int SPFI = cast<FrameIndexSDNode>(Temp.getNode())->getIndex();
7179 auto MPI =
7180 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI);
7181 Chain = DAG.getStore(Chain, sdl, Env, Temp, MPI, TempAlign,
7183 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
7185 TempAlign);
7186 Chain = DAG.getSetFPEnv(Chain, sdl, Temp, EnvVT, MMO);
7187 }
7188 DAG.setRoot(Chain);
7189 return;
7190 }
7191 case Intrinsic::reset_fpenv:
7192 DAG.setRoot(DAG.getNode(ISD::RESET_FPENV, sdl, MVT::Other, getRoot()));
7193 return;
7194 case Intrinsic::get_fpmode:
7195 Res = DAG.getNode(
7196 ISD::GET_FPMODE, sdl,
7197 DAG.getVTList(TLI.getValueType(DAG.getDataLayout(), I.getType()),
7198 MVT::Other),
7199 DAG.getRoot());
7200 setValue(&I, Res);
7201 DAG.setRoot(Res.getValue(1));
7202 return;
7203 case Intrinsic::set_fpmode:
7204 Res = DAG.getNode(ISD::SET_FPMODE, sdl, MVT::Other, {DAG.getRoot()},
7205 getValue(I.getArgOperand(0)));
7206 DAG.setRoot(Res);
7207 return;
7208 case Intrinsic::reset_fpmode: {
7209 Res = DAG.getNode(ISD::RESET_FPMODE, sdl, MVT::Other, getRoot());
7210 DAG.setRoot(Res);
7211 return;
7212 }
7213 case Intrinsic::pcmarker: {
7214 SDValue Tmp = getValue(I.getArgOperand(0));
7215 DAG.setRoot(DAG.getNode(ISD::PCMARKER, sdl, MVT::Other, getRoot(), Tmp));
7216 return;
7217 }
7218 case Intrinsic::readcyclecounter: {
7219 SDValue Op = getRoot();
7220 Res = DAG.getNode(ISD::READCYCLECOUNTER, sdl,
7221 DAG.getVTList(MVT::i64, MVT::Other), Op);
7222 setValue(&I, Res);
7223 DAG.setRoot(Res.getValue(1));
7224 return;
7225 }
7226 case Intrinsic::readsteadycounter: {
7227 SDValue Op = getRoot();
7228 Res = DAG.getNode(ISD::READSTEADYCOUNTER, sdl,
7229 DAG.getVTList(MVT::i64, MVT::Other), Op);
7230 setValue(&I, Res);
7231 DAG.setRoot(Res.getValue(1));
7232 return;
7233 }
7234 case Intrinsic::bitreverse:
7235 setValue(&I, DAG.getNode(ISD::BITREVERSE, sdl,
7236 getValue(I.getArgOperand(0)).getValueType(),
7237 getValue(I.getArgOperand(0))));
7238 return;
7239 case Intrinsic::bswap:
7240 setValue(&I, DAG.getNode(ISD::BSWAP, sdl,
7241 getValue(I.getArgOperand(0)).getValueType(),
7242 getValue(I.getArgOperand(0))));
7243 return;
7244 case Intrinsic::cttz: {
7245 SDValue Arg = getValue(I.getArgOperand(0));
7246 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
7247 EVT Ty = Arg.getValueType();
7248 setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTTZ : ISD::CTTZ_ZERO_UNDEF,
7249 sdl, Ty, Arg));
7250 return;
7251 }
7252 case Intrinsic::ctlz: {
7253 SDValue Arg = getValue(I.getArgOperand(0));
7254 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
7255 EVT Ty = Arg.getValueType();
7256 setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTLZ : ISD::CTLZ_ZERO_UNDEF,
7257 sdl, Ty, Arg));
7258 return;
7259 }
7260 case Intrinsic::ctpop: {
7261 SDValue Arg = getValue(I.getArgOperand(0));
7262 EVT Ty = Arg.getValueType();
7263 setValue(&I, DAG.getNode(ISD::CTPOP, sdl, Ty, Arg));
7264 return;
7265 }
7266 case Intrinsic::fshl:
7267 case Intrinsic::fshr: {
7268 bool IsFSHL = Intrinsic == Intrinsic::fshl;
7269 SDValue X = getValue(I.getArgOperand(0));
7270 SDValue Y = getValue(I.getArgOperand(1));
7271 SDValue Z = getValue(I.getArgOperand(2));
7272 EVT VT = X.getValueType();
7273
7274 if (X == Y) {
7275 auto RotateOpcode = IsFSHL ? ISD::ROTL : ISD::ROTR;
7276 setValue(&I, DAG.getNode(RotateOpcode, sdl, VT, X, Z));
7277 } else {
7278 auto FunnelOpcode = IsFSHL ? ISD::FSHL : ISD::FSHR;
7279 setValue(&I, DAG.getNode(FunnelOpcode, sdl, VT, X, Y, Z));
7280 }
7281 return;
7282 }
7283 case Intrinsic::sadd_sat: {
7284 SDValue Op1 = getValue(I.getArgOperand(0));
7285 SDValue Op2 = getValue(I.getArgOperand(1));
7286 setValue(&I, DAG.getNode(ISD::SADDSAT, sdl, Op1.getValueType(), Op1, Op2));
7287 return;
7288 }
7289 case Intrinsic::uadd_sat: {
7290 SDValue Op1 = getValue(I.getArgOperand(0));
7291 SDValue Op2 = getValue(I.getArgOperand(1));
7292 setValue(&I, DAG.getNode(ISD::UADDSAT, sdl, Op1.getValueType(), Op1, Op2));
7293 return;
7294 }
7295 case Intrinsic::ssub_sat: {
7296 SDValue Op1 = getValue(I.getArgOperand(0));
7297 SDValue Op2 = getValue(I.getArgOperand(1));
7298 setValue(&I, DAG.getNode(ISD::SSUBSAT, sdl, Op1.getValueType(), Op1, Op2));
7299 return;
7300 }
7301 case Intrinsic::usub_sat: {
7302 SDValue Op1 = getValue(I.getArgOperand(0));
7303 SDValue Op2 = getValue(I.getArgOperand(1));
7304 setValue(&I, DAG.getNode(ISD::USUBSAT, sdl, Op1.getValueType(), Op1, Op2));
7305 return;
7306 }
7307 case Intrinsic::sshl_sat: {
7308 SDValue Op1 = getValue(I.getArgOperand(0));
7309 SDValue Op2 = getValue(I.getArgOperand(1));
7310 setValue(&I, DAG.getNode(ISD::SSHLSAT, sdl, Op1.getValueType(), Op1, Op2));
7311 return;
7312 }
7313 case Intrinsic::ushl_sat: {
7314 SDValue Op1 = getValue(I.getArgOperand(0));
7315 SDValue Op2 = getValue(I.getArgOperand(1));
7316 setValue(&I, DAG.getNode(ISD::USHLSAT, sdl, Op1.getValueType(), Op1, Op2));
7317 return;
7318 }
7319 case Intrinsic::smul_fix:
7320 case Intrinsic::umul_fix:
7321 case Intrinsic::smul_fix_sat:
7322 case Intrinsic::umul_fix_sat: {
7323 SDValue Op1 = getValue(I.getArgOperand(0));
7324 SDValue Op2 = getValue(I.getArgOperand(1));
7325 SDValue Op3 = getValue(I.getArgOperand(2));
7326 setValue(&I, DAG.getNode(FixedPointIntrinsicToOpcode(Intrinsic), sdl,
7327 Op1.getValueType(), Op1, Op2, Op3));
7328 return;
7329 }
7330 case Intrinsic::sdiv_fix:
7331 case Intrinsic::udiv_fix:
7332 case Intrinsic::sdiv_fix_sat:
7333 case Intrinsic::udiv_fix_sat: {
7334 SDValue Op1 = getValue(I.getArgOperand(0));
7335 SDValue Op2 = getValue(I.getArgOperand(1));
7336 SDValue Op3 = getValue(I.getArgOperand(2));
7338 Op1, Op2, Op3, DAG, TLI));
7339 return;
7340 }
7341 case Intrinsic::smax: {
7342 SDValue Op1 = getValue(I.getArgOperand(0));
7343 SDValue Op2 = getValue(I.getArgOperand(1));
7344 setValue(&I, DAG.getNode(ISD::SMAX, sdl, Op1.getValueType(), Op1, Op2));
7345 return;
7346 }
7347 case Intrinsic::smin: {
7348 SDValue Op1 = getValue(I.getArgOperand(0));
7349 SDValue Op2 = getValue(I.getArgOperand(1));
7350 setValue(&I, DAG.getNode(ISD::SMIN, sdl, Op1.getValueType(), Op1, Op2));
7351 return;
7352 }
7353 case Intrinsic::umax: {
7354 SDValue Op1 = getValue(I.getArgOperand(0));
7355 SDValue Op2 = getValue(I.getArgOperand(1));
7356 setValue(&I, DAG.getNode(ISD::UMAX, sdl, Op1.getValueType(), Op1, Op2));
7357 return;
7358 }
7359 case Intrinsic::umin: {
7360 SDValue Op1 = getValue(I.getArgOperand(0));
7361 SDValue Op2 = getValue(I.getArgOperand(1));
7362 setValue(&I, DAG.getNode(ISD::UMIN, sdl, Op1.getValueType(), Op1, Op2));
7363 return;
7364 }
7365 case Intrinsic::abs: {
7366 // TODO: Preserve "int min is poison" arg in SDAG?
7367 SDValue Op1 = getValue(I.getArgOperand(0));
7368 setValue(&I, DAG.getNode(ISD::ABS, sdl, Op1.getValueType(), Op1));
7369 return;
7370 }
7371 case Intrinsic::scmp: {
7372 SDValue Op1 = getValue(I.getArgOperand(0));
7373 SDValue Op2 = getValue(I.getArgOperand(1));
7374 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7375 setValue(&I, DAG.getNode(ISD::SCMP, sdl, DestVT, Op1, Op2));
7376 break;
7377 }
7378 case Intrinsic::ucmp: {
7379 SDValue Op1 = getValue(I.getArgOperand(0));
7380 SDValue Op2 = getValue(I.getArgOperand(1));
7381 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7382 setValue(&I, DAG.getNode(ISD::UCMP, sdl, DestVT, Op1, Op2));
7383 break;
7384 }
7385 case Intrinsic::stacksave: {
7386 SDValue Op = getRoot();
7387 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7388 Res = DAG.getNode(ISD::STACKSAVE, sdl, DAG.getVTList(VT, MVT::Other), Op);
7389 setValue(&I, Res);
7390 DAG.setRoot(Res.getValue(1));
7391 return;
7392 }
7393 case Intrinsic::stackrestore:
7394 Res = getValue(I.getArgOperand(0));
7395 DAG.setRoot(DAG.getNode(ISD::STACKRESTORE, sdl, MVT::Other, getRoot(), Res));
7396 return;
7397 case Intrinsic::get_dynamic_area_offset: {
7398 SDValue Op = getRoot();
7399 EVT ResTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
7400 Res = DAG.getNode(ISD::GET_DYNAMIC_AREA_OFFSET, sdl, DAG.getVTList(ResTy),
7401 Op);
7402 DAG.setRoot(Op);
7403 setValue(&I, Res);
7404 return;
7405 }
7406 case Intrinsic::stackguard: {
7407 MachineFunction &MF = DAG.getMachineFunction();
7408 const Module &M = *MF.getFunction().getParent();
7409 EVT PtrTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
7410 SDValue Chain = getRoot();
7411 if (TLI.useLoadStackGuardNode(M)) {
7412 Res = getLoadStackGuard(DAG, sdl, Chain);
7413 Res = DAG.getPtrExtOrTrunc(Res, sdl, PtrTy);
7414 } else {
7415 const Value *Global = TLI.getSDagStackGuard(M);
7416 if (!Global) {
7417 LLVMContext &Ctx = *DAG.getContext();
7418 Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
7419 setValue(&I, DAG.getPOISON(PtrTy));
7420 return;
7421 }
7422
7423 Align Align = DAG.getDataLayout().getPrefTypeAlign(Global->getType());
7424 Res = DAG.getLoad(PtrTy, sdl, Chain, getValue(Global),
7425 MachinePointerInfo(Global, 0), Align,
7427 }
7428 if (TLI.useStackGuardXorFP())
7429 Res = TLI.emitStackGuardXorFP(DAG, Res, sdl);
7430 DAG.setRoot(Chain);
7431 setValue(&I, Res);
7432 return;
7433 }
7434 case Intrinsic::stackprotector: {
7435 // Emit code into the DAG to store the stack guard onto the stack.
7436 MachineFunction &MF = DAG.getMachineFunction();
7437 MachineFrameInfo &MFI = MF.getFrameInfo();
7438 const Module &M = *MF.getFunction().getParent();
7439 SDValue Src, Chain = getRoot();
7440
7441 if (TLI.useLoadStackGuardNode(M))
7442 Src = getLoadStackGuard(DAG, sdl, Chain);
7443 else
7444 Src = getValue(I.getArgOperand(0)); // The guard's value.
7445
7446 AllocaInst *Slot = cast<AllocaInst>(I.getArgOperand(1));
7447
7448 int FI = FuncInfo.StaticAllocaMap[Slot];
7449 MFI.setStackProtectorIndex(FI);
7450 EVT PtrTy = TLI.getFrameIndexTy(DAG.getDataLayout());
7451
7452 SDValue FIN = DAG.getFrameIndex(FI, PtrTy);
7453
7454 // Store the stack protector onto the stack.
7455 Res = DAG.getStore(
7456 Chain, sdl, Src, FIN,
7457 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI),
7458 MaybeAlign(), MachineMemOperand::MOVolatile);
7459 setValue(&I, Res);
7460 DAG.setRoot(Res);
7461 return;
7462 }
7463 case Intrinsic::objectsize:
7464 llvm_unreachable("llvm.objectsize.* should have been lowered already");
7465
7466 case Intrinsic::is_constant:
7467 llvm_unreachable("llvm.is.constant.* should have been lowered already");
7468
7469 case Intrinsic::annotation:
7470 case Intrinsic::ptr_annotation:
7471 case Intrinsic::launder_invariant_group:
7472 case Intrinsic::strip_invariant_group:
7473 // Drop the intrinsic, but forward the value
7474 setValue(&I, getValue(I.getOperand(0)));
7475 return;
7476
7477 case Intrinsic::type_test:
7478 case Intrinsic::public_type_test:
7479 setValue(&I, getValue(ConstantInt::getTrue(I.getType())));
7480 return;
7481
7482 case Intrinsic::assume:
7483 case Intrinsic::experimental_noalias_scope_decl:
7484 case Intrinsic::var_annotation:
7485 case Intrinsic::sideeffect:
7486 // Discard annotate attributes, noalias scope declarations, assumptions, and
7487 // artificial side-effects.
7488 return;
7489
7490 case Intrinsic::codeview_annotation: {
7491 // Emit a label associated with this metadata.
7492 MachineFunction &MF = DAG.getMachineFunction();
7493 MCSymbol *Label = MF.getContext().createTempSymbol("annotation", true);
7494 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(0))->getMetadata();
7495 MF.addCodeViewAnnotation(Label, cast<MDNode>(MD));
7496 Res = DAG.getLabelNode(ISD::ANNOTATION_LABEL, sdl, getRoot(), Label);
7497 DAG.setRoot(Res);
7498 return;
7499 }
7500
7501 case Intrinsic::init_trampoline: {
7502 const Function *F = cast<Function>(I.getArgOperand(1)->stripPointerCasts());
7503
7504 SDValue Ops[6];
7505 Ops[0] = getRoot();
7506 Ops[1] = getValue(I.getArgOperand(0));
7507 Ops[2] = getValue(I.getArgOperand(1));
7508 Ops[3] = getValue(I.getArgOperand(2));
7509 Ops[4] = DAG.getSrcValue(I.getArgOperand(0));
7510 Ops[5] = DAG.getSrcValue(F);
7511
7512 Res = DAG.getNode(ISD::INIT_TRAMPOLINE, sdl, MVT::Other, Ops);
7513
7514 DAG.setRoot(Res);
7515 return;
7516 }
7517 case Intrinsic::adjust_trampoline:
7518 setValue(&I, DAG.getNode(ISD::ADJUST_TRAMPOLINE, sdl,
7519 TLI.getPointerTy(DAG.getDataLayout()),
7520 getValue(I.getArgOperand(0))));
7521 return;
7522 case Intrinsic::gcroot: {
7523 assert(DAG.getMachineFunction().getFunction().hasGC() &&
7524 "only valid in functions with gc specified, enforced by Verifier");
7525 assert(GFI && "implied by previous");
7526 const Value *Alloca = I.getArgOperand(0)->stripPointerCasts();
7527 const Constant *TypeMap = cast<Constant>(I.getArgOperand(1));
7528
7529 FrameIndexSDNode *FI = cast<FrameIndexSDNode>(getValue(Alloca).getNode());
7530 GFI->addStackRoot(FI->getIndex(), TypeMap);
7531 return;
7532 }
7533 case Intrinsic::gcread:
7534 case Intrinsic::gcwrite:
7535 llvm_unreachable("GC failed to lower gcread/gcwrite intrinsics!");
7536 case Intrinsic::get_rounding:
7537 Res = DAG.getNode(ISD::GET_ROUNDING, sdl, {MVT::i32, MVT::Other}, getRoot());
7538 setValue(&I, Res);
7539 DAG.setRoot(Res.getValue(1));
7540 return;
7541
7542 case Intrinsic::expect:
7543 case Intrinsic::expect_with_probability:
7544 // Just replace __builtin_expect(exp, c) and
7545 // __builtin_expect_with_probability(exp, c, p) with EXP.
7546 setValue(&I, getValue(I.getArgOperand(0)));
7547 return;
7548
7549 case Intrinsic::ubsantrap:
7550 case Intrinsic::debugtrap:
7551 case Intrinsic::trap: {
7552 StringRef TrapFuncName =
7553 I.getAttributes().getFnAttr("trap-func-name").getValueAsString();
7554 if (TrapFuncName.empty()) {
7555 switch (Intrinsic) {
7556 case Intrinsic::trap:
7557 DAG.setRoot(DAG.getNode(ISD::TRAP, sdl, MVT::Other, getRoot()));
7558 break;
7559 case Intrinsic::debugtrap:
7560 DAG.setRoot(DAG.getNode(ISD::DEBUGTRAP, sdl, MVT::Other, getRoot()));
7561 break;
7562 case Intrinsic::ubsantrap:
7563 DAG.setRoot(DAG.getNode(
7564 ISD::UBSANTRAP, sdl, MVT::Other, getRoot(),
7565 DAG.getTargetConstant(
7566 cast<ConstantInt>(I.getArgOperand(0))->getZExtValue(), sdl,
7567 MVT::i32)));
7568 break;
7569 default: llvm_unreachable("unknown trap intrinsic");
7570 }
7571 DAG.addNoMergeSiteInfo(DAG.getRoot().getNode(),
7572 I.hasFnAttr(Attribute::NoMerge));
7573 return;
7574 }
7576 if (Intrinsic == Intrinsic::ubsantrap) {
7577 Value *Arg = I.getArgOperand(0);
7578 Args.emplace_back(Arg, getValue(Arg));
7579 }
7580
7581 TargetLowering::CallLoweringInfo CLI(DAG);
7582 CLI.setDebugLoc(sdl).setChain(getRoot()).setLibCallee(
7583 CallingConv::C, I.getType(),
7584 DAG.getExternalSymbol(TrapFuncName.data(),
7585 TLI.getPointerTy(DAG.getDataLayout())),
7586 std::move(Args));
7587 CLI.NoMerge = I.hasFnAttr(Attribute::NoMerge);
7588 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
7589 DAG.setRoot(Result.second);
7590 return;
7591 }
7592
7593 case Intrinsic::allow_runtime_check:
7594 case Intrinsic::allow_ubsan_check:
7595 setValue(&I, getValue(ConstantInt::getTrue(I.getType())));
7596 return;
7597
7598 case Intrinsic::uadd_with_overflow:
7599 case Intrinsic::sadd_with_overflow:
7600 case Intrinsic::usub_with_overflow:
7601 case Intrinsic::ssub_with_overflow:
7602 case Intrinsic::umul_with_overflow:
7603 case Intrinsic::smul_with_overflow: {
7605 switch (Intrinsic) {
7606 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
7607 case Intrinsic::uadd_with_overflow: Op = ISD::UADDO; break;
7608 case Intrinsic::sadd_with_overflow: Op = ISD::SADDO; break;
7609 case Intrinsic::usub_with_overflow: Op = ISD::USUBO; break;
7610 case Intrinsic::ssub_with_overflow: Op = ISD::SSUBO; break;
7611 case Intrinsic::umul_with_overflow: Op = ISD::UMULO; break;
7612 case Intrinsic::smul_with_overflow: Op = ISD::SMULO; break;
7613 }
7614 SDValue Op1 = getValue(I.getArgOperand(0));
7615 SDValue Op2 = getValue(I.getArgOperand(1));
7616
7617 EVT ResultVT = Op1.getValueType();
7618 EVT OverflowVT = MVT::i1;
7619 if (ResultVT.isVector())
7620 OverflowVT = EVT::getVectorVT(
7621 *Context, OverflowVT, ResultVT.getVectorElementCount());
7622
7623 SDVTList VTs = DAG.getVTList(ResultVT, OverflowVT);
7624 setValue(&I, DAG.getNode(Op, sdl, VTs, Op1, Op2));
7625 return;
7626 }
7627 case Intrinsic::prefetch: {
7628 SDValue Ops[5];
7629 unsigned rw = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
7631 Ops[0] = DAG.getRoot();
7632 Ops[1] = getValue(I.getArgOperand(0));
7633 Ops[2] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(1)), sdl,
7634 MVT::i32);
7635 Ops[3] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(2)), sdl,
7636 MVT::i32);
7637 Ops[4] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(3)), sdl,
7638 MVT::i32);
7639 SDValue Result = DAG.getMemIntrinsicNode(
7640 ISD::PREFETCH, sdl, DAG.getVTList(MVT::Other), Ops,
7641 EVT::getIntegerVT(*Context, 8), MachinePointerInfo(I.getArgOperand(0)),
7642 /* align */ std::nullopt, Flags);
7643
7644 // Chain the prefetch in parallel with any pending loads, to stay out of
7645 // the way of later optimizations.
7646 PendingLoads.push_back(Result);
7647 Result = getRoot();
7648 DAG.setRoot(Result);
7649 return;
7650 }
7651 case Intrinsic::lifetime_start:
7652 case Intrinsic::lifetime_end: {
7653 bool IsStart = (Intrinsic == Intrinsic::lifetime_start);
7654 // Stack coloring is not enabled in O0, discard region information.
7655 if (TM.getOptLevel() == CodeGenOptLevel::None)
7656 return;
7657
7658 const AllocaInst *LifetimeObject = dyn_cast<AllocaInst>(I.getArgOperand(0));
7659 if (!LifetimeObject)
7660 return;
7661
7662 // First check that the Alloca is static, otherwise it won't have a
7663 // valid frame index.
7664 auto SI = FuncInfo.StaticAllocaMap.find(LifetimeObject);
7665 if (SI == FuncInfo.StaticAllocaMap.end())
7666 return;
7667
7668 const int FrameIndex = SI->second;
7669 Res = DAG.getLifetimeNode(IsStart, sdl, getRoot(), FrameIndex);
7670 DAG.setRoot(Res);
7671 return;
7672 }
7673 case Intrinsic::pseudoprobe: {
7674 auto Guid = cast<ConstantInt>(I.getArgOperand(0))->getZExtValue();
7675 auto Index = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
7676 auto Attr = cast<ConstantInt>(I.getArgOperand(2))->getZExtValue();
7677 Res = DAG.getPseudoProbeNode(sdl, getRoot(), Guid, Index, Attr);
7678 DAG.setRoot(Res);
7679 return;
7680 }
7681 case Intrinsic::invariant_start:
7682 // Discard region information.
7683 setValue(&I,
7684 DAG.getUNDEF(TLI.getValueType(DAG.getDataLayout(), I.getType())));
7685 return;
7686 case Intrinsic::invariant_end:
7687 // Discard region information.
7688 return;
7689 case Intrinsic::clear_cache: {
7690 SDValue InputChain = DAG.getRoot();
7691 SDValue StartVal = getValue(I.getArgOperand(0));
7692 SDValue EndVal = getValue(I.getArgOperand(1));
7693 Res = DAG.getNode(ISD::CLEAR_CACHE, sdl, DAG.getVTList(MVT::Other),
7694 {InputChain, StartVal, EndVal});
7695 setValue(&I, Res);
7696 DAG.setRoot(Res);
7697 return;
7698 }
7699 case Intrinsic::donothing:
7700 case Intrinsic::seh_try_begin:
7701 case Intrinsic::seh_scope_begin:
7702 case Intrinsic::seh_try_end:
7703 case Intrinsic::seh_scope_end:
7704 // ignore
7705 return;
7706 case Intrinsic::experimental_stackmap:
7707 visitStackmap(I);
7708 return;
7709 case Intrinsic::experimental_patchpoint_void:
7710 case Intrinsic::experimental_patchpoint:
7711 visitPatchpoint(I);
7712 return;
7713 case Intrinsic::experimental_gc_statepoint:
7715 return;
7716 case Intrinsic::experimental_gc_result:
7717 visitGCResult(cast<GCResultInst>(I));
7718 return;
7719 case Intrinsic::experimental_gc_relocate:
7720 visitGCRelocate(cast<GCRelocateInst>(I));
7721 return;
7722 case Intrinsic::instrprof_cover:
7723 llvm_unreachable("instrprof failed to lower a cover");
7724 case Intrinsic::instrprof_increment:
7725 llvm_unreachable("instrprof failed to lower an increment");
7726 case Intrinsic::instrprof_timestamp:
7727 llvm_unreachable("instrprof failed to lower a timestamp");
7728 case Intrinsic::instrprof_value_profile:
7729 llvm_unreachable("instrprof failed to lower a value profiling call");
7730 case Intrinsic::instrprof_mcdc_parameters:
7731 llvm_unreachable("instrprof failed to lower mcdc parameters");
7732 case Intrinsic::instrprof_mcdc_tvbitmap_update:
7733 llvm_unreachable("instrprof failed to lower an mcdc tvbitmap update");
7734 case Intrinsic::localescape: {
7735 MachineFunction &MF = DAG.getMachineFunction();
7736 const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo();
7737
7738 // Directly emit some LOCAL_ESCAPE machine instrs. Label assignment emission
7739 // is the same on all targets.
7740 for (unsigned Idx = 0, E = I.arg_size(); Idx < E; ++Idx) {
7741 Value *Arg = I.getArgOperand(Idx)->stripPointerCasts();
7742 if (isa<ConstantPointerNull>(Arg))
7743 continue; // Skip null pointers. They represent a hole in index space.
7744 AllocaInst *Slot = cast<AllocaInst>(Arg);
7745 assert(FuncInfo.StaticAllocaMap.count(Slot) &&
7746 "can only escape static allocas");
7747 int FI = FuncInfo.StaticAllocaMap[Slot];
7748 MCSymbol *FrameAllocSym = MF.getContext().getOrCreateFrameAllocSymbol(
7750 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, dl,
7751 TII->get(TargetOpcode::LOCAL_ESCAPE))
7752 .addSym(FrameAllocSym)
7753 .addFrameIndex(FI);
7754 }
7755
7756 return;
7757 }
7758
7759 case Intrinsic::localrecover: {
7760 // i8* @llvm.localrecover(i8* %fn, i8* %fp, i32 %idx)
7761 MachineFunction &MF = DAG.getMachineFunction();
7762
7763 // Get the symbol that defines the frame offset.
7764 auto *Fn = cast<Function>(I.getArgOperand(0)->stripPointerCasts());
7765 auto *Idx = cast<ConstantInt>(I.getArgOperand(2));
7766 unsigned IdxVal =
7767 unsigned(Idx->getLimitedValue(std::numeric_limits<int>::max()));
7768 MCSymbol *FrameAllocSym = MF.getContext().getOrCreateFrameAllocSymbol(
7770
7771 Value *FP = I.getArgOperand(1);
7772 SDValue FPVal = getValue(FP);
7773 EVT PtrVT = FPVal.getValueType();
7774
7775 // Create a MCSymbol for the label to avoid any target lowering
7776 // that would make this PC relative.
7777 SDValue OffsetSym = DAG.getMCSymbol(FrameAllocSym, PtrVT);
7778 SDValue OffsetVal =
7779 DAG.getNode(ISD::LOCAL_RECOVER, sdl, PtrVT, OffsetSym);
7780
7781 // Add the offset to the FP.
7782 SDValue Add = DAG.getMemBasePlusOffset(FPVal, OffsetVal, sdl);
7783 setValue(&I, Add);
7784
7785 return;
7786 }
7787
7788 case Intrinsic::fake_use: {
7789 Value *V = I.getArgOperand(0);
7790 SDValue Ops[2];
7791 // For Values not declared or previously used in this basic block, the
7792 // NodeMap will not have an entry, and `getValue` will assert if V has no
7793 // valid register value.
7794 auto FakeUseValue = [&]() -> SDValue {
7795 SDValue &N = NodeMap[V];
7796 if (N.getNode())
7797 return N;
7798
7799 // If there's a virtual register allocated and initialized for this
7800 // value, use it.
7801 if (SDValue copyFromReg = getCopyFromRegs(V, V->getType()))
7802 return copyFromReg;
7803 // FIXME: Do we want to preserve constants? It seems pointless.
7804 if (isa<Constant>(V))
7805 return getValue(V);
7806 return SDValue();
7807 }();
7808 if (!FakeUseValue || FakeUseValue.isUndef())
7809 return;
7810 Ops[0] = getRoot();
7811 Ops[1] = FakeUseValue;
7812 // Also, do not translate a fake use with an undef operand, or any other
7813 // empty SDValues.
7814 if (!Ops[1] || Ops[1].isUndef())
7815 return;
7816 DAG.setRoot(DAG.getNode(ISD::FAKE_USE, sdl, MVT::Other, Ops));
7817 return;
7818 }
7819
7820 case Intrinsic::reloc_none: {
7821 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(0))->getMetadata();
7822 StringRef SymbolName = cast<MDString>(MD)->getString();
7823 SDValue Ops[2] = {
7824 getRoot(),
7825 DAG.getTargetExternalSymbol(
7826 SymbolName.data(), TLI.getProgramPointerTy(DAG.getDataLayout()))};
7827 DAG.setRoot(DAG.getNode(ISD::RELOC_NONE, sdl, MVT::Other, Ops));
7828 return;
7829 }
7830
7831 case Intrinsic::eh_exceptionpointer:
7832 case Intrinsic::eh_exceptioncode: {
7833 // Get the exception pointer vreg, copy from it, and resize it to fit.
7834 const auto *CPI = cast<CatchPadInst>(I.getArgOperand(0));
7835 MVT PtrVT = TLI.getPointerTy(DAG.getDataLayout());
7836 const TargetRegisterClass *PtrRC = TLI.getRegClassFor(PtrVT);
7837 Register VReg = FuncInfo.getCatchPadExceptionPointerVReg(CPI, PtrRC);
7838 SDValue N = DAG.getCopyFromReg(DAG.getEntryNode(), sdl, VReg, PtrVT);
7839 if (Intrinsic == Intrinsic::eh_exceptioncode)
7840 N = DAG.getZExtOrTrunc(N, sdl, MVT::i32);
7841 setValue(&I, N);
7842 return;
7843 }
7844 case Intrinsic::xray_customevent: {
7845 // Here we want to make sure that the intrinsic behaves as if it has a
7846 // specific calling convention.
7847 const auto &Triple = DAG.getTarget().getTargetTriple();
7848 if (!Triple.isAArch64(64) && Triple.getArch() != Triple::x86_64)
7849 return;
7850
7852
7853 // We want to say that we always want the arguments in registers.
7854 SDValue LogEntryVal = getValue(I.getArgOperand(0));
7855 SDValue StrSizeVal = getValue(I.getArgOperand(1));
7856 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
7857 SDValue Chain = getRoot();
7858 Ops.push_back(LogEntryVal);
7859 Ops.push_back(StrSizeVal);
7860 Ops.push_back(Chain);
7861
7862 // We need to enforce the calling convention for the callsite, so that
7863 // argument ordering is enforced correctly, and that register allocation can
7864 // see that some registers may be assumed clobbered and have to preserve
7865 // them across calls to the intrinsic.
7866 MachineSDNode *MN = DAG.getMachineNode(TargetOpcode::PATCHABLE_EVENT_CALL,
7867 sdl, NodeTys, Ops);
7868 SDValue patchableNode = SDValue(MN, 0);
7869 DAG.setRoot(patchableNode);
7870 setValue(&I, patchableNode);
7871 return;
7872 }
7873 case Intrinsic::xray_typedevent: {
7874 // Here we want to make sure that the intrinsic behaves as if it has a
7875 // specific calling convention.
7876 const auto &Triple = DAG.getTarget().getTargetTriple();
7877 if (!Triple.isAArch64(64) && Triple.getArch() != Triple::x86_64)
7878 return;
7879
7881
7882 // We want to say that we always want the arguments in registers.
7883 // It's unclear to me how manipulating the selection DAG here forces callers
7884 // to provide arguments in registers instead of on the stack.
7885 SDValue LogTypeId = getValue(I.getArgOperand(0));
7886 SDValue LogEntryVal = getValue(I.getArgOperand(1));
7887 SDValue StrSizeVal = getValue(I.getArgOperand(2));
7888 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
7889 SDValue Chain = getRoot();
7890 Ops.push_back(LogTypeId);
7891 Ops.push_back(LogEntryVal);
7892 Ops.push_back(StrSizeVal);
7893 Ops.push_back(Chain);
7894
7895 // We need to enforce the calling convention for the callsite, so that
7896 // argument ordering is enforced correctly, and that register allocation can
7897 // see that some registers may be assumed clobbered and have to preserve
7898 // them across calls to the intrinsic.
7899 MachineSDNode *MN = DAG.getMachineNode(
7900 TargetOpcode::PATCHABLE_TYPED_EVENT_CALL, sdl, NodeTys, Ops);
7901 SDValue patchableNode = SDValue(MN, 0);
7902 DAG.setRoot(patchableNode);
7903 setValue(&I, patchableNode);
7904 return;
7905 }
7906 case Intrinsic::experimental_deoptimize:
7908 return;
7909 case Intrinsic::stepvector:
7910 visitStepVector(I);
7911 return;
7912 case Intrinsic::vector_reduce_fadd:
7913 case Intrinsic::vector_reduce_fmul:
7914 case Intrinsic::vector_reduce_add:
7915 case Intrinsic::vector_reduce_mul:
7916 case Intrinsic::vector_reduce_and:
7917 case Intrinsic::vector_reduce_or:
7918 case Intrinsic::vector_reduce_xor:
7919 case Intrinsic::vector_reduce_smax:
7920 case Intrinsic::vector_reduce_smin:
7921 case Intrinsic::vector_reduce_umax:
7922 case Intrinsic::vector_reduce_umin:
7923 case Intrinsic::vector_reduce_fmax:
7924 case Intrinsic::vector_reduce_fmin:
7925 case Intrinsic::vector_reduce_fmaximum:
7926 case Intrinsic::vector_reduce_fminimum:
7927 visitVectorReduce(I, Intrinsic);
7928 return;
7929
7930 case Intrinsic::icall_branch_funnel: {
7932 Ops.push_back(getValue(I.getArgOperand(0)));
7933
7934 int64_t Offset;
7936 I.getArgOperand(1), Offset, DAG.getDataLayout()));
7937 if (!Base)
7939 "llvm.icall.branch.funnel operand must be a GlobalValue");
7940 Ops.push_back(DAG.getTargetGlobalAddress(Base, sdl, MVT::i64, 0));
7941
7942 struct BranchFunnelTarget {
7943 int64_t Offset;
7945 };
7947
7948 for (unsigned Op = 1, N = I.arg_size(); Op != N; Op += 2) {
7950 I.getArgOperand(Op), Offset, DAG.getDataLayout()));
7951 if (ElemBase != Base)
7952 report_fatal_error("all llvm.icall.branch.funnel operands must refer "
7953 "to the same GlobalValue");
7954
7955 SDValue Val = getValue(I.getArgOperand(Op + 1));
7956 auto *GA = dyn_cast<GlobalAddressSDNode>(Val);
7957 if (!GA)
7959 "llvm.icall.branch.funnel operand must be a GlobalValue");
7960 Targets.push_back({Offset, DAG.getTargetGlobalAddress(
7961 GA->getGlobal(), sdl, Val.getValueType(),
7962 GA->getOffset())});
7963 }
7964 llvm::sort(Targets,
7965 [](const BranchFunnelTarget &T1, const BranchFunnelTarget &T2) {
7966 return T1.Offset < T2.Offset;
7967 });
7968
7969 for (auto &T : Targets) {
7970 Ops.push_back(DAG.getTargetConstant(T.Offset, sdl, MVT::i32));
7971 Ops.push_back(T.Target);
7972 }
7973
7974 Ops.push_back(DAG.getRoot()); // Chain
7975 SDValue N(DAG.getMachineNode(TargetOpcode::ICALL_BRANCH_FUNNEL, sdl,
7976 MVT::Other, Ops),
7977 0);
7978 DAG.setRoot(N);
7979 setValue(&I, N);
7980 HasTailCall = true;
7981 return;
7982 }
7983
7984 case Intrinsic::wasm_landingpad_index:
7985 // Information this intrinsic contained has been transferred to
7986 // MachineFunction in SelectionDAGISel::PrepareEHLandingPad. We can safely
7987 // delete it now.
7988 return;
7989
7990 case Intrinsic::aarch64_settag:
7991 case Intrinsic::aarch64_settag_zero: {
7992 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
7993 bool ZeroMemory = Intrinsic == Intrinsic::aarch64_settag_zero;
7995 DAG, sdl, getRoot(), getValue(I.getArgOperand(0)),
7996 getValue(I.getArgOperand(1)), MachinePointerInfo(I.getArgOperand(0)),
7997 ZeroMemory);
7998 DAG.setRoot(Val);
7999 setValue(&I, Val);
8000 return;
8001 }
8002 case Intrinsic::amdgcn_cs_chain: {
8003 // At this point we don't care if it's amdgpu_cs_chain or
8004 // amdgpu_cs_chain_preserve.
8006
8007 Type *RetTy = I.getType();
8008 assert(RetTy->isVoidTy() && "Should not return");
8009
8010 SDValue Callee = getValue(I.getOperand(0));
8011
8012 // We only have 2 actual args: one for the SGPRs and one for the VGPRs.
8013 // We'll also tack the value of the EXEC mask at the end.
8015 Args.reserve(3);
8016
8017 for (unsigned Idx : {2, 3, 1}) {
8018 TargetLowering::ArgListEntry Arg(getValue(I.getOperand(Idx)),
8019 I.getOperand(Idx)->getType());
8020 Arg.setAttributes(&I, Idx);
8021 Args.push_back(Arg);
8022 }
8023
8024 assert(Args[0].IsInReg && "SGPR args should be marked inreg");
8025 assert(!Args[1].IsInReg && "VGPR args should not be marked inreg");
8026 Args[2].IsInReg = true; // EXEC should be inreg
8027
8028 // Forward the flags and any additional arguments.
8029 for (unsigned Idx = 4; Idx < I.arg_size(); ++Idx) {
8030 TargetLowering::ArgListEntry Arg(getValue(I.getOperand(Idx)),
8031 I.getOperand(Idx)->getType());
8032 Arg.setAttributes(&I, Idx);
8033 Args.push_back(Arg);
8034 }
8035
8036 TargetLowering::CallLoweringInfo CLI(DAG);
8037 CLI.setDebugLoc(getCurSDLoc())
8038 .setChain(getRoot())
8039 .setCallee(CC, RetTy, Callee, std::move(Args))
8040 .setNoReturn(true)
8041 .setTailCall(true)
8042 .setConvergent(I.isConvergent());
8043 CLI.CB = &I;
8044 std::pair<SDValue, SDValue> Result =
8045 lowerInvokable(CLI, /*EHPadBB*/ nullptr);
8046 (void)Result;
8047 assert(!Result.first.getNode() && !Result.second.getNode() &&
8048 "Should've lowered as tail call");
8049
8050 HasTailCall = true;
8051 return;
8052 }
8053 case Intrinsic::amdgcn_call_whole_wave: {
8055 bool isTailCall = I.isTailCall();
8056
8057 // The first argument is the callee. Skip it when assembling the call args.
8058 for (unsigned Idx = 1; Idx < I.arg_size(); ++Idx) {
8059 TargetLowering::ArgListEntry Arg(getValue(I.getArgOperand(Idx)),
8060 I.getArgOperand(Idx)->getType());
8061 Arg.setAttributes(&I, Idx);
8062
8063 // If we have an explicit sret argument that is an Instruction, (i.e., it
8064 // might point to function-local memory), we can't meaningfully tail-call.
8065 if (Arg.IsSRet && isa<Instruction>(I.getArgOperand(Idx)))
8066 isTailCall = false;
8067
8068 Args.push_back(Arg);
8069 }
8070
8071 SDValue ConvControlToken;
8072 if (auto Bundle = I.getOperandBundle(LLVMContext::OB_convergencectrl)) {
8073 auto *Token = Bundle->Inputs[0].get();
8074 ConvControlToken = getValue(Token);
8075 }
8076
8077 TargetLowering::CallLoweringInfo CLI(DAG);
8078 CLI.setDebugLoc(getCurSDLoc())
8079 .setChain(getRoot())
8080 .setCallee(CallingConv::AMDGPU_Gfx_WholeWave, I.getType(),
8081 getValue(I.getArgOperand(0)), std::move(Args))
8082 .setTailCall(isTailCall && canTailCall(I))
8083 .setIsPreallocated(
8084 I.countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0)
8085 .setConvergent(I.isConvergent())
8086 .setConvergenceControlToken(ConvControlToken);
8087 CLI.CB = &I;
8088
8089 std::pair<SDValue, SDValue> Result =
8090 lowerInvokable(CLI, /*EHPadBB=*/nullptr);
8091
8092 if (Result.first.getNode())
8093 setValue(&I, Result.first);
8094 return;
8095 }
8096 case Intrinsic::ptrmask: {
8097 SDValue Ptr = getValue(I.getOperand(0));
8098 SDValue Mask = getValue(I.getOperand(1));
8099
8100 // On arm64_32, pointers are 32 bits when stored in memory, but
8101 // zero-extended to 64 bits when in registers. Thus the mask is 32 bits to
8102 // match the index type, but the pointer is 64 bits, so the mask must be
8103 // zero-extended up to 64 bits to match the pointer.
8104 EVT PtrVT =
8105 TLI.getValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
8106 EVT MemVT =
8107 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
8108 assert(PtrVT == Ptr.getValueType());
8109 if (Mask.getValueType().getFixedSizeInBits() < MemVT.getFixedSizeInBits()) {
8110 // For AMDGPU buffer descriptors the mask is 48 bits, but the pointer is
8111 // 128-bit, so we have to pad the mask with ones for unused bits.
8112 auto HighOnes = DAG.getNode(
8113 ISD::SHL, sdl, PtrVT, DAG.getAllOnesConstant(sdl, PtrVT),
8114 DAG.getShiftAmountConstant(Mask.getValueType().getFixedSizeInBits(),
8115 PtrVT, sdl));
8116 Mask = DAG.getNode(ISD::OR, sdl, PtrVT,
8117 DAG.getZExtOrTrunc(Mask, sdl, PtrVT), HighOnes);
8118 } else if (Mask.getValueType() != PtrVT)
8119 Mask = DAG.getPtrExtOrTrunc(Mask, sdl, PtrVT);
8120
8121 assert(Mask.getValueType() == PtrVT);
8122 setValue(&I, DAG.getNode(ISD::AND, sdl, PtrVT, Ptr, Mask));
8123 return;
8124 }
8125 case Intrinsic::threadlocal_address: {
8126 setValue(&I, getValue(I.getOperand(0)));
8127 return;
8128 }
8129 case Intrinsic::get_active_lane_mask: {
8130 EVT CCVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8131 SDValue Index = getValue(I.getOperand(0));
8132 SDValue TripCount = getValue(I.getOperand(1));
8133 EVT ElementVT = Index.getValueType();
8134
8135 if (!TLI.shouldExpandGetActiveLaneMask(CCVT, ElementVT)) {
8136 setValue(&I, DAG.getNode(ISD::GET_ACTIVE_LANE_MASK, sdl, CCVT, Index,
8137 TripCount));
8138 return;
8139 }
8140
8141 EVT VecTy = EVT::getVectorVT(*DAG.getContext(), ElementVT,
8142 CCVT.getVectorElementCount());
8143
8144 SDValue VectorIndex = DAG.getSplat(VecTy, sdl, Index);
8145 SDValue VectorTripCount = DAG.getSplat(VecTy, sdl, TripCount);
8146 SDValue VectorStep = DAG.getStepVector(sdl, VecTy);
8147 SDValue VectorInduction = DAG.getNode(
8148 ISD::UADDSAT, sdl, VecTy, VectorIndex, VectorStep);
8149 SDValue SetCC = DAG.getSetCC(sdl, CCVT, VectorInduction,
8150 VectorTripCount, ISD::CondCode::SETULT);
8151 setValue(&I, SetCC);
8152 return;
8153 }
8154 case Intrinsic::experimental_get_vector_length: {
8155 assert(cast<ConstantInt>(I.getOperand(1))->getSExtValue() > 0 &&
8156 "Expected positive VF");
8157 unsigned VF = cast<ConstantInt>(I.getOperand(1))->getZExtValue();
8158 bool IsScalable = cast<ConstantInt>(I.getOperand(2))->isOne();
8159
8160 SDValue Count = getValue(I.getOperand(0));
8161 EVT CountVT = Count.getValueType();
8162
8163 if (!TLI.shouldExpandGetVectorLength(CountVT, VF, IsScalable)) {
8164 visitTargetIntrinsic(I, Intrinsic);
8165 return;
8166 }
8167
8168 // Expand to a umin between the trip count and the maximum elements the type
8169 // can hold.
8170 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8171
8172 // Extend the trip count to at least the result VT.
8173 if (CountVT.bitsLT(VT)) {
8174 Count = DAG.getNode(ISD::ZERO_EXTEND, sdl, VT, Count);
8175 CountVT = VT;
8176 }
8177
8178 SDValue MaxEVL = DAG.getElementCount(sdl, CountVT,
8179 ElementCount::get(VF, IsScalable));
8180
8181 SDValue UMin = DAG.getNode(ISD::UMIN, sdl, CountVT, Count, MaxEVL);
8182 // Clip to the result type if needed.
8183 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, sdl, VT, UMin);
8184
8185 setValue(&I, Trunc);
8186 return;
8187 }
8188 case Intrinsic::vector_partial_reduce_add: {
8189 SDValue Acc = getValue(I.getOperand(0));
8190 SDValue Input = getValue(I.getOperand(1));
8191 setValue(&I,
8192 DAG.getNode(ISD::PARTIAL_REDUCE_UMLA, sdl, Acc.getValueType(), Acc,
8193 Input, DAG.getConstant(1, sdl, Input.getValueType())));
8194 return;
8195 }
8196 case Intrinsic::vector_partial_reduce_fadd: {
8197 SDValue Acc = getValue(I.getOperand(0));
8198 SDValue Input = getValue(I.getOperand(1));
8199 setValue(&I, DAG.getNode(
8200 ISD::PARTIAL_REDUCE_FMLA, sdl, Acc.getValueType(), Acc,
8201 Input, DAG.getConstantFP(1.0, sdl, Input.getValueType())));
8202 return;
8203 }
8204 case Intrinsic::experimental_cttz_elts: {
8205 auto DL = getCurSDLoc();
8206 SDValue Op = getValue(I.getOperand(0));
8207 EVT OpVT = Op.getValueType();
8208
8209 if (!TLI.shouldExpandCttzElements(OpVT)) {
8210 visitTargetIntrinsic(I, Intrinsic);
8211 return;
8212 }
8213
8214 if (OpVT.getScalarType() != MVT::i1) {
8215 // Compare the input vector elements to zero & use to count trailing zeros
8216 SDValue AllZero = DAG.getConstant(0, DL, OpVT);
8217 OpVT = EVT::getVectorVT(*DAG.getContext(), MVT::i1,
8218 OpVT.getVectorElementCount());
8219 Op = DAG.getSetCC(DL, OpVT, Op, AllZero, ISD::SETNE);
8220 }
8221
8222 // If the zero-is-poison flag is set, we can assume the upper limit
8223 // of the result is VF-1.
8224 bool ZeroIsPoison =
8225 !cast<ConstantSDNode>(getValue(I.getOperand(1)))->isZero();
8226 ConstantRange VScaleRange(1, true); // Dummy value.
8227 if (isa<ScalableVectorType>(I.getOperand(0)->getType()))
8228 VScaleRange = getVScaleRange(I.getCaller(), 64);
8229 unsigned EltWidth = TLI.getBitWidthForCttzElements(
8230 I.getType(), OpVT.getVectorElementCount(), ZeroIsPoison, &VScaleRange);
8231
8232 MVT NewEltTy = MVT::getIntegerVT(EltWidth);
8233
8234 // Create the new vector type & get the vector length
8235 EVT NewVT = EVT::getVectorVT(*DAG.getContext(), NewEltTy,
8236 OpVT.getVectorElementCount());
8237
8238 SDValue VL =
8239 DAG.getElementCount(DL, NewEltTy, OpVT.getVectorElementCount());
8240
8241 SDValue StepVec = DAG.getStepVector(DL, NewVT);
8242 SDValue SplatVL = DAG.getSplat(NewVT, DL, VL);
8243 SDValue StepVL = DAG.getNode(ISD::SUB, DL, NewVT, SplatVL, StepVec);
8244 SDValue Ext = DAG.getNode(ISD::SIGN_EXTEND, DL, NewVT, Op);
8245 SDValue And = DAG.getNode(ISD::AND, DL, NewVT, StepVL, Ext);
8246 SDValue Max = DAG.getNode(ISD::VECREDUCE_UMAX, DL, NewEltTy, And);
8247 SDValue Sub = DAG.getNode(ISD::SUB, DL, NewEltTy, VL, Max);
8248
8249 EVT RetTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
8250 SDValue Ret = DAG.getZExtOrTrunc(Sub, DL, RetTy);
8251
8252 setValue(&I, Ret);
8253 return;
8254 }
8255 case Intrinsic::vector_insert: {
8256 SDValue Vec = getValue(I.getOperand(0));
8257 SDValue SubVec = getValue(I.getOperand(1));
8258 SDValue Index = getValue(I.getOperand(2));
8259
8260 // The intrinsic's index type is i64, but the SDNode requires an index type
8261 // suitable for the target. Convert the index as required.
8262 MVT VectorIdxTy = TLI.getVectorIdxTy(DAG.getDataLayout());
8263 if (Index.getValueType() != VectorIdxTy)
8264 Index = DAG.getVectorIdxConstant(Index->getAsZExtVal(), sdl);
8265
8266 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8267 setValue(&I, DAG.getNode(ISD::INSERT_SUBVECTOR, sdl, ResultVT, Vec, SubVec,
8268 Index));
8269 return;
8270 }
8271 case Intrinsic::vector_extract: {
8272 SDValue Vec = getValue(I.getOperand(0));
8273 SDValue Index = getValue(I.getOperand(1));
8274 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8275
8276 // The intrinsic's index type is i64, but the SDNode requires an index type
8277 // suitable for the target. Convert the index as required.
8278 MVT VectorIdxTy = TLI.getVectorIdxTy(DAG.getDataLayout());
8279 if (Index.getValueType() != VectorIdxTy)
8280 Index = DAG.getVectorIdxConstant(Index->getAsZExtVal(), sdl);
8281
8282 setValue(&I,
8283 DAG.getNode(ISD::EXTRACT_SUBVECTOR, sdl, ResultVT, Vec, Index));
8284 return;
8285 }
8286 case Intrinsic::experimental_vector_match: {
8287 SDValue Op1 = getValue(I.getOperand(0));
8288 SDValue Op2 = getValue(I.getOperand(1));
8289 SDValue Mask = getValue(I.getOperand(2));
8290 EVT Op1VT = Op1.getValueType();
8291 EVT Op2VT = Op2.getValueType();
8292 EVT ResVT = Mask.getValueType();
8293 unsigned SearchSize = Op2VT.getVectorNumElements();
8294
8295 // If the target has native support for this vector match operation, lower
8296 // the intrinsic untouched; otherwise, expand it below.
8297 if (!TLI.shouldExpandVectorMatch(Op1VT, SearchSize)) {
8298 visitTargetIntrinsic(I, Intrinsic);
8299 return;
8300 }
8301
8302 SDValue Ret = DAG.getConstant(0, sdl, ResVT);
8303
8304 for (unsigned i = 0; i < SearchSize; ++i) {
8305 SDValue Op2Elem = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, sdl,
8306 Op2VT.getVectorElementType(), Op2,
8307 DAG.getVectorIdxConstant(i, sdl));
8308 SDValue Splat = DAG.getNode(ISD::SPLAT_VECTOR, sdl, Op1VT, Op2Elem);
8309 SDValue Cmp = DAG.getSetCC(sdl, ResVT, Op1, Splat, ISD::SETEQ);
8310 Ret = DAG.getNode(ISD::OR, sdl, ResVT, Ret, Cmp);
8311 }
8312
8313 setValue(&I, DAG.getNode(ISD::AND, sdl, ResVT, Ret, Mask));
8314 return;
8315 }
8316 case Intrinsic::vector_reverse:
8317 visitVectorReverse(I);
8318 return;
8319 case Intrinsic::vector_splice:
8320 visitVectorSplice(I);
8321 return;
8322 case Intrinsic::callbr_landingpad:
8323 visitCallBrLandingPad(I);
8324 return;
8325 case Intrinsic::vector_interleave2:
8326 visitVectorInterleave(I, 2);
8327 return;
8328 case Intrinsic::vector_interleave3:
8329 visitVectorInterleave(I, 3);
8330 return;
8331 case Intrinsic::vector_interleave4:
8332 visitVectorInterleave(I, 4);
8333 return;
8334 case Intrinsic::vector_interleave5:
8335 visitVectorInterleave(I, 5);
8336 return;
8337 case Intrinsic::vector_interleave6:
8338 visitVectorInterleave(I, 6);
8339 return;
8340 case Intrinsic::vector_interleave7:
8341 visitVectorInterleave(I, 7);
8342 return;
8343 case Intrinsic::vector_interleave8:
8344 visitVectorInterleave(I, 8);
8345 return;
8346 case Intrinsic::vector_deinterleave2:
8347 visitVectorDeinterleave(I, 2);
8348 return;
8349 case Intrinsic::vector_deinterleave3:
8350 visitVectorDeinterleave(I, 3);
8351 return;
8352 case Intrinsic::vector_deinterleave4:
8353 visitVectorDeinterleave(I, 4);
8354 return;
8355 case Intrinsic::vector_deinterleave5:
8356 visitVectorDeinterleave(I, 5);
8357 return;
8358 case Intrinsic::vector_deinterleave6:
8359 visitVectorDeinterleave(I, 6);
8360 return;
8361 case Intrinsic::vector_deinterleave7:
8362 visitVectorDeinterleave(I, 7);
8363 return;
8364 case Intrinsic::vector_deinterleave8:
8365 visitVectorDeinterleave(I, 8);
8366 return;
8367 case Intrinsic::experimental_vector_compress:
8368 setValue(&I, DAG.getNode(ISD::VECTOR_COMPRESS, sdl,
8369 getValue(I.getArgOperand(0)).getValueType(),
8370 getValue(I.getArgOperand(0)),
8371 getValue(I.getArgOperand(1)),
8372 getValue(I.getArgOperand(2)), Flags));
8373 return;
8374 case Intrinsic::experimental_convergence_anchor:
8375 case Intrinsic::experimental_convergence_entry:
8376 case Intrinsic::experimental_convergence_loop:
8377 visitConvergenceControl(I, Intrinsic);
8378 return;
8379 case Intrinsic::experimental_vector_histogram_add: {
8380 visitVectorHistogram(I, Intrinsic);
8381 return;
8382 }
8383 case Intrinsic::experimental_vector_extract_last_active: {
8384 visitVectorExtractLastActive(I, Intrinsic);
8385 return;
8386 }
8387 case Intrinsic::loop_dependence_war_mask:
8388 setValue(&I,
8390 EVT::getEVT(I.getType()), getValue(I.getOperand(0)),
8391 getValue(I.getOperand(1)), getValue(I.getOperand(2))));
8392 return;
8393 case Intrinsic::loop_dependence_raw_mask:
8394 setValue(&I,
8396 EVT::getEVT(I.getType()), getValue(I.getOperand(0)),
8397 getValue(I.getOperand(1)), getValue(I.getOperand(2))));
8398 return;
8399 }
8400}
8401
8402void SelectionDAGBuilder::pushFPOpOutChain(SDValue Result,
8404 assert(Result.getNode()->getNumValues() == 2);
8405 SDValue OutChain = Result.getValue(1);
8406 assert(OutChain.getValueType() == MVT::Other);
8407
8408 // Instead of updating the root immediately, push the produced chain to the
8409 // appropriate list, deferring the update until the root is requested. In this
8410 // case, the nodes from the lists are chained using TokenFactor, indicating
8411 // that the operations are independent.
8412 //
8413 // In particular, the root is updated before any call that might access the
8414 // floating-point environment, except for constrained intrinsics.
8415 switch (EB) {
8418 PendingConstrainedFP.push_back(OutChain);
8419 break;
8421 PendingConstrainedFPStrict.push_back(OutChain);
8422 break;
8423 }
8424}
8425
8426void SelectionDAGBuilder::visitConstrainedFPIntrinsic(
8427 const ConstrainedFPIntrinsic &FPI) {
8428 SDLoc sdl = getCurSDLoc();
8429
8430 // We do not need to serialize constrained FP intrinsics against
8431 // each other or against (nonvolatile) loads, so they can be
8432 // chained like loads.
8434 SDValue Chain = getFPOperationRoot(EB);
8436 Opers.push_back(Chain);
8437 for (unsigned I = 0, E = FPI.getNonMetadataArgCount(); I != E; ++I)
8438 Opers.push_back(getValue(FPI.getArgOperand(I)));
8439
8440 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8441 EVT VT = TLI.getValueType(DAG.getDataLayout(), FPI.getType());
8442 SDVTList VTs = DAG.getVTList(VT, MVT::Other);
8443
8444 SDNodeFlags Flags;
8446 Flags.setNoFPExcept(true);
8447
8448 if (auto *FPOp = dyn_cast<FPMathOperator>(&FPI))
8449 Flags.copyFMF(*FPOp);
8450
8451 unsigned Opcode;
8452 switch (FPI.getIntrinsicID()) {
8453 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
8454#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
8455 case Intrinsic::INTRINSIC: \
8456 Opcode = ISD::STRICT_##DAGN; \
8457 break;
8458#include "llvm/IR/ConstrainedOps.def"
8459 case Intrinsic::experimental_constrained_fmuladd: {
8460 Opcode = ISD::STRICT_FMA;
8461 // Break fmuladd into fmul and fadd.
8462 if (TM.Options.AllowFPOpFusion == FPOpFusion::Strict ||
8463 !TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), VT)) {
8464 Opers.pop_back();
8465 SDValue Mul = DAG.getNode(ISD::STRICT_FMUL, sdl, VTs, Opers, Flags);
8466 pushFPOpOutChain(Mul, EB);
8467 Opcode = ISD::STRICT_FADD;
8468 Opers.clear();
8469 Opers.push_back(Mul.getValue(1));
8470 Opers.push_back(Mul.getValue(0));
8471 Opers.push_back(getValue(FPI.getArgOperand(2)));
8472 }
8473 break;
8474 }
8475 }
8476
8477 // A few strict DAG nodes carry additional operands that are not
8478 // set up by the default code above.
8479 switch (Opcode) {
8480 default: break;
8482 Opers.push_back(
8483 DAG.getTargetConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout())));
8484 break;
8485 case ISD::STRICT_FSETCC:
8486 case ISD::STRICT_FSETCCS: {
8488 ISD::CondCode Condition = getFCmpCondCode(FPCmp->getPredicate());
8489 if (TM.Options.NoNaNsFPMath)
8490 Condition = getFCmpCodeWithoutNaN(Condition);
8491 Opers.push_back(DAG.getCondCode(Condition));
8492 break;
8493 }
8494 }
8495
8496 SDValue Result = DAG.getNode(Opcode, sdl, VTs, Opers, Flags);
8497 pushFPOpOutChain(Result, EB);
8498
8499 SDValue FPResult = Result.getValue(0);
8500 setValue(&FPI, FPResult);
8501}
8502
8503static unsigned getISDForVPIntrinsic(const VPIntrinsic &VPIntrin) {
8504 std::optional<unsigned> ResOPC;
8505 switch (VPIntrin.getIntrinsicID()) {
8506 case Intrinsic::vp_ctlz: {
8507 bool IsZeroUndef = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8508 ResOPC = IsZeroUndef ? ISD::VP_CTLZ_ZERO_UNDEF : ISD::VP_CTLZ;
8509 break;
8510 }
8511 case Intrinsic::vp_cttz: {
8512 bool IsZeroUndef = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8513 ResOPC = IsZeroUndef ? ISD::VP_CTTZ_ZERO_UNDEF : ISD::VP_CTTZ;
8514 break;
8515 }
8516 case Intrinsic::vp_cttz_elts: {
8517 bool IsZeroPoison = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8518 ResOPC = IsZeroPoison ? ISD::VP_CTTZ_ELTS_ZERO_UNDEF : ISD::VP_CTTZ_ELTS;
8519 break;
8520 }
8521#define HELPER_MAP_VPID_TO_VPSD(VPID, VPSD) \
8522 case Intrinsic::VPID: \
8523 ResOPC = ISD::VPSD; \
8524 break;
8525#include "llvm/IR/VPIntrinsics.def"
8526 }
8527
8528 if (!ResOPC)
8530 "Inconsistency: no SDNode available for this VPIntrinsic!");
8531
8532 if (*ResOPC == ISD::VP_REDUCE_SEQ_FADD ||
8533 *ResOPC == ISD::VP_REDUCE_SEQ_FMUL) {
8534 if (VPIntrin.getFastMathFlags().allowReassoc())
8535 return *ResOPC == ISD::VP_REDUCE_SEQ_FADD ? ISD::VP_REDUCE_FADD
8536 : ISD::VP_REDUCE_FMUL;
8537 }
8538
8539 return *ResOPC;
8540}
8541
8542void SelectionDAGBuilder::visitVPLoad(
8543 const VPIntrinsic &VPIntrin, EVT VT,
8544 const SmallVectorImpl<SDValue> &OpValues) {
8545 SDLoc DL = getCurSDLoc();
8546 Value *PtrOperand = VPIntrin.getArgOperand(0);
8547 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8548 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8549 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8550 SDValue LD;
8551 // Do not serialize variable-length loads of constant memory with
8552 // anything.
8553 if (!Alignment)
8554 Alignment = DAG.getEVTAlign(VT);
8555 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8556 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8557 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8558 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8559 MachineMemOperand::Flags MMOFlags =
8560 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8561 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8562 MachinePointerInfo(PtrOperand), MMOFlags,
8563 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo, Ranges);
8564 LD = DAG.getLoadVP(VT, DL, InChain, OpValues[0], OpValues[1], OpValues[2],
8565 MMO, false /*IsExpanding */);
8566 if (AddToChain)
8567 PendingLoads.push_back(LD.getValue(1));
8568 setValue(&VPIntrin, LD);
8569}
8570
8571void SelectionDAGBuilder::visitVPLoadFF(
8572 const VPIntrinsic &VPIntrin, EVT VT, EVT EVLVT,
8573 const SmallVectorImpl<SDValue> &OpValues) {
8574 assert(OpValues.size() == 3 && "Unexpected number of operands");
8575 SDLoc DL = getCurSDLoc();
8576 Value *PtrOperand = VPIntrin.getArgOperand(0);
8577 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8578 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8579 const MDNode *Ranges = VPIntrin.getMetadata(LLVMContext::MD_range);
8580 SDValue LD;
8581 // Do not serialize variable-length loads of constant memory with
8582 // anything.
8583 if (!Alignment)
8584 Alignment = DAG.getEVTAlign(VT);
8585 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8586 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8587 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8588 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8589 MachinePointerInfo(PtrOperand), MachineMemOperand::MOLoad,
8590 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo, Ranges);
8591 LD = DAG.getLoadFFVP(VT, DL, InChain, OpValues[0], OpValues[1], OpValues[2],
8592 MMO);
8593 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, EVLVT, LD.getValue(1));
8594 if (AddToChain)
8595 PendingLoads.push_back(LD.getValue(2));
8596 setValue(&VPIntrin, DAG.getMergeValues({LD.getValue(0), Trunc}, DL));
8597}
8598
8599void SelectionDAGBuilder::visitVPGather(
8600 const VPIntrinsic &VPIntrin, EVT VT,
8601 const SmallVectorImpl<SDValue> &OpValues) {
8602 SDLoc DL = getCurSDLoc();
8603 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8604 Value *PtrOperand = VPIntrin.getArgOperand(0);
8605 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8606 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8607 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8608 SDValue LD;
8609 if (!Alignment)
8610 Alignment = DAG.getEVTAlign(VT.getScalarType());
8611 unsigned AS =
8612 PtrOperand->getType()->getScalarType()->getPointerAddressSpace();
8613 MachineMemOperand::Flags MMOFlags =
8614 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8615 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8616 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8617 *Alignment, AAInfo, Ranges);
8618 SDValue Base, Index, Scale;
8619 bool UniformBase =
8620 getUniformBase(PtrOperand, Base, Index, Scale, this, VPIntrin.getParent(),
8621 VT.getScalarStoreSize());
8622 if (!UniformBase) {
8623 Base = DAG.getConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout()));
8624 Index = getValue(PtrOperand);
8625 Scale = DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout()));
8626 }
8627 EVT IdxVT = Index.getValueType();
8628 EVT EltTy = IdxVT.getVectorElementType();
8629 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
8630 EVT NewIdxVT = IdxVT.changeVectorElementType(EltTy);
8631 Index = DAG.getNode(ISD::SIGN_EXTEND, DL, NewIdxVT, Index);
8632 }
8633 LD = DAG.getGatherVP(
8634 DAG.getVTList(VT, MVT::Other), VT, DL,
8635 {DAG.getRoot(), Base, Index, Scale, OpValues[1], OpValues[2]}, MMO,
8637 PendingLoads.push_back(LD.getValue(1));
8638 setValue(&VPIntrin, LD);
8639}
8640
8641void SelectionDAGBuilder::visitVPStore(
8642 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8643 SDLoc DL = getCurSDLoc();
8644 Value *PtrOperand = VPIntrin.getArgOperand(1);
8645 EVT VT = OpValues[0].getValueType();
8646 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8647 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8648 SDValue ST;
8649 if (!Alignment)
8650 Alignment = DAG.getEVTAlign(VT);
8651 SDValue Ptr = OpValues[1];
8652 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
8653 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8654 MachineMemOperand::Flags MMOFlags =
8655 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8656 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8657 MachinePointerInfo(PtrOperand), MMOFlags,
8658 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo);
8659 ST = DAG.getStoreVP(getMemoryRoot(), DL, OpValues[0], Ptr, Offset,
8660 OpValues[2], OpValues[3], VT, MMO, ISD::UNINDEXED,
8661 /* IsTruncating */ false, /*IsCompressing*/ false);
8662 DAG.setRoot(ST);
8663 setValue(&VPIntrin, ST);
8664}
8665
8666void SelectionDAGBuilder::visitVPScatter(
8667 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8668 SDLoc DL = getCurSDLoc();
8669 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8670 Value *PtrOperand = VPIntrin.getArgOperand(1);
8671 EVT VT = OpValues[0].getValueType();
8672 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8673 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8674 SDValue ST;
8675 if (!Alignment)
8676 Alignment = DAG.getEVTAlign(VT.getScalarType());
8677 unsigned AS =
8678 PtrOperand->getType()->getScalarType()->getPointerAddressSpace();
8679 MachineMemOperand::Flags MMOFlags =
8680 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8681 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8682 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8683 *Alignment, AAInfo);
8684 SDValue Base, Index, Scale;
8685 bool UniformBase =
8686 getUniformBase(PtrOperand, Base, Index, Scale, this, VPIntrin.getParent(),
8687 VT.getScalarStoreSize());
8688 if (!UniformBase) {
8689 Base = DAG.getConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout()));
8690 Index = getValue(PtrOperand);
8691 Scale = DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout()));
8692 }
8693 EVT IdxVT = Index.getValueType();
8694 EVT EltTy = IdxVT.getVectorElementType();
8695 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
8696 EVT NewIdxVT = IdxVT.changeVectorElementType(EltTy);
8697 Index = DAG.getNode(ISD::SIGN_EXTEND, DL, NewIdxVT, Index);
8698 }
8699 ST = DAG.getScatterVP(DAG.getVTList(MVT::Other), VT, DL,
8700 {getMemoryRoot(), OpValues[0], Base, Index, Scale,
8701 OpValues[2], OpValues[3]},
8702 MMO, ISD::SIGNED_SCALED);
8703 DAG.setRoot(ST);
8704 setValue(&VPIntrin, ST);
8705}
8706
8707void SelectionDAGBuilder::visitVPStridedLoad(
8708 const VPIntrinsic &VPIntrin, EVT VT,
8709 const SmallVectorImpl<SDValue> &OpValues) {
8710 SDLoc DL = getCurSDLoc();
8711 Value *PtrOperand = VPIntrin.getArgOperand(0);
8712 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8713 if (!Alignment)
8714 Alignment = DAG.getEVTAlign(VT.getScalarType());
8715 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8716 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8717 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8718 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8719 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8720 unsigned AS = PtrOperand->getType()->getPointerAddressSpace();
8721 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8722 MachineMemOperand::Flags MMOFlags =
8723 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8724 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8725 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8726 *Alignment, AAInfo, Ranges);
8727
8728 SDValue LD = DAG.getStridedLoadVP(VT, DL, InChain, OpValues[0], OpValues[1],
8729 OpValues[2], OpValues[3], MMO,
8730 false /*IsExpanding*/);
8731
8732 if (AddToChain)
8733 PendingLoads.push_back(LD.getValue(1));
8734 setValue(&VPIntrin, LD);
8735}
8736
8737void SelectionDAGBuilder::visitVPStridedStore(
8738 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8739 SDLoc DL = getCurSDLoc();
8740 Value *PtrOperand = VPIntrin.getArgOperand(1);
8741 EVT VT = OpValues[0].getValueType();
8742 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8743 if (!Alignment)
8744 Alignment = DAG.getEVTAlign(VT.getScalarType());
8745 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8746 unsigned AS = PtrOperand->getType()->getPointerAddressSpace();
8747 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8748 MachineMemOperand::Flags MMOFlags =
8749 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8750 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8751 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8752 *Alignment, AAInfo);
8753
8754 SDValue ST = DAG.getStridedStoreVP(
8755 getMemoryRoot(), DL, OpValues[0], OpValues[1],
8756 DAG.getUNDEF(OpValues[1].getValueType()), OpValues[2], OpValues[3],
8757 OpValues[4], VT, MMO, ISD::UNINDEXED, /*IsTruncating*/ false,
8758 /*IsCompressing*/ false);
8759
8760 DAG.setRoot(ST);
8761 setValue(&VPIntrin, ST);
8762}
8763
8764void SelectionDAGBuilder::visitVPCmp(const VPCmpIntrinsic &VPIntrin) {
8765 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8766 SDLoc DL = getCurSDLoc();
8767
8768 ISD::CondCode Condition;
8770 bool IsFP = VPIntrin.getOperand(0)->getType()->isFPOrFPVectorTy();
8771 if (IsFP) {
8772 // FIXME: Regular fcmps are FPMathOperators which may have fast-math (nnan)
8773 // flags, but calls that don't return floating-point types can't be
8774 // FPMathOperators, like vp.fcmp. This affects constrained fcmp too.
8775 Condition = getFCmpCondCode(CondCode);
8776 if (TM.Options.NoNaNsFPMath)
8777 Condition = getFCmpCodeWithoutNaN(Condition);
8778 } else {
8779 Condition = getICmpCondCode(CondCode);
8780 }
8781
8782 SDValue Op1 = getValue(VPIntrin.getOperand(0));
8783 SDValue Op2 = getValue(VPIntrin.getOperand(1));
8784 // #2 is the condition code
8785 SDValue MaskOp = getValue(VPIntrin.getOperand(3));
8786 SDValue EVL = getValue(VPIntrin.getOperand(4));
8787 MVT EVLParamVT = TLI.getVPExplicitVectorLengthTy();
8788 assert(EVLParamVT.isScalarInteger() && EVLParamVT.bitsGE(MVT::i32) &&
8789 "Unexpected target EVL type");
8790 EVL = DAG.getNode(ISD::ZERO_EXTEND, DL, EVLParamVT, EVL);
8791
8792 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
8793 VPIntrin.getType());
8794 setValue(&VPIntrin,
8795 DAG.getSetCCVP(DL, DestVT, Op1, Op2, Condition, MaskOp, EVL));
8796}
8797
8798void SelectionDAGBuilder::visitVectorPredicationIntrinsic(
8799 const VPIntrinsic &VPIntrin) {
8800 SDLoc DL = getCurSDLoc();
8801 unsigned Opcode = getISDForVPIntrinsic(VPIntrin);
8802
8803 auto IID = VPIntrin.getIntrinsicID();
8804
8805 if (const auto *CmpI = dyn_cast<VPCmpIntrinsic>(&VPIntrin))
8806 return visitVPCmp(*CmpI);
8807
8808 SmallVector<EVT, 4> ValueVTs;
8809 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8810 ComputeValueVTs(TLI, DAG.getDataLayout(), VPIntrin.getType(), ValueVTs);
8811 SDVTList VTs = DAG.getVTList(ValueVTs);
8812
8813 auto EVLParamPos = VPIntrinsic::getVectorLengthParamPos(IID);
8814
8815 MVT EVLParamVT = TLI.getVPExplicitVectorLengthTy();
8816 assert(EVLParamVT.isScalarInteger() && EVLParamVT.bitsGE(MVT::i32) &&
8817 "Unexpected target EVL type");
8818
8819 // Request operands.
8820 SmallVector<SDValue, 7> OpValues;
8821 for (unsigned I = 0; I < VPIntrin.arg_size(); ++I) {
8822 auto Op = getValue(VPIntrin.getArgOperand(I));
8823 if (I == EVLParamPos)
8824 Op = DAG.getNode(ISD::ZERO_EXTEND, DL, EVLParamVT, Op);
8825 OpValues.push_back(Op);
8826 }
8827
8828 switch (Opcode) {
8829 default: {
8830 SDNodeFlags SDFlags;
8831 if (auto *FPMO = dyn_cast<FPMathOperator>(&VPIntrin))
8832 SDFlags.copyFMF(*FPMO);
8833 SDValue Result = DAG.getNode(Opcode, DL, VTs, OpValues, SDFlags);
8834 setValue(&VPIntrin, Result);
8835 break;
8836 }
8837 case ISD::VP_LOAD:
8838 visitVPLoad(VPIntrin, ValueVTs[0], OpValues);
8839 break;
8840 case ISD::VP_LOAD_FF:
8841 visitVPLoadFF(VPIntrin, ValueVTs[0], ValueVTs[1], OpValues);
8842 break;
8843 case ISD::VP_GATHER:
8844 visitVPGather(VPIntrin, ValueVTs[0], OpValues);
8845 break;
8846 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
8847 visitVPStridedLoad(VPIntrin, ValueVTs[0], OpValues);
8848 break;
8849 case ISD::VP_STORE:
8850 visitVPStore(VPIntrin, OpValues);
8851 break;
8852 case ISD::VP_SCATTER:
8853 visitVPScatter(VPIntrin, OpValues);
8854 break;
8855 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
8856 visitVPStridedStore(VPIntrin, OpValues);
8857 break;
8858 case ISD::VP_FMULADD: {
8859 assert(OpValues.size() == 5 && "Unexpected number of operands");
8860 SDNodeFlags SDFlags;
8861 if (auto *FPMO = dyn_cast<FPMathOperator>(&VPIntrin))
8862 SDFlags.copyFMF(*FPMO);
8863 if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
8864 TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), ValueVTs[0])) {
8865 setValue(&VPIntrin, DAG.getNode(ISD::VP_FMA, DL, VTs, OpValues, SDFlags));
8866 } else {
8867 SDValue Mul = DAG.getNode(
8868 ISD::VP_FMUL, DL, VTs,
8869 {OpValues[0], OpValues[1], OpValues[3], OpValues[4]}, SDFlags);
8870 SDValue Add =
8871 DAG.getNode(ISD::VP_FADD, DL, VTs,
8872 {Mul, OpValues[2], OpValues[3], OpValues[4]}, SDFlags);
8873 setValue(&VPIntrin, Add);
8874 }
8875 break;
8876 }
8877 case ISD::VP_IS_FPCLASS: {
8878 const DataLayout DLayout = DAG.getDataLayout();
8879 EVT DestVT = TLI.getValueType(DLayout, VPIntrin.getType());
8880 auto Constant = OpValues[1]->getAsZExtVal();
8881 SDValue Check = DAG.getTargetConstant(Constant, DL, MVT::i32);
8882 SDValue V = DAG.getNode(ISD::VP_IS_FPCLASS, DL, DestVT,
8883 {OpValues[0], Check, OpValues[2], OpValues[3]});
8884 setValue(&VPIntrin, V);
8885 return;
8886 }
8887 case ISD::VP_INTTOPTR: {
8888 SDValue N = OpValues[0];
8889 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), VPIntrin.getType());
8890 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(), VPIntrin.getType());
8891 N = DAG.getVPPtrExtOrTrunc(getCurSDLoc(), DestVT, N, OpValues[1],
8892 OpValues[2]);
8893 N = DAG.getVPZExtOrTrunc(getCurSDLoc(), PtrMemVT, N, OpValues[1],
8894 OpValues[2]);
8895 setValue(&VPIntrin, N);
8896 break;
8897 }
8898 case ISD::VP_PTRTOINT: {
8899 SDValue N = OpValues[0];
8900 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
8901 VPIntrin.getType());
8902 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(),
8903 VPIntrin.getOperand(0)->getType());
8904 N = DAG.getVPPtrExtOrTrunc(getCurSDLoc(), PtrMemVT, N, OpValues[1],
8905 OpValues[2]);
8906 N = DAG.getVPZExtOrTrunc(getCurSDLoc(), DestVT, N, OpValues[1],
8907 OpValues[2]);
8908 setValue(&VPIntrin, N);
8909 break;
8910 }
8911 case ISD::VP_ABS:
8912 case ISD::VP_CTLZ:
8913 case ISD::VP_CTLZ_ZERO_UNDEF:
8914 case ISD::VP_CTTZ:
8915 case ISD::VP_CTTZ_ZERO_UNDEF:
8916 case ISD::VP_CTTZ_ELTS_ZERO_UNDEF:
8917 case ISD::VP_CTTZ_ELTS: {
8918 SDValue Result =
8919 DAG.getNode(Opcode, DL, VTs, {OpValues[0], OpValues[2], OpValues[3]});
8920 setValue(&VPIntrin, Result);
8921 break;
8922 }
8923 }
8924}
8925
8926SDValue SelectionDAGBuilder::lowerStartEH(SDValue Chain,
8927 const BasicBlock *EHPadBB,
8928 MCSymbol *&BeginLabel) {
8929 MachineFunction &MF = DAG.getMachineFunction();
8930
8931 // Insert a label before the invoke call to mark the try range. This can be
8932 // used to detect deletion of the invoke via the MachineModuleInfo.
8933 BeginLabel = MF.getContext().createTempSymbol();
8934
8935 // For SjLj, keep track of which landing pads go with which invokes
8936 // so as to maintain the ordering of pads in the LSDA.
8937 unsigned CallSiteIndex = FuncInfo.getCurrentCallSite();
8938 if (CallSiteIndex) {
8939 MF.setCallSiteBeginLabel(BeginLabel, CallSiteIndex);
8940 LPadToCallSiteMap[FuncInfo.getMBB(EHPadBB)].push_back(CallSiteIndex);
8941
8942 // Now that the call site is handled, stop tracking it.
8943 FuncInfo.setCurrentCallSite(0);
8944 }
8945
8946 return DAG.getEHLabel(getCurSDLoc(), Chain, BeginLabel);
8947}
8948
8949SDValue SelectionDAGBuilder::lowerEndEH(SDValue Chain, const InvokeInst *II,
8950 const BasicBlock *EHPadBB,
8951 MCSymbol *BeginLabel) {
8952 assert(BeginLabel && "BeginLabel should've been set");
8953
8954 MachineFunction &MF = DAG.getMachineFunction();
8955
8956 // Insert a label at the end of the invoke call to mark the try range. This
8957 // can be used to detect deletion of the invoke via the MachineModuleInfo.
8958 MCSymbol *EndLabel = MF.getContext().createTempSymbol();
8959 Chain = DAG.getEHLabel(getCurSDLoc(), Chain, EndLabel);
8960
8961 // Inform MachineModuleInfo of range.
8962 auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn());
8963 // There is a platform (e.g. wasm) that uses funclet style IR but does not
8964 // actually use outlined funclets and their LSDA info style.
8965 if (MF.hasEHFunclets() && isFuncletEHPersonality(Pers)) {
8966 assert(II && "II should've been set");
8967 WinEHFuncInfo *EHInfo = MF.getWinEHFuncInfo();
8968 EHInfo->addIPToStateRange(II, BeginLabel, EndLabel);
8969 } else if (!isScopedEHPersonality(Pers)) {
8970 assert(EHPadBB);
8971 MF.addInvoke(FuncInfo.getMBB(EHPadBB), BeginLabel, EndLabel);
8972 }
8973
8974 return Chain;
8975}
8976
8977std::pair<SDValue, SDValue>
8979 const BasicBlock *EHPadBB) {
8980 MCSymbol *BeginLabel = nullptr;
8981
8982 if (EHPadBB) {
8983 // Both PendingLoads and PendingExports must be flushed here;
8984 // this call might not return.
8985 (void)getRoot();
8986 DAG.setRoot(lowerStartEH(getControlRoot(), EHPadBB, BeginLabel));
8987 CLI.setChain(getRoot());
8988 }
8989
8990 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8991 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
8992
8993 assert((CLI.IsTailCall || Result.second.getNode()) &&
8994 "Non-null chain expected with non-tail call!");
8995 assert((Result.second.getNode() || !Result.first.getNode()) &&
8996 "Null value expected with tail call!");
8997
8998 if (!Result.second.getNode()) {
8999 // As a special case, a null chain means that a tail call has been emitted
9000 // and the DAG root is already updated.
9001 HasTailCall = true;
9002
9003 // Since there's no actual continuation from this block, nothing can be
9004 // relying on us setting vregs for them.
9005 PendingExports.clear();
9006 } else {
9007 DAG.setRoot(Result.second);
9008 }
9009
9010 if (EHPadBB) {
9011 DAG.setRoot(lowerEndEH(getRoot(), cast_or_null<InvokeInst>(CLI.CB), EHPadBB,
9012 BeginLabel));
9013 Result.second = getRoot();
9014 }
9015
9016 return Result;
9017}
9018
9020 bool isMustTailCall = CB.isMustTailCall();
9021
9022 // Avoid emitting tail calls in functions with the disable-tail-calls
9023 // attribute.
9024 const Function *Caller = CB.getParent()->getParent();
9025 if (!isMustTailCall &&
9026 Caller->getFnAttribute("disable-tail-calls").getValueAsBool())
9027 return false;
9028
9029 // We can't tail call inside a function with a swifterror argument. Lowering
9030 // does not support this yet. It would have to move into the swifterror
9031 // register before the call.
9032 if (DAG.getTargetLoweringInfo().supportSwiftError() &&
9033 Caller->getAttributes().hasAttrSomewhere(Attribute::SwiftError))
9034 return false;
9035
9036 // Check if target-independent constraints permit a tail call here.
9037 // Target-dependent constraints are checked within TLI->LowerCallTo.
9038 return isInTailCallPosition(CB, DAG.getTarget());
9039}
9040
9042 bool isTailCall, bool isMustTailCall,
9043 const BasicBlock *EHPadBB,
9044 const TargetLowering::PtrAuthInfo *PAI) {
9045 auto &DL = DAG.getDataLayout();
9046 FunctionType *FTy = CB.getFunctionType();
9047 Type *RetTy = CB.getType();
9048
9050 Args.reserve(CB.arg_size());
9051
9052 const Value *SwiftErrorVal = nullptr;
9053 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9054
9055 if (isTailCall)
9056 isTailCall = canTailCall(CB);
9057
9058 for (auto I = CB.arg_begin(), E = CB.arg_end(); I != E; ++I) {
9059 const Value *V = *I;
9060
9061 // Skip empty types
9062 if (V->getType()->isEmptyTy())
9063 continue;
9064
9065 SDValue ArgNode = getValue(V);
9066 TargetLowering::ArgListEntry Entry(ArgNode, V->getType());
9067 Entry.setAttributes(&CB, I - CB.arg_begin());
9068
9069 // Use swifterror virtual register as input to the call.
9070 if (Entry.IsSwiftError && TLI.supportSwiftError()) {
9071 SwiftErrorVal = V;
9072 // We find the virtual register for the actual swifterror argument.
9073 // Instead of using the Value, we use the virtual register instead.
9074 Entry.Node =
9075 DAG.getRegister(SwiftError.getOrCreateVRegUseAt(&CB, FuncInfo.MBB, V),
9076 EVT(TLI.getPointerTy(DL)));
9077 }
9078
9079 Args.push_back(Entry);
9080
9081 // If we have an explicit sret argument that is an Instruction, (i.e., it
9082 // might point to function-local memory), we can't meaningfully tail-call.
9083 if (Entry.IsSRet && isa<Instruction>(V))
9084 isTailCall = false;
9085 }
9086
9087 // If call site has a cfguardtarget operand bundle, create and add an
9088 // additional ArgListEntry.
9089 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_cfguardtarget)) {
9090 Value *V = Bundle->Inputs[0];
9092 Entry.IsCFGuardTarget = true;
9093 Args.push_back(Entry);
9094 }
9095
9096 // Disable tail calls if there is an swifterror argument. Targets have not
9097 // been updated to support tail calls.
9098 if (TLI.supportSwiftError() && SwiftErrorVal)
9099 isTailCall = false;
9100
9101 ConstantInt *CFIType = nullptr;
9102 if (CB.isIndirectCall()) {
9103 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_kcfi)) {
9104 if (!TLI.supportKCFIBundles())
9106 "Target doesn't support calls with kcfi operand bundles.");
9107 CFIType = cast<ConstantInt>(Bundle->Inputs[0]);
9108 assert(CFIType->getType()->isIntegerTy(32) && "Invalid CFI type");
9109 }
9110 }
9111
9112 SDValue ConvControlToken;
9113 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_convergencectrl)) {
9114 auto *Token = Bundle->Inputs[0].get();
9115 ConvControlToken = getValue(Token);
9116 }
9117
9120 .setChain(getRoot())
9121 .setCallee(RetTy, FTy, Callee, std::move(Args), CB)
9122 .setTailCall(isTailCall)
9126 .setCFIType(CFIType)
9127 .setConvergenceControlToken(ConvControlToken);
9128
9129 // Set the pointer authentication info if we have it.
9130 if (PAI) {
9131 if (!TLI.supportPtrAuthBundles())
9133 "This target doesn't support calls with ptrauth operand bundles.");
9134 CLI.setPtrAuth(*PAI);
9135 }
9136
9137 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
9138
9139 if (Result.first.getNode()) {
9140 Result.first = lowerRangeToAssertZExt(DAG, CB, Result.first);
9141 Result.first = lowerNoFPClassToAssertNoFPClass(DAG, CB, Result.first);
9142 setValue(&CB, Result.first);
9143 }
9144
9145 // The last element of CLI.InVals has the SDValue for swifterror return.
9146 // Here we copy it to a virtual register and update SwiftErrorMap for
9147 // book-keeping.
9148 if (SwiftErrorVal && TLI.supportSwiftError()) {
9149 // Get the last element of InVals.
9150 SDValue Src = CLI.InVals.back();
9151 Register VReg =
9152 SwiftError.getOrCreateVRegDefAt(&CB, FuncInfo.MBB, SwiftErrorVal);
9153 SDValue CopyNode = CLI.DAG.getCopyToReg(Result.second, CLI.DL, VReg, Src);
9154 DAG.setRoot(CopyNode);
9155 }
9156}
9157
9158static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT,
9159 SelectionDAGBuilder &Builder) {
9160 // Check to see if this load can be trivially constant folded, e.g. if the
9161 // input is from a string literal.
9162 if (const Constant *LoadInput = dyn_cast<Constant>(PtrVal)) {
9163 // Cast pointer to the type we really want to load.
9164 Type *LoadTy =
9165 Type::getIntNTy(PtrVal->getContext(), LoadVT.getScalarSizeInBits());
9166 if (LoadVT.isVector())
9167 LoadTy = FixedVectorType::get(LoadTy, LoadVT.getVectorNumElements());
9168 if (const Constant *LoadCst =
9169 ConstantFoldLoadFromConstPtr(const_cast<Constant *>(LoadInput),
9170 LoadTy, Builder.DAG.getDataLayout()))
9171 return Builder.getValue(LoadCst);
9172 }
9173
9174 // Otherwise, we have to emit the load. If the pointer is to unfoldable but
9175 // still constant memory, the input chain can be the entry node.
9176 SDValue Root;
9177 bool ConstantMemory = false;
9178
9179 // Do not serialize (non-volatile) loads of constant memory with anything.
9180 if (Builder.BatchAA && Builder.BatchAA->pointsToConstantMemory(PtrVal)) {
9181 Root = Builder.DAG.getEntryNode();
9182 ConstantMemory = true;
9183 } else {
9184 // Do not serialize non-volatile loads against each other.
9185 Root = Builder.DAG.getRoot();
9186 }
9187
9188 SDValue Ptr = Builder.getValue(PtrVal);
9189 SDValue LoadVal =
9190 Builder.DAG.getLoad(LoadVT, Builder.getCurSDLoc(), Root, Ptr,
9191 MachinePointerInfo(PtrVal), Align(1));
9192
9193 if (!ConstantMemory)
9194 Builder.PendingLoads.push_back(LoadVal.getValue(1));
9195 return LoadVal;
9196}
9197
9198/// Record the value for an instruction that produces an integer result,
9199/// converting the type where necessary.
9200void SelectionDAGBuilder::processIntegerCallValue(const Instruction &I,
9201 SDValue Value,
9202 bool IsSigned) {
9203 EVT VT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9204 I.getType(), true);
9205 Value = DAG.getExtOrTrunc(IsSigned, Value, getCurSDLoc(), VT);
9206 setValue(&I, Value);
9207}
9208
9209/// See if we can lower a memcmp/bcmp call into an optimized form. If so, return
9210/// true and lower it. Otherwise return false, and it will be lowered like a
9211/// normal call.
9212/// The caller already checked that \p I calls the appropriate LibFunc with a
9213/// correct prototype.
9214bool SelectionDAGBuilder::visitMemCmpBCmpCall(const CallInst &I) {
9215 const Value *LHS = I.getArgOperand(0), *RHS = I.getArgOperand(1);
9216 const Value *Size = I.getArgOperand(2);
9217 const ConstantSDNode *CSize = dyn_cast<ConstantSDNode>(getValue(Size));
9218 if (CSize && CSize->getZExtValue() == 0) {
9219 EVT CallVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9220 I.getType(), true);
9221 setValue(&I, DAG.getConstant(0, getCurSDLoc(), CallVT));
9222 return true;
9223 }
9224
9225 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9226 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForMemcmp(
9227 DAG, getCurSDLoc(), DAG.getRoot(), getValue(LHS), getValue(RHS),
9228 getValue(Size), &I);
9229 if (Res.first.getNode()) {
9230 processIntegerCallValue(I, Res.first, true);
9231 PendingLoads.push_back(Res.second);
9232 return true;
9233 }
9234
9235 // memcmp(S1,S2,2) != 0 -> (*(short*)LHS != *(short*)RHS) != 0
9236 // memcmp(S1,S2,4) != 0 -> (*(int*)LHS != *(int*)RHS) != 0
9237 if (!CSize || !isOnlyUsedInZeroEqualityComparison(&I))
9238 return false;
9239
9240 // If the target has a fast compare for the given size, it will return a
9241 // preferred load type for that size. Require that the load VT is legal and
9242 // that the target supports unaligned loads of that type. Otherwise, return
9243 // INVALID.
9244 auto hasFastLoadsAndCompare = [&](unsigned NumBits) {
9245 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9246 MVT LVT = TLI.hasFastEqualityCompare(NumBits);
9247 if (LVT != MVT::INVALID_SIMPLE_VALUE_TYPE) {
9248 // TODO: Handle 5 byte compare as 4-byte + 1 byte.
9249 // TODO: Handle 8 byte compare on x86-32 as two 32-bit loads.
9250 // TODO: Check alignment of src and dest ptrs.
9251 unsigned DstAS = LHS->getType()->getPointerAddressSpace();
9252 unsigned SrcAS = RHS->getType()->getPointerAddressSpace();
9253 if (!TLI.isTypeLegal(LVT) ||
9254 !TLI.allowsMisalignedMemoryAccesses(LVT, SrcAS) ||
9255 !TLI.allowsMisalignedMemoryAccesses(LVT, DstAS))
9257 }
9258
9259 return LVT;
9260 };
9261
9262 // This turns into unaligned loads. We only do this if the target natively
9263 // supports the MVT we'll be loading or if it is small enough (<= 4) that
9264 // we'll only produce a small number of byte loads.
9265 MVT LoadVT;
9266 unsigned NumBitsToCompare = CSize->getZExtValue() * 8;
9267 switch (NumBitsToCompare) {
9268 default:
9269 return false;
9270 case 16:
9271 LoadVT = MVT::i16;
9272 break;
9273 case 32:
9274 LoadVT = MVT::i32;
9275 break;
9276 case 64:
9277 case 128:
9278 case 256:
9279 LoadVT = hasFastLoadsAndCompare(NumBitsToCompare);
9280 break;
9281 }
9282
9283 if (LoadVT == MVT::INVALID_SIMPLE_VALUE_TYPE)
9284 return false;
9285
9286 SDValue LoadL = getMemCmpLoad(LHS, LoadVT, *this);
9287 SDValue LoadR = getMemCmpLoad(RHS, LoadVT, *this);
9288
9289 // Bitcast to a wide integer type if the loads are vectors.
9290 if (LoadVT.isVector()) {
9291 EVT CmpVT = EVT::getIntegerVT(LHS->getContext(), LoadVT.getSizeInBits());
9292 LoadL = DAG.getBitcast(CmpVT, LoadL);
9293 LoadR = DAG.getBitcast(CmpVT, LoadR);
9294 }
9295
9296 SDValue Cmp = DAG.getSetCC(getCurSDLoc(), MVT::i1, LoadL, LoadR, ISD::SETNE);
9297 processIntegerCallValue(I, Cmp, false);
9298 return true;
9299}
9300
9301/// See if we can lower a memchr call into an optimized form. If so, return
9302/// true and lower it. Otherwise return false, and it will be lowered like a
9303/// normal call.
9304/// The caller already checked that \p I calls the appropriate LibFunc with a
9305/// correct prototype.
9306bool SelectionDAGBuilder::visitMemChrCall(const CallInst &I) {
9307 const Value *Src = I.getArgOperand(0);
9308 const Value *Char = I.getArgOperand(1);
9309 const Value *Length = I.getArgOperand(2);
9310
9311 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9312 std::pair<SDValue, SDValue> Res =
9313 TSI.EmitTargetCodeForMemchr(DAG, getCurSDLoc(), DAG.getRoot(),
9314 getValue(Src), getValue(Char), getValue(Length),
9315 MachinePointerInfo(Src));
9316 if (Res.first.getNode()) {
9317 setValue(&I, Res.first);
9318 PendingLoads.push_back(Res.second);
9319 return true;
9320 }
9321
9322 return false;
9323}
9324
9325/// See if we can lower a mempcpy call into an optimized form. If so, return
9326/// true and lower it. Otherwise return false, and it will be lowered like a
9327/// normal call.
9328/// The caller already checked that \p I calls the appropriate LibFunc with a
9329/// correct prototype.
9330bool SelectionDAGBuilder::visitMemPCpyCall(const CallInst &I) {
9331 SDValue Dst = getValue(I.getArgOperand(0));
9332 SDValue Src = getValue(I.getArgOperand(1));
9333 SDValue Size = getValue(I.getArgOperand(2));
9334
9335 Align DstAlign = DAG.InferPtrAlign(Dst).valueOrOne();
9336 Align SrcAlign = DAG.InferPtrAlign(Src).valueOrOne();
9337 // DAG::getMemcpy needs Alignment to be defined.
9338 Align Alignment = std::min(DstAlign, SrcAlign);
9339
9340 SDLoc sdl = getCurSDLoc();
9341
9342 // In the mempcpy context we need to pass in a false value for isTailCall
9343 // because the return pointer needs to be adjusted by the size of
9344 // the copied memory.
9345 SDValue Root = getMemoryRoot();
9346 SDValue MC = DAG.getMemcpy(
9347 Root, sdl, Dst, Src, Size, Alignment, false, false, /*CI=*/nullptr,
9348 std::nullopt, MachinePointerInfo(I.getArgOperand(0)),
9349 MachinePointerInfo(I.getArgOperand(1)), I.getAAMetadata());
9350 assert(MC.getNode() != nullptr &&
9351 "** memcpy should not be lowered as TailCall in mempcpy context **");
9352 DAG.setRoot(MC);
9353
9354 // Check if Size needs to be truncated or extended.
9355 Size = DAG.getSExtOrTrunc(Size, sdl, Dst.getValueType());
9356
9357 // Adjust return pointer to point just past the last dst byte.
9358 SDValue DstPlusSize = DAG.getMemBasePlusOffset(Dst, Size, sdl);
9359 setValue(&I, DstPlusSize);
9360 return true;
9361}
9362
9363/// See if we can lower a strcpy call into an optimized form. If so, return
9364/// true and lower it, otherwise return false and it will be lowered like a
9365/// normal call.
9366/// The caller already checked that \p I calls the appropriate LibFunc with a
9367/// correct prototype.
9368bool SelectionDAGBuilder::visitStrCpyCall(const CallInst &I, bool isStpcpy) {
9369 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9370
9371 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9372 std::pair<SDValue, SDValue> Res =
9374 getValue(Arg0), getValue(Arg1),
9375 MachinePointerInfo(Arg0),
9376 MachinePointerInfo(Arg1), isStpcpy);
9377 if (Res.first.getNode()) {
9378 setValue(&I, Res.first);
9379 DAG.setRoot(Res.second);
9380 return true;
9381 }
9382
9383 return false;
9384}
9385
9386/// See if we can lower a strcmp call into an optimized form. If so, return
9387/// true and lower it, otherwise return false and it will be lowered like a
9388/// normal call.
9389/// The caller already checked that \p I calls the appropriate LibFunc with a
9390/// correct prototype.
9391bool SelectionDAGBuilder::visitStrCmpCall(const CallInst &I) {
9392 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9393
9394 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9395 std::pair<SDValue, SDValue> Res =
9396 TSI.EmitTargetCodeForStrcmp(DAG, getCurSDLoc(), DAG.getRoot(),
9397 getValue(Arg0), getValue(Arg1),
9398 MachinePointerInfo(Arg0),
9399 MachinePointerInfo(Arg1));
9400 if (Res.first.getNode()) {
9401 processIntegerCallValue(I, Res.first, true);
9402 PendingLoads.push_back(Res.second);
9403 return true;
9404 }
9405
9406 return false;
9407}
9408
9409/// See if we can lower a strlen call into an optimized form. If so, return
9410/// true and lower it, otherwise return false and it will be lowered like a
9411/// normal call.
9412/// The caller already checked that \p I calls the appropriate LibFunc with a
9413/// correct prototype.
9414bool SelectionDAGBuilder::visitStrLenCall(const CallInst &I) {
9415 const Value *Arg0 = I.getArgOperand(0);
9416
9417 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9418 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrlen(
9419 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), &I);
9420 if (Res.first.getNode()) {
9421 processIntegerCallValue(I, Res.first, false);
9422 PendingLoads.push_back(Res.second);
9423 return true;
9424 }
9425
9426 return false;
9427}
9428
9429/// See if we can lower a strnlen call into an optimized form. If so, return
9430/// true and lower it, otherwise return false and it will be lowered like a
9431/// normal call.
9432/// The caller already checked that \p I calls the appropriate LibFunc with a
9433/// correct prototype.
9434bool SelectionDAGBuilder::visitStrNLenCall(const CallInst &I) {
9435 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9436
9437 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9438 std::pair<SDValue, SDValue> Res =
9439 TSI.EmitTargetCodeForStrnlen(DAG, getCurSDLoc(), DAG.getRoot(),
9440 getValue(Arg0), getValue(Arg1),
9441 MachinePointerInfo(Arg0));
9442 if (Res.first.getNode()) {
9443 processIntegerCallValue(I, Res.first, false);
9444 PendingLoads.push_back(Res.second);
9445 return true;
9446 }
9447
9448 return false;
9449}
9450
9451/// See if we can lower a unary floating-point operation into an SDNode with
9452/// the specified Opcode. If so, return true and lower it, otherwise return
9453/// false and it will be lowered like a normal call.
9454/// The caller already checked that \p I calls the appropriate LibFunc with a
9455/// correct prototype.
9456bool SelectionDAGBuilder::visitUnaryFloatCall(const CallInst &I,
9457 unsigned Opcode) {
9458 // We already checked this call's prototype; verify it doesn't modify errno.
9459 // Do not perform optimizations for call sites that require strict
9460 // floating-point semantics.
9461 if (!I.onlyReadsMemory() || I.isStrictFP())
9462 return false;
9463
9464 SDNodeFlags Flags;
9465 Flags.copyFMF(cast<FPMathOperator>(I));
9466
9467 SDValue Tmp = getValue(I.getArgOperand(0));
9468 setValue(&I,
9469 DAG.getNode(Opcode, getCurSDLoc(), Tmp.getValueType(), Tmp, Flags));
9470 return true;
9471}
9472
9473/// See if we can lower a binary floating-point operation into an SDNode with
9474/// the specified Opcode. If so, return true and lower it. Otherwise return
9475/// false, and it will be lowered like a normal call.
9476/// The caller already checked that \p I calls the appropriate LibFunc with a
9477/// correct prototype.
9478bool SelectionDAGBuilder::visitBinaryFloatCall(const CallInst &I,
9479 unsigned Opcode) {
9480 // We already checked this call's prototype; verify it doesn't modify errno.
9481 // Do not perform optimizations for call sites that require strict
9482 // floating-point semantics.
9483 if (!I.onlyReadsMemory() || I.isStrictFP())
9484 return false;
9485
9486 SDNodeFlags Flags;
9487 Flags.copyFMF(cast<FPMathOperator>(I));
9488
9489 SDValue Tmp0 = getValue(I.getArgOperand(0));
9490 SDValue Tmp1 = getValue(I.getArgOperand(1));
9491 EVT VT = Tmp0.getValueType();
9492 setValue(&I, DAG.getNode(Opcode, getCurSDLoc(), VT, Tmp0, Tmp1, Flags));
9493 return true;
9494}
9495
9496void SelectionDAGBuilder::visitCall(const CallInst &I) {
9497 // Handle inline assembly differently.
9498 if (I.isInlineAsm()) {
9499 visitInlineAsm(I);
9500 return;
9501 }
9502
9504
9505 if (Function *F = I.getCalledFunction()) {
9506 if (F->isDeclaration()) {
9507 // Is this an LLVM intrinsic?
9508 if (unsigned IID = F->getIntrinsicID()) {
9509 visitIntrinsicCall(I, IID);
9510 return;
9511 }
9512 }
9513
9514 // Check for well-known libc/libm calls. If the function is internal, it
9515 // can't be a library call. Don't do the check if marked as nobuiltin for
9516 // some reason.
9517 LibFunc Func;
9518 if (!I.isNoBuiltin() && !F->hasLocalLinkage() && F->hasName() &&
9519 LibInfo->getLibFunc(*F, Func) && LibInfo->hasOptimizedCodeGen(Func)) {
9520 switch (Func) {
9521 default: break;
9522 case LibFunc_bcmp:
9523 if (visitMemCmpBCmpCall(I))
9524 return;
9525 break;
9526 case LibFunc_copysign:
9527 case LibFunc_copysignf:
9528 case LibFunc_copysignl:
9529 // We already checked this call's prototype; verify it doesn't modify
9530 // errno.
9531 if (I.onlyReadsMemory()) {
9532 SDValue LHS = getValue(I.getArgOperand(0));
9533 SDValue RHS = getValue(I.getArgOperand(1));
9535 LHS.getValueType(), LHS, RHS));
9536 return;
9537 }
9538 break;
9539 case LibFunc_fabs:
9540 case LibFunc_fabsf:
9541 case LibFunc_fabsl:
9542 if (visitUnaryFloatCall(I, ISD::FABS))
9543 return;
9544 break;
9545 case LibFunc_fmin:
9546 case LibFunc_fminf:
9547 case LibFunc_fminl:
9548 if (visitBinaryFloatCall(I, ISD::FMINNUM))
9549 return;
9550 break;
9551 case LibFunc_fmax:
9552 case LibFunc_fmaxf:
9553 case LibFunc_fmaxl:
9554 if (visitBinaryFloatCall(I, ISD::FMAXNUM))
9555 return;
9556 break;
9557 case LibFunc_fminimum_num:
9558 case LibFunc_fminimum_numf:
9559 case LibFunc_fminimum_numl:
9560 if (visitBinaryFloatCall(I, ISD::FMINIMUMNUM))
9561 return;
9562 break;
9563 case LibFunc_fmaximum_num:
9564 case LibFunc_fmaximum_numf:
9565 case LibFunc_fmaximum_numl:
9566 if (visitBinaryFloatCall(I, ISD::FMAXIMUMNUM))
9567 return;
9568 break;
9569 case LibFunc_sin:
9570 case LibFunc_sinf:
9571 case LibFunc_sinl:
9572 if (visitUnaryFloatCall(I, ISD::FSIN))
9573 return;
9574 break;
9575 case LibFunc_cos:
9576 case LibFunc_cosf:
9577 case LibFunc_cosl:
9578 if (visitUnaryFloatCall(I, ISD::FCOS))
9579 return;
9580 break;
9581 case LibFunc_tan:
9582 case LibFunc_tanf:
9583 case LibFunc_tanl:
9584 if (visitUnaryFloatCall(I, ISD::FTAN))
9585 return;
9586 break;
9587 case LibFunc_asin:
9588 case LibFunc_asinf:
9589 case LibFunc_asinl:
9590 if (visitUnaryFloatCall(I, ISD::FASIN))
9591 return;
9592 break;
9593 case LibFunc_acos:
9594 case LibFunc_acosf:
9595 case LibFunc_acosl:
9596 if (visitUnaryFloatCall(I, ISD::FACOS))
9597 return;
9598 break;
9599 case LibFunc_atan:
9600 case LibFunc_atanf:
9601 case LibFunc_atanl:
9602 if (visitUnaryFloatCall(I, ISD::FATAN))
9603 return;
9604 break;
9605 case LibFunc_atan2:
9606 case LibFunc_atan2f:
9607 case LibFunc_atan2l:
9608 if (visitBinaryFloatCall(I, ISD::FATAN2))
9609 return;
9610 break;
9611 case LibFunc_sinh:
9612 case LibFunc_sinhf:
9613 case LibFunc_sinhl:
9614 if (visitUnaryFloatCall(I, ISD::FSINH))
9615 return;
9616 break;
9617 case LibFunc_cosh:
9618 case LibFunc_coshf:
9619 case LibFunc_coshl:
9620 if (visitUnaryFloatCall(I, ISD::FCOSH))
9621 return;
9622 break;
9623 case LibFunc_tanh:
9624 case LibFunc_tanhf:
9625 case LibFunc_tanhl:
9626 if (visitUnaryFloatCall(I, ISD::FTANH))
9627 return;
9628 break;
9629 case LibFunc_sqrt:
9630 case LibFunc_sqrtf:
9631 case LibFunc_sqrtl:
9632 case LibFunc_sqrt_finite:
9633 case LibFunc_sqrtf_finite:
9634 case LibFunc_sqrtl_finite:
9635 if (visitUnaryFloatCall(I, ISD::FSQRT))
9636 return;
9637 break;
9638 case LibFunc_floor:
9639 case LibFunc_floorf:
9640 case LibFunc_floorl:
9641 if (visitUnaryFloatCall(I, ISD::FFLOOR))
9642 return;
9643 break;
9644 case LibFunc_nearbyint:
9645 case LibFunc_nearbyintf:
9646 case LibFunc_nearbyintl:
9647 if (visitUnaryFloatCall(I, ISD::FNEARBYINT))
9648 return;
9649 break;
9650 case LibFunc_ceil:
9651 case LibFunc_ceilf:
9652 case LibFunc_ceill:
9653 if (visitUnaryFloatCall(I, ISD::FCEIL))
9654 return;
9655 break;
9656 case LibFunc_rint:
9657 case LibFunc_rintf:
9658 case LibFunc_rintl:
9659 if (visitUnaryFloatCall(I, ISD::FRINT))
9660 return;
9661 break;
9662 case LibFunc_round:
9663 case LibFunc_roundf:
9664 case LibFunc_roundl:
9665 if (visitUnaryFloatCall(I, ISD::FROUND))
9666 return;
9667 break;
9668 case LibFunc_trunc:
9669 case LibFunc_truncf:
9670 case LibFunc_truncl:
9671 if (visitUnaryFloatCall(I, ISD::FTRUNC))
9672 return;
9673 break;
9674 case LibFunc_log2:
9675 case LibFunc_log2f:
9676 case LibFunc_log2l:
9677 if (visitUnaryFloatCall(I, ISD::FLOG2))
9678 return;
9679 break;
9680 case LibFunc_exp2:
9681 case LibFunc_exp2f:
9682 case LibFunc_exp2l:
9683 if (visitUnaryFloatCall(I, ISD::FEXP2))
9684 return;
9685 break;
9686 case LibFunc_exp10:
9687 case LibFunc_exp10f:
9688 case LibFunc_exp10l:
9689 if (visitUnaryFloatCall(I, ISD::FEXP10))
9690 return;
9691 break;
9692 case LibFunc_ldexp:
9693 case LibFunc_ldexpf:
9694 case LibFunc_ldexpl:
9695 if (visitBinaryFloatCall(I, ISD::FLDEXP))
9696 return;
9697 break;
9698 case LibFunc_memcmp:
9699 if (visitMemCmpBCmpCall(I))
9700 return;
9701 break;
9702 case LibFunc_mempcpy:
9703 if (visitMemPCpyCall(I))
9704 return;
9705 break;
9706 case LibFunc_memchr:
9707 if (visitMemChrCall(I))
9708 return;
9709 break;
9710 case LibFunc_strcpy:
9711 if (visitStrCpyCall(I, false))
9712 return;
9713 break;
9714 case LibFunc_stpcpy:
9715 if (visitStrCpyCall(I, true))
9716 return;
9717 break;
9718 case LibFunc_strcmp:
9719 if (visitStrCmpCall(I))
9720 return;
9721 break;
9722 case LibFunc_strlen:
9723 if (visitStrLenCall(I))
9724 return;
9725 break;
9726 case LibFunc_strnlen:
9727 if (visitStrNLenCall(I))
9728 return;
9729 break;
9730 }
9731 }
9732 }
9733
9734 if (I.countOperandBundlesOfType(LLVMContext::OB_ptrauth)) {
9735 LowerCallSiteWithPtrAuthBundle(cast<CallBase>(I), /*EHPadBB=*/nullptr);
9736 return;
9737 }
9738
9739 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
9740 // have to do anything here to lower funclet bundles.
9741 // CFGuardTarget bundles are lowered in LowerCallTo.
9743 I, "calls",
9748
9749 SDValue Callee = getValue(I.getCalledOperand());
9750
9751 if (I.hasDeoptState())
9752 LowerCallSiteWithDeoptBundle(&I, Callee, nullptr);
9753 else
9754 // Check if we can potentially perform a tail call. More detailed checking
9755 // is be done within LowerCallTo, after more information about the call is
9756 // known.
9757 LowerCallTo(I, Callee, I.isTailCall(), I.isMustTailCall());
9758}
9759
9761 const CallBase &CB, const BasicBlock *EHPadBB) {
9762 auto PAB = CB.getOperandBundle("ptrauth");
9763 const Value *CalleeV = CB.getCalledOperand();
9764
9765 // Gather the call ptrauth data from the operand bundle:
9766 // [ i32 <key>, i64 <discriminator> ]
9767 const auto *Key = cast<ConstantInt>(PAB->Inputs[0]);
9768 const Value *Discriminator = PAB->Inputs[1];
9769
9770 assert(Key->getType()->isIntegerTy(32) && "Invalid ptrauth key");
9771 assert(Discriminator->getType()->isIntegerTy(64) &&
9772 "Invalid ptrauth discriminator");
9773
9774 // Look through ptrauth constants to find the raw callee.
9775 // Do a direct unauthenticated call if we found it and everything matches.
9776 if (const auto *CalleeCPA = dyn_cast<ConstantPtrAuth>(CalleeV))
9777 if (CalleeCPA->isKnownCompatibleWith(Key, Discriminator,
9778 DAG.getDataLayout()))
9779 return LowerCallTo(CB, getValue(CalleeCPA->getPointer()), CB.isTailCall(),
9780 CB.isMustTailCall(), EHPadBB);
9781
9782 // Functions should never be ptrauth-called directly.
9783 assert(!isa<Function>(CalleeV) && "invalid direct ptrauth call");
9784
9785 // Otherwise, do an authenticated indirect call.
9786 TargetLowering::PtrAuthInfo PAI = {Key->getZExtValue(),
9787 getValue(Discriminator)};
9788
9789 LowerCallTo(CB, getValue(CalleeV), CB.isTailCall(), CB.isMustTailCall(),
9790 EHPadBB, &PAI);
9791}
9792
9793namespace {
9794
9795/// AsmOperandInfo - This contains information for each constraint that we are
9796/// lowering.
9797class SDISelAsmOperandInfo : public TargetLowering::AsmOperandInfo {
9798public:
9799 /// CallOperand - If this is the result output operand or a clobber
9800 /// this is null, otherwise it is the incoming operand to the CallInst.
9801 /// This gets modified as the asm is processed.
9802 SDValue CallOperand;
9803
9804 /// AssignedRegs - If this is a register or register class operand, this
9805 /// contains the set of register corresponding to the operand.
9806 RegsForValue AssignedRegs;
9807
9808 explicit SDISelAsmOperandInfo(const TargetLowering::AsmOperandInfo &info)
9809 : TargetLowering::AsmOperandInfo(info), CallOperand(nullptr, 0) {
9810 }
9811
9812 /// Whether or not this operand accesses memory
9813 bool hasMemory(const TargetLowering &TLI) const {
9814 // Indirect operand accesses access memory.
9815 if (isIndirect)
9816 return true;
9817
9818 for (const auto &Code : Codes)
9820 return true;
9821
9822 return false;
9823 }
9824};
9825
9826
9827} // end anonymous namespace
9828
9829/// Make sure that the output operand \p OpInfo and its corresponding input
9830/// operand \p MatchingOpInfo have compatible constraint types (otherwise error
9831/// out).
9832static void patchMatchingInput(const SDISelAsmOperandInfo &OpInfo,
9833 SDISelAsmOperandInfo &MatchingOpInfo,
9834 SelectionDAG &DAG) {
9835 if (OpInfo.ConstraintVT == MatchingOpInfo.ConstraintVT)
9836 return;
9837
9839 const auto &TLI = DAG.getTargetLoweringInfo();
9840
9841 std::pair<unsigned, const TargetRegisterClass *> MatchRC =
9842 TLI.getRegForInlineAsmConstraint(TRI, OpInfo.ConstraintCode,
9843 OpInfo.ConstraintVT);
9844 std::pair<unsigned, const TargetRegisterClass *> InputRC =
9845 TLI.getRegForInlineAsmConstraint(TRI, MatchingOpInfo.ConstraintCode,
9846 MatchingOpInfo.ConstraintVT);
9847 const bool OutOpIsIntOrFP =
9848 OpInfo.ConstraintVT.isInteger() || OpInfo.ConstraintVT.isFloatingPoint();
9849 const bool InOpIsIntOrFP = MatchingOpInfo.ConstraintVT.isInteger() ||
9850 MatchingOpInfo.ConstraintVT.isFloatingPoint();
9851 if ((OutOpIsIntOrFP != InOpIsIntOrFP) || (MatchRC.second != InputRC.second)) {
9852 // FIXME: error out in a more elegant fashion
9853 report_fatal_error("Unsupported asm: input constraint"
9854 " with a matching output constraint of"
9855 " incompatible type!");
9856 }
9857 MatchingOpInfo.ConstraintVT = OpInfo.ConstraintVT;
9858}
9859
9860/// Get a direct memory input to behave well as an indirect operand.
9861/// This may introduce stores, hence the need for a \p Chain.
9862/// \return The (possibly updated) chain.
9863static SDValue getAddressForMemoryInput(SDValue Chain, const SDLoc &Location,
9864 SDISelAsmOperandInfo &OpInfo,
9865 SelectionDAG &DAG) {
9866 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9867
9868 // If we don't have an indirect input, put it in the constpool if we can,
9869 // otherwise spill it to a stack slot.
9870 // TODO: This isn't quite right. We need to handle these according to
9871 // the addressing mode that the constraint wants. Also, this may take
9872 // an additional register for the computation and we don't want that
9873 // either.
9874
9875 // If the operand is a float, integer, or vector constant, spill to a
9876 // constant pool entry to get its address.
9877 const Value *OpVal = OpInfo.CallOperandVal;
9878 if (isa<ConstantFP>(OpVal) || isa<ConstantInt>(OpVal) ||
9880 OpInfo.CallOperand = DAG.getConstantPool(
9881 cast<Constant>(OpVal), TLI.getPointerTy(DAG.getDataLayout()));
9882 return Chain;
9883 }
9884
9885 // Otherwise, create a stack slot and emit a store to it before the asm.
9886 Type *Ty = OpVal->getType();
9887 auto &DL = DAG.getDataLayout();
9888 TypeSize TySize = DL.getTypeAllocSize(Ty);
9891 int StackID = 0;
9892 if (TySize.isScalable())
9893 StackID = TFI->getStackIDForScalableVectors();
9894 int SSFI = MF.getFrameInfo().CreateStackObject(TySize.getKnownMinValue(),
9895 DL.getPrefTypeAlign(Ty), false,
9896 nullptr, StackID);
9897 SDValue StackSlot = DAG.getFrameIndex(SSFI, TLI.getFrameIndexTy(DL));
9898 Chain = DAG.getTruncStore(Chain, Location, OpInfo.CallOperand, StackSlot,
9900 TLI.getMemValueType(DL, Ty));
9901 OpInfo.CallOperand = StackSlot;
9902
9903 return Chain;
9904}
9905
9906/// GetRegistersForValue - Assign registers (virtual or physical) for the
9907/// specified operand. We prefer to assign virtual registers, to allow the
9908/// register allocator to handle the assignment process. However, if the asm
9909/// uses features that we can't model on machineinstrs, we have SDISel do the
9910/// allocation. This produces generally horrible, but correct, code.
9911///
9912/// OpInfo describes the operand
9913/// RefOpInfo describes the matching operand if any, the operand otherwise
9914static std::optional<unsigned>
9916 SDISelAsmOperandInfo &OpInfo,
9917 SDISelAsmOperandInfo &RefOpInfo) {
9918 LLVMContext &Context = *DAG.getContext();
9919 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9920
9924
9925 // No work to do for memory/address operands.
9926 if (OpInfo.ConstraintType == TargetLowering::C_Memory ||
9927 OpInfo.ConstraintType == TargetLowering::C_Address)
9928 return std::nullopt;
9929
9930 // If this is a constraint for a single physreg, or a constraint for a
9931 // register class, find it.
9932 unsigned AssignedReg;
9933 const TargetRegisterClass *RC;
9934 std::tie(AssignedReg, RC) = TLI.getRegForInlineAsmConstraint(
9935 &TRI, RefOpInfo.ConstraintCode, RefOpInfo.ConstraintVT);
9936 // RC is unset only on failure. Return immediately.
9937 if (!RC)
9938 return std::nullopt;
9939
9940 // Get the actual register value type. This is important, because the user
9941 // may have asked for (e.g.) the AX register in i32 type. We need to
9942 // remember that AX is actually i16 to get the right extension.
9943 const MVT RegVT = *TRI.legalclasstypes_begin(*RC);
9944
9945 if (OpInfo.ConstraintVT != MVT::Other && RegVT != MVT::Untyped) {
9946 // If this is an FP operand in an integer register (or visa versa), or more
9947 // generally if the operand value disagrees with the register class we plan
9948 // to stick it in, fix the operand type.
9949 //
9950 // If this is an input value, the bitcast to the new type is done now.
9951 // Bitcast for output value is done at the end of visitInlineAsm().
9952 if ((OpInfo.Type == InlineAsm::isOutput ||
9953 OpInfo.Type == InlineAsm::isInput) &&
9954 !TRI.isTypeLegalForClass(*RC, OpInfo.ConstraintVT)) {
9955 // Try to convert to the first EVT that the reg class contains. If the
9956 // types are identical size, use a bitcast to convert (e.g. two differing
9957 // vector types). Note: output bitcast is done at the end of
9958 // visitInlineAsm().
9959 if (RegVT.getSizeInBits() == OpInfo.ConstraintVT.getSizeInBits()) {
9960 // Exclude indirect inputs while they are unsupported because the code
9961 // to perform the load is missing and thus OpInfo.CallOperand still
9962 // refers to the input address rather than the pointed-to value.
9963 if (OpInfo.Type == InlineAsm::isInput && !OpInfo.isIndirect)
9964 OpInfo.CallOperand =
9965 DAG.getNode(ISD::BITCAST, DL, RegVT, OpInfo.CallOperand);
9966 OpInfo.ConstraintVT = RegVT;
9967 // If the operand is an FP value and we want it in integer registers,
9968 // use the corresponding integer type. This turns an f64 value into
9969 // i64, which can be passed with two i32 values on a 32-bit machine.
9970 } else if (RegVT.isInteger() && OpInfo.ConstraintVT.isFloatingPoint()) {
9971 MVT VT = MVT::getIntegerVT(OpInfo.ConstraintVT.getSizeInBits());
9972 if (OpInfo.Type == InlineAsm::isInput)
9973 OpInfo.CallOperand =
9974 DAG.getNode(ISD::BITCAST, DL, VT, OpInfo.CallOperand);
9975 OpInfo.ConstraintVT = VT;
9976 }
9977 }
9978 }
9979
9980 // No need to allocate a matching input constraint since the constraint it's
9981 // matching to has already been allocated.
9982 if (OpInfo.isMatchingInputConstraint())
9983 return std::nullopt;
9984
9985 EVT ValueVT = OpInfo.ConstraintVT;
9986 if (OpInfo.ConstraintVT == MVT::Other)
9987 ValueVT = RegVT;
9988
9989 // Initialize NumRegs.
9990 unsigned NumRegs = 1;
9991 if (OpInfo.ConstraintVT != MVT::Other)
9992 NumRegs = TLI.getNumRegisters(Context, OpInfo.ConstraintVT, RegVT);
9993
9994 // If this is a constraint for a specific physical register, like {r17},
9995 // assign it now.
9996
9997 // If this associated to a specific register, initialize iterator to correct
9998 // place. If virtual, make sure we have enough registers
9999
10000 // Initialize iterator if necessary
10003
10004 // Do not check for single registers.
10005 if (AssignedReg) {
10006 I = std::find(I, RC->end(), AssignedReg);
10007 if (I == RC->end()) {
10008 // RC does not contain the selected register, which indicates a
10009 // mismatch between the register and the required type/bitwidth.
10010 return {AssignedReg};
10011 }
10012 }
10013
10014 for (; NumRegs; --NumRegs, ++I) {
10015 assert(I != RC->end() && "Ran out of registers to allocate!");
10016 Register R = AssignedReg ? Register(*I) : RegInfo.createVirtualRegister(RC);
10017 Regs.push_back(R);
10018 }
10019
10020 OpInfo.AssignedRegs = RegsForValue(Regs, RegVT, ValueVT);
10021 return std::nullopt;
10022}
10023
10024static unsigned
10026 const std::vector<SDValue> &AsmNodeOperands) {
10027 // Scan until we find the definition we already emitted of this operand.
10028 unsigned CurOp = InlineAsm::Op_FirstOperand;
10029 for (; OperandNo; --OperandNo) {
10030 // Advance to the next operand.
10031 unsigned OpFlag = AsmNodeOperands[CurOp]->getAsZExtVal();
10032 const InlineAsm::Flag F(OpFlag);
10033 assert(
10034 (F.isRegDefKind() || F.isRegDefEarlyClobberKind() || F.isMemKind()) &&
10035 "Skipped past definitions?");
10036 CurOp += F.getNumOperandRegisters() + 1;
10037 }
10038 return CurOp;
10039}
10040
10041namespace {
10042
10043class ExtraFlags {
10044 unsigned Flags = 0;
10045
10046public:
10047 explicit ExtraFlags(const CallBase &Call) {
10048 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
10049 if (IA->hasSideEffects())
10051 if (IA->isAlignStack())
10053 if (Call.isConvergent())
10055 Flags |= IA->getDialect() * InlineAsm::Extra_AsmDialect;
10056 }
10057
10058 void update(const TargetLowering::AsmOperandInfo &OpInfo) {
10059 // Ideally, we would only check against memory constraints. However, the
10060 // meaning of an Other constraint can be target-specific and we can't easily
10061 // reason about it. Therefore, be conservative and set MayLoad/MayStore
10062 // for Other constraints as well.
10065 if (OpInfo.Type == InlineAsm::isInput)
10067 else if (OpInfo.Type == InlineAsm::isOutput)
10069 else if (OpInfo.Type == InlineAsm::isClobber)
10071 }
10072 }
10073
10074 unsigned get() const { return Flags; }
10075};
10076
10077} // end anonymous namespace
10078
10079static bool isFunction(SDValue Op) {
10080 if (Op && Op.getOpcode() == ISD::GlobalAddress) {
10081 if (auto *GA = dyn_cast<GlobalAddressSDNode>(Op)) {
10082 auto Fn = dyn_cast_or_null<Function>(GA->getGlobal());
10083
10084 // In normal "call dllimport func" instruction (non-inlineasm) it force
10085 // indirect access by specifing call opcode. And usually specially print
10086 // asm with indirect symbol (i.g: "*") according to opcode. Inline asm can
10087 // not do in this way now. (In fact, this is similar with "Data Access"
10088 // action). So here we ignore dllimport function.
10089 if (Fn && !Fn->hasDLLImportStorageClass())
10090 return true;
10091 }
10092 }
10093 return false;
10094}
10095
10096/// visitInlineAsm - Handle a call to an InlineAsm object.
10097void SelectionDAGBuilder::visitInlineAsm(const CallBase &Call,
10098 const BasicBlock *EHPadBB) {
10099 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
10100
10101 /// ConstraintOperands - Information about all of the constraints.
10102 SmallVector<SDISelAsmOperandInfo, 16> ConstraintOperands;
10103
10104 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10106 DAG.getDataLayout(), DAG.getSubtarget().getRegisterInfo(), Call);
10107
10108 // First Pass: Calculate HasSideEffects and ExtraFlags (AlignStack,
10109 // AsmDialect, MayLoad, MayStore).
10110 bool HasSideEffect = IA->hasSideEffects();
10111 ExtraFlags ExtraInfo(Call);
10112
10113 for (auto &T : TargetConstraints) {
10114 ConstraintOperands.push_back(SDISelAsmOperandInfo(T));
10115 SDISelAsmOperandInfo &OpInfo = ConstraintOperands.back();
10116
10117 if (OpInfo.CallOperandVal)
10118 OpInfo.CallOperand = getValue(OpInfo.CallOperandVal);
10119
10120 if (!HasSideEffect)
10121 HasSideEffect = OpInfo.hasMemory(TLI);
10122
10123 // Determine if this InlineAsm MayLoad or MayStore based on the constraints.
10124 // FIXME: Could we compute this on OpInfo rather than T?
10125
10126 // Compute the constraint code and ConstraintType to use.
10128
10129 if (T.ConstraintType == TargetLowering::C_Immediate &&
10130 OpInfo.CallOperand && !isa<ConstantSDNode>(OpInfo.CallOperand))
10131 // We've delayed emitting a diagnostic like the "n" constraint because
10132 // inlining could cause an integer showing up.
10133 return emitInlineAsmError(Call, "constraint '" + Twine(T.ConstraintCode) +
10134 "' expects an integer constant "
10135 "expression");
10136
10137 ExtraInfo.update(T);
10138 }
10139
10140 // We won't need to flush pending loads if this asm doesn't touch
10141 // memory and is nonvolatile.
10142 SDValue Glue, Chain = (HasSideEffect) ? getRoot() : DAG.getRoot();
10143
10144 bool EmitEHLabels = isa<InvokeInst>(Call);
10145 if (EmitEHLabels) {
10146 assert(EHPadBB && "InvokeInst must have an EHPadBB");
10147 }
10148 bool IsCallBr = isa<CallBrInst>(Call);
10149
10150 if (IsCallBr || EmitEHLabels) {
10151 // If this is a callbr or invoke we need to flush pending exports since
10152 // inlineasm_br and invoke are terminators.
10153 // We need to do this before nodes are glued to the inlineasm_br node.
10154 Chain = getControlRoot();
10155 }
10156
10157 MCSymbol *BeginLabel = nullptr;
10158 if (EmitEHLabels) {
10159 Chain = lowerStartEH(Chain, EHPadBB, BeginLabel);
10160 }
10161
10162 int OpNo = -1;
10163 SmallVector<StringRef> AsmStrs;
10164 IA->collectAsmStrs(AsmStrs);
10165
10166 // Second pass over the constraints: compute which constraint option to use.
10167 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
10168 if (OpInfo.hasArg() || OpInfo.Type == InlineAsm::isOutput)
10169 OpNo++;
10170
10171 // If this is an output operand with a matching input operand, look up the
10172 // matching input. If their types mismatch, e.g. one is an integer, the
10173 // other is floating point, or their sizes are different, flag it as an
10174 // error.
10175 if (OpInfo.hasMatchingInput()) {
10176 SDISelAsmOperandInfo &Input = ConstraintOperands[OpInfo.MatchingInput];
10177 patchMatchingInput(OpInfo, Input, DAG);
10178 }
10179
10180 // Compute the constraint code and ConstraintType to use.
10181 TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
10182
10183 if ((OpInfo.ConstraintType == TargetLowering::C_Memory &&
10184 OpInfo.Type == InlineAsm::isClobber) ||
10185 OpInfo.ConstraintType == TargetLowering::C_Address)
10186 continue;
10187
10188 // In Linux PIC model, there are 4 cases about value/label addressing:
10189 //
10190 // 1: Function call or Label jmp inside the module.
10191 // 2: Data access (such as global variable, static variable) inside module.
10192 // 3: Function call or Label jmp outside the module.
10193 // 4: Data access (such as global variable) outside the module.
10194 //
10195 // Due to current llvm inline asm architecture designed to not "recognize"
10196 // the asm code, there are quite troubles for us to treat mem addressing
10197 // differently for same value/adress used in different instuctions.
10198 // For example, in pic model, call a func may in plt way or direclty
10199 // pc-related, but lea/mov a function adress may use got.
10200 //
10201 // Here we try to "recognize" function call for the case 1 and case 3 in
10202 // inline asm. And try to adjust the constraint for them.
10203 //
10204 // TODO: Due to current inline asm didn't encourage to jmp to the outsider
10205 // label, so here we don't handle jmp function label now, but we need to
10206 // enhance it (especilly in PIC model) if we meet meaningful requirements.
10207 if (OpInfo.isIndirect && isFunction(OpInfo.CallOperand) &&
10208 TLI.isInlineAsmTargetBranch(AsmStrs, OpNo) &&
10209 TM.getCodeModel() != CodeModel::Large) {
10210 OpInfo.isIndirect = false;
10211 OpInfo.ConstraintType = TargetLowering::C_Address;
10212 }
10213
10214 // If this is a memory input, and if the operand is not indirect, do what we
10215 // need to provide an address for the memory input.
10216 if (OpInfo.ConstraintType == TargetLowering::C_Memory &&
10217 !OpInfo.isIndirect) {
10218 assert((OpInfo.isMultipleAlternative ||
10219 (OpInfo.Type == InlineAsm::isInput)) &&
10220 "Can only indirectify direct input operands!");
10221
10222 // Memory operands really want the address of the value.
10223 Chain = getAddressForMemoryInput(Chain, getCurSDLoc(), OpInfo, DAG);
10224
10225 // There is no longer a Value* corresponding to this operand.
10226 OpInfo.CallOperandVal = nullptr;
10227
10228 // It is now an indirect operand.
10229 OpInfo.isIndirect = true;
10230 }
10231
10232 }
10233
10234 // AsmNodeOperands - The operands for the ISD::INLINEASM node.
10235 std::vector<SDValue> AsmNodeOperands;
10236 AsmNodeOperands.push_back(SDValue()); // reserve space for input chain
10237 AsmNodeOperands.push_back(DAG.getTargetExternalSymbol(
10238 IA->getAsmString().data(), TLI.getProgramPointerTy(DAG.getDataLayout())));
10239
10240 // If we have a !srcloc metadata node associated with it, we want to attach
10241 // this to the ultimately generated inline asm machineinstr. To do this, we
10242 // pass in the third operand as this (potentially null) inline asm MDNode.
10243 const MDNode *SrcLoc = Call.getMetadata("srcloc");
10244 AsmNodeOperands.push_back(DAG.getMDNode(SrcLoc));
10245
10246 // Remember the HasSideEffect, AlignStack, AsmDialect, MayLoad and MayStore
10247 // bits as operand 3.
10248 AsmNodeOperands.push_back(DAG.getTargetConstant(
10249 ExtraInfo.get(), getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10250
10251 // Third pass: Loop over operands to prepare DAG-level operands.. As part of
10252 // this, assign virtual and physical registers for inputs and otput.
10253 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
10254 // Assign Registers.
10255 SDISelAsmOperandInfo &RefOpInfo =
10256 OpInfo.isMatchingInputConstraint()
10257 ? ConstraintOperands[OpInfo.getMatchedOperand()]
10258 : OpInfo;
10259 const auto RegError =
10260 getRegistersForValue(DAG, getCurSDLoc(), OpInfo, RefOpInfo);
10261 if (RegError) {
10262 const MachineFunction &MF = DAG.getMachineFunction();
10263 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
10264 const char *RegName = TRI.getName(*RegError);
10265 emitInlineAsmError(Call, "register '" + Twine(RegName) +
10266 "' allocated for constraint '" +
10267 Twine(OpInfo.ConstraintCode) +
10268 "' does not match required type");
10269 return;
10270 }
10271
10272 auto DetectWriteToReservedRegister = [&]() {
10273 const MachineFunction &MF = DAG.getMachineFunction();
10274 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
10275 for (Register Reg : OpInfo.AssignedRegs.Regs) {
10276 if (Reg.isPhysical() && TRI.isInlineAsmReadOnlyReg(MF, Reg)) {
10277 const char *RegName = TRI.getName(Reg);
10278 emitInlineAsmError(Call, "write to reserved register '" +
10279 Twine(RegName) + "'");
10280 return true;
10281 }
10282 }
10283 return false;
10284 };
10285 assert((OpInfo.ConstraintType != TargetLowering::C_Address ||
10286 (OpInfo.Type == InlineAsm::isInput &&
10287 !OpInfo.isMatchingInputConstraint())) &&
10288 "Only address as input operand is allowed.");
10289
10290 switch (OpInfo.Type) {
10292 if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
10293 const InlineAsm::ConstraintCode ConstraintID =
10294 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10296 "Failed to convert memory constraint code to constraint id.");
10297
10298 // Add information to the INLINEASM node to know about this output.
10299 InlineAsm::Flag OpFlags(InlineAsm::Kind::Mem, 1);
10300 OpFlags.setMemConstraint(ConstraintID);
10301 AsmNodeOperands.push_back(DAG.getTargetConstant(OpFlags, getCurSDLoc(),
10302 MVT::i32));
10303 AsmNodeOperands.push_back(OpInfo.CallOperand);
10304 } else {
10305 // Otherwise, this outputs to a register (directly for C_Register /
10306 // C_RegisterClass, and a target-defined fashion for
10307 // C_Immediate/C_Other). Find a register that we can use.
10308 if (OpInfo.AssignedRegs.Regs.empty()) {
10309 emitInlineAsmError(
10310 Call, "couldn't allocate output register for constraint '" +
10311 Twine(OpInfo.ConstraintCode) + "'");
10312 return;
10313 }
10314
10315 if (DetectWriteToReservedRegister())
10316 return;
10317
10318 // Add information to the INLINEASM node to know that this register is
10319 // set.
10320 OpInfo.AssignedRegs.AddInlineAsmOperands(
10321 OpInfo.isEarlyClobber ? InlineAsm::Kind::RegDefEarlyClobber
10323 false, 0, getCurSDLoc(), DAG, AsmNodeOperands);
10324 }
10325 break;
10326
10327 case InlineAsm::isInput:
10328 case InlineAsm::isLabel: {
10329 SDValue InOperandVal = OpInfo.CallOperand;
10330
10331 if (OpInfo.isMatchingInputConstraint()) {
10332 // If this is required to match an output register we have already set,
10333 // just use its register.
10334 auto CurOp = findMatchingInlineAsmOperand(OpInfo.getMatchedOperand(),
10335 AsmNodeOperands);
10336 InlineAsm::Flag Flag(AsmNodeOperands[CurOp]->getAsZExtVal());
10337 if (Flag.isRegDefKind() || Flag.isRegDefEarlyClobberKind()) {
10338 if (OpInfo.isIndirect) {
10339 // This happens on gcc/testsuite/gcc.dg/pr8788-1.c
10340 emitInlineAsmError(Call, "inline asm not supported yet: "
10341 "don't know how to handle tied "
10342 "indirect register inputs");
10343 return;
10344 }
10345
10347 MachineFunction &MF = DAG.getMachineFunction();
10348 MachineRegisterInfo &MRI = MF.getRegInfo();
10349 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
10350 auto *R = cast<RegisterSDNode>(AsmNodeOperands[CurOp+1]);
10351 Register TiedReg = R->getReg();
10352 MVT RegVT = R->getSimpleValueType(0);
10353 const TargetRegisterClass *RC =
10354 TiedReg.isVirtual() ? MRI.getRegClass(TiedReg)
10355 : RegVT != MVT::Untyped ? TLI.getRegClassFor(RegVT)
10356 : TRI.getMinimalPhysRegClass(TiedReg);
10357 for (unsigned i = 0, e = Flag.getNumOperandRegisters(); i != e; ++i)
10358 Regs.push_back(MRI.createVirtualRegister(RC));
10359
10360 RegsForValue MatchedRegs(Regs, RegVT, InOperandVal.getValueType());
10361
10362 SDLoc dl = getCurSDLoc();
10363 // Use the produced MatchedRegs object to
10364 MatchedRegs.getCopyToRegs(InOperandVal, DAG, dl, Chain, &Glue, &Call);
10365 MatchedRegs.AddInlineAsmOperands(InlineAsm::Kind::RegUse, true,
10366 OpInfo.getMatchedOperand(), dl, DAG,
10367 AsmNodeOperands);
10368 break;
10369 }
10370
10371 assert(Flag.isMemKind() && "Unknown matching constraint!");
10372 assert(Flag.getNumOperandRegisters() == 1 &&
10373 "Unexpected number of operands");
10374 // Add information to the INLINEASM node to know about this input.
10375 // See InlineAsm.h isUseOperandTiedToDef.
10376 Flag.clearMemConstraint();
10377 Flag.setMatchingOp(OpInfo.getMatchedOperand());
10378 AsmNodeOperands.push_back(DAG.getTargetConstant(
10379 Flag, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10380 AsmNodeOperands.push_back(AsmNodeOperands[CurOp+1]);
10381 break;
10382 }
10383
10384 // Treat indirect 'X' constraint as memory.
10385 if (OpInfo.ConstraintType == TargetLowering::C_Other &&
10386 OpInfo.isIndirect)
10387 OpInfo.ConstraintType = TargetLowering::C_Memory;
10388
10389 if (OpInfo.ConstraintType == TargetLowering::C_Immediate ||
10390 OpInfo.ConstraintType == TargetLowering::C_Other) {
10391 std::vector<SDValue> Ops;
10392 TLI.LowerAsmOperandForConstraint(InOperandVal, OpInfo.ConstraintCode,
10393 Ops, DAG);
10394 if (Ops.empty()) {
10395 if (OpInfo.ConstraintType == TargetLowering::C_Immediate)
10396 if (isa<ConstantSDNode>(InOperandVal)) {
10397 emitInlineAsmError(Call, "value out of range for constraint '" +
10398 Twine(OpInfo.ConstraintCode) + "'");
10399 return;
10400 }
10401
10402 emitInlineAsmError(Call,
10403 "invalid operand for inline asm constraint '" +
10404 Twine(OpInfo.ConstraintCode) + "'");
10405 return;
10406 }
10407
10408 // Add information to the INLINEASM node to know about this input.
10409 InlineAsm::Flag ResOpType(InlineAsm::Kind::Imm, Ops.size());
10410 AsmNodeOperands.push_back(DAG.getTargetConstant(
10411 ResOpType, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));
10412 llvm::append_range(AsmNodeOperands, Ops);
10413 break;
10414 }
10415
10416 if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
10417 assert((OpInfo.isIndirect ||
10418 OpInfo.ConstraintType != TargetLowering::C_Memory) &&
10419 "Operand must be indirect to be a mem!");
10420 assert(InOperandVal.getValueType() ==
10421 TLI.getPointerTy(DAG.getDataLayout()) &&
10422 "Memory operands expect pointer values");
10423
10424 const InlineAsm::ConstraintCode ConstraintID =
10425 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10427 "Failed to convert memory constraint code to constraint id.");
10428
10429 // Add information to the INLINEASM node to know about this input.
10430 InlineAsm::Flag ResOpType(InlineAsm::Kind::Mem, 1);
10431 ResOpType.setMemConstraint(ConstraintID);
10432 AsmNodeOperands.push_back(DAG.getTargetConstant(ResOpType,
10433 getCurSDLoc(),
10434 MVT::i32));
10435 AsmNodeOperands.push_back(InOperandVal);
10436 break;
10437 }
10438
10439 if (OpInfo.ConstraintType == TargetLowering::C_Address) {
10440 const InlineAsm::ConstraintCode ConstraintID =
10441 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10443 "Failed to convert memory constraint code to constraint id.");
10444
10445 InlineAsm::Flag ResOpType(InlineAsm::Kind::Mem, 1);
10446
10447 SDValue AsmOp = InOperandVal;
10448 if (isFunction(InOperandVal)) {
10449 auto *GA = cast<GlobalAddressSDNode>(InOperandVal);
10450 ResOpType = InlineAsm::Flag(InlineAsm::Kind::Func, 1);
10451 AsmOp = DAG.getTargetGlobalAddress(GA->getGlobal(), getCurSDLoc(),
10452 InOperandVal.getValueType(),
10453 GA->getOffset());
10454 }
10455
10456 // Add information to the INLINEASM node to know about this input.
10457 ResOpType.setMemConstraint(ConstraintID);
10458
10459 AsmNodeOperands.push_back(
10460 DAG.getTargetConstant(ResOpType, getCurSDLoc(), MVT::i32));
10461
10462 AsmNodeOperands.push_back(AsmOp);
10463 break;
10464 }
10465
10466 if (OpInfo.ConstraintType != TargetLowering::C_RegisterClass &&
10467 OpInfo.ConstraintType != TargetLowering::C_Register) {
10468 emitInlineAsmError(Call, "unknown asm constraint '" +
10469 Twine(OpInfo.ConstraintCode) + "'");
10470 return;
10471 }
10472
10473 // TODO: Support this.
10474 if (OpInfo.isIndirect) {
10475 emitInlineAsmError(
10476 Call, "Don't know how to handle indirect register inputs yet "
10477 "for constraint '" +
10478 Twine(OpInfo.ConstraintCode) + "'");
10479 return;
10480 }
10481
10482 // Copy the input into the appropriate registers.
10483 if (OpInfo.AssignedRegs.Regs.empty()) {
10484 emitInlineAsmError(Call,
10485 "couldn't allocate input reg for constraint '" +
10486 Twine(OpInfo.ConstraintCode) + "'");
10487 return;
10488 }
10489
10490 if (DetectWriteToReservedRegister())
10491 return;
10492
10493 SDLoc dl = getCurSDLoc();
10494
10495 OpInfo.AssignedRegs.getCopyToRegs(InOperandVal, DAG, dl, Chain, &Glue,
10496 &Call);
10497
10498 OpInfo.AssignedRegs.AddInlineAsmOperands(InlineAsm::Kind::RegUse, false,
10499 0, dl, DAG, AsmNodeOperands);
10500 break;
10501 }
10503 // Add the clobbered value to the operand list, so that the register
10504 // allocator is aware that the physreg got clobbered.
10505 if (!OpInfo.AssignedRegs.Regs.empty())
10507 false, 0, getCurSDLoc(), DAG,
10508 AsmNodeOperands);
10509 break;
10510 }
10511 }
10512
10513 // Finish up input operands. Set the input chain and add the flag last.
10514 AsmNodeOperands[InlineAsm::Op_InputChain] = Chain;
10515 if (Glue.getNode()) AsmNodeOperands.push_back(Glue);
10516
10517 unsigned ISDOpc = IsCallBr ? ISD::INLINEASM_BR : ISD::INLINEASM;
10518 Chain = DAG.getNode(ISDOpc, getCurSDLoc(),
10519 DAG.getVTList(MVT::Other, MVT::Glue), AsmNodeOperands);
10520 Glue = Chain.getValue(1);
10521
10522 // Do additional work to generate outputs.
10523
10524 SmallVector<EVT, 1> ResultVTs;
10525 SmallVector<SDValue, 1> ResultValues;
10526 SmallVector<SDValue, 8> OutChains;
10527
10528 llvm::Type *CallResultType = Call.getType();
10529 ArrayRef<Type *> ResultTypes;
10530 if (StructType *StructResult = dyn_cast<StructType>(CallResultType))
10531 ResultTypes = StructResult->elements();
10532 else if (!CallResultType->isVoidTy())
10533 ResultTypes = ArrayRef(CallResultType);
10534
10535 auto CurResultType = ResultTypes.begin();
10536 auto handleRegAssign = [&](SDValue V) {
10537 assert(CurResultType != ResultTypes.end() && "Unexpected value");
10538 assert((*CurResultType)->isSized() && "Unexpected unsized type");
10539 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), *CurResultType);
10540 ++CurResultType;
10541 // If the type of the inline asm call site return value is different but has
10542 // same size as the type of the asm output bitcast it. One example of this
10543 // is for vectors with different width / number of elements. This can
10544 // happen for register classes that can contain multiple different value
10545 // types. The preg or vreg allocated may not have the same VT as was
10546 // expected.
10547 //
10548 // This can also happen for a return value that disagrees with the register
10549 // class it is put in, eg. a double in a general-purpose register on a
10550 // 32-bit machine.
10551 if (ResultVT != V.getValueType() &&
10552 ResultVT.getSizeInBits() == V.getValueSizeInBits())
10553 V = DAG.getNode(ISD::BITCAST, getCurSDLoc(), ResultVT, V);
10554 else if (ResultVT != V.getValueType() && ResultVT.isInteger() &&
10555 V.getValueType().isInteger()) {
10556 // If a result value was tied to an input value, the computed result
10557 // may have a wider width than the expected result. Extract the
10558 // relevant portion.
10559 V = DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), ResultVT, V);
10560 }
10561 assert(ResultVT == V.getValueType() && "Asm result value mismatch!");
10562 ResultVTs.push_back(ResultVT);
10563 ResultValues.push_back(V);
10564 };
10565
10566 // Deal with output operands.
10567 for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
10568 if (OpInfo.Type == InlineAsm::isOutput) {
10569 SDValue Val;
10570 // Skip trivial output operands.
10571 if (OpInfo.AssignedRegs.Regs.empty())
10572 continue;
10573
10574 switch (OpInfo.ConstraintType) {
10577 Val = OpInfo.AssignedRegs.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(),
10578 Chain, &Glue, &Call);
10579 break;
10582 Val = TLI.LowerAsmOutputForConstraint(Chain, Glue, getCurSDLoc(),
10583 OpInfo, DAG);
10584 break;
10586 break; // Already handled.
10588 break; // Silence warning.
10590 assert(false && "Unexpected unknown constraint");
10591 }
10592
10593 // Indirect output manifest as stores. Record output chains.
10594 if (OpInfo.isIndirect) {
10595 const Value *Ptr = OpInfo.CallOperandVal;
10596 assert(Ptr && "Expected value CallOperandVal for indirect asm operand");
10597 SDValue Store = DAG.getStore(Chain, getCurSDLoc(), Val, getValue(Ptr),
10598 MachinePointerInfo(Ptr));
10599 OutChains.push_back(Store);
10600 } else {
10601 // generate CopyFromRegs to associated registers.
10602 assert(!Call.getType()->isVoidTy() && "Bad inline asm!");
10603 if (Val.getOpcode() == ISD::MERGE_VALUES) {
10604 for (const SDValue &V : Val->op_values())
10605 handleRegAssign(V);
10606 } else
10607 handleRegAssign(Val);
10608 }
10609 }
10610 }
10611
10612 // Set results.
10613 if (!ResultValues.empty()) {
10614 assert(CurResultType == ResultTypes.end() &&
10615 "Mismatch in number of ResultTypes");
10616 assert(ResultValues.size() == ResultTypes.size() &&
10617 "Mismatch in number of output operands in asm result");
10618
10620 DAG.getVTList(ResultVTs), ResultValues);
10621 setValue(&Call, V);
10622 }
10623
10624 // Collect store chains.
10625 if (!OutChains.empty())
10626 Chain = DAG.getNode(ISD::TokenFactor, getCurSDLoc(), MVT::Other, OutChains);
10627
10628 if (EmitEHLabels) {
10629 Chain = lowerEndEH(Chain, cast<InvokeInst>(&Call), EHPadBB, BeginLabel);
10630 }
10631
10632 // Only Update Root if inline assembly has a memory effect.
10633 if (ResultValues.empty() || HasSideEffect || !OutChains.empty() || IsCallBr ||
10634 EmitEHLabels)
10635 DAG.setRoot(Chain);
10636}
10637
10638void SelectionDAGBuilder::emitInlineAsmError(const CallBase &Call,
10639 const Twine &Message) {
10640 LLVMContext &Ctx = *DAG.getContext();
10641 Ctx.diagnose(DiagnosticInfoInlineAsm(Call, Message));
10642
10643 // Make sure we leave the DAG in a valid state
10644 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10645 SmallVector<EVT, 1> ValueVTs;
10646 ComputeValueVTs(TLI, DAG.getDataLayout(), Call.getType(), ValueVTs);
10647
10648 if (ValueVTs.empty())
10649 return;
10650
10652 for (const EVT &VT : ValueVTs)
10653 Ops.push_back(DAG.getUNDEF(VT));
10654
10655 setValue(&Call, DAG.getMergeValues(Ops, getCurSDLoc()));
10656}
10657
10658void SelectionDAGBuilder::visitVAStart(const CallInst &I) {
10659 DAG.setRoot(DAG.getNode(ISD::VASTART, getCurSDLoc(),
10660 MVT::Other, getRoot(),
10661 getValue(I.getArgOperand(0)),
10662 DAG.getSrcValue(I.getArgOperand(0))));
10663}
10664
10665void SelectionDAGBuilder::visitVAArg(const VAArgInst &I) {
10666 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10667 const DataLayout &DL = DAG.getDataLayout();
10668 SDValue V = DAG.getVAArg(
10669 TLI.getMemValueType(DAG.getDataLayout(), I.getType()), getCurSDLoc(),
10670 getRoot(), getValue(I.getOperand(0)), DAG.getSrcValue(I.getOperand(0)),
10671 DL.getABITypeAlign(I.getType()).value());
10672 DAG.setRoot(V.getValue(1));
10673
10674 if (I.getType()->isPointerTy())
10675 V = DAG.getPtrExtOrTrunc(
10676 V, getCurSDLoc(), TLI.getValueType(DAG.getDataLayout(), I.getType()));
10677 setValue(&I, V);
10678}
10679
10680void SelectionDAGBuilder::visitVAEnd(const CallInst &I) {
10681 DAG.setRoot(DAG.getNode(ISD::VAEND, getCurSDLoc(),
10682 MVT::Other, getRoot(),
10683 getValue(I.getArgOperand(0)),
10684 DAG.getSrcValue(I.getArgOperand(0))));
10685}
10686
10687void SelectionDAGBuilder::visitVACopy(const CallInst &I) {
10688 DAG.setRoot(DAG.getNode(ISD::VACOPY, getCurSDLoc(),
10689 MVT::Other, getRoot(),
10690 getValue(I.getArgOperand(0)),
10691 getValue(I.getArgOperand(1)),
10692 DAG.getSrcValue(I.getArgOperand(0)),
10693 DAG.getSrcValue(I.getArgOperand(1))));
10694}
10695
10697 const Instruction &I,
10698 SDValue Op) {
10699 std::optional<ConstantRange> CR = getRange(I);
10700
10701 if (!CR || CR->isFullSet() || CR->isEmptySet() || CR->isUpperWrapped())
10702 return Op;
10703
10704 APInt Lo = CR->getUnsignedMin();
10705 if (!Lo.isMinValue())
10706 return Op;
10707
10708 APInt Hi = CR->getUnsignedMax();
10709 unsigned Bits = std::max(Hi.getActiveBits(),
10710 static_cast<unsigned>(IntegerType::MIN_INT_BITS));
10711
10712 EVT SmallVT = EVT::getIntegerVT(*DAG.getContext(), Bits);
10713
10714 SDLoc SL = getCurSDLoc();
10715
10716 SDValue ZExt = DAG.getNode(ISD::AssertZext, SL, Op.getValueType(), Op,
10717 DAG.getValueType(SmallVT));
10718 unsigned NumVals = Op.getNode()->getNumValues();
10719 if (NumVals == 1)
10720 return ZExt;
10721
10723
10724 Ops.push_back(ZExt);
10725 for (unsigned I = 1; I != NumVals; ++I)
10726 Ops.push_back(Op.getValue(I));
10727
10728 return DAG.getMergeValues(Ops, SL);
10729}
10730
10732 SelectionDAG &DAG, const Instruction &I, SDValue Op) {
10733 FPClassTest Classes = getNoFPClass(I);
10734 if (Classes == fcNone)
10735 return Op;
10736
10737 return DAG.getNode(ISD::AssertNoFPClass, SDLoc(Op), Op.getValueType(), Op,
10738 DAG.getTargetConstant(Classes, SDLoc(), MVT::i32));
10739}
10740
10741/// Populate a CallLowerinInfo (into \p CLI) based on the properties of
10742/// the call being lowered.
10743///
10744/// This is a helper for lowering intrinsics that follow a target calling
10745/// convention or require stack pointer adjustment. Only a subset of the
10746/// intrinsic's operands need to participate in the calling convention.
10749 unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy,
10750 AttributeSet RetAttrs, bool IsPatchPoint) {
10752 Args.reserve(NumArgs);
10753
10754 // Populate the argument list.
10755 // Attributes for args start at offset 1, after the return attribute.
10756 for (unsigned ArgI = ArgIdx, ArgE = ArgIdx + NumArgs;
10757 ArgI != ArgE; ++ArgI) {
10758 const Value *V = Call->getOperand(ArgI);
10759
10760 assert(!V->getType()->isEmptyTy() && "Empty type passed to intrinsic.");
10761
10762 TargetLowering::ArgListEntry Entry(getValue(V), V->getType());
10763 Entry.setAttributes(Call, ArgI);
10764 Args.push_back(Entry);
10765 }
10766
10768 .setChain(getRoot())
10769 .setCallee(Call->getCallingConv(), ReturnTy, Callee, std::move(Args),
10770 RetAttrs)
10771 .setDiscardResult(Call->use_empty())
10772 .setIsPatchPoint(IsPatchPoint)
10774 Call->countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0);
10775}
10776
10777/// Add a stack map intrinsic call's live variable operands to a stackmap
10778/// or patchpoint target node's operand list.
10779///
10780/// Constants are converted to TargetConstants purely as an optimization to
10781/// avoid constant materialization and register allocation.
10782///
10783/// FrameIndex operands are converted to TargetFrameIndex so that ISEL does not
10784/// generate addess computation nodes, and so FinalizeISel can convert the
10785/// TargetFrameIndex into a DirectMemRefOp StackMap location. This avoids
10786/// address materialization and register allocation, but may also be required
10787/// for correctness. If a StackMap (or PatchPoint) intrinsic directly uses an
10788/// alloca in the entry block, then the runtime may assume that the alloca's
10789/// StackMap location can be read immediately after compilation and that the
10790/// location is valid at any point during execution (this is similar to the
10791/// assumption made by the llvm.gcroot intrinsic). If the alloca's location were
10792/// only available in a register, then the runtime would need to trap when
10793/// execution reaches the StackMap in order to read the alloca's location.
10794static void addStackMapLiveVars(const CallBase &Call, unsigned StartIdx,
10796 SelectionDAGBuilder &Builder) {
10797 SelectionDAG &DAG = Builder.DAG;
10798 for (unsigned I = StartIdx; I < Call.arg_size(); I++) {
10799 SDValue Op = Builder.getValue(Call.getArgOperand(I));
10800
10801 // Things on the stack are pointer-typed, meaning that they are already
10802 // legal and can be emitted directly to target nodes.
10804 Ops.push_back(DAG.getTargetFrameIndex(FI->getIndex(), Op.getValueType()));
10805 } else {
10806 // Otherwise emit a target independent node to be legalised.
10807 Ops.push_back(Builder.getValue(Call.getArgOperand(I)));
10808 }
10809 }
10810}
10811
10812/// Lower llvm.experimental.stackmap.
10813void SelectionDAGBuilder::visitStackmap(const CallInst &CI) {
10814 // void @llvm.experimental.stackmap(i64 <id>, i32 <numShadowBytes>,
10815 // [live variables...])
10816
10817 assert(CI.getType()->isVoidTy() && "Stackmap cannot return a value.");
10818
10819 SDValue Chain, InGlue, Callee;
10821
10822 SDLoc DL = getCurSDLoc();
10824
10825 // The stackmap intrinsic only records the live variables (the arguments
10826 // passed to it) and emits NOPS (if requested). Unlike the patchpoint
10827 // intrinsic, this won't be lowered to a function call. This means we don't
10828 // have to worry about calling conventions and target specific lowering code.
10829 // Instead we perform the call lowering right here.
10830 //
10831 // chain, flag = CALLSEQ_START(chain, 0, 0)
10832 // chain, flag = STACKMAP(id, nbytes, ..., chain, flag)
10833 // chain, flag = CALLSEQ_END(chain, 0, 0, flag)
10834 //
10835 Chain = DAG.getCALLSEQ_START(getRoot(), 0, 0, DL);
10836 InGlue = Chain.getValue(1);
10837
10838 // Add the STACKMAP operands, starting with DAG house-keeping.
10839 Ops.push_back(Chain);
10840 Ops.push_back(InGlue);
10841
10842 // Add the <id>, <numShadowBytes> operands.
10843 //
10844 // These do not require legalisation, and can be emitted directly to target
10845 // constant nodes.
10847 assert(ID.getValueType() == MVT::i64);
10848 SDValue IDConst =
10849 DAG.getTargetConstant(ID->getAsZExtVal(), DL, ID.getValueType());
10850 Ops.push_back(IDConst);
10851
10852 SDValue Shad = getValue(CI.getArgOperand(1));
10853 assert(Shad.getValueType() == MVT::i32);
10854 SDValue ShadConst =
10855 DAG.getTargetConstant(Shad->getAsZExtVal(), DL, Shad.getValueType());
10856 Ops.push_back(ShadConst);
10857
10858 // Add the live variables.
10859 addStackMapLiveVars(CI, 2, DL, Ops, *this);
10860
10861 // Create the STACKMAP node.
10862 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
10863 Chain = DAG.getNode(ISD::STACKMAP, DL, NodeTys, Ops);
10864 InGlue = Chain.getValue(1);
10865
10866 Chain = DAG.getCALLSEQ_END(Chain, 0, 0, InGlue, DL);
10867
10868 // Stackmaps don't generate values, so nothing goes into the NodeMap.
10869
10870 // Set the root to the target-lowered call chain.
10871 DAG.setRoot(Chain);
10872
10873 // Inform the Frame Information that we have a stackmap in this function.
10874 FuncInfo.MF->getFrameInfo().setHasStackMap();
10875}
10876
10877/// Lower llvm.experimental.patchpoint directly to its target opcode.
10878void SelectionDAGBuilder::visitPatchpoint(const CallBase &CB,
10879 const BasicBlock *EHPadBB) {
10880 // <ty> @llvm.experimental.patchpoint.<ty>(i64 <id>,
10881 // i32 <numBytes>,
10882 // i8* <target>,
10883 // i32 <numArgs>,
10884 // [Args...],
10885 // [live variables...])
10886
10888 bool IsAnyRegCC = CC == CallingConv::AnyReg;
10889 bool HasDef = !CB.getType()->isVoidTy();
10890 SDLoc dl = getCurSDLoc();
10892
10893 // Handle immediate and symbolic callees.
10894 if (auto* ConstCallee = dyn_cast<ConstantSDNode>(Callee))
10895 Callee = DAG.getIntPtrConstant(ConstCallee->getZExtValue(), dl,
10896 /*isTarget=*/true);
10897 else if (auto* SymbolicCallee = dyn_cast<GlobalAddressSDNode>(Callee))
10898 Callee = DAG.getTargetGlobalAddress(SymbolicCallee->getGlobal(),
10899 SDLoc(SymbolicCallee),
10900 SymbolicCallee->getValueType(0));
10901
10902 // Get the real number of arguments participating in the call <numArgs>
10904 unsigned NumArgs = NArgVal->getAsZExtVal();
10905
10906 // Skip the four meta args: <id>, <numNopBytes>, <target>, <numArgs>
10907 // Intrinsics include all meta-operands up to but not including CC.
10908 unsigned NumMetaOpers = PatchPointOpers::CCPos;
10909 assert(CB.arg_size() >= NumMetaOpers + NumArgs &&
10910 "Not enough arguments provided to the patchpoint intrinsic");
10911
10912 // For AnyRegCC the arguments are lowered later on manually.
10913 unsigned NumCallArgs = IsAnyRegCC ? 0 : NumArgs;
10914 Type *ReturnTy =
10915 IsAnyRegCC ? Type::getVoidTy(*DAG.getContext()) : CB.getType();
10916
10917 TargetLowering::CallLoweringInfo CLI(DAG);
10918 populateCallLoweringInfo(CLI, &CB, NumMetaOpers, NumCallArgs, Callee,
10919 ReturnTy, CB.getAttributes().getRetAttrs(), true);
10920 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
10921
10922 SDNode *CallEnd = Result.second.getNode();
10923 if (CallEnd->getOpcode() == ISD::EH_LABEL)
10924 CallEnd = CallEnd->getOperand(0).getNode();
10925 if (HasDef && (CallEnd->getOpcode() == ISD::CopyFromReg))
10926 CallEnd = CallEnd->getOperand(0).getNode();
10927
10928 /// Get a call instruction from the call sequence chain.
10929 /// Tail calls are not allowed.
10930 assert(CallEnd->getOpcode() == ISD::CALLSEQ_END &&
10931 "Expected a callseq node.");
10932 SDNode *Call = CallEnd->getOperand(0).getNode();
10933 bool HasGlue = Call->getGluedNode();
10934
10935 // Replace the target specific call node with the patchable intrinsic.
10937
10938 // Push the chain.
10939 Ops.push_back(*(Call->op_begin()));
10940
10941 // Optionally, push the glue (if any).
10942 if (HasGlue)
10943 Ops.push_back(*(Call->op_end() - 1));
10944
10945 // Push the register mask info.
10946 if (HasGlue)
10947 Ops.push_back(*(Call->op_end() - 2));
10948 else
10949 Ops.push_back(*(Call->op_end() - 1));
10950
10951 // Add the <id> and <numBytes> constants.
10953 Ops.push_back(DAG.getTargetConstant(IDVal->getAsZExtVal(), dl, MVT::i64));
10955 Ops.push_back(DAG.getTargetConstant(NBytesVal->getAsZExtVal(), dl, MVT::i32));
10956
10957 // Add the callee.
10958 Ops.push_back(Callee);
10959
10960 // Adjust <numArgs> to account for any arguments that have been passed on the
10961 // stack instead.
10962 // Call Node: Chain, Target, {Args}, RegMask, [Glue]
10963 unsigned NumCallRegArgs = Call->getNumOperands() - (HasGlue ? 4 : 3);
10964 NumCallRegArgs = IsAnyRegCC ? NumArgs : NumCallRegArgs;
10965 Ops.push_back(DAG.getTargetConstant(NumCallRegArgs, dl, MVT::i32));
10966
10967 // Add the calling convention
10968 Ops.push_back(DAG.getTargetConstant((unsigned)CC, dl, MVT::i32));
10969
10970 // Add the arguments we omitted previously. The register allocator should
10971 // place these in any free register.
10972 if (IsAnyRegCC)
10973 for (unsigned i = NumMetaOpers, e = NumMetaOpers + NumArgs; i != e; ++i)
10974 Ops.push_back(getValue(CB.getArgOperand(i)));
10975
10976 // Push the arguments from the call instruction.
10977 SDNode::op_iterator e = HasGlue ? Call->op_end()-2 : Call->op_end()-1;
10978 Ops.append(Call->op_begin() + 2, e);
10979
10980 // Push live variables for the stack map.
10981 addStackMapLiveVars(CB, NumMetaOpers + NumArgs, dl, Ops, *this);
10982
10983 SDVTList NodeTys;
10984 if (IsAnyRegCC && HasDef) {
10985 // Create the return types based on the intrinsic definition
10986 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10987 SmallVector<EVT, 3> ValueVTs;
10988 ComputeValueVTs(TLI, DAG.getDataLayout(), CB.getType(), ValueVTs);
10989 assert(ValueVTs.size() == 1 && "Expected only one return value type.");
10990
10991 // There is always a chain and a glue type at the end
10992 ValueVTs.push_back(MVT::Other);
10993 ValueVTs.push_back(MVT::Glue);
10994 NodeTys = DAG.getVTList(ValueVTs);
10995 } else
10996 NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
10997
10998 // Replace the target specific call node with a PATCHPOINT node.
10999 SDValue PPV = DAG.getNode(ISD::PATCHPOINT, dl, NodeTys, Ops);
11000
11001 // Update the NodeMap.
11002 if (HasDef) {
11003 if (IsAnyRegCC)
11004 setValue(&CB, SDValue(PPV.getNode(), 0));
11005 else
11006 setValue(&CB, Result.first);
11007 }
11008
11009 // Fixup the consumers of the intrinsic. The chain and glue may be used in the
11010 // call sequence. Furthermore the location of the chain and glue can change
11011 // when the AnyReg calling convention is used and the intrinsic returns a
11012 // value.
11013 if (IsAnyRegCC && HasDef) {
11014 SDValue From[] = {SDValue(Call, 0), SDValue(Call, 1)};
11015 SDValue To[] = {PPV.getValue(1), PPV.getValue(2)};
11016 DAG.ReplaceAllUsesOfValuesWith(From, To, 2);
11017 } else
11018 DAG.ReplaceAllUsesWith(Call, PPV.getNode());
11019 DAG.DeleteNode(Call);
11020
11021 // Inform the Frame Information that we have a patchpoint in this function.
11022 FuncInfo.MF->getFrameInfo().setHasPatchPoint();
11023}
11024
11025void SelectionDAGBuilder::visitVectorReduce(const CallInst &I,
11026 unsigned Intrinsic) {
11027 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11028 SDValue Op1 = getValue(I.getArgOperand(0));
11029 SDValue Op2;
11030 if (I.arg_size() > 1)
11031 Op2 = getValue(I.getArgOperand(1));
11032 SDLoc dl = getCurSDLoc();
11033 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
11034 SDValue Res;
11035 SDNodeFlags SDFlags;
11036 if (auto *FPMO = dyn_cast<FPMathOperator>(&I))
11037 SDFlags.copyFMF(*FPMO);
11038
11039 switch (Intrinsic) {
11040 case Intrinsic::vector_reduce_fadd:
11041 if (SDFlags.hasAllowReassociation())
11042 Res = DAG.getNode(ISD::FADD, dl, VT, Op1,
11043 DAG.getNode(ISD::VECREDUCE_FADD, dl, VT, Op2, SDFlags),
11044 SDFlags);
11045 else
11046 Res = DAG.getNode(ISD::VECREDUCE_SEQ_FADD, dl, VT, Op1, Op2, SDFlags);
11047 break;
11048 case Intrinsic::vector_reduce_fmul:
11049 if (SDFlags.hasAllowReassociation())
11050 Res = DAG.getNode(ISD::FMUL, dl, VT, Op1,
11051 DAG.getNode(ISD::VECREDUCE_FMUL, dl, VT, Op2, SDFlags),
11052 SDFlags);
11053 else
11054 Res = DAG.getNode(ISD::VECREDUCE_SEQ_FMUL, dl, VT, Op1, Op2, SDFlags);
11055 break;
11056 case Intrinsic::vector_reduce_add:
11057 Res = DAG.getNode(ISD::VECREDUCE_ADD, dl, VT, Op1);
11058 break;
11059 case Intrinsic::vector_reduce_mul:
11060 Res = DAG.getNode(ISD::VECREDUCE_MUL, dl, VT, Op1);
11061 break;
11062 case Intrinsic::vector_reduce_and:
11063 Res = DAG.getNode(ISD::VECREDUCE_AND, dl, VT, Op1);
11064 break;
11065 case Intrinsic::vector_reduce_or:
11066 Res = DAG.getNode(ISD::VECREDUCE_OR, dl, VT, Op1);
11067 break;
11068 case Intrinsic::vector_reduce_xor:
11069 Res = DAG.getNode(ISD::VECREDUCE_XOR, dl, VT, Op1);
11070 break;
11071 case Intrinsic::vector_reduce_smax:
11072 Res = DAG.getNode(ISD::VECREDUCE_SMAX, dl, VT, Op1);
11073 break;
11074 case Intrinsic::vector_reduce_smin:
11075 Res = DAG.getNode(ISD::VECREDUCE_SMIN, dl, VT, Op1);
11076 break;
11077 case Intrinsic::vector_reduce_umax:
11078 Res = DAG.getNode(ISD::VECREDUCE_UMAX, dl, VT, Op1);
11079 break;
11080 case Intrinsic::vector_reduce_umin:
11081 Res = DAG.getNode(ISD::VECREDUCE_UMIN, dl, VT, Op1);
11082 break;
11083 case Intrinsic::vector_reduce_fmax:
11084 Res = DAG.getNode(ISD::VECREDUCE_FMAX, dl, VT, Op1, SDFlags);
11085 break;
11086 case Intrinsic::vector_reduce_fmin:
11087 Res = DAG.getNode(ISD::VECREDUCE_FMIN, dl, VT, Op1, SDFlags);
11088 break;
11089 case Intrinsic::vector_reduce_fmaximum:
11090 Res = DAG.getNode(ISD::VECREDUCE_FMAXIMUM, dl, VT, Op1, SDFlags);
11091 break;
11092 case Intrinsic::vector_reduce_fminimum:
11093 Res = DAG.getNode(ISD::VECREDUCE_FMINIMUM, dl, VT, Op1, SDFlags);
11094 break;
11095 default:
11096 llvm_unreachable("Unhandled vector reduce intrinsic");
11097 }
11098 setValue(&I, Res);
11099}
11100
11101/// Returns an AttributeList representing the attributes applied to the return
11102/// value of the given call.
11105 if (CLI.RetSExt)
11106 Attrs.push_back(Attribute::SExt);
11107 if (CLI.RetZExt)
11108 Attrs.push_back(Attribute::ZExt);
11109 if (CLI.IsInReg)
11110 Attrs.push_back(Attribute::InReg);
11111
11112 return AttributeList::get(CLI.RetTy->getContext(), AttributeList::ReturnIndex,
11113 Attrs);
11114}
11115
11116/// TargetLowering::LowerCallTo - This is the default LowerCallTo
11117/// implementation, which just calls LowerCall.
11118/// FIXME: When all targets are
11119/// migrated to using LowerCall, this hook should be integrated into SDISel.
11120std::pair<SDValue, SDValue>
11122 LLVMContext &Context = CLI.RetTy->getContext();
11123
11124 // Handle the incoming return values from the call.
11125 CLI.Ins.clear();
11126 SmallVector<Type *, 4> RetOrigTys;
11128 auto &DL = CLI.DAG.getDataLayout();
11129 ComputeValueTypes(DL, CLI.OrigRetTy, RetOrigTys, &Offsets);
11130
11131 SmallVector<EVT, 4> RetVTs;
11132 if (CLI.RetTy != CLI.OrigRetTy) {
11133 assert(RetOrigTys.size() == 1 &&
11134 "Only supported for non-aggregate returns");
11135 RetVTs.push_back(getValueType(DL, CLI.RetTy));
11136 } else {
11137 for (Type *Ty : RetOrigTys)
11138 RetVTs.push_back(getValueType(DL, Ty));
11139 }
11140
11141 if (CLI.IsPostTypeLegalization) {
11142 // If we are lowering a libcall after legalization, split the return type.
11143 SmallVector<Type *, 4> OldRetOrigTys;
11144 SmallVector<EVT, 4> OldRetVTs;
11145 SmallVector<TypeSize, 4> OldOffsets;
11146 RetOrigTys.swap(OldRetOrigTys);
11147 RetVTs.swap(OldRetVTs);
11148 Offsets.swap(OldOffsets);
11149
11150 for (size_t i = 0, e = OldRetVTs.size(); i != e; ++i) {
11151 EVT RetVT = OldRetVTs[i];
11152 uint64_t Offset = OldOffsets[i];
11153 MVT RegisterVT = getRegisterType(Context, RetVT);
11154 unsigned NumRegs = getNumRegisters(Context, RetVT);
11155 unsigned RegisterVTByteSZ = RegisterVT.getSizeInBits() / 8;
11156 RetOrigTys.append(NumRegs, OldRetOrigTys[i]);
11157 RetVTs.append(NumRegs, RegisterVT);
11158 for (unsigned j = 0; j != NumRegs; ++j)
11159 Offsets.push_back(TypeSize::getFixed(Offset + j * RegisterVTByteSZ));
11160 }
11161 }
11162
11164 GetReturnInfo(CLI.CallConv, CLI.RetTy, getReturnAttrs(CLI), Outs, *this, DL);
11165
11166 bool CanLowerReturn =
11168 CLI.IsVarArg, Outs, Context, CLI.RetTy);
11169
11170 SDValue DemoteStackSlot;
11171 int DemoteStackIdx = -100;
11172 if (!CanLowerReturn) {
11173 // FIXME: equivalent assert?
11174 // assert(!CS.hasInAllocaArgument() &&
11175 // "sret demotion is incompatible with inalloca");
11176 uint64_t TySize = DL.getTypeAllocSize(CLI.RetTy);
11177 Align Alignment = DL.getPrefTypeAlign(CLI.RetTy);
11179 DemoteStackIdx =
11180 MF.getFrameInfo().CreateStackObject(TySize, Alignment, false);
11181 Type *StackSlotPtrType = PointerType::get(Context, DL.getAllocaAddrSpace());
11182
11183 DemoteStackSlot = CLI.DAG.getFrameIndex(DemoteStackIdx, getFrameIndexTy(DL));
11184 ArgListEntry Entry(DemoteStackSlot, StackSlotPtrType);
11185 Entry.IsSRet = true;
11186 Entry.Alignment = Alignment;
11187 CLI.getArgs().insert(CLI.getArgs().begin(), Entry);
11188 CLI.NumFixedArgs += 1;
11189 CLI.getArgs()[0].IndirectType = CLI.RetTy;
11190 CLI.RetTy = CLI.OrigRetTy = Type::getVoidTy(Context);
11191
11192 // sret demotion isn't compatible with tail-calls, since the sret argument
11193 // points into the callers stack frame.
11194 CLI.IsTailCall = false;
11195 } else {
11196 bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
11197 CLI.RetTy, CLI.CallConv, CLI.IsVarArg, DL);
11198 for (unsigned I = 0, E = RetVTs.size(); I != E; ++I) {
11199 ISD::ArgFlagsTy Flags;
11200 if (NeedsRegBlock) {
11201 Flags.setInConsecutiveRegs();
11202 if (I == RetVTs.size() - 1)
11203 Flags.setInConsecutiveRegsLast();
11204 }
11205 EVT VT = RetVTs[I];
11206 MVT RegisterVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11207 unsigned NumRegs =
11208 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11209 for (unsigned i = 0; i != NumRegs; ++i) {
11210 ISD::InputArg Ret(Flags, RegisterVT, VT, RetOrigTys[I],
11212 if (CLI.RetTy->isPointerTy()) {
11213 Ret.Flags.setPointer();
11214 Ret.Flags.setPointerAddrSpace(
11215 cast<PointerType>(CLI.RetTy)->getAddressSpace());
11216 }
11217 if (CLI.RetSExt)
11218 Ret.Flags.setSExt();
11219 if (CLI.RetZExt)
11220 Ret.Flags.setZExt();
11221 if (CLI.IsInReg)
11222 Ret.Flags.setInReg();
11223 CLI.Ins.push_back(Ret);
11224 }
11225 }
11226 }
11227
11228 // We push in swifterror return as the last element of CLI.Ins.
11229 ArgListTy &Args = CLI.getArgs();
11230 if (supportSwiftError()) {
11231 for (const ArgListEntry &Arg : Args) {
11232 if (Arg.IsSwiftError) {
11233 ISD::ArgFlagsTy Flags;
11234 Flags.setSwiftError();
11236 PointerType::getUnqual(Context),
11237 /*Used=*/true, ISD::InputArg::NoArgIndex, 0);
11238 CLI.Ins.push_back(Ret);
11239 }
11240 }
11241 }
11242
11243 // Handle all of the outgoing arguments.
11244 CLI.Outs.clear();
11245 CLI.OutVals.clear();
11246 for (unsigned i = 0, e = Args.size(); i != e; ++i) {
11247 SmallVector<Type *, 4> OrigArgTys;
11248 ComputeValueTypes(DL, Args[i].OrigTy, OrigArgTys);
11249 // FIXME: Split arguments if CLI.IsPostTypeLegalization
11250 Type *FinalType = Args[i].Ty;
11251 if (Args[i].IsByVal)
11252 FinalType = Args[i].IndirectType;
11253 bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
11254 FinalType, CLI.CallConv, CLI.IsVarArg, DL);
11255 for (unsigned Value = 0, NumValues = OrigArgTys.size(); Value != NumValues;
11256 ++Value) {
11257 Type *OrigArgTy = OrigArgTys[Value];
11258 Type *ArgTy = OrigArgTy;
11259 if (Args[i].Ty != Args[i].OrigTy) {
11260 assert(Value == 0 && "Only supported for non-aggregate arguments");
11261 ArgTy = Args[i].Ty;
11262 }
11263
11264 EVT VT = getValueType(DL, ArgTy);
11265 SDValue Op = SDValue(Args[i].Node.getNode(),
11266 Args[i].Node.getResNo() + Value);
11267 ISD::ArgFlagsTy Flags;
11268
11269 // Certain targets (such as MIPS), may have a different ABI alignment
11270 // for a type depending on the context. Give the target a chance to
11271 // specify the alignment it wants.
11272 const Align OriginalAlignment(getABIAlignmentForCallingConv(ArgTy, DL));
11273 Flags.setOrigAlign(OriginalAlignment);
11274
11275 if (i >= CLI.NumFixedArgs)
11276 Flags.setVarArg();
11277 if (ArgTy->isPointerTy()) {
11278 Flags.setPointer();
11279 Flags.setPointerAddrSpace(cast<PointerType>(ArgTy)->getAddressSpace());
11280 }
11281 if (Args[i].IsZExt)
11282 Flags.setZExt();
11283 if (Args[i].IsSExt)
11284 Flags.setSExt();
11285 if (Args[i].IsNoExt)
11286 Flags.setNoExt();
11287 if (Args[i].IsInReg) {
11288 // If we are using vectorcall calling convention, a structure that is
11289 // passed InReg - is surely an HVA
11291 isa<StructType>(FinalType)) {
11292 // The first value of a structure is marked
11293 if (0 == Value)
11294 Flags.setHvaStart();
11295 Flags.setHva();
11296 }
11297 // Set InReg Flag
11298 Flags.setInReg();
11299 }
11300 if (Args[i].IsSRet)
11301 Flags.setSRet();
11302 if (Args[i].IsSwiftSelf)
11303 Flags.setSwiftSelf();
11304 if (Args[i].IsSwiftAsync)
11305 Flags.setSwiftAsync();
11306 if (Args[i].IsSwiftError)
11307 Flags.setSwiftError();
11308 if (Args[i].IsCFGuardTarget)
11309 Flags.setCFGuardTarget();
11310 if (Args[i].IsByVal)
11311 Flags.setByVal();
11312 if (Args[i].IsByRef)
11313 Flags.setByRef();
11314 if (Args[i].IsPreallocated) {
11315 Flags.setPreallocated();
11316 // Set the byval flag for CCAssignFn callbacks that don't know about
11317 // preallocated. This way we can know how many bytes we should've
11318 // allocated and how many bytes a callee cleanup function will pop. If
11319 // we port preallocated to more targets, we'll have to add custom
11320 // preallocated handling in the various CC lowering callbacks.
11321 Flags.setByVal();
11322 }
11323 if (Args[i].IsInAlloca) {
11324 Flags.setInAlloca();
11325 // Set the byval flag for CCAssignFn callbacks that don't know about
11326 // inalloca. This way we can know how many bytes we should've allocated
11327 // and how many bytes a callee cleanup function will pop. If we port
11328 // inalloca to more targets, we'll have to add custom inalloca handling
11329 // in the various CC lowering callbacks.
11330 Flags.setByVal();
11331 }
11332 Align MemAlign;
11333 if (Args[i].IsByVal || Args[i].IsInAlloca || Args[i].IsPreallocated) {
11334 unsigned FrameSize = DL.getTypeAllocSize(Args[i].IndirectType);
11335 Flags.setByValSize(FrameSize);
11336
11337 // info is not there but there are cases it cannot get right.
11338 if (auto MA = Args[i].Alignment)
11339 MemAlign = *MA;
11340 else
11341 MemAlign = getByValTypeAlignment(Args[i].IndirectType, DL);
11342 } else if (auto MA = Args[i].Alignment) {
11343 MemAlign = *MA;
11344 } else {
11345 MemAlign = OriginalAlignment;
11346 }
11347 Flags.setMemAlign(MemAlign);
11348 if (Args[i].IsNest)
11349 Flags.setNest();
11350 if (NeedsRegBlock)
11351 Flags.setInConsecutiveRegs();
11352
11353 MVT PartVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11354 unsigned NumParts =
11355 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11356 SmallVector<SDValue, 4> Parts(NumParts);
11357 ISD::NodeType ExtendKind = ISD::ANY_EXTEND;
11358
11359 if (Args[i].IsSExt)
11360 ExtendKind = ISD::SIGN_EXTEND;
11361 else if (Args[i].IsZExt)
11362 ExtendKind = ISD::ZERO_EXTEND;
11363
11364 // Conservatively only handle 'returned' on non-vectors that can be lowered,
11365 // for now.
11366 if (Args[i].IsReturned && !Op.getValueType().isVector() &&
11368 assert((CLI.RetTy == Args[i].Ty ||
11369 (CLI.RetTy->isPointerTy() && Args[i].Ty->isPointerTy() &&
11371 Args[i].Ty->getPointerAddressSpace())) &&
11372 RetVTs.size() == NumValues && "unexpected use of 'returned'");
11373 // Before passing 'returned' to the target lowering code, ensure that
11374 // either the register MVT and the actual EVT are the same size or that
11375 // the return value and argument are extended in the same way; in these
11376 // cases it's safe to pass the argument register value unchanged as the
11377 // return register value (although it's at the target's option whether
11378 // to do so)
11379 // TODO: allow code generation to take advantage of partially preserved
11380 // registers rather than clobbering the entire register when the
11381 // parameter extension method is not compatible with the return
11382 // extension method
11383 if ((NumParts * PartVT.getSizeInBits() == VT.getSizeInBits()) ||
11384 (ExtendKind != ISD::ANY_EXTEND && CLI.RetSExt == Args[i].IsSExt &&
11385 CLI.RetZExt == Args[i].IsZExt))
11386 Flags.setReturned();
11387 }
11388
11389 getCopyToParts(CLI.DAG, CLI.DL, Op, &Parts[0], NumParts, PartVT, CLI.CB,
11390 CLI.CallConv, ExtendKind);
11391
11392 for (unsigned j = 0; j != NumParts; ++j) {
11393 // if it isn't first piece, alignment must be 1
11394 // For scalable vectors the scalable part is currently handled
11395 // by individual targets, so we just use the known minimum size here.
11396 ISD::OutputArg MyFlags(
11397 Flags, Parts[j].getValueType().getSimpleVT(), VT, OrigArgTy, i,
11398 j * Parts[j].getValueType().getStoreSize().getKnownMinValue());
11399 if (NumParts > 1 && j == 0)
11400 MyFlags.Flags.setSplit();
11401 else if (j != 0) {
11402 MyFlags.Flags.setOrigAlign(Align(1));
11403 if (j == NumParts - 1)
11404 MyFlags.Flags.setSplitEnd();
11405 }
11406
11407 CLI.Outs.push_back(MyFlags);
11408 CLI.OutVals.push_back(Parts[j]);
11409 }
11410
11411 if (NeedsRegBlock && Value == NumValues - 1)
11412 CLI.Outs[CLI.Outs.size() - 1].Flags.setInConsecutiveRegsLast();
11413 }
11414 }
11415
11417 CLI.Chain = LowerCall(CLI, InVals);
11418
11419 // Update CLI.InVals to use outside of this function.
11420 CLI.InVals = InVals;
11421
11422 // Verify that the target's LowerCall behaved as expected.
11423 assert(CLI.Chain.getNode() && CLI.Chain.getValueType() == MVT::Other &&
11424 "LowerCall didn't return a valid chain!");
11425 assert((!CLI.IsTailCall || InVals.empty()) &&
11426 "LowerCall emitted a return value for a tail call!");
11427 assert((CLI.IsTailCall || InVals.size() == CLI.Ins.size()) &&
11428 "LowerCall didn't emit the correct number of values!");
11429
11430 // For a tail call, the return value is merely live-out and there aren't
11431 // any nodes in the DAG representing it. Return a special value to
11432 // indicate that a tail call has been emitted and no more Instructions
11433 // should be processed in the current block.
11434 if (CLI.IsTailCall) {
11435 CLI.DAG.setRoot(CLI.Chain);
11436 return std::make_pair(SDValue(), SDValue());
11437 }
11438
11439#ifndef NDEBUG
11440 for (unsigned i = 0, e = CLI.Ins.size(); i != e; ++i) {
11441 assert(InVals[i].getNode() && "LowerCall emitted a null value!");
11442 assert(EVT(CLI.Ins[i].VT) == InVals[i].getValueType() &&
11443 "LowerCall emitted a value with the wrong type!");
11444 }
11445#endif
11446
11447 SmallVector<SDValue, 4> ReturnValues;
11448 if (!CanLowerReturn) {
11449 // The instruction result is the result of loading from the
11450 // hidden sret parameter.
11451 MVT PtrVT = getPointerTy(DL, DL.getAllocaAddrSpace());
11452
11453 unsigned NumValues = RetVTs.size();
11454 ReturnValues.resize(NumValues);
11455 SmallVector<SDValue, 4> Chains(NumValues);
11456
11457 // An aggregate return value cannot wrap around the address space, so
11458 // offsets to its parts don't wrap either.
11460 Align HiddenSRetAlign = MF.getFrameInfo().getObjectAlign(DemoteStackIdx);
11461 for (unsigned i = 0; i < NumValues; ++i) {
11463 DemoteStackSlot, CLI.DAG.getConstant(Offsets[i], CLI.DL, PtrVT),
11465 SDValue L = CLI.DAG.getLoad(
11466 RetVTs[i], CLI.DL, CLI.Chain, Add,
11468 DemoteStackIdx, Offsets[i]),
11469 HiddenSRetAlign);
11470 ReturnValues[i] = L;
11471 Chains[i] = L.getValue(1);
11472 }
11473
11474 CLI.Chain = CLI.DAG.getNode(ISD::TokenFactor, CLI.DL, MVT::Other, Chains);
11475 } else {
11476 // Collect the legal value parts into potentially illegal values
11477 // that correspond to the original function's return values.
11478 std::optional<ISD::NodeType> AssertOp;
11479 if (CLI.RetSExt)
11480 AssertOp = ISD::AssertSext;
11481 else if (CLI.RetZExt)
11482 AssertOp = ISD::AssertZext;
11483 unsigned CurReg = 0;
11484 for (EVT VT : RetVTs) {
11485 MVT RegisterVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11486 unsigned NumRegs =
11487 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11488
11489 ReturnValues.push_back(getCopyFromParts(
11490 CLI.DAG, CLI.DL, &InVals[CurReg], NumRegs, RegisterVT, VT, nullptr,
11491 CLI.Chain, CLI.CallConv, AssertOp));
11492 CurReg += NumRegs;
11493 }
11494
11495 // For a function returning void, there is no return value. We can't create
11496 // such a node, so we just return a null return value in that case. In
11497 // that case, nothing will actually look at the value.
11498 if (ReturnValues.empty())
11499 return std::make_pair(SDValue(), CLI.Chain);
11500 }
11501
11502 SDValue Res = CLI.DAG.getNode(ISD::MERGE_VALUES, CLI.DL,
11503 CLI.DAG.getVTList(RetVTs), ReturnValues);
11504 return std::make_pair(Res, CLI.Chain);
11505}
11506
11507/// Places new result values for the node in Results (their number
11508/// and types must exactly match those of the original return values of
11509/// the node), or leaves Results empty, which indicates that the node is not
11510/// to be custom lowered after all.
11513 SelectionDAG &DAG) const {
11514 SDValue Res = LowerOperation(SDValue(N, 0), DAG);
11515
11516 if (!Res.getNode())
11517 return;
11518
11519 // If the original node has one result, take the return value from
11520 // LowerOperation as is. It might not be result number 0.
11521 if (N->getNumValues() == 1) {
11522 Results.push_back(Res);
11523 return;
11524 }
11525
11526 // If the original node has multiple results, then the return node should
11527 // have the same number of results.
11528 assert((N->getNumValues() == Res->getNumValues()) &&
11529 "Lowering returned the wrong number of results!");
11530
11531 // Places new result values base on N result number.
11532 for (unsigned I = 0, E = N->getNumValues(); I != E; ++I)
11533 Results.push_back(Res.getValue(I));
11534}
11535
11537 llvm_unreachable("LowerOperation not implemented for this target!");
11538}
11539
11541 Register Reg,
11542 ISD::NodeType ExtendType) {
11544 assert((Op.getOpcode() != ISD::CopyFromReg ||
11545 cast<RegisterSDNode>(Op.getOperand(1))->getReg() != Reg) &&
11546 "Copy from a reg to the same reg!");
11547 assert(!Reg.isPhysical() && "Is a physreg");
11548
11549 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11550 // If this is an InlineAsm we have to match the registers required, not the
11551 // notional registers required by the type.
11552
11553 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), Reg, V->getType(),
11554 std::nullopt); // This is not an ABI copy.
11555 SDValue Chain = DAG.getEntryNode();
11556
11557 if (ExtendType == ISD::ANY_EXTEND) {
11558 auto PreferredExtendIt = FuncInfo.PreferredExtendType.find(V);
11559 if (PreferredExtendIt != FuncInfo.PreferredExtendType.end())
11560 ExtendType = PreferredExtendIt->second;
11561 }
11562 RFV.getCopyToRegs(Op, DAG, getCurSDLoc(), Chain, nullptr, V, ExtendType);
11563 PendingExports.push_back(Chain);
11564}
11565
11567
11568/// isOnlyUsedInEntryBlock - If the specified argument is only used in the
11569/// entry block, return true. This includes arguments used by switches, since
11570/// the switch may expand into multiple basic blocks.
11571static bool isOnlyUsedInEntryBlock(const Argument *A, bool FastISel) {
11572 // With FastISel active, we may be splitting blocks, so force creation
11573 // of virtual registers for all non-dead arguments.
11574 if (FastISel)
11575 return A->use_empty();
11576
11577 const BasicBlock &Entry = A->getParent()->front();
11578 for (const User *U : A->users())
11579 if (cast<Instruction>(U)->getParent() != &Entry || isa<SwitchInst>(U))
11580 return false; // Use not in entry block.
11581
11582 return true;
11583}
11584
11586 DenseMap<const Argument *,
11587 std::pair<const AllocaInst *, const StoreInst *>>;
11588
11589/// Scan the entry block of the function in FuncInfo for arguments that look
11590/// like copies into a local alloca. Record any copied arguments in
11591/// ArgCopyElisionCandidates.
11592static void
11594 FunctionLoweringInfo *FuncInfo,
11595 ArgCopyElisionMapTy &ArgCopyElisionCandidates) {
11596 // Record the state of every static alloca used in the entry block. Argument
11597 // allocas are all used in the entry block, so we need approximately as many
11598 // entries as we have arguments.
11599 enum StaticAllocaInfo { Unknown, Clobbered, Elidable };
11601 unsigned NumArgs = FuncInfo->Fn->arg_size();
11602 StaticAllocas.reserve(NumArgs * 2);
11603
11604 auto GetInfoIfStaticAlloca = [&](const Value *V) -> StaticAllocaInfo * {
11605 if (!V)
11606 return nullptr;
11607 V = V->stripPointerCasts();
11608 const auto *AI = dyn_cast<AllocaInst>(V);
11609 if (!AI || !AI->isStaticAlloca() || !FuncInfo->StaticAllocaMap.count(AI))
11610 return nullptr;
11611 auto Iter = StaticAllocas.insert({AI, Unknown});
11612 return &Iter.first->second;
11613 };
11614
11615 // Look for stores of arguments to static allocas. Look through bitcasts and
11616 // GEPs to handle type coercions, as long as the alloca is fully initialized
11617 // by the store. Any non-store use of an alloca escapes it and any subsequent
11618 // unanalyzed store might write it.
11619 // FIXME: Handle structs initialized with multiple stores.
11620 for (const Instruction &I : FuncInfo->Fn->getEntryBlock()) {
11621 // Look for stores, and handle non-store uses conservatively.
11622 const auto *SI = dyn_cast<StoreInst>(&I);
11623 if (!SI) {
11624 // We will look through cast uses, so ignore them completely.
11625 if (I.isCast())
11626 continue;
11627 // Ignore debug info and pseudo op intrinsics, they don't escape or store
11628 // to allocas.
11629 if (I.isDebugOrPseudoInst())
11630 continue;
11631 // This is an unknown instruction. Assume it escapes or writes to all
11632 // static alloca operands.
11633 for (const Use &U : I.operands()) {
11634 if (StaticAllocaInfo *Info = GetInfoIfStaticAlloca(U))
11635 *Info = StaticAllocaInfo::Clobbered;
11636 }
11637 continue;
11638 }
11639
11640 // If the stored value is a static alloca, mark it as escaped.
11641 if (StaticAllocaInfo *Info = GetInfoIfStaticAlloca(SI->getValueOperand()))
11642 *Info = StaticAllocaInfo::Clobbered;
11643
11644 // Check if the destination is a static alloca.
11645 const Value *Dst = SI->getPointerOperand()->stripPointerCasts();
11646 StaticAllocaInfo *Info = GetInfoIfStaticAlloca(Dst);
11647 if (!Info)
11648 continue;
11649 const AllocaInst *AI = cast<AllocaInst>(Dst);
11650
11651 // Skip allocas that have been initialized or clobbered.
11652 if (*Info != StaticAllocaInfo::Unknown)
11653 continue;
11654
11655 // Check if the stored value is an argument, and that this store fully
11656 // initializes the alloca.
11657 // If the argument type has padding bits we can't directly forward a pointer
11658 // as the upper bits may contain garbage.
11659 // Don't elide copies from the same argument twice.
11660 const Value *Val = SI->getValueOperand()->stripPointerCasts();
11661 const auto *Arg = dyn_cast<Argument>(Val);
11662 if (!Arg || Arg->hasPassPointeeByValueCopyAttr() ||
11663 Arg->getType()->isEmptyTy() ||
11664 DL.getTypeStoreSize(Arg->getType()) !=
11665 DL.getTypeAllocSize(AI->getAllocatedType()) ||
11666 !DL.typeSizeEqualsStoreSize(Arg->getType()) ||
11667 ArgCopyElisionCandidates.count(Arg)) {
11668 *Info = StaticAllocaInfo::Clobbered;
11669 continue;
11670 }
11671
11672 LLVM_DEBUG(dbgs() << "Found argument copy elision candidate: " << *AI
11673 << '\n');
11674
11675 // Mark this alloca and store for argument copy elision.
11676 *Info = StaticAllocaInfo::Elidable;
11677 ArgCopyElisionCandidates.insert({Arg, {AI, SI}});
11678
11679 // Stop scanning if we've seen all arguments. This will happen early in -O0
11680 // builds, which is useful, because -O0 builds have large entry blocks and
11681 // many allocas.
11682 if (ArgCopyElisionCandidates.size() == NumArgs)
11683 break;
11684 }
11685}
11686
11687/// Try to elide argument copies from memory into a local alloca. Succeeds if
11688/// ArgVal is a load from a suitable fixed stack object.
11691 DenseMap<int, int> &ArgCopyElisionFrameIndexMap,
11692 SmallPtrSetImpl<const Instruction *> &ElidedArgCopyInstrs,
11693 ArgCopyElisionMapTy &ArgCopyElisionCandidates, const Argument &Arg,
11694 ArrayRef<SDValue> ArgVals, bool &ArgHasUses) {
11695 // Check if this is a load from a fixed stack object.
11696 auto *LNode = dyn_cast<LoadSDNode>(ArgVals[0]);
11697 if (!LNode)
11698 return;
11699 auto *FINode = dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode());
11700 if (!FINode)
11701 return;
11702
11703 // Check that the fixed stack object is the right size and alignment.
11704 // Look at the alignment that the user wrote on the alloca instead of looking
11705 // at the stack object.
11706 auto ArgCopyIter = ArgCopyElisionCandidates.find(&Arg);
11707 assert(ArgCopyIter != ArgCopyElisionCandidates.end());
11708 const AllocaInst *AI = ArgCopyIter->second.first;
11709 int FixedIndex = FINode->getIndex();
11710 int &AllocaIndex = FuncInfo.StaticAllocaMap[AI];
11711 int OldIndex = AllocaIndex;
11712 MachineFrameInfo &MFI = FuncInfo.MF->getFrameInfo();
11713 if (MFI.getObjectSize(FixedIndex) != MFI.getObjectSize(OldIndex)) {
11714 LLVM_DEBUG(
11715 dbgs() << " argument copy elision failed due to bad fixed stack "
11716 "object size\n");
11717 return;
11718 }
11719 Align RequiredAlignment = AI->getAlign();
11720 if (MFI.getObjectAlign(FixedIndex) < RequiredAlignment) {
11721 LLVM_DEBUG(dbgs() << " argument copy elision failed: alignment of alloca "
11722 "greater than stack argument alignment ("
11723 << DebugStr(RequiredAlignment) << " vs "
11724 << DebugStr(MFI.getObjectAlign(FixedIndex)) << ")\n");
11725 return;
11726 }
11727
11728 // Perform the elision. Delete the old stack object and replace its only use
11729 // in the variable info map. Mark the stack object as mutable and aliased.
11730 LLVM_DEBUG({
11731 dbgs() << "Eliding argument copy from " << Arg << " to " << *AI << '\n'
11732 << " Replacing frame index " << OldIndex << " with " << FixedIndex
11733 << '\n';
11734 });
11735 MFI.RemoveStackObject(OldIndex);
11736 MFI.setIsImmutableObjectIndex(FixedIndex, false);
11737 MFI.setIsAliasedObjectIndex(FixedIndex, true);
11738 AllocaIndex = FixedIndex;
11739 ArgCopyElisionFrameIndexMap.insert({OldIndex, FixedIndex});
11740 for (SDValue ArgVal : ArgVals)
11741 Chains.push_back(ArgVal.getValue(1));
11742
11743 // Avoid emitting code for the store implementing the copy.
11744 const StoreInst *SI = ArgCopyIter->second.second;
11745 ElidedArgCopyInstrs.insert(SI);
11746
11747 // Check for uses of the argument again so that we can avoid exporting ArgVal
11748 // if it is't used by anything other than the store.
11749 for (const Value *U : Arg.users()) {
11750 if (U != SI) {
11751 ArgHasUses = true;
11752 break;
11753 }
11754 }
11755}
11756
11757void SelectionDAGISel::LowerArguments(const Function &F) {
11758 SelectionDAG &DAG = SDB->DAG;
11759 SDLoc dl = SDB->getCurSDLoc();
11760 const DataLayout &DL = DAG.getDataLayout();
11762
11763 // In Naked functions we aren't going to save any registers.
11764 if (F.hasFnAttribute(Attribute::Naked))
11765 return;
11766
11767 if (!FuncInfo->CanLowerReturn) {
11768 // Put in an sret pointer parameter before all the other parameters.
11769 MVT ValueVT = TLI->getPointerTy(DL, DL.getAllocaAddrSpace());
11770
11771 ISD::ArgFlagsTy Flags;
11772 Flags.setSRet();
11773 MVT RegisterVT = TLI->getRegisterType(*DAG.getContext(), ValueVT);
11774 ISD::InputArg RetArg(Flags, RegisterVT, ValueVT, F.getReturnType(), true,
11776 Ins.push_back(RetArg);
11777 }
11778
11779 // Look for stores of arguments to static allocas. Mark such arguments with a
11780 // flag to ask the target to give us the memory location of that argument if
11781 // available.
11782 ArgCopyElisionMapTy ArgCopyElisionCandidates;
11784 ArgCopyElisionCandidates);
11785
11786 // Set up the incoming argument description vector.
11787 for (const Argument &Arg : F.args()) {
11788 unsigned ArgNo = Arg.getArgNo();
11790 ComputeValueTypes(DAG.getDataLayout(), Arg.getType(), Types);
11791 bool isArgValueUsed = !Arg.use_empty();
11792 unsigned PartBase = 0;
11793 Type *FinalType = Arg.getType();
11794 if (Arg.hasAttribute(Attribute::ByVal))
11795 FinalType = Arg.getParamByValType();
11796 bool NeedsRegBlock = TLI->functionArgumentNeedsConsecutiveRegisters(
11797 FinalType, F.getCallingConv(), F.isVarArg(), DL);
11798 for (unsigned Value = 0, NumValues = Types.size(); Value != NumValues;
11799 ++Value) {
11800 Type *ArgTy = Types[Value];
11801 EVT VT = TLI->getValueType(DL, ArgTy);
11802 ISD::ArgFlagsTy Flags;
11803
11804 if (ArgTy->isPointerTy()) {
11805 Flags.setPointer();
11806 Flags.setPointerAddrSpace(cast<PointerType>(ArgTy)->getAddressSpace());
11807 }
11808 if (Arg.hasAttribute(Attribute::ZExt))
11809 Flags.setZExt();
11810 if (Arg.hasAttribute(Attribute::SExt))
11811 Flags.setSExt();
11812 if (Arg.hasAttribute(Attribute::InReg)) {
11813 // If we are using vectorcall calling convention, a structure that is
11814 // passed InReg - is surely an HVA
11815 if (F.getCallingConv() == CallingConv::X86_VectorCall &&
11816 isa<StructType>(Arg.getType())) {
11817 // The first value of a structure is marked
11818 if (0 == Value)
11819 Flags.setHvaStart();
11820 Flags.setHva();
11821 }
11822 // Set InReg Flag
11823 Flags.setInReg();
11824 }
11825 if (Arg.hasAttribute(Attribute::StructRet))
11826 Flags.setSRet();
11827 if (Arg.hasAttribute(Attribute::SwiftSelf))
11828 Flags.setSwiftSelf();
11829 if (Arg.hasAttribute(Attribute::SwiftAsync))
11830 Flags.setSwiftAsync();
11831 if (Arg.hasAttribute(Attribute::SwiftError))
11832 Flags.setSwiftError();
11833 if (Arg.hasAttribute(Attribute::ByVal))
11834 Flags.setByVal();
11835 if (Arg.hasAttribute(Attribute::ByRef))
11836 Flags.setByRef();
11837 if (Arg.hasAttribute(Attribute::InAlloca)) {
11838 Flags.setInAlloca();
11839 // Set the byval flag for CCAssignFn callbacks that don't know about
11840 // inalloca. This way we can know how many bytes we should've allocated
11841 // and how many bytes a callee cleanup function will pop. If we port
11842 // inalloca to more targets, we'll have to add custom inalloca handling
11843 // in the various CC lowering callbacks.
11844 Flags.setByVal();
11845 }
11846 if (Arg.hasAttribute(Attribute::Preallocated)) {
11847 Flags.setPreallocated();
11848 // Set the byval flag for CCAssignFn callbacks that don't know about
11849 // preallocated. This way we can know how many bytes we should've
11850 // allocated and how many bytes a callee cleanup function will pop. If
11851 // we port preallocated to more targets, we'll have to add custom
11852 // preallocated handling in the various CC lowering callbacks.
11853 Flags.setByVal();
11854 }
11855
11856 // Certain targets (such as MIPS), may have a different ABI alignment
11857 // for a type depending on the context. Give the target a chance to
11858 // specify the alignment it wants.
11859 const Align OriginalAlignment(
11860 TLI->getABIAlignmentForCallingConv(ArgTy, DL));
11861 Flags.setOrigAlign(OriginalAlignment);
11862
11863 Align MemAlign;
11864 Type *ArgMemTy = nullptr;
11865 if (Flags.isByVal() || Flags.isInAlloca() || Flags.isPreallocated() ||
11866 Flags.isByRef()) {
11867 if (!ArgMemTy)
11868 ArgMemTy = Arg.getPointeeInMemoryValueType();
11869
11870 uint64_t MemSize = DL.getTypeAllocSize(ArgMemTy);
11871
11872 // For in-memory arguments, size and alignment should be passed from FE.
11873 // BE will guess if this info is not there but there are cases it cannot
11874 // get right.
11875 if (auto ParamAlign = Arg.getParamStackAlign())
11876 MemAlign = *ParamAlign;
11877 else if ((ParamAlign = Arg.getParamAlign()))
11878 MemAlign = *ParamAlign;
11879 else
11880 MemAlign = TLI->getByValTypeAlignment(ArgMemTy, DL);
11881 if (Flags.isByRef())
11882 Flags.setByRefSize(MemSize);
11883 else
11884 Flags.setByValSize(MemSize);
11885 } else if (auto ParamAlign = Arg.getParamStackAlign()) {
11886 MemAlign = *ParamAlign;
11887 } else {
11888 MemAlign = OriginalAlignment;
11889 }
11890 Flags.setMemAlign(MemAlign);
11891
11892 if (Arg.hasAttribute(Attribute::Nest))
11893 Flags.setNest();
11894 if (NeedsRegBlock)
11895 Flags.setInConsecutiveRegs();
11896 if (ArgCopyElisionCandidates.count(&Arg))
11897 Flags.setCopyElisionCandidate();
11898 if (Arg.hasAttribute(Attribute::Returned))
11899 Flags.setReturned();
11900
11901 MVT RegisterVT = TLI->getRegisterTypeForCallingConv(
11902 *CurDAG->getContext(), F.getCallingConv(), VT);
11903 unsigned NumRegs = TLI->getNumRegistersForCallingConv(
11904 *CurDAG->getContext(), F.getCallingConv(), VT);
11905 for (unsigned i = 0; i != NumRegs; ++i) {
11906 // For scalable vectors, use the minimum size; individual targets
11907 // are responsible for handling scalable vector arguments and
11908 // return values.
11909 ISD::InputArg MyFlags(
11910 Flags, RegisterVT, VT, ArgTy, isArgValueUsed, ArgNo,
11911 PartBase + i * RegisterVT.getStoreSize().getKnownMinValue());
11912 if (NumRegs > 1 && i == 0)
11913 MyFlags.Flags.setSplit();
11914 // if it isn't first piece, alignment must be 1
11915 else if (i > 0) {
11916 MyFlags.Flags.setOrigAlign(Align(1));
11917 if (i == NumRegs - 1)
11918 MyFlags.Flags.setSplitEnd();
11919 }
11920 Ins.push_back(MyFlags);
11921 }
11922 if (NeedsRegBlock && Value == NumValues - 1)
11923 Ins[Ins.size() - 1].Flags.setInConsecutiveRegsLast();
11924 PartBase += VT.getStoreSize().getKnownMinValue();
11925 }
11926 }
11927
11928 // Call the target to set up the argument values.
11930 SDValue NewRoot = TLI->LowerFormalArguments(
11931 DAG.getRoot(), F.getCallingConv(), F.isVarArg(), Ins, dl, DAG, InVals);
11932
11933 // Verify that the target's LowerFormalArguments behaved as expected.
11934 assert(NewRoot.getNode() && NewRoot.getValueType() == MVT::Other &&
11935 "LowerFormalArguments didn't return a valid chain!");
11936 assert(InVals.size() == Ins.size() &&
11937 "LowerFormalArguments didn't emit the correct number of values!");
11938 LLVM_DEBUG({
11939 for (unsigned i = 0, e = Ins.size(); i != e; ++i) {
11940 assert(InVals[i].getNode() &&
11941 "LowerFormalArguments emitted a null value!");
11942 assert(EVT(Ins[i].VT) == InVals[i].getValueType() &&
11943 "LowerFormalArguments emitted a value with the wrong type!");
11944 }
11945 });
11946
11947 // Update the DAG with the new chain value resulting from argument lowering.
11948 DAG.setRoot(NewRoot);
11949
11950 // Set up the argument values.
11951 unsigned i = 0;
11952 if (!FuncInfo->CanLowerReturn) {
11953 // Create a virtual register for the sret pointer, and put in a copy
11954 // from the sret argument into it.
11955 MVT VT = TLI->getPointerTy(DL, DL.getAllocaAddrSpace());
11956 MVT RegVT = TLI->getRegisterType(*CurDAG->getContext(), VT);
11957 std::optional<ISD::NodeType> AssertOp;
11958 SDValue ArgValue =
11959 getCopyFromParts(DAG, dl, &InVals[0], 1, RegVT, VT, nullptr, NewRoot,
11960 F.getCallingConv(), AssertOp);
11961
11962 MachineFunction& MF = SDB->DAG.getMachineFunction();
11963 MachineRegisterInfo& RegInfo = MF.getRegInfo();
11964 Register SRetReg =
11965 RegInfo.createVirtualRegister(TLI->getRegClassFor(RegVT));
11966 FuncInfo->DemoteRegister = SRetReg;
11967 NewRoot =
11968 SDB->DAG.getCopyToReg(NewRoot, SDB->getCurSDLoc(), SRetReg, ArgValue);
11969 DAG.setRoot(NewRoot);
11970
11971 // i indexes lowered arguments. Bump it past the hidden sret argument.
11972 ++i;
11973 }
11974
11976 DenseMap<int, int> ArgCopyElisionFrameIndexMap;
11977 for (const Argument &Arg : F.args()) {
11978 SmallVector<SDValue, 4> ArgValues;
11979 SmallVector<EVT, 4> ValueVTs;
11980 ComputeValueVTs(*TLI, DAG.getDataLayout(), Arg.getType(), ValueVTs);
11981 unsigned NumValues = ValueVTs.size();
11982 if (NumValues == 0)
11983 continue;
11984
11985 bool ArgHasUses = !Arg.use_empty();
11986
11987 // Elide the copying store if the target loaded this argument from a
11988 // suitable fixed stack object.
11989 if (Ins[i].Flags.isCopyElisionCandidate()) {
11990 unsigned NumParts = 0;
11991 for (EVT VT : ValueVTs)
11992 NumParts += TLI->getNumRegistersForCallingConv(*CurDAG->getContext(),
11993 F.getCallingConv(), VT);
11994
11995 tryToElideArgumentCopy(*FuncInfo, Chains, ArgCopyElisionFrameIndexMap,
11996 ElidedArgCopyInstrs, ArgCopyElisionCandidates, Arg,
11997 ArrayRef(&InVals[i], NumParts), ArgHasUses);
11998 }
11999
12000 // If this argument is unused then remember its value. It is used to generate
12001 // debugging information.
12002 bool isSwiftErrorArg =
12003 TLI->supportSwiftError() &&
12004 Arg.hasAttribute(Attribute::SwiftError);
12005 if (!ArgHasUses && !isSwiftErrorArg) {
12006 SDB->setUnusedArgValue(&Arg, InVals[i]);
12007
12008 // Also remember any frame index for use in FastISel.
12009 if (FrameIndexSDNode *FI =
12011 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12012 }
12013
12014 for (unsigned Val = 0; Val != NumValues; ++Val) {
12015 EVT VT = ValueVTs[Val];
12016 MVT PartVT = TLI->getRegisterTypeForCallingConv(*CurDAG->getContext(),
12017 F.getCallingConv(), VT);
12018 unsigned NumParts = TLI->getNumRegistersForCallingConv(
12019 *CurDAG->getContext(), F.getCallingConv(), VT);
12020
12021 // Even an apparent 'unused' swifterror argument needs to be returned. So
12022 // we do generate a copy for it that can be used on return from the
12023 // function.
12024 if (ArgHasUses || isSwiftErrorArg) {
12025 std::optional<ISD::NodeType> AssertOp;
12026 if (Arg.hasAttribute(Attribute::SExt))
12027 AssertOp = ISD::AssertSext;
12028 else if (Arg.hasAttribute(Attribute::ZExt))
12029 AssertOp = ISD::AssertZext;
12030
12031 SDValue OutVal =
12032 getCopyFromParts(DAG, dl, &InVals[i], NumParts, PartVT, VT, nullptr,
12033 NewRoot, F.getCallingConv(), AssertOp);
12034
12035 FPClassTest NoFPClass = Arg.getNoFPClass();
12036 if (NoFPClass != fcNone) {
12037 SDValue SDNoFPClass = DAG.getTargetConstant(
12038 static_cast<uint64_t>(NoFPClass), dl, MVT::i32);
12039 OutVal = DAG.getNode(ISD::AssertNoFPClass, dl, OutVal.getValueType(),
12040 OutVal, SDNoFPClass);
12041 }
12042 ArgValues.push_back(OutVal);
12043 }
12044
12045 i += NumParts;
12046 }
12047
12048 // We don't need to do anything else for unused arguments.
12049 if (ArgValues.empty())
12050 continue;
12051
12052 // Note down frame index.
12053 if (FrameIndexSDNode *FI =
12054 dyn_cast<FrameIndexSDNode>(ArgValues[0].getNode()))
12055 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12056
12057 SDValue Res = DAG.getMergeValues(ArrayRef(ArgValues.data(), NumValues),
12058 SDB->getCurSDLoc());
12059
12060 SDB->setValue(&Arg, Res);
12061 if (!TM.Options.EnableFastISel && Res.getOpcode() == ISD::BUILD_PAIR) {
12062 // We want to associate the argument with the frame index, among
12063 // involved operands, that correspond to the lowest address. The
12064 // getCopyFromParts function, called earlier, is swapping the order of
12065 // the operands to BUILD_PAIR depending on endianness. The result of
12066 // that swapping is that the least significant bits of the argument will
12067 // be in the first operand of the BUILD_PAIR node, and the most
12068 // significant bits will be in the second operand.
12069 unsigned LowAddressOp = DAG.getDataLayout().isBigEndian() ? 1 : 0;
12070 if (LoadSDNode *LNode =
12071 dyn_cast<LoadSDNode>(Res.getOperand(LowAddressOp).getNode()))
12072 if (FrameIndexSDNode *FI =
12073 dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
12074 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12075 }
12076
12077 // Analyses past this point are naive and don't expect an assertion.
12078 if (Res.getOpcode() == ISD::AssertZext)
12079 Res = Res.getOperand(0);
12080
12081 // Update the SwiftErrorVRegDefMap.
12082 if (Res.getOpcode() == ISD::CopyFromReg && isSwiftErrorArg) {
12083 Register Reg = cast<RegisterSDNode>(Res.getOperand(1))->getReg();
12084 if (Reg.isVirtual())
12085 SwiftError->setCurrentVReg(FuncInfo->MBB, SwiftError->getFunctionArg(),
12086 Reg);
12087 }
12088
12089 // If this argument is live outside of the entry block, insert a copy from
12090 // wherever we got it to the vreg that other BB's will reference it as.
12091 if (Res.getOpcode() == ISD::CopyFromReg) {
12092 // If we can, though, try to skip creating an unnecessary vreg.
12093 // FIXME: This isn't very clean... it would be nice to make this more
12094 // general.
12095 Register Reg = cast<RegisterSDNode>(Res.getOperand(1))->getReg();
12096 if (Reg.isVirtual()) {
12097 FuncInfo->ValueMap[&Arg] = Reg;
12098 continue;
12099 }
12100 }
12101 if (!isOnlyUsedInEntryBlock(&Arg, TM.Options.EnableFastISel)) {
12102 FuncInfo->InitializeRegForValue(&Arg);
12103 SDB->CopyToExportRegsIfNeeded(&Arg);
12104 }
12105 }
12106
12107 if (!Chains.empty()) {
12108 Chains.push_back(NewRoot);
12109 NewRoot = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chains);
12110 }
12111
12112 DAG.setRoot(NewRoot);
12113
12114 assert(i == InVals.size() && "Argument register count mismatch!");
12115
12116 // If any argument copy elisions occurred and we have debug info, update the
12117 // stale frame indices used in the dbg.declare variable info table.
12118 if (!ArgCopyElisionFrameIndexMap.empty()) {
12119 for (MachineFunction::VariableDbgInfo &VI :
12120 MF->getInStackSlotVariableDbgInfo()) {
12121 auto I = ArgCopyElisionFrameIndexMap.find(VI.getStackSlot());
12122 if (I != ArgCopyElisionFrameIndexMap.end())
12123 VI.updateStackSlot(I->second);
12124 }
12125 }
12126
12127 // Finally, if the target has anything special to do, allow it to do so.
12129}
12130
12131/// Handle PHI nodes in successor blocks. Emit code into the SelectionDAG to
12132/// ensure constants are generated when needed. Remember the virtual registers
12133/// that need to be added to the Machine PHI nodes as input. We cannot just
12134/// directly add them, because expansion might result in multiple MBB's for one
12135/// BB. As such, the start of the BB might correspond to a different MBB than
12136/// the end.
12137void
12138SelectionDAGBuilder::HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) {
12139 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12140
12141 SmallPtrSet<MachineBasicBlock *, 4> SuccsHandled;
12142
12143 // Check PHI nodes in successors that expect a value to be available from this
12144 // block.
12145 for (const BasicBlock *SuccBB : successors(LLVMBB->getTerminator())) {
12146 if (!isa<PHINode>(SuccBB->begin())) continue;
12147 MachineBasicBlock *SuccMBB = FuncInfo.getMBB(SuccBB);
12148
12149 // If this terminator has multiple identical successors (common for
12150 // switches), only handle each succ once.
12151 if (!SuccsHandled.insert(SuccMBB).second)
12152 continue;
12153
12155
12156 // At this point we know that there is a 1-1 correspondence between LLVM PHI
12157 // nodes and Machine PHI nodes, but the incoming operands have not been
12158 // emitted yet.
12159 for (const PHINode &PN : SuccBB->phis()) {
12160 // Ignore dead phi's.
12161 if (PN.use_empty())
12162 continue;
12163
12164 // Skip empty types
12165 if (PN.getType()->isEmptyTy())
12166 continue;
12167
12168 Register Reg;
12169 const Value *PHIOp = PN.getIncomingValueForBlock(LLVMBB);
12170
12171 if (const auto *C = dyn_cast<Constant>(PHIOp)) {
12172 Register &RegOut = ConstantsOut[C];
12173 if (!RegOut) {
12174 RegOut = FuncInfo.CreateRegs(&PN);
12175 // We need to zero/sign extend ConstantInt phi operands to match
12176 // assumptions in FunctionLoweringInfo::ComputePHILiveOutRegInfo.
12177 ISD::NodeType ExtendType = ISD::ANY_EXTEND;
12178 if (auto *CI = dyn_cast<ConstantInt>(C))
12179 ExtendType = TLI.signExtendConstant(CI) ? ISD::SIGN_EXTEND
12181 CopyValueToVirtualRegister(C, RegOut, ExtendType);
12182 }
12183 Reg = RegOut;
12184 } else {
12186 FuncInfo.ValueMap.find(PHIOp);
12187 if (I != FuncInfo.ValueMap.end())
12188 Reg = I->second;
12189 else {
12190 assert(isa<AllocaInst>(PHIOp) &&
12191 FuncInfo.StaticAllocaMap.count(cast<AllocaInst>(PHIOp)) &&
12192 "Didn't codegen value into a register!??");
12193 Reg = FuncInfo.CreateRegs(&PN);
12195 }
12196 }
12197
12198 // Remember that this register needs to added to the machine PHI node as
12199 // the input for this MBB.
12200 SmallVector<EVT, 4> ValueVTs;
12201 ComputeValueVTs(TLI, DAG.getDataLayout(), PN.getType(), ValueVTs);
12202 for (EVT VT : ValueVTs) {
12203 const unsigned NumRegisters = TLI.getNumRegisters(*DAG.getContext(), VT);
12204 for (unsigned i = 0; i != NumRegisters; ++i)
12205 FuncInfo.PHINodesToUpdate.emplace_back(&*MBBI++, Reg + i);
12206 Reg += NumRegisters;
12207 }
12208 }
12209 }
12210
12211 ConstantsOut.clear();
12212}
12213
12214MachineBasicBlock *SelectionDAGBuilder::NextBlock(MachineBasicBlock *MBB) {
12216 if (++I == FuncInfo.MF->end())
12217 return nullptr;
12218 return &*I;
12219}
12220
12221/// During lowering new call nodes can be created (such as memset, etc.).
12222/// Those will become new roots of the current DAG, but complications arise
12223/// when they are tail calls. In such cases, the call lowering will update
12224/// the root, but the builder still needs to know that a tail call has been
12225/// lowered in order to avoid generating an additional return.
12226void SelectionDAGBuilder::updateDAGForMaybeTailCall(SDValue MaybeTC) {
12227 // If the node is null, we do have a tail call.
12228 if (MaybeTC.getNode() != nullptr)
12229 DAG.setRoot(MaybeTC);
12230 else
12231 HasTailCall = true;
12232}
12233
12234void SelectionDAGBuilder::lowerWorkItem(SwitchWorkListItem W, Value *Cond,
12235 MachineBasicBlock *SwitchMBB,
12236 MachineBasicBlock *DefaultMBB) {
12237 MachineFunction *CurMF = FuncInfo.MF;
12238 MachineBasicBlock *NextMBB = nullptr;
12240 if (++BBI != FuncInfo.MF->end())
12241 NextMBB = &*BBI;
12242
12243 unsigned Size = W.LastCluster - W.FirstCluster + 1;
12244
12245 BranchProbabilityInfo *BPI = FuncInfo.BPI;
12246
12247 if (Size == 2 && W.MBB == SwitchMBB) {
12248 // If any two of the cases has the same destination, and if one value
12249 // is the same as the other, but has one bit unset that the other has set,
12250 // use bit manipulation to do two compares at once. For example:
12251 // "if (X == 6 || X == 4)" -> "if ((X|2) == 6)"
12252 // TODO: This could be extended to merge any 2 cases in switches with 3
12253 // cases.
12254 // TODO: Handle cases where W.CaseBB != SwitchBB.
12255 CaseCluster &Small = *W.FirstCluster;
12256 CaseCluster &Big = *W.LastCluster;
12257
12258 if (Small.Low == Small.High && Big.Low == Big.High &&
12259 Small.MBB == Big.MBB) {
12260 const APInt &SmallValue = Small.Low->getValue();
12261 const APInt &BigValue = Big.Low->getValue();
12262
12263 // Check that there is only one bit different.
12264 APInt CommonBit = BigValue ^ SmallValue;
12265 if (CommonBit.isPowerOf2()) {
12266 SDValue CondLHS = getValue(Cond);
12267 EVT VT = CondLHS.getValueType();
12268 SDLoc DL = getCurSDLoc();
12269
12270 SDValue Or = DAG.getNode(ISD::OR, DL, VT, CondLHS,
12271 DAG.getConstant(CommonBit, DL, VT));
12272 SDValue Cond = DAG.getSetCC(
12273 DL, MVT::i1, Or, DAG.getConstant(BigValue | SmallValue, DL, VT),
12274 ISD::SETEQ);
12275
12276 // Update successor info.
12277 // Both Small and Big will jump to Small.BB, so we sum up the
12278 // probabilities.
12279 addSuccessorWithProb(SwitchMBB, Small.MBB, Small.Prob + Big.Prob);
12280 if (BPI)
12281 addSuccessorWithProb(
12282 SwitchMBB, DefaultMBB,
12283 // The default destination is the first successor in IR.
12284 BPI->getEdgeProbability(SwitchMBB->getBasicBlock(), (unsigned)0));
12285 else
12286 addSuccessorWithProb(SwitchMBB, DefaultMBB);
12287
12288 // Insert the true branch.
12289 SDValue BrCond =
12290 DAG.getNode(ISD::BRCOND, DL, MVT::Other, getControlRoot(), Cond,
12291 DAG.getBasicBlock(Small.MBB));
12292 // Insert the false branch.
12293 BrCond = DAG.getNode(ISD::BR, DL, MVT::Other, BrCond,
12294 DAG.getBasicBlock(DefaultMBB));
12295
12296 DAG.setRoot(BrCond);
12297 return;
12298 }
12299 }
12300 }
12301
12302 if (TM.getOptLevel() != CodeGenOptLevel::None) {
12303 // Here, we order cases by probability so the most likely case will be
12304 // checked first. However, two clusters can have the same probability in
12305 // which case their relative ordering is non-deterministic. So we use Low
12306 // as a tie-breaker as clusters are guaranteed to never overlap.
12307 llvm::sort(W.FirstCluster, W.LastCluster + 1,
12308 [](const CaseCluster &a, const CaseCluster &b) {
12309 return a.Prob != b.Prob ?
12310 a.Prob > b.Prob :
12311 a.Low->getValue().slt(b.Low->getValue());
12312 });
12313
12314 // Rearrange the case blocks so that the last one falls through if possible
12315 // without changing the order of probabilities.
12316 for (CaseClusterIt I = W.LastCluster; I > W.FirstCluster; ) {
12317 --I;
12318 if (I->Prob > W.LastCluster->Prob)
12319 break;
12320 if (I->Kind == CC_Range && I->MBB == NextMBB) {
12321 std::swap(*I, *W.LastCluster);
12322 break;
12323 }
12324 }
12325 }
12326
12327 // Compute total probability.
12328 BranchProbability DefaultProb = W.DefaultProb;
12329 BranchProbability UnhandledProbs = DefaultProb;
12330 for (CaseClusterIt I = W.FirstCluster; I <= W.LastCluster; ++I)
12331 UnhandledProbs += I->Prob;
12332
12333 MachineBasicBlock *CurMBB = W.MBB;
12334 for (CaseClusterIt I = W.FirstCluster, E = W.LastCluster; I <= E; ++I) {
12335 bool FallthroughUnreachable = false;
12336 MachineBasicBlock *Fallthrough;
12337 if (I == W.LastCluster) {
12338 // For the last cluster, fall through to the default destination.
12339 Fallthrough = DefaultMBB;
12340 FallthroughUnreachable = isa<UnreachableInst>(
12341 DefaultMBB->getBasicBlock()->getFirstNonPHIOrDbg());
12342 } else {
12343 Fallthrough = CurMF->CreateMachineBasicBlock(CurMBB->getBasicBlock());
12344 CurMF->insert(BBI, Fallthrough);
12345 // Put Cond in a virtual register to make it available from the new blocks.
12347 }
12348 UnhandledProbs -= I->Prob;
12349
12350 switch (I->Kind) {
12351 case CC_JumpTable: {
12352 // FIXME: Optimize away range check based on pivot comparisons.
12353 JumpTableHeader *JTH = &SL->JTCases[I->JTCasesIndex].first;
12354 SwitchCG::JumpTable *JT = &SL->JTCases[I->JTCasesIndex].second;
12355
12356 // The jump block hasn't been inserted yet; insert it here.
12357 MachineBasicBlock *JumpMBB = JT->MBB;
12358 CurMF->insert(BBI, JumpMBB);
12359
12360 auto JumpProb = I->Prob;
12361 auto FallthroughProb = UnhandledProbs;
12362
12363 // If the default statement is a target of the jump table, we evenly
12364 // distribute the default probability to successors of CurMBB. Also
12365 // update the probability on the edge from JumpMBB to Fallthrough.
12366 for (MachineBasicBlock::succ_iterator SI = JumpMBB->succ_begin(),
12367 SE = JumpMBB->succ_end();
12368 SI != SE; ++SI) {
12369 if (*SI == DefaultMBB) {
12370 JumpProb += DefaultProb / 2;
12371 FallthroughProb -= DefaultProb / 2;
12372 JumpMBB->setSuccProbability(SI, DefaultProb / 2);
12373 JumpMBB->normalizeSuccProbs();
12374 break;
12375 }
12376 }
12377
12378 // If the default clause is unreachable, propagate that knowledge into
12379 // JTH->FallthroughUnreachable which will use it to suppress the range
12380 // check.
12381 //
12382 // However, don't do this if we're doing branch target enforcement,
12383 // because a table branch _without_ a range check can be a tempting JOP
12384 // gadget - out-of-bounds inputs that are impossible in correct
12385 // execution become possible again if an attacker can influence the
12386 // control flow. So if an attacker doesn't already have a BTI bypass
12387 // available, we don't want them to be able to get one out of this
12388 // table branch.
12389 if (FallthroughUnreachable) {
12390 Function &CurFunc = CurMF->getFunction();
12391 if (!CurFunc.hasFnAttribute("branch-target-enforcement"))
12392 JTH->FallthroughUnreachable = true;
12393 }
12394
12395 if (!JTH->FallthroughUnreachable)
12396 addSuccessorWithProb(CurMBB, Fallthrough, FallthroughProb);
12397 addSuccessorWithProb(CurMBB, JumpMBB, JumpProb);
12398 CurMBB->normalizeSuccProbs();
12399
12400 // The jump table header will be inserted in our current block, do the
12401 // range check, and fall through to our fallthrough block.
12402 JTH->HeaderBB = CurMBB;
12403 JT->Default = Fallthrough; // FIXME: Move Default to JumpTableHeader.
12404
12405 // If we're in the right place, emit the jump table header right now.
12406 if (CurMBB == SwitchMBB) {
12407 visitJumpTableHeader(*JT, *JTH, SwitchMBB);
12408 JTH->Emitted = true;
12409 }
12410 break;
12411 }
12412 case CC_BitTests: {
12413 // FIXME: Optimize away range check based on pivot comparisons.
12414 BitTestBlock *BTB = &SL->BitTestCases[I->BTCasesIndex];
12415
12416 // The bit test blocks haven't been inserted yet; insert them here.
12417 for (BitTestCase &BTC : BTB->Cases)
12418 CurMF->insert(BBI, BTC.ThisBB);
12419
12420 // Fill in fields of the BitTestBlock.
12421 BTB->Parent = CurMBB;
12422 BTB->Default = Fallthrough;
12423
12424 BTB->DefaultProb = UnhandledProbs;
12425 // If the cases in bit test don't form a contiguous range, we evenly
12426 // distribute the probability on the edge to Fallthrough to two
12427 // successors of CurMBB.
12428 if (!BTB->ContiguousRange) {
12429 BTB->Prob += DefaultProb / 2;
12430 BTB->DefaultProb -= DefaultProb / 2;
12431 }
12432
12433 if (FallthroughUnreachable)
12434 BTB->FallthroughUnreachable = true;
12435
12436 // If we're in the right place, emit the bit test header right now.
12437 if (CurMBB == SwitchMBB) {
12438 visitBitTestHeader(*BTB, SwitchMBB);
12439 BTB->Emitted = true;
12440 }
12441 break;
12442 }
12443 case CC_Range: {
12444 const Value *RHS, *LHS, *MHS;
12445 ISD::CondCode CC;
12446 if (I->Low == I->High) {
12447 // Check Cond == I->Low.
12448 CC = ISD::SETEQ;
12449 LHS = Cond;
12450 RHS=I->Low;
12451 MHS = nullptr;
12452 } else {
12453 // Check I->Low <= Cond <= I->High.
12454 CC = ISD::SETLE;
12455 LHS = I->Low;
12456 MHS = Cond;
12457 RHS = I->High;
12458 }
12459
12460 // If Fallthrough is unreachable, fold away the comparison.
12461 if (FallthroughUnreachable)
12462 CC = ISD::SETTRUE;
12463
12464 // The false probability is the sum of all unhandled cases.
12465 CaseBlock CB(CC, LHS, RHS, MHS, I->MBB, Fallthrough, CurMBB,
12466 getCurSDLoc(), I->Prob, UnhandledProbs);
12467
12468 if (CurMBB == SwitchMBB)
12469 visitSwitchCase(CB, SwitchMBB);
12470 else
12471 SL->SwitchCases.push_back(CB);
12472
12473 break;
12474 }
12475 }
12476 CurMBB = Fallthrough;
12477 }
12478}
12479
12480void SelectionDAGBuilder::splitWorkItem(SwitchWorkList &WorkList,
12481 const SwitchWorkListItem &W,
12482 Value *Cond,
12483 MachineBasicBlock *SwitchMBB) {
12484 assert(W.FirstCluster->Low->getValue().slt(W.LastCluster->Low->getValue()) &&
12485 "Clusters not sorted?");
12486 assert(W.LastCluster - W.FirstCluster + 1 >= 2 && "Too small to split!");
12487
12488 auto [LastLeft, FirstRight, LeftProb, RightProb] =
12489 SL->computeSplitWorkItemInfo(W);
12490
12491 // Use the first element on the right as pivot since we will make less-than
12492 // comparisons against it.
12493 CaseClusterIt PivotCluster = FirstRight;
12494 assert(PivotCluster > W.FirstCluster);
12495 assert(PivotCluster <= W.LastCluster);
12496
12497 CaseClusterIt FirstLeft = W.FirstCluster;
12498 CaseClusterIt LastRight = W.LastCluster;
12499
12500 const ConstantInt *Pivot = PivotCluster->Low;
12501
12502 // New blocks will be inserted immediately after the current one.
12504 ++BBI;
12505
12506 // We will branch to the LHS if Value < Pivot. If LHS is a single cluster,
12507 // we can branch to its destination directly if it's squeezed exactly in
12508 // between the known lower bound and Pivot - 1.
12509 MachineBasicBlock *LeftMBB;
12510 if (FirstLeft == LastLeft && FirstLeft->Kind == CC_Range &&
12511 FirstLeft->Low == W.GE &&
12512 (FirstLeft->High->getValue() + 1LL) == Pivot->getValue()) {
12513 LeftMBB = FirstLeft->MBB;
12514 } else {
12515 LeftMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
12516 FuncInfo.MF->insert(BBI, LeftMBB);
12517 WorkList.push_back(
12518 {LeftMBB, FirstLeft, LastLeft, W.GE, Pivot, W.DefaultProb / 2});
12519 // Put Cond in a virtual register to make it available from the new blocks.
12521 }
12522
12523 // Similarly, we will branch to the RHS if Value >= Pivot. If RHS is a
12524 // single cluster, RHS.Low == Pivot, and we can branch to its destination
12525 // directly if RHS.High equals the current upper bound.
12526 MachineBasicBlock *RightMBB;
12527 if (FirstRight == LastRight && FirstRight->Kind == CC_Range &&
12528 W.LT && (FirstRight->High->getValue() + 1ULL) == W.LT->getValue()) {
12529 RightMBB = FirstRight->MBB;
12530 } else {
12531 RightMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
12532 FuncInfo.MF->insert(BBI, RightMBB);
12533 WorkList.push_back(
12534 {RightMBB, FirstRight, LastRight, Pivot, W.LT, W.DefaultProb / 2});
12535 // Put Cond in a virtual register to make it available from the new blocks.
12537 }
12538
12539 // Create the CaseBlock record that will be used to lower the branch.
12540 CaseBlock CB(ISD::SETLT, Cond, Pivot, nullptr, LeftMBB, RightMBB, W.MBB,
12541 getCurSDLoc(), LeftProb, RightProb);
12542
12543 if (W.MBB == SwitchMBB)
12544 visitSwitchCase(CB, SwitchMBB);
12545 else
12546 SL->SwitchCases.push_back(CB);
12547}
12548
12549// Scale CaseProb after peeling a case with the probablity of PeeledCaseProb
12550// from the swith statement.
12552 BranchProbability PeeledCaseProb) {
12553 if (PeeledCaseProb == BranchProbability::getOne())
12555 BranchProbability SwitchProb = PeeledCaseProb.getCompl();
12556
12557 uint32_t Numerator = CaseProb.getNumerator();
12558 uint32_t Denominator = SwitchProb.scale(CaseProb.getDenominator());
12559 return BranchProbability(Numerator, std::max(Numerator, Denominator));
12560}
12561
12562// Try to peel the top probability case if it exceeds the threshold.
12563// Return current MachineBasicBlock for the switch statement if the peeling
12564// does not occur.
12565// If the peeling is performed, return the newly created MachineBasicBlock
12566// for the peeled switch statement. Also update Clusters to remove the peeled
12567// case. PeeledCaseProb is the BranchProbability for the peeled case.
12568MachineBasicBlock *SelectionDAGBuilder::peelDominantCaseCluster(
12569 const SwitchInst &SI, CaseClusterVector &Clusters,
12570 BranchProbability &PeeledCaseProb) {
12571 MachineBasicBlock *SwitchMBB = FuncInfo.MBB;
12572 // Don't perform if there is only one cluster or optimizing for size.
12573 if (SwitchPeelThreshold > 100 || !FuncInfo.BPI || Clusters.size() < 2 ||
12574 TM.getOptLevel() == CodeGenOptLevel::None ||
12575 SwitchMBB->getParent()->getFunction().hasMinSize())
12576 return SwitchMBB;
12577
12578 BranchProbability TopCaseProb = BranchProbability(SwitchPeelThreshold, 100);
12579 unsigned PeeledCaseIndex = 0;
12580 bool SwitchPeeled = false;
12581 for (unsigned Index = 0; Index < Clusters.size(); ++Index) {
12582 CaseCluster &CC = Clusters[Index];
12583 if (CC.Prob < TopCaseProb)
12584 continue;
12585 TopCaseProb = CC.Prob;
12586 PeeledCaseIndex = Index;
12587 SwitchPeeled = true;
12588 }
12589 if (!SwitchPeeled)
12590 return SwitchMBB;
12591
12592 LLVM_DEBUG(dbgs() << "Peeled one top case in switch stmt, prob: "
12593 << TopCaseProb << "\n");
12594
12595 // Record the MBB for the peeled switch statement.
12596 MachineFunction::iterator BBI(SwitchMBB);
12597 ++BBI;
12598 MachineBasicBlock *PeeledSwitchMBB =
12599 FuncInfo.MF->CreateMachineBasicBlock(SwitchMBB->getBasicBlock());
12600 FuncInfo.MF->insert(BBI, PeeledSwitchMBB);
12601
12602 ExportFromCurrentBlock(SI.getCondition());
12603 auto PeeledCaseIt = Clusters.begin() + PeeledCaseIndex;
12604 SwitchWorkListItem W = {SwitchMBB, PeeledCaseIt, PeeledCaseIt,
12605 nullptr, nullptr, TopCaseProb.getCompl()};
12606 lowerWorkItem(W, SI.getCondition(), SwitchMBB, PeeledSwitchMBB);
12607
12608 Clusters.erase(PeeledCaseIt);
12609 for (CaseCluster &CC : Clusters) {
12610 LLVM_DEBUG(
12611 dbgs() << "Scale the probablity for one cluster, before scaling: "
12612 << CC.Prob << "\n");
12613 CC.Prob = scaleCaseProbality(CC.Prob, TopCaseProb);
12614 LLVM_DEBUG(dbgs() << "After scaling: " << CC.Prob << "\n");
12615 }
12616 PeeledCaseProb = TopCaseProb;
12617 return PeeledSwitchMBB;
12618}
12619
12620void SelectionDAGBuilder::visitSwitch(const SwitchInst &SI) {
12621 // Extract cases from the switch.
12622 BranchProbabilityInfo *BPI = FuncInfo.BPI;
12623 CaseClusterVector Clusters;
12624 Clusters.reserve(SI.getNumCases());
12625 for (auto I : SI.cases()) {
12626 MachineBasicBlock *Succ = FuncInfo.getMBB(I.getCaseSuccessor());
12627 const ConstantInt *CaseVal = I.getCaseValue();
12628 BranchProbability Prob =
12629 BPI ? BPI->getEdgeProbability(SI.getParent(), I.getSuccessorIndex())
12630 : BranchProbability(1, SI.getNumCases() + 1);
12631 Clusters.push_back(CaseCluster::range(CaseVal, CaseVal, Succ, Prob));
12632 }
12633
12634 MachineBasicBlock *DefaultMBB = FuncInfo.getMBB(SI.getDefaultDest());
12635
12636 // Cluster adjacent cases with the same destination. We do this at all
12637 // optimization levels because it's cheap to do and will make codegen faster
12638 // if there are many clusters.
12639 sortAndRangeify(Clusters);
12640
12641 // The branch probablity of the peeled case.
12642 BranchProbability PeeledCaseProb = BranchProbability::getZero();
12643 MachineBasicBlock *PeeledSwitchMBB =
12644 peelDominantCaseCluster(SI, Clusters, PeeledCaseProb);
12645
12646 // If there is only the default destination, jump there directly.
12647 MachineBasicBlock *SwitchMBB = FuncInfo.MBB;
12648 if (Clusters.empty()) {
12649 assert(PeeledSwitchMBB == SwitchMBB);
12650 SwitchMBB->addSuccessor(DefaultMBB);
12651 if (DefaultMBB != NextBlock(SwitchMBB)) {
12652 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
12653 getControlRoot(), DAG.getBasicBlock(DefaultMBB)));
12654 }
12655 return;
12656 }
12657
12658 SL->findJumpTables(Clusters, &SI, getCurSDLoc(), DefaultMBB, DAG.getPSI(),
12659 DAG.getBFI());
12660 SL->findBitTestClusters(Clusters, &SI);
12661
12662 LLVM_DEBUG({
12663 dbgs() << "Case clusters: ";
12664 for (const CaseCluster &C : Clusters) {
12665 if (C.Kind == CC_JumpTable)
12666 dbgs() << "JT:";
12667 if (C.Kind == CC_BitTests)
12668 dbgs() << "BT:";
12669
12670 C.Low->getValue().print(dbgs(), true);
12671 if (C.Low != C.High) {
12672 dbgs() << '-';
12673 C.High->getValue().print(dbgs(), true);
12674 }
12675 dbgs() << ' ';
12676 }
12677 dbgs() << '\n';
12678 });
12679
12680 assert(!Clusters.empty());
12681 SwitchWorkList WorkList;
12682 CaseClusterIt First = Clusters.begin();
12683 CaseClusterIt Last = Clusters.end() - 1;
12684 auto DefaultProb = getEdgeProbability(PeeledSwitchMBB, DefaultMBB);
12685 // Scale the branchprobability for DefaultMBB if the peel occurs and
12686 // DefaultMBB is not replaced.
12687 if (PeeledCaseProb != BranchProbability::getZero() &&
12688 DefaultMBB == FuncInfo.getMBB(SI.getDefaultDest()))
12689 DefaultProb = scaleCaseProbality(DefaultProb, PeeledCaseProb);
12690 WorkList.push_back(
12691 {PeeledSwitchMBB, First, Last, nullptr, nullptr, DefaultProb});
12692
12693 while (!WorkList.empty()) {
12694 SwitchWorkListItem W = WorkList.pop_back_val();
12695 unsigned NumClusters = W.LastCluster - W.FirstCluster + 1;
12696
12697 if (NumClusters > 3 && TM.getOptLevel() != CodeGenOptLevel::None &&
12698 !DefaultMBB->getParent()->getFunction().hasMinSize()) {
12699 // For optimized builds, lower large range as a balanced binary tree.
12700 splitWorkItem(WorkList, W, SI.getCondition(), SwitchMBB);
12701 continue;
12702 }
12703
12704 lowerWorkItem(W, SI.getCondition(), SwitchMBB, DefaultMBB);
12705 }
12706}
12707
12708void SelectionDAGBuilder::visitStepVector(const CallInst &I) {
12709 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12710 auto DL = getCurSDLoc();
12711 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12712 setValue(&I, DAG.getStepVector(DL, ResultVT));
12713}
12714
12715void SelectionDAGBuilder::visitVectorReverse(const CallInst &I) {
12716 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12717 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12718
12719 SDLoc DL = getCurSDLoc();
12720 SDValue V = getValue(I.getOperand(0));
12721 assert(VT == V.getValueType() && "Malformed vector.reverse!");
12722
12723 if (VT.isScalableVector()) {
12724 setValue(&I, DAG.getNode(ISD::VECTOR_REVERSE, DL, VT, V));
12725 return;
12726 }
12727
12728 // Use VECTOR_SHUFFLE for the fixed-length vector
12729 // to maintain existing behavior.
12730 SmallVector<int, 8> Mask;
12731 unsigned NumElts = VT.getVectorMinNumElements();
12732 for (unsigned i = 0; i != NumElts; ++i)
12733 Mask.push_back(NumElts - 1 - i);
12734
12735 setValue(&I, DAG.getVectorShuffle(VT, DL, V, DAG.getUNDEF(VT), Mask));
12736}
12737
12738void SelectionDAGBuilder::visitVectorDeinterleave(const CallInst &I,
12739 unsigned Factor) {
12740 auto DL = getCurSDLoc();
12741 SDValue InVec = getValue(I.getOperand(0));
12742
12743 SmallVector<EVT, 4> ValueVTs;
12744 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
12745 ValueVTs);
12746
12747 EVT OutVT = ValueVTs[0];
12748 unsigned OutNumElts = OutVT.getVectorMinNumElements();
12749
12750 SmallVector<SDValue, 4> SubVecs(Factor);
12751 for (unsigned i = 0; i != Factor; ++i) {
12752 assert(ValueVTs[i] == OutVT && "Expected VTs to be the same");
12753 SubVecs[i] = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, OutVT, InVec,
12754 DAG.getVectorIdxConstant(OutNumElts * i, DL));
12755 }
12756
12757 // Use VECTOR_SHUFFLE for fixed-length vectors with factor of 2 to benefit
12758 // from existing legalisation and combines.
12759 if (OutVT.isFixedLengthVector() && Factor == 2) {
12760 SDValue Even = DAG.getVectorShuffle(OutVT, DL, SubVecs[0], SubVecs[1],
12761 createStrideMask(0, 2, OutNumElts));
12762 SDValue Odd = DAG.getVectorShuffle(OutVT, DL, SubVecs[0], SubVecs[1],
12763 createStrideMask(1, 2, OutNumElts));
12764 SDValue Res = DAG.getMergeValues({Even, Odd}, getCurSDLoc());
12765 setValue(&I, Res);
12766 return;
12767 }
12768
12769 SDValue Res = DAG.getNode(ISD::VECTOR_DEINTERLEAVE, DL,
12770 DAG.getVTList(ValueVTs), SubVecs);
12771 setValue(&I, Res);
12772}
12773
12774void SelectionDAGBuilder::visitVectorInterleave(const CallInst &I,
12775 unsigned Factor) {
12776 auto DL = getCurSDLoc();
12777 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12778 EVT InVT = getValue(I.getOperand(0)).getValueType();
12779 EVT OutVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12780
12781 SmallVector<SDValue, 8> InVecs(Factor);
12782 for (unsigned i = 0; i < Factor; ++i) {
12783 InVecs[i] = getValue(I.getOperand(i));
12784 assert(InVecs[i].getValueType() == InVecs[0].getValueType() &&
12785 "Expected VTs to be the same");
12786 }
12787
12788 // Use VECTOR_SHUFFLE for fixed-length vectors with factor of 2 to benefit
12789 // from existing legalisation and combines.
12790 if (OutVT.isFixedLengthVector() && Factor == 2) {
12791 unsigned NumElts = InVT.getVectorMinNumElements();
12792 SDValue V = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, InVecs);
12793 setValue(&I, DAG.getVectorShuffle(OutVT, DL, V, DAG.getUNDEF(OutVT),
12794 createInterleaveMask(NumElts, 2)));
12795 return;
12796 }
12797
12798 SmallVector<EVT, 8> ValueVTs(Factor, InVT);
12799 SDValue Res =
12800 DAG.getNode(ISD::VECTOR_INTERLEAVE, DL, DAG.getVTList(ValueVTs), InVecs);
12801
12803 for (unsigned i = 0; i < Factor; ++i)
12804 Results[i] = Res.getValue(i);
12805
12806 Res = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, Results);
12807 setValue(&I, Res);
12808}
12809
12810void SelectionDAGBuilder::visitFreeze(const FreezeInst &I) {
12811 SmallVector<EVT, 4> ValueVTs;
12812 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
12813 ValueVTs);
12814 unsigned NumValues = ValueVTs.size();
12815 if (NumValues == 0) return;
12816
12817 SmallVector<SDValue, 4> Values(NumValues);
12818 SDValue Op = getValue(I.getOperand(0));
12819
12820 for (unsigned i = 0; i != NumValues; ++i)
12821 Values[i] = DAG.getNode(ISD::FREEZE, getCurSDLoc(), ValueVTs[i],
12822 SDValue(Op.getNode(), Op.getResNo() + i));
12823
12825 DAG.getVTList(ValueVTs), Values));
12826}
12827
12828void SelectionDAGBuilder::visitVectorSplice(const CallInst &I) {
12829 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12830 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
12831
12832 SDLoc DL = getCurSDLoc();
12833 SDValue V1 = getValue(I.getOperand(0));
12834 SDValue V2 = getValue(I.getOperand(1));
12835 int64_t Imm = cast<ConstantInt>(I.getOperand(2))->getSExtValue();
12836
12837 // VECTOR_SHUFFLE doesn't support a scalable mask so use a dedicated node.
12838 if (VT.isScalableVector()) {
12839 setValue(
12840 &I, DAG.getNode(ISD::VECTOR_SPLICE, DL, VT, V1, V2,
12841 DAG.getSignedConstant(
12842 Imm, DL, TLI.getVectorIdxTy(DAG.getDataLayout()))));
12843 return;
12844 }
12845
12846 unsigned NumElts = VT.getVectorNumElements();
12847
12848 uint64_t Idx = (NumElts + Imm) % NumElts;
12849
12850 // Use VECTOR_SHUFFLE to maintain original behaviour for fixed-length vectors.
12851 SmallVector<int, 8> Mask;
12852 for (unsigned i = 0; i < NumElts; ++i)
12853 Mask.push_back(Idx + i);
12854 setValue(&I, DAG.getVectorShuffle(VT, DL, V1, V2, Mask));
12855}
12856
12857// Consider the following MIR after SelectionDAG, which produces output in
12858// phyregs in the first case or virtregs in the second case.
12859//
12860// INLINEASM_BR ..., implicit-def $ebx, ..., implicit-def $edx
12861// %5:gr32 = COPY $ebx
12862// %6:gr32 = COPY $edx
12863// %1:gr32 = COPY %6:gr32
12864// %0:gr32 = COPY %5:gr32
12865//
12866// INLINEASM_BR ..., def %5:gr32, ..., def %6:gr32
12867// %1:gr32 = COPY %6:gr32
12868// %0:gr32 = COPY %5:gr32
12869//
12870// Given %0, we'd like to return $ebx in the first case and %5 in the second.
12871// Given %1, we'd like to return $edx in the first case and %6 in the second.
12872//
12873// If a callbr has outputs, it will have a single mapping in FuncInfo.ValueMap
12874// to a single virtreg (such as %0). The remaining outputs monotonically
12875// increase in virtreg number from there. If a callbr has no outputs, then it
12876// should not have a corresponding callbr landingpad; in fact, the callbr
12877// landingpad would not even be able to refer to such a callbr.
12879 MachineInstr *MI = MRI.def_begin(Reg)->getParent();
12880 // There is definitely at least one copy.
12881 assert(MI->getOpcode() == TargetOpcode::COPY &&
12882 "start of copy chain MUST be COPY");
12883 Reg = MI->getOperand(1).getReg();
12884
12885 // If the copied register in the first copy must be virtual.
12886 assert(Reg.isVirtual() && "expected COPY of virtual register");
12887 MI = MRI.def_begin(Reg)->getParent();
12888
12889 // There may be an optional second copy.
12890 if (MI->getOpcode() == TargetOpcode::COPY) {
12891 assert(Reg.isVirtual() && "expected COPY of virtual register");
12892 Reg = MI->getOperand(1).getReg();
12893 assert(Reg.isPhysical() && "expected COPY of physical register");
12894 } else {
12895 // The start of the chain must be an INLINEASM_BR.
12896 assert(MI->getOpcode() == TargetOpcode::INLINEASM_BR &&
12897 "end of copy chain MUST be INLINEASM_BR");
12898 }
12899
12900 return Reg;
12901}
12902
12903// We must do this walk rather than the simpler
12904// setValue(&I, getCopyFromRegs(CBR, CBR->getType()));
12905// otherwise we will end up with copies of virtregs only valid along direct
12906// edges.
12907void SelectionDAGBuilder::visitCallBrLandingPad(const CallInst &I) {
12908 SmallVector<EVT, 8> ResultVTs;
12909 SmallVector<SDValue, 8> ResultValues;
12910 const auto *CBR =
12911 cast<CallBrInst>(I.getParent()->getUniquePredecessor()->getTerminator());
12912
12913 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12914 const TargetRegisterInfo *TRI = DAG.getSubtarget().getRegisterInfo();
12915 MachineRegisterInfo &MRI = DAG.getMachineFunction().getRegInfo();
12916
12917 Register InitialDef = FuncInfo.ValueMap[CBR];
12918 SDValue Chain = DAG.getRoot();
12919
12920 // Re-parse the asm constraints string.
12921 TargetLowering::AsmOperandInfoVector TargetConstraints =
12922 TLI.ParseConstraints(DAG.getDataLayout(), TRI, *CBR);
12923 for (auto &T : TargetConstraints) {
12924 SDISelAsmOperandInfo OpInfo(T);
12925 if (OpInfo.Type != InlineAsm::isOutput)
12926 continue;
12927
12928 // Pencil in OpInfo.ConstraintType and OpInfo.ConstraintVT based on the
12929 // individual constraint.
12930 TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
12931
12932 switch (OpInfo.ConstraintType) {
12935 // Fill in OpInfo.AssignedRegs.Regs.
12936 getRegistersForValue(DAG, getCurSDLoc(), OpInfo, OpInfo);
12937
12938 // getRegistersForValue may produce 1 to many registers based on whether
12939 // the OpInfo.ConstraintVT is legal on the target or not.
12940 for (Register &Reg : OpInfo.AssignedRegs.Regs) {
12941 Register OriginalDef = FollowCopyChain(MRI, InitialDef++);
12942 if (OriginalDef.isPhysical())
12943 FuncInfo.MBB->addLiveIn(OriginalDef);
12944 // Update the assigned registers to use the original defs.
12945 Reg = OriginalDef;
12946 }
12947
12948 SDValue V = OpInfo.AssignedRegs.getCopyFromRegs(
12949 DAG, FuncInfo, getCurSDLoc(), Chain, nullptr, CBR);
12950 ResultValues.push_back(V);
12951 ResultVTs.push_back(OpInfo.ConstraintVT);
12952 break;
12953 }
12955 SDValue Flag;
12956 SDValue V = TLI.LowerAsmOutputForConstraint(Chain, Flag, getCurSDLoc(),
12957 OpInfo, DAG);
12958 ++InitialDef;
12959 ResultValues.push_back(V);
12960 ResultVTs.push_back(OpInfo.ConstraintVT);
12961 break;
12962 }
12963 default:
12964 break;
12965 }
12966 }
12968 DAG.getVTList(ResultVTs), ResultValues);
12969 setValue(&I, V);
12970}
unsigned const MachineRegisterInfo * MRI
return SDValue()
static unsigned getIntrinsicID(const SDNode *N)
unsigned RegSize
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static msgpack::DocNode getNode(msgpack::DocNode DN, msgpack::Type Type, MCValue Val)
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
Function Alias Analysis Results
Atomic ordering constants.
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
This file implements the BitVector class.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Analysis containing CSE Info
Definition CSEInfo.cpp:27
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 unsigned 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)
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
static Type * getValueType(Value *V)
Returns the type of the given value/instruction V.
This file contains some templates that are useful if you are working with the STL at all.
static bool hasOnlySelectUsers(const Value *Cond)
static SDValue getLoadStackGuard(SelectionDAG &DAG, const SDLoc &DL, SDValue &Chain)
Create a LOAD_STACK_GUARD node, and let it carry the target specific global variable if there exists ...
static bool getUniformBase(const Value *Ptr, SDValue &Base, SDValue &Index, SDValue &Scale, SelectionDAGBuilder *SDB, const BasicBlock *CurBB, uint64_t ElemSize)
static void failForInvalidBundles(const CallBase &I, StringRef Name, ArrayRef< uint32_t > AllowedBundles)
static void addStackMapLiveVars(const CallBase &Call, unsigned StartIdx, const SDLoc &DL, SmallVectorImpl< SDValue > &Ops, SelectionDAGBuilder &Builder)
Add a stack map intrinsic call's live variable operands to a stackmap or patchpoint target node's ope...
static const unsigned MaxParallelChains
static SDValue expandPow(const SDLoc &dl, SDValue LHS, SDValue RHS, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
visitPow - Lower a pow intrinsic.
static const CallBase * FindPreallocatedCall(const Value *PreallocatedSetup)
Given a @llvm.call.preallocated.setup, return the corresponding preallocated call.
static cl::opt< unsigned > SwitchPeelThreshold("switch-peel-threshold", cl::Hidden, cl::init(66), cl::desc("Set the case probability threshold for peeling the case from a " "switch statement. A value greater than 100 will void this " "optimization"))
static cl::opt< bool > InsertAssertAlign("insert-assert-align", cl::init(true), cl::desc("Insert the experimental `assertalign` node."), cl::ReallyHidden)
static unsigned getISDForVPIntrinsic(const VPIntrinsic &VPIntrin)
static bool handleDanglingVariadicDebugInfo(SelectionDAG &DAG, DILocalVariable *Variable, DebugLoc DL, unsigned Order, SmallVectorImpl< Value * > &Values, DIExpression *Expression)
static unsigned findMatchingInlineAsmOperand(unsigned OperandNo, const std::vector< SDValue > &AsmNodeOperands)
static void patchMatchingInput(const SDISelAsmOperandInfo &OpInfo, SDISelAsmOperandInfo &MatchingOpInfo, SelectionDAG &DAG)
Make sure that the output operand OpInfo and its corresponding input operand MatchingOpInfo have comp...
static void findUnwindDestinations(FunctionLoweringInfo &FuncInfo, const BasicBlock *EHPadBB, BranchProbability Prob, SmallVectorImpl< std::pair< MachineBasicBlock *, BranchProbability > > &UnwindDests)
When an invoke or a cleanupret unwinds to the next EH pad, there are many places it could ultimately ...
static unsigned FixedPointIntrinsicToOpcode(unsigned Intrinsic)
static BranchProbability scaleCaseProbality(BranchProbability CaseProb, BranchProbability PeeledCaseProb)
static SDValue expandExp2(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandExp2 - Lower an exp2 intrinsic.
static SDValue expandDivFix(unsigned Opcode, const SDLoc &DL, SDValue LHS, SDValue RHS, SDValue Scale, SelectionDAG &DAG, const TargetLowering &TLI)
static SDValue getF32Constant(SelectionDAG &DAG, unsigned Flt, const SDLoc &dl)
getF32Constant - Get 32-bit floating point constant.
static SDValue widenVectorToPartType(SelectionDAG &DAG, SDValue Val, const SDLoc &DL, EVT PartVT)
static SDValue expandLog10(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandLog10 - Lower a log10 intrinsic.
DenseMap< const Argument *, std::pair< const AllocaInst *, const StoreInst * > > ArgCopyElisionMapTy
static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &dl, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, const Value *V, std::optional< CallingConv::ID > CallConv)
getCopyToPartsVector - Create a series of nodes that contain the specified value split into legal par...
static void getUnderlyingArgRegs(SmallVectorImpl< std::pair< Register, TypeSize > > &Regs, const SDValue &N)
static void getCopyToParts(SelectionDAG &DAG, const SDLoc &DL, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, const Value *V, std::optional< CallingConv::ID > CallConv=std::nullopt, ISD::NodeType ExtendKind=ISD::ANY_EXTEND)
getCopyToParts - Create a series of nodes that contain the specified value split into legal parts.
static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT, SelectionDAGBuilder &Builder)
static SDValue expandLog2(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandLog2 - Lower a log2 intrinsic.
static SDValue getAddressForMemoryInput(SDValue Chain, const SDLoc &Location, SDISelAsmOperandInfo &OpInfo, SelectionDAG &DAG)
Get a direct memory input to behave well as an indirect operand.
static bool isOnlyUsedInEntryBlock(const Argument *A, bool FastISel)
isOnlyUsedInEntryBlock - If the specified argument is only used in the entry block,...
static void diagnosePossiblyInvalidConstraint(LLVMContext &Ctx, const Value *V, const Twine &ErrMsg)
static bool collectInstructionDeps(SmallMapVector< const Instruction *, bool, 8 > *Deps, const Value *V, SmallMapVector< const Instruction *, bool, 8 > *Necessary=nullptr, unsigned Depth=0)
static void findArgumentCopyElisionCandidates(const DataLayout &DL, FunctionLoweringInfo *FuncInfo, ArgCopyElisionMapTy &ArgCopyElisionCandidates)
Scan the entry block of the function in FuncInfo for arguments that look like copies into a local all...
static bool isFunction(SDValue Op)
static SDValue GetExponent(SelectionDAG &DAG, SDValue Op, const TargetLowering &TLI, const SDLoc &dl)
GetExponent - Get the exponent:
static Register FollowCopyChain(MachineRegisterInfo &MRI, Register Reg)
static SDValue ExpandPowI(const SDLoc &DL, SDValue LHS, SDValue RHS, SelectionDAG &DAG)
ExpandPowI - Expand a llvm.powi intrinsic.
static SDValue expandLog(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandLog - Lower a log intrinsic.
static SDValue getCopyFromParts(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V, SDValue InChain, std::optional< CallingConv::ID > CC=std::nullopt, std::optional< ISD::NodeType > AssertOp=std::nullopt)
getCopyFromParts - Create a value that contains the specified legal parts combined into the value the...
static SDValue getLimitedPrecisionExp2(SDValue t0, const SDLoc &dl, SelectionDAG &DAG)
static SDValue GetSignificand(SelectionDAG &DAG, SDValue Op, const SDLoc &dl)
GetSignificand - Get the significand and build it into a floating-point number with exponent of 1:
static SDValue expandExp(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandExp - Lower an exp intrinsic.
static const MDNode * getRangeMetadata(const Instruction &I)
static cl::opt< unsigned, true > LimitFPPrecision("limit-float-precision", cl::desc("Generate low-precision inline sequences " "for some float libcalls"), cl::location(LimitFloatPrecision), cl::Hidden, cl::init(0))
static void tryToElideArgumentCopy(FunctionLoweringInfo &FuncInfo, SmallVectorImpl< SDValue > &Chains, DenseMap< int, int > &ArgCopyElisionFrameIndexMap, SmallPtrSetImpl< const Instruction * > &ElidedArgCopyInstrs, ArgCopyElisionMapTy &ArgCopyElisionCandidates, const Argument &Arg, ArrayRef< SDValue > ArgVals, bool &ArgHasUses)
Try to elide argument copies from memory into a local alloca.
static unsigned LimitFloatPrecision
LimitFloatPrecision - Generate low-precision inline sequences for some float libcalls (6,...
static SDValue getCopyFromPartsVector(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V, SDValue InChain, std::optional< CallingConv::ID > CC)
getCopyFromPartsVector - Create a value that contains the specified legal parts combined into the val...
static bool InBlock(const Value *V, const BasicBlock *BB)
static FPClassTest getNoFPClass(const Instruction &I)
static LLVM_ATTRIBUTE_ALWAYS_INLINE MVT::SimpleValueType getSimpleVT(const unsigned char *MatcherTable, unsigned &MatcherIndex)
getSimpleVT - Decode a value in MatcherTable, if it's a VBR encoded value, use GetVBR to decode it.
This file defines the SmallPtrSet class.
This file contains some functions that are useful when dealing with strings.
#define LLVM_DEBUG(...)
Definition Debug.h:114
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
This pass exposes codegen information to IR-level passes.
Value * RHS
Value * LHS
static const fltSemantics & IEEEsingle()
Definition APFloat.h:296
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.
Type * getAllocatedType() const
Return the type that is being allocated by the instruction.
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:339
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:41
iterator end() const
Definition ArrayRef.h:132
size_t size() const
size - Get the array size.
Definition ArrayRef.h:143
iterator begin() const
Definition ArrayRef.h:131
bool empty() const
empty - Check if the array is empty.
Definition ArrayRef.h:138
A cache of @llvm.assume calls within a function.
An instruction that atomically checks whether a specified value is in a memory location,...
an instruction that atomically reads a memory location, combines it with another value,...
@ Add
*p = old + v
@ FAdd
*p = old + v
@ USubCond
Subtract only if no unsigned overflow.
@ FMinimum
*p = minimum(old, v) minimum matches the behavior of llvm.minimum.
@ Min
*p = old <signed v ? old : v
@ Sub
*p = old - v
@ And
*p = old & v
@ Xor
*p = old ^ v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ FMaximum
*p = maximum(old, v) maximum matches the behavior of llvm.maximum.
@ FSub
*p = old - v
@ UIncWrap
Increment one up to a maximum value.
@ Max
*p = old >signed v ? old : v
@ UMin
*p = old <unsigned v ? old : v
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
@ UMax
*p = old >unsigned v ? old : v
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
@ Nand
*p = ~(old & v)
This class holds the attributes for a particular argument, parameter, function, or return value.
Definition Attributes.h:361
LLVM Basic Block Representation.
Definition BasicBlock.h:62
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
InstListType::const_iterator const_iterator
Definition BasicBlock.h:171
LLVM_ABI bool isEntryBlock() const
Return true if this is the entry block of the containing function.
LLVM_ABI InstListType::const_iterator getFirstNonPHIOrDbg(bool SkipPseudoOp=true) const
Returns a pointer to the first instruction in this block that is not a PHINode or a debug intrinsic,...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
Definition BasicBlock.h:233
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
This class represents a no-op cast from one type to another.
The address of a basic block.
Definition Constants.h:899
Conditional or Unconditional Branch instruction.
Analysis providing branch probability information.
LLVM_ABI BranchProbability getEdgeProbability(const BasicBlock *Src, unsigned IndexInSuccessors) const
Get an edge's probability, relative to other out-edges of the Src.
LLVM_ABI bool isEdgeHot(const BasicBlock *Src, const BasicBlock *Dst) const
Test if an edge is hot relative to other out-edges of the Src.
static uint32_t getDenominator()
static BranchProbability getOne()
static BranchProbability getUnknown()
uint32_t getNumerator() const
LLVM_ABI uint64_t scale(uint64_t Num) const
Scale a large integer.
BranchProbability getCompl() const
static BranchProbability getZero()
static void normalizeProbabilities(ProbabilityIter Begin, ProbabilityIter End)
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
std::optional< OperandBundleUse > getOperandBundle(StringRef Name) const
Return an operand bundle by name, if present.
CallingConv::ID getCallingConv() const
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
LLVM_ABI bool isMustTailCall() const
Tests if this call site must be tail call optimized.
LLVM_ABI bool isIndirectCall() const
Return true if the callsite is an indirect call.
unsigned countOperandBundlesOfType(StringRef Name) const
Return the number of operand bundles with the tag Name attached to this instruction.
Value * getCalledOperand() const
Value * getArgOperand(unsigned i) const
User::op_iterator arg_end()
Return the iterator pointing to the end of the argument list.
bool isConvergent() const
Determine if the invoke is convergent.
FunctionType * getFunctionType() const
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
LLVM_ABI bool isTailCall() const
Tests if this call site is marked as a tail call.
CallBr instruction, tracking function calls that may not return control but instead transfer it to a ...
This class represents a function call, abstracting a target machine's calling convention.
This class is the base class for the comparison instructions.
Definition InstrTypes.h:664
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:676
ConstantDataSequential - A vector or array constant whose element type is a simple 1/2/4/8-byte integ...
Definition Constants.h:593
A constant value that is initialized with an expression using other constant values.
Definition Constants.h:1120
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:277
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:214
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:163
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:154
A signed pointer, in the ptrauth sense.
Definition Constants.h:1032
uint64_t getZExtValue() const
Constant Vector Declarations.
Definition Constants.h:517
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:63
bool isBigEndian() const
Definition DataLayout.h:208
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:124
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:233
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:64
An instruction for ordering other memory operations.
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
Definition Type.cpp:802
This class represents a freeze function that returns random concrete value if an operand is either a ...
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
BranchProbabilityInfo * BPI
MachineBasicBlock * getMBB(const BasicBlock *BB) const
DenseMap< const AllocaInst *, int > StaticAllocaMap
StaticAllocaMap - Keep track of frame indices for fixed sized allocas in the entry block.
const LiveOutInfo * GetLiveOutRegInfo(Register Reg)
GetLiveOutRegInfo - Gets LiveOutInfo for a register, returning NULL if the register is a PHI destinat...
MachineBasicBlock * MBB
MBB - The current block.
Class to represent function types.
unsigned getNumParams() const
Return the number of fixed parameters this function type requires.
Type * getParamType(unsigned i) const
Parameter type accessors.
Type * getReturnType() const
Data structure describing the variable locations in a function.
const BasicBlock & getEntryBlock() const
Definition Function.h:807
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Definition Function.h:209
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
Definition Function.h:244
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition Function.h:703
bool hasParamAttribute(unsigned ArgNo, Attribute::AttrKind Kind) const
check if an attributes is in the list of attributes.
Definition Function.cpp:742
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
Definition Function.h:270
Constant * getPersonalityFn() const
Get the personality function associated with this function.
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:352
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
Definition Function.h:249
size_t arg_size() const
Definition Function.h:899
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:730
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:1078
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.
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,...
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:141
std::pair< iterator, bool > try_emplace(const KeyT &Key, Ts &&...Args)
Definition MapVector.h:111
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:183
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:79
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Definition Register.h:83
Resume the propagation of an exception.
Return a value (possibly void), from a function.
Holds the information from a dbg_label node through SDISel.
static SDDbgOperand fromNode(SDNode *Node, unsigned ResNo)
static SDDbgOperand fromFrameIdx(unsigned FrameIdx)
static SDDbgOperand fromVReg(Register VReg)
static SDDbgOperand fromConst(const Value *Const)
Holds the information from a dbg_value node through SDISel.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
iterator_range< value_op_iterator > op_values() const
unsigned getIROrder() const
Return the node ordering.
uint64_t getAsZExtVal() const
Helper method returns the zero-extended integer value of a ConstantSDNode.
unsigned getNumValues() const
Return the number of values defined/returned by this operator.
const SDValue & getOperand(unsigned Num) const
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDNode * getNode() const
get the SDNode which holds the desired result
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
TypeSize getValueSizeInBits() const
Returns the size of the value in bits.
const SDValue & getOperand(unsigned i) const
unsigned getResNo() const
get the index which selects a specific result in the SDNode
MVT getSimpleValueType() const
Return the simple ValueType of the referenced return value.
unsigned getOpcode() const
SelectionDAGBuilder - This is the common target-independent lowering implementation that is parameter...
SDValue getValue(const Value *V)
getValue - Return an SDValue for the given Value.
DenseMap< const Constant *, Register > ConstantsOut
void addDanglingDebugInfo(SmallVectorImpl< Value * > &Values, DILocalVariable *Var, DIExpression *Expr, bool IsVariadic, DebugLoc DL, unsigned Order)
Register a dbg_value which relies on a Value which we have not yet seen.
void visitDbgInfo(const Instruction &I)
void clearDanglingDebugInfo()
Clear the dangling debug information map.
void LowerCallTo(const CallBase &CB, SDValue Callee, bool IsTailCall, bool IsMustTailCall, const BasicBlock *EHPadBB=nullptr, const TargetLowering::PtrAuthInfo *PAI=nullptr)
void clear()
Clear out the current SelectionDAG and the associated state and prepare this SelectionDAGBuilder obje...
void visitBitTestHeader(SwitchCG::BitTestBlock &B, MachineBasicBlock *SwitchBB)
visitBitTestHeader - This function emits necessary code to produce value suitable for "bit tests"
void LowerStatepoint(const GCStatepointInst &I, const BasicBlock *EHPadBB=nullptr)
std::unique_ptr< SDAGSwitchLowering > SL
SDValue lowerRangeToAssertZExt(SelectionDAG &DAG, const Instruction &I, SDValue Op)
bool HasTailCall
This is set to true if a call in the current block has been translated as a tail call.
bool ShouldEmitAsBranches(const std::vector< SwitchCG::CaseBlock > &Cases)
If the set of cases should be emitted as a series of branches, return true.
void EmitBranchForMergedCondition(const Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB, BranchProbability TProb, BranchProbability FProb, bool InvertCond)
EmitBranchForMergedCondition - Helper method for FindMergedConditions.
void LowerDeoptimizeCall(const CallInst *CI)
void LowerCallSiteWithDeoptBundle(const CallBase *Call, SDValue Callee, const BasicBlock *EHPadBB)
SwiftErrorValueTracking & SwiftError
Information about the swifterror values used throughout the function.
SDValue getNonRegisterValue(const Value *V)
getNonRegisterValue - Return an SDValue for the given Value, but don't look in FuncInfo....
DenseMap< MachineBasicBlock *, SmallVector< unsigned, 4 > > LPadToCallSiteMap
Map a landing pad to the call site indexes.
SDValue lowerNoFPClassToAssertNoFPClass(SelectionDAG &DAG, const Instruction &I, SDValue Op)
void handleDebugDeclare(Value *Address, DILocalVariable *Variable, DIExpression *Expression, DebugLoc DL)
bool shouldKeepJumpConditionsTogether(const FunctionLoweringInfo &FuncInfo, const BranchInst &I, Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs, TargetLoweringBase::CondMergingParams Params) const
StatepointLoweringState StatepointLowering
State used while lowering a statepoint sequence (gc_statepoint, gc_relocate, and gc_result).
void visitBitTestCase(SwitchCG::BitTestBlock &BB, MachineBasicBlock *NextMBB, BranchProbability BranchProbToNext, Register Reg, SwitchCG::BitTestCase &B, MachineBasicBlock *SwitchBB)
visitBitTestCase - this function produces one "bit test"
bool canTailCall(const CallBase &CB) const
void populateCallLoweringInfo(TargetLowering::CallLoweringInfo &CLI, const CallBase *Call, unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy, AttributeSet RetAttrs, bool IsPatchPoint)
Populate a CallLowerinInfo (into CLI) based on the properties of the call being lowered.
void CopyValueToVirtualRegister(const Value *V, Register Reg, ISD::NodeType ExtendType=ISD::ANY_EXTEND)
void salvageUnresolvedDbgValue(const Value *V, DanglingDebugInfo &DDI)
For the given dangling debuginfo record, perform last-ditch efforts to resolve the debuginfo to somet...
SmallVector< SDValue, 8 > PendingLoads
Loads are not emitted to the program immediately.
GCFunctionInfo * GFI
Garbage collection metadata for the function.
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 init(GCFunctionInfo *gfi, BatchAAResults *BatchAA, AssumptionCache *AC, const TargetLibraryInfo *li)
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 > 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 > EmitTargetCodeForStrcpy(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dest, SDValue Src, MachinePointerInfo DestPtrInfo, MachinePointerInfo SrcPtrInfo, bool isStpcpy) const
Emit target-specific code that performs a strcpy or stpcpy, in cases where that is faster than a libc...
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 > 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 std::pair< SDValue, SDValue > EmitTargetCodeForStrcmp(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, MachinePointerInfo Op1PtrInfo, MachinePointerInfo Op2PtrInfo) const
Emit target-specific code that performs a strcmp, 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
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...
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:143
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:140
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
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...
const TargetMachine & getTargetMachine() const
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 Value * getSDagStackGuard(const Module &M) const
Return the variable that's previously inserted by insertSSPDeclarations, if any, otherwise return nul...
virtual unsigned getNumRegisters(LLVMContext &Context, EVT VT, std::optional< MVT > RegisterVT=std::nullopt) const
Return the number of registers that this ValueType will eventually require.
unsigned getBitWidthForCttzElements(Type *RetTy, ElementCount EC, bool ZeroIsPoison, const ConstantRange *VScaleRange) const
Return the minimum number of bits required to hold the maximum possible number of trailing zero vecto...
virtual bool shouldExtendGSIndex(EVT VT, EVT &EltTy) const
Returns true if the index type for a masked gather/scatter requires extending.
virtual unsigned getVectorTypeBreakdownForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const
Certain targets such as MIPS require that some types such as vectors are always broken down into scal...
Function * getSSPStackGuardCheck(const Module &M) const
If the target has a standard stack protection check function that performs validation and error handl...
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 getTgtMemIntrinsic(IntrinsicInfo &, const CallInst &, MachineFunction &, unsigned) const
Given an intrinsic, checks if on the target the intrinsic will need to map to a MemIntrinsicNode (tou...
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 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 bool shouldExpandCttzElements(EVT VT) const
Return true if the @llvm.experimental.cttz.elts intrinsic should be expanded using generic code in Se...
virtual bool signExtendConstant(const ConstantInt *C) const
Return true if this constant should be sign extended when promoting to a larger type.
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.
std::pair< SDValue, SDValue > makeLibCall(SelectionDAG &DAG, RTLIB::Libcall LC, EVT RetVT, ArrayRef< SDValue > Ops, MakeLibCallOptions CallOptions, const SDLoc &dl, SDValue Chain=SDValue()) const
Returns a pair of (return value, chain).
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.
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.
virtual TargetTransformInfo getTargetTransformInfo(const Function &F) const
Return a TargetTransformInfo for a given function.
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.
@ TCK_Latency
The latency of instruction.
LLVM_ABI bool hasConditionalLoadStoreForType(Type *Ty, bool IsStore) const
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:343
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
LLVM_ABI bool isEmptyTy() const
Return true if this type is empty, that is, it has no elements or all of its elements are empty.
Definition Type.cpp:180
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:273
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:267
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:280
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:352
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:128
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:293
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:240
bool isTokenTy() const
Return true if this is 'token'.
Definition Type.h:234
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
Definition Type.cpp:300
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Definition Type.h:225
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:139
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:284
Value * getOperand(unsigned i) const
Definition User.h:232
unsigned getNumOperands() const
Definition User.h:254
op_iterator op_end()
Definition User.h:286
This class represents the va_arg llvm instruction, which returns an argument of the specified type gi...
LLVM_ABI CmpInst::Predicate getPredicate() const
This is the common base class for vector predication intrinsics.
static LLVM_ABI std::optional< unsigned > getVectorLengthParamPos(Intrinsic::ID IntrinsicID)
LLVM_ABI MaybeAlign getPointerAlignment() const
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:439
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:701
bool use_empty() const
Definition Value.h:346
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.cpp:1099
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
Base class of all SIMD vector types.
Type * getElementType() const
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:230
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
const ParentTy * getParent() const
Definition ilist_node.h:34
A raw_ostream that writes to an std::string.
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char SymbolName[]
Key for Kernel::Metadata::mSymbolName.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
Definition CallingConv.h:60
@ AMDGPU_CS_Chain
Used on AMDGPUs to give the middle-end more control over argument placement.
@ X86_VectorCall
MSVC calling convention that passes vectors and vector aggregates in SSE registers.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:41
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition ISDOpcodes.h:256
@ CTLZ_ZERO_UNDEF
Definition ISDOpcodes.h:780
@ STRICT_FSETCC
STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used for floating-point operands only.
Definition ISDOpcodes.h:504
@ DELETED_NODE
DELETED_NODE - This is an illegal value that is used to catch errors.
Definition ISDOpcodes.h:45
@ LOOP_DEPENDENCE_RAW_MASK
@ EH_SJLJ_LONGJMP
OUTCHAIN = EH_SJLJ_LONGJMP(INCHAIN, buffer) This corresponds to the eh.sjlj.longjmp intrinsic.
Definition ISDOpcodes.h:163
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition ISDOpcodes.h:593
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:771
@ SMULFIX
RESULT = [US]MULFIX(LHS, RHS, SCALE) - Perform fixed point multiplication on 2 integers with the same...
Definition ISDOpcodes.h:387
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:259
@ SMULFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
Definition ISDOpcodes.h:393
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:841
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:511
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition ISDOpcodes.h:215
@ EH_SJLJ_SETUP_DISPATCH
OUTCHAIN = EH_SJLJ_SETUP_DISPATCH(INCHAIN) The target initializes the dispatch table here.
Definition ISDOpcodes.h:167
@ GlobalAddress
Definition ISDOpcodes.h:88
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
Definition ISDOpcodes.h:868
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition ISDOpcodes.h:577
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:410
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
Definition ISDOpcodes.h:744
@ FMULADD
FMULADD - Performs a * b + c, with, or without, intermediate rounding.
Definition ISDOpcodes.h:521
@ FPTRUNC_ROUND
FPTRUNC_ROUND - This corresponds to the fptrunc_round intrinsic.
Definition ISDOpcodes.h:508
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
Definition ISDOpcodes.h:249
@ SDIVFIX
RESULT = [US]DIVFIX(LHS, RHS, SCALE) - Perform fixed point division on 2 integers with the same width...
Definition ISDOpcodes.h:400
@ EH_RETURN
OUTCHAIN = EH_RETURN(INCHAIN, OFFSET, HANDLER) - This node represents 'eh_return' gcc dwarf builtin,...
Definition ISDOpcodes.h:151
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:832
@ ADDROFRETURNADDR
ADDROFRETURNADDR - Represents the llvm.addressofreturnaddress intrinsic.
Definition ISDOpcodes.h:117
@ CTTZ_ZERO_UNDEF
Bit counting operators with an undefined result for zero inputs.
Definition ISDOpcodes.h:779
@ SSUBO
Same for subtraction.
Definition ISDOpcodes.h:347
@ VECTOR_INTERLEAVE
VECTOR_INTERLEAVE(VEC1, VEC2, ...) - Returns N vectors from N input vectors, where N is the factor to...
Definition ISDOpcodes.h:628
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition ISDOpcodes.h:534
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
Definition ISDOpcodes.h:541
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition ISDOpcodes.h:369
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:784
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
Definition ISDOpcodes.h:242
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition ISDOpcodes.h:669
@ 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:225
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition ISDOpcodes.h:343
@ 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:958
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:762
@ 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:607
@ 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:134
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition ISDOpcodes.h:569
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:838
@ LOCAL_RECOVER
LOCAL_RECOVER - Represents the llvm.localrecover intrinsic.
Definition ISDOpcodes.h:130
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
Definition ISDOpcodes.h:379
@ SMULO
Same for multiplication.
Definition ISDOpcodes.h:351
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:724
@ VECTOR_REVERSE
VECTOR_REVERSE(VECTOR) - Returns a vector, of the same type as VECTOR, whose elements are shuffled us...
Definition ISDOpcodes.h:633
@ SDIVFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
Definition ISDOpcodes.h:406
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition ISDOpcodes.h:793
@ EH_DWARF_CFA
EH_DWARF_CFA - This node represents the pointer to the DWARF Canonical Frame Address (CFA),...
Definition ISDOpcodes.h:145
@ FRAMEADDR
FRAMEADDR, RETURNADDR - These nodes represent llvm.frameaddress and llvm.returnaddress on the DAG.
Definition ISDOpcodes.h:110
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition ISDOpcodes.h:493
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:914
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:736
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition ISDOpcodes.h:200
@ SCMP
[US]CMP - 3-way comparison of signed or unsigned integers.
Definition ISDOpcodes.h:732
@ STRICT_FADD
Constrained versions of the binary floating point operators.
Definition ISDOpcodes.h:420
@ FREEZE
FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or is evaluated to UNDEF),...
Definition ISDOpcodes.h:236
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition ISDOpcodes.h:558
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:53
@ VECTOR_SPLICE
VECTOR_SPLICE(VEC1, VEC2, IMM) - Returns a subvector of the same type as VEC1/VEC2 from CONCAT_VECTOR...
Definition ISDOpcodes.h:654
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition ISDOpcodes.h:947
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
Definition ISDOpcodes.h:696
@ SPONENTRY
SPONENTRY - Represents the llvm.sponentry intrinsic.
Definition ISDOpcodes.h:122
@ 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:933
@ EH_SJLJ_SETJMP
RESULT, OUTCHAIN = EH_SJLJ_SETJMP(INCHAIN, buffer) This corresponds to the eh.sjlj....
Definition ISDOpcodes.h:157
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:844
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition ISDOpcodes.h:62
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition ISDOpcodes.h:527
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition ISDOpcodes.h:360
@ VECTOR_DEINTERLEAVE
VECTOR_DEINTERLEAVE(VEC1, VEC2, ...) - Returns N vectors from N input vectors, where N is the factor ...
Definition ISDOpcodes.h:617
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition ISDOpcodes.h:208
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:549
@ LOOP_DEPENDENCE_WAR_MASK
Set rounding mode.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM.
Flag
These should be considered private to the implementation of the MCInstrDesc class.
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
bool match(Val *V, const Pattern &P)
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
TwoOps_match< Val_t, Idx_t, Instruction::ExtractElement > m_ExtractElt(const Val_t &Val, const Idx_t &Idx)
Matches ExtractElementInst.
IntrinsicID_match m_VScale()
Matches a call to llvm.vscale().
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
Offsets
Offsets in bytes from the start of the input buffer.
std::pair< JumpTableHeader, JumpTable > JumpTableBlock
void sortAndRangeify(CaseClusterVector &Clusters)
Sort Clusters and merge adjacent cases.
std::vector< CaseCluster > CaseClusterVector
@ CC_Range
A cluster of adjacent case labels with the same destination, or just one case.
@ CC_JumpTable
A cluster of cases suitable for jump table lowering.
@ CC_BitTests
A cluster of cases suitable for bit test lowering.
SmallVector< SwitchWorkListItem, 4 > SwitchWorkList
CaseClusterVector::iterator CaseClusterIt
initializer< Ty > init(const Ty &Val)
LocationClass< Ty > location(Ty &L)
@ DW_OP_LLVM_arg
Only used in LLVM metadata.
Definition Dwarf.h:149
ExceptionBehavior
Exception behavior used for floating point operations.
Definition FPEnv.h:39
@ ebStrict
This corresponds to "fpexcept.strict".
Definition FPEnv.h:42
@ ebMayTrap
This corresponds to "fpexcept.maytrap".
Definition FPEnv.h:41
@ ebIgnore
This corresponds to "fpexcept.ignore".
Definition FPEnv.h:40
constexpr float log2ef
Definition MathExtras.h:51
constexpr double e
constexpr float ln2f
Definition MathExtras.h:49
NodeAddr< FuncNode * > Func
Definition RDFGraph.h:393
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
@ 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:477
@ Length
Definition DWP.cpp:477
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:241
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:1725
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:1655
LLVM_ABI void GetReturnInfo(CallingConv::ID CC, Type *ReturnType, AttributeList attr, SmallVectorImpl< ISD::OutputArg > &Outs, const TargetLowering &TLI, const DataLayout &DL)
Given an LLVM IR type and return type attributes, compute the return value EVTs and flags,...
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
LLVM_ABI bool isOnlyUsedInZeroEqualityComparison(const Instruction *CxtI)
void ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, Type *Ty, SmallVectorImpl< EVT > &ValueVTs, SmallVectorImpl< EVT > *MemVTs=nullptr, SmallVectorImpl< TypeSize > *Offsets=nullptr, TypeSize StartingOffset=TypeSize::getZero())
ComputeValueVTs - Given an LLVM IR type, compute a sequence of EVTs that represent all the individual...
Definition Analysis.cpp:119
LLVM_ABI SDValue peekThroughBitcasts(SDValue V)
Return the non-bitcasted source operand of V if it exists.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
@ Done
Definition Threading.h:60
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition bit.h:293
LLVM_ABI void diagnoseDontCall(const CallInst &CI)
auto successors(const MachineBasicBlock *BB)
bool isIntOrFPConstant(SDValue V)
Return true if V is either a integer or FP constant.
static ConstantRange getRange(Value *Op, SCCPSolver &Solver, const SmallPtrSetImpl< Value * > &InsertedValues)
Helper for getting ranges from Solver.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2136
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 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:1150
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:1732
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:852
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1622
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:167
generic_gep_type_iterator<> gep_type_iterator
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
auto succ_size(const MachineBasicBlock *BB)
bool hasSingleElement(ContainerTy &&C)
Returns true if the given container only contains a single element.
Definition STLExtras.h:300
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
ISD::CondCode getFCmpCondCode(FCmpInst::Predicate Pred)
getFCmpCondCode - Return the ISD condition code corresponding to the given LLVM IR floating-point con...
Definition Analysis.cpp:207
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:2274
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:71
bool isFuncletEHPersonality(EHPersonality Pers)
Returns true if this is a personality function that invokes handler funclets (which must return to it...
TargetTransformInfo TTI
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:189
LLVM_ABI bool isAssignmentTrackingEnabled(const Module &M)
Return true if assignment tracking is enabled for module M.
LLVM_ABI llvm::SmallVector< int, 16 > createInterleaveMask(unsigned VF, unsigned NumVecs)
Create an interleave shuffle mask.
@ UMin
Unsigned integer min implemented in terms of select(cmp()).
@ Or
Bitwise or logical OR of integers.
@ Mul
Product of integers.
@ And
Bitwise or logical AND of integers.
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:144
@ SPNB_RETURNS_NAN
NaN behavior not applicable.
@ SPNB_RETURNS_OTHER
Given one NaN input, returns the NaN.
@ SPNB_RETURNS_ANY
Given one NaN input, returns the non-NaN.
bool isInTailCallPosition(const CallBase &Call, const TargetMachine &TM, bool ReturnsFirstArg=false)
Test if the given instruction is in a position to be optimized with a tail-call.
Definition Analysis.cpp:543
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:229
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 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:2120
GlobalValue * ExtractTypeInfo(Value *V)
ExtractTypeInfo - Returns the type info, possibly bitcast, encoded in V.
Definition Analysis.cpp:185
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1897
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:2108
LLVM_ABI Constant * ConstantFoldLoadFromConstPtr(Constant *C, Type *Ty, APInt Offset, const DataLayout &DL)
Return the value that a load from C with offset Offset would produce if it is constant and determinab...
unsigned ComputeLinearIndex(Type *Ty, const unsigned *Indices, const unsigned *IndicesEnd, unsigned CurIndex=0)
Compute the linearized index of a member in a nested aggregate/struct/array.
Definition Analysis.cpp:33
T bit_floor(T Value)
Returns the largest integral power of two no greater than Value if Value is nonzero.
Definition bit.h:330
@ Default
The result values are uniform if and only if all operands are uniform.
Definition Uniformity.h:20
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:180
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:869
#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:395
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:74
uint64_t getScalarStoreSize() const
Definition ValueTypes.h:402
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition ValueTypes.h:284
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:300
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition ValueTypes.h:147
ElementCount getVectorElementCount() const
Definition ValueTypes.h:350
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:373
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition ValueTypes.h:359
uint64_t getScalarSizeInBits() const
Definition ValueTypes.h:385
static LLVM_ABI EVT getEVT(Type *Ty, bool HandleUnknown=false)
Return the value type corresponding to the specified type.
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:316
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition ValueTypes.h:65
bool isRISCVVectorTuple() const
Return true if this is a vector value type.
Definition ValueTypes.h:179
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
Definition ValueTypes.h:381
bool isFixedLengthVector() const
Definition ValueTypes.h:181
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:168
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition ValueTypes.h:323
bool bitsGE(EVT VT) const
Return true if this has no less bits than VT.
Definition ValueTypes.h:292
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
Definition ValueTypes.h:174
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:328
bool isScalarInteger() const
Return true if this is an integer, but not a vector.
Definition ValueTypes.h:157
EVT changeVectorElementType(EVT EltVT) const
Return a VT for a vector type whose attributes match ourselves with the exception of the element type...
Definition ValueTypes.h:102
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition ValueTypes.h:336
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition ValueTypes.h:152
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:248
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:257
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)
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 & 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)