LLVM 23.0.0git
SelectionDAGBuilder.cpp
Go to the documentation of this file.
1//===- SelectionDAGBuilder.cpp - Selection-DAG building -------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This implements routines for translating from LLVM IR into SelectionDAG IR.
10//
11//===----------------------------------------------------------------------===//
12
13#include "SelectionDAGBuilder.h"
14#include "SDNodeDbgValue.h"
15#include "llvm/ADT/APFloat.h"
16#include "llvm/ADT/APInt.h"
17#include "llvm/ADT/BitVector.h"
18#include "llvm/ADT/STLExtras.h"
21#include "llvm/ADT/StringRef.h"
22#include "llvm/ADT/Twine.h"
26#include "llvm/Analysis/Loads.h"
58#include "llvm/IR/Argument.h"
59#include "llvm/IR/Attributes.h"
60#include "llvm/IR/BasicBlock.h"
61#include "llvm/IR/CFG.h"
62#include "llvm/IR/CallingConv.h"
63#include "llvm/IR/Constant.h"
65#include "llvm/IR/Constants.h"
66#include "llvm/IR/DataLayout.h"
67#include "llvm/IR/DebugInfo.h"
72#include "llvm/IR/Function.h"
74#include "llvm/IR/InlineAsm.h"
75#include "llvm/IR/InstrTypes.h"
78#include "llvm/IR/Intrinsics.h"
79#include "llvm/IR/IntrinsicsAArch64.h"
80#include "llvm/IR/IntrinsicsAMDGPU.h"
81#include "llvm/IR/IntrinsicsWebAssembly.h"
82#include "llvm/IR/LLVMContext.h"
84#include "llvm/IR/Metadata.h"
85#include "llvm/IR/Module.h"
86#include "llvm/IR/Operator.h"
88#include "llvm/IR/Statepoint.h"
89#include "llvm/IR/Type.h"
90#include "llvm/IR/User.h"
91#include "llvm/IR/Value.h"
92#include "llvm/MC/MCContext.h"
97#include "llvm/Support/Debug.h"
105#include <cstddef>
106#include <limits>
107#include <optional>
108#include <tuple>
109
110using namespace llvm;
111using namespace PatternMatch;
112using namespace SwitchCG;
113
114#define DEBUG_TYPE "isel"
115
116/// LimitFloatPrecision - Generate low-precision inline sequences for
117/// some float libcalls (6, 8 or 12 bits).
118static unsigned LimitFloatPrecision;
119
120static cl::opt<bool>
121 InsertAssertAlign("insert-assert-align", cl::init(true),
122 cl::desc("Insert the experimental `assertalign` node."),
124
126 LimitFPPrecision("limit-float-precision",
127 cl::desc("Generate low-precision inline sequences "
128 "for some float libcalls"),
130 cl::init(0));
131
133 "switch-peel-threshold", cl::Hidden, cl::init(66),
134 cl::desc("Set the case probability threshold for peeling the case from a "
135 "switch statement. A value greater than 100 will void this "
136 "optimization"));
137
138// Limit the width of DAG chains. This is important in general to prevent
139// DAG-based analysis from blowing up. For example, alias analysis and
140// load clustering may not complete in reasonable time. It is difficult to
141// recognize and avoid this situation within each individual analysis, and
142// future analyses are likely to have the same behavior. Limiting DAG width is
143// the safe approach and will be especially important with global DAGs.
144//
145// MaxParallelChains default is arbitrarily high to avoid affecting
146// optimization, but could be lowered to improve compile time. Any ld-ld-st-st
147// sequence over this should have been converted to llvm.memcpy by the
148// frontend. It is easy to induce this behavior with .ll code such as:
149// %buffer = alloca [4096 x i8]
150// %data = load [4096 x i8]* %argPtr
151// store [4096 x i8] %data, [4096 x i8]* %buffer
152static const unsigned MaxParallelChains = 64;
153
155 const SDValue *Parts, unsigned NumParts,
156 MVT PartVT, EVT ValueVT, const Value *V,
157 SDValue InChain,
158 std::optional<CallingConv::ID> CC);
159
160/// getCopyFromParts - Create a value that contains the specified legal parts
161/// combined into the value they represent. If the parts combine to a type
162/// larger than ValueVT then AssertOp can be used to specify whether the extra
163/// bits are known to be zero (ISD::AssertZext) or sign extended from ValueVT
164/// (ISD::AssertSext).
165static SDValue
166getCopyFromParts(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts,
167 unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V,
168 SDValue InChain,
169 std::optional<CallingConv::ID> CC = std::nullopt,
170 std::optional<ISD::NodeType> AssertOp = std::nullopt) {
171 // Let the target assemble the parts if it wants to
172 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
173 if (SDValue Val = TLI.joinRegisterPartsIntoValue(DAG, DL, Parts, NumParts,
174 PartVT, ValueVT, CC))
175 return Val;
176
177 if (ValueVT.isVector())
178 return getCopyFromPartsVector(DAG, DL, Parts, NumParts, PartVT, ValueVT, V,
179 InChain, CC);
180
181 assert(NumParts > 0 && "No parts to assemble!");
182 SDValue Val = Parts[0];
183
184 if (NumParts > 1) {
185 // Assemble the value from multiple parts.
186 if (ValueVT.isInteger()) {
187 unsigned PartBits = PartVT.getSizeInBits();
188 unsigned ValueBits = ValueVT.getSizeInBits();
189
190 // Assemble the power of 2 part.
191 unsigned RoundParts = llvm::bit_floor(NumParts);
192 unsigned RoundBits = PartBits * RoundParts;
193 EVT RoundVT = RoundBits == ValueBits ?
194 ValueVT : EVT::getIntegerVT(*DAG.getContext(), RoundBits);
195 SDValue Lo, Hi;
196
197 EVT HalfVT = EVT::getIntegerVT(*DAG.getContext(), RoundBits/2);
198
199 if (RoundParts > 2) {
200 Lo = getCopyFromParts(DAG, DL, Parts, RoundParts / 2, PartVT, HalfVT, V,
201 InChain);
202 Hi = getCopyFromParts(DAG, DL, Parts + RoundParts / 2, RoundParts / 2,
203 PartVT, HalfVT, V, InChain);
204 } else {
205 Lo = DAG.getNode(ISD::BITCAST, DL, HalfVT, Parts[0]);
206 Hi = DAG.getNode(ISD::BITCAST, DL, HalfVT, Parts[1]);
207 }
208
209 if (DAG.getDataLayout().isBigEndian())
210 std::swap(Lo, Hi);
211
212 Val = DAG.getNode(ISD::BUILD_PAIR, DL, RoundVT, Lo, Hi);
213
214 if (RoundParts < NumParts) {
215 // Assemble the trailing non-power-of-2 part.
216 unsigned OddParts = NumParts - RoundParts;
217 EVT OddVT = EVT::getIntegerVT(*DAG.getContext(), OddParts * PartBits);
218 Hi = getCopyFromParts(DAG, DL, Parts + RoundParts, OddParts, PartVT,
219 OddVT, V, InChain, CC);
220
221 // Combine the round and odd parts.
222 Lo = Val;
223 if (DAG.getDataLayout().isBigEndian())
224 std::swap(Lo, Hi);
225 EVT TotalVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
226 Hi = DAG.getNode(ISD::ANY_EXTEND, DL, TotalVT, Hi);
227 Hi = DAG.getNode(
228 ISD::SHL, DL, TotalVT, Hi,
229 DAG.getShiftAmountConstant(Lo.getValueSizeInBits(), TotalVT, DL));
230 Lo = DAG.getNode(ISD::ZERO_EXTEND, DL, TotalVT, Lo);
231 Val = DAG.getNode(ISD::OR, DL, TotalVT, Lo, Hi);
232 }
233 } else if (PartVT.isFloatingPoint()) {
234 // FP split into multiple FP parts (for ppcf128)
235 assert(ValueVT == EVT(MVT::ppcf128) && PartVT == MVT::f64 &&
236 "Unexpected split");
237 SDValue Lo, Hi;
238 Lo = DAG.getNode(ISD::BITCAST, DL, EVT(MVT::f64), Parts[0]);
239 Hi = DAG.getNode(ISD::BITCAST, DL, EVT(MVT::f64), Parts[1]);
240 if (TLI.hasBigEndianPartOrdering(ValueVT, DAG.getDataLayout()))
241 std::swap(Lo, Hi);
242 Val = DAG.getNode(ISD::BUILD_PAIR, DL, ValueVT, Lo, Hi);
243 } else {
244 // FP split into integer parts (soft fp)
245 assert(ValueVT.isFloatingPoint() && PartVT.isInteger() &&
246 !PartVT.isVector() && "Unexpected split");
247 EVT IntVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
248 Val = getCopyFromParts(DAG, DL, Parts, NumParts, PartVT, IntVT, V,
249 InChain, CC);
250 }
251 }
252
253 // There is now one part, held in Val. Correct it to match ValueVT.
254 // PartEVT is the type of the register class that holds the value.
255 // ValueVT is the type of the inline asm operation.
256 EVT PartEVT = Val.getValueType();
257
258 if (PartEVT == ValueVT)
259 return Val;
260
261 if (PartEVT.isInteger() && ValueVT.isFloatingPoint() &&
262 ValueVT.bitsLT(PartEVT)) {
263 // For an FP value in an integer part, we need to truncate to the right
264 // width first.
265 PartEVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
266 Val = DAG.getNode(ISD::TRUNCATE, DL, PartEVT, Val);
267 }
268
269 // Handle types that have the same size.
270 if (PartEVT.getSizeInBits() == ValueVT.getSizeInBits())
271 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
272
273 // Handle types with different sizes.
274 if (PartEVT.isInteger() && ValueVT.isInteger()) {
275 if (ValueVT.bitsLT(PartEVT)) {
276 // For a truncate, see if we have any information to
277 // indicate whether the truncated bits will always be
278 // zero or sign-extension.
279 if (AssertOp)
280 Val = DAG.getNode(*AssertOp, DL, PartEVT, Val,
281 DAG.getValueType(ValueVT));
282 return DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
283 }
284 return DAG.getNode(ISD::ANY_EXTEND, DL, ValueVT, Val);
285 }
286
287 if (PartEVT.isFloatingPoint() && ValueVT.isFloatingPoint()) {
288 // FP_ROUND's are always exact here.
289 if (ValueVT.bitsLT(Val.getValueType())) {
290
291 SDValue NoChange =
293
294 if (DAG.getMachineFunction().getFunction().getAttributes().hasFnAttr(
295 llvm::Attribute::StrictFP)) {
296 return DAG.getNode(ISD::STRICT_FP_ROUND, DL,
297 DAG.getVTList(ValueVT, MVT::Other), InChain, Val,
298 NoChange);
299 }
300
301 return DAG.getNode(ISD::FP_ROUND, DL, ValueVT, Val, NoChange);
302 }
303
304 return DAG.getNode(ISD::FP_EXTEND, DL, ValueVT, Val);
305 }
306
307 // Handle MMX to a narrower integer type by bitcasting MMX to integer and
308 // then truncating.
309 if (PartEVT == MVT::x86mmx && ValueVT.isInteger() &&
310 ValueVT.bitsLT(PartEVT)) {
311 Val = DAG.getNode(ISD::BITCAST, DL, MVT::i64, Val);
312 return DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
313 }
314
315 report_fatal_error("Unknown mismatch in getCopyFromParts!");
316}
317
319 const Twine &ErrMsg) {
321 if (!I)
322 return Ctx.emitError(ErrMsg);
323
324 if (const CallInst *CI = dyn_cast<CallInst>(I))
325 if (CI->isInlineAsm()) {
326 return Ctx.diagnose(DiagnosticInfoInlineAsm(
327 *CI, ErrMsg + ", possible invalid constraint for vector type"));
328 }
329
330 return Ctx.emitError(I, ErrMsg);
331}
332
333/// getCopyFromPartsVector - Create a value that contains the specified legal
334/// parts combined into the value they represent. If the parts combine to a
335/// type larger than ValueVT then AssertOp can be used to specify whether the
336/// extra bits are known to be zero (ISD::AssertZext) or sign extended from
337/// ValueVT (ISD::AssertSext).
339 const SDValue *Parts, unsigned NumParts,
340 MVT PartVT, EVT ValueVT, const Value *V,
341 SDValue InChain,
342 std::optional<CallingConv::ID> CallConv) {
343 assert(ValueVT.isVector() && "Not a vector value");
344 assert(NumParts > 0 && "No parts to assemble!");
345 const bool IsABIRegCopy = CallConv.has_value();
346
347 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
348 SDValue Val = Parts[0];
349
350 // Handle a multi-element vector.
351 if (NumParts > 1) {
352 EVT IntermediateVT;
353 MVT RegisterVT;
354 unsigned NumIntermediates;
355 unsigned NumRegs;
356
357 if (IsABIRegCopy) {
359 *DAG.getContext(), *CallConv, ValueVT, IntermediateVT,
360 NumIntermediates, RegisterVT);
361 } else {
362 NumRegs =
363 TLI.getVectorTypeBreakdown(*DAG.getContext(), ValueVT, IntermediateVT,
364 NumIntermediates, RegisterVT);
365 }
366
367 assert(NumRegs == NumParts && "Part count doesn't match vector breakdown!");
368 NumParts = NumRegs; // Silence a compiler warning.
369 assert(RegisterVT == PartVT && "Part type doesn't match vector breakdown!");
370 assert(RegisterVT.getSizeInBits() ==
371 Parts[0].getSimpleValueType().getSizeInBits() &&
372 "Part type sizes don't match!");
373
374 // Assemble the parts into intermediate operands.
375 SmallVector<SDValue, 8> Ops(NumIntermediates);
376 if (NumIntermediates == NumParts) {
377 // If the register was not expanded, truncate or copy the value,
378 // as appropriate.
379 for (unsigned i = 0; i != NumParts; ++i)
380 Ops[i] = getCopyFromParts(DAG, DL, &Parts[i], 1, PartVT, IntermediateVT,
381 V, InChain, CallConv);
382 } else if (NumParts > 0) {
383 // If the intermediate type was expanded, build the intermediate
384 // operands from the parts.
385 assert(NumParts % NumIntermediates == 0 &&
386 "Must expand into a divisible number of parts!");
387 unsigned Factor = NumParts / NumIntermediates;
388 for (unsigned i = 0; i != NumIntermediates; ++i)
389 Ops[i] = getCopyFromParts(DAG, DL, &Parts[i * Factor], Factor, PartVT,
390 IntermediateVT, V, InChain, CallConv);
391 }
392
393 // Build a vector with BUILD_VECTOR or CONCAT_VECTORS from the
394 // intermediate operands.
395 EVT BuiltVectorTy =
396 IntermediateVT.isVector()
398 *DAG.getContext(), IntermediateVT.getScalarType(),
399 IntermediateVT.getVectorElementCount() * NumParts)
401 IntermediateVT.getScalarType(),
402 NumIntermediates);
403 Val = DAG.getNode(IntermediateVT.isVector() ? ISD::CONCAT_VECTORS
405 DL, BuiltVectorTy, Ops);
406 }
407
408 // There is now one part, held in Val. Correct it to match ValueVT.
409 EVT PartEVT = Val.getValueType();
410
411 if (PartEVT == ValueVT)
412 return Val;
413
414 if (PartEVT.isVector()) {
415 // Vector/Vector bitcast.
416 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits())
417 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
418
419 // If the parts vector has more elements than the value vector, then we
420 // have a vector widening case (e.g. <2 x float> -> <4 x float>).
421 // Extract the elements we want.
422 if (PartEVT.getVectorElementCount() != ValueVT.getVectorElementCount()) {
425 (PartEVT.getVectorElementCount().isScalable() ==
426 ValueVT.getVectorElementCount().isScalable()) &&
427 "Cannot narrow, it would be a lossy transformation");
428 PartEVT =
430 ValueVT.getVectorElementCount());
431 Val = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, PartEVT, Val,
432 DAG.getVectorIdxConstant(0, DL));
433 if (PartEVT == ValueVT)
434 return Val;
435 if (PartEVT.isInteger() && ValueVT.isFloatingPoint())
436 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
437
438 // Vector/Vector bitcast (e.g. <2 x bfloat> -> <2 x half>).
439 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits())
440 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
441 }
442
443 // Promoted vector extract
444 return DAG.getAnyExtOrTrunc(Val, DL, ValueVT);
445 }
446
447 // Trivial bitcast if the types are the same size and the destination
448 // vector type is legal.
449 if (PartEVT.getSizeInBits() == ValueVT.getSizeInBits() &&
450 TLI.isTypeLegal(ValueVT))
451 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
452
453 if (ValueVT.getVectorNumElements() != 1) {
454 // Certain ABIs require that vectors are passed as integers. For vectors
455 // are the same size, this is an obvious bitcast.
456 if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits()) {
457 return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
458 } else if (ValueVT.bitsLT(PartEVT)) {
459 const uint64_t ValueSize = ValueVT.getFixedSizeInBits();
460 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
461 // Drop the extra bits.
462 Val = DAG.getNode(ISD::TRUNCATE, DL, IntermediateType, Val);
463 return DAG.getBitcast(ValueVT, Val);
464 }
465
467 *DAG.getContext(), V, "non-trivial scalar-to-vector conversion");
468 return DAG.getUNDEF(ValueVT);
469 }
470
471 // Handle cases such as i8 -> <1 x i1>
472 EVT ValueSVT = ValueVT.getVectorElementType();
473 if (ValueVT.getVectorNumElements() == 1 && ValueSVT != PartEVT) {
474 unsigned ValueSize = ValueSVT.getSizeInBits();
475 if (ValueSize == PartEVT.getSizeInBits()) {
476 Val = DAG.getNode(ISD::BITCAST, DL, ValueSVT, Val);
477 } else if (ValueSVT.isFloatingPoint() && PartEVT.isInteger()) {
478 // It's possible a scalar floating point type gets softened to integer and
479 // then promoted to a larger integer. If PartEVT is the larger integer
480 // we need to truncate it and then bitcast to the FP type.
481 assert(ValueSVT.bitsLT(PartEVT) && "Unexpected types");
482 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
483 Val = DAG.getNode(ISD::TRUNCATE, DL, IntermediateType, Val);
484 Val = DAG.getBitcast(ValueSVT, Val);
485 } else {
486 Val = ValueVT.isFloatingPoint()
487 ? DAG.getFPExtendOrRound(Val, DL, ValueSVT)
488 : DAG.getAnyExtOrTrunc(Val, DL, ValueSVT);
489 }
490 }
491
492 return DAG.getBuildVector(ValueVT, DL, Val);
493}
494
495static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &dl,
496 SDValue Val, SDValue *Parts, unsigned NumParts,
497 MVT PartVT, const Value *V,
498 std::optional<CallingConv::ID> CallConv);
499
500/// getCopyToParts - Create a series of nodes that contain the specified value
501/// split into legal parts. If the parts contain more bits than Val, then, for
502/// integers, ExtendKind can be used to specify how to generate the extra bits.
503static void
505 unsigned NumParts, MVT PartVT, const Value *V,
506 std::optional<CallingConv::ID> CallConv = std::nullopt,
507 ISD::NodeType ExtendKind = ISD::ANY_EXTEND) {
508 // Let the target split the parts if it wants to
509 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
510 if (TLI.splitValueIntoRegisterParts(DAG, DL, Val, Parts, NumParts, PartVT,
511 CallConv))
512 return;
513 EVT ValueVT = Val.getValueType();
514
515 // Handle the vector case separately.
516 if (ValueVT.isVector())
517 return getCopyToPartsVector(DAG, DL, Val, Parts, NumParts, PartVT, V,
518 CallConv);
519
520 unsigned OrigNumParts = NumParts;
522 "Copying to an illegal type!");
523
524 if (NumParts == 0)
525 return;
526
527 assert(!ValueVT.isVector() && "Vector case handled elsewhere");
528 EVT PartEVT = PartVT;
529 if (PartEVT == ValueVT) {
530 assert(NumParts == 1 && "No-op copy with multiple parts!");
531 Parts[0] = Val;
532 return;
533 }
534
535 unsigned PartBits = PartVT.getSizeInBits();
536 if (NumParts * PartBits > ValueVT.getSizeInBits()) {
537 // If the parts cover more bits than the value has, promote the value.
538 if (PartVT.isFloatingPoint() && ValueVT.isFloatingPoint()) {
539 assert(NumParts == 1 && "Do not know what to promote to!");
540 Val = DAG.getNode(ISD::FP_EXTEND, DL, PartVT, Val);
541 } else {
542 if (ValueVT.isFloatingPoint()) {
543 // FP values need to be bitcast, then extended if they are being put
544 // into a larger container.
545 ValueVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
546 Val = DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
547 }
548 assert((PartVT.isInteger() || PartVT == MVT::x86mmx) &&
549 ValueVT.isInteger() &&
550 "Unknown mismatch!");
551 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
552 Val = DAG.getNode(ExtendKind, DL, ValueVT, Val);
553 if (PartVT == MVT::x86mmx)
554 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
555 }
556 } else if (PartBits == ValueVT.getSizeInBits()) {
557 // Different types of the same size.
558 assert(NumParts == 1 && PartEVT != ValueVT);
559 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
560 } else if (NumParts * PartBits < ValueVT.getSizeInBits()) {
561 // If the parts cover less bits than value has, truncate the value.
562 assert((PartVT.isInteger() || PartVT == MVT::x86mmx) &&
563 ValueVT.isInteger() &&
564 "Unknown mismatch!");
565 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
566 Val = DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
567 if (PartVT == MVT::x86mmx)
568 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
569 }
570
571 // The value may have changed - recompute ValueVT.
572 ValueVT = Val.getValueType();
573 assert(NumParts * PartBits == ValueVT.getSizeInBits() &&
574 "Failed to tile the value with PartVT!");
575
576 if (NumParts == 1) {
577 if (PartEVT != ValueVT) {
579 "scalar-to-vector conversion failed");
580 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
581 }
582
583 Parts[0] = Val;
584 return;
585 }
586
587 // Expand the value into multiple parts.
588 if (NumParts & (NumParts - 1)) {
589 // The number of parts is not a power of 2. Split off and copy the tail.
590 assert(PartVT.isInteger() && ValueVT.isInteger() &&
591 "Do not know what to expand to!");
592 unsigned RoundParts = llvm::bit_floor(NumParts);
593 unsigned RoundBits = RoundParts * PartBits;
594 unsigned OddParts = NumParts - RoundParts;
595 SDValue OddVal = DAG.getNode(ISD::SRL, DL, ValueVT, Val,
596 DAG.getShiftAmountConstant(RoundBits, ValueVT, DL));
597
598 getCopyToParts(DAG, DL, OddVal, Parts + RoundParts, OddParts, PartVT, V,
599 CallConv);
600
601 if (DAG.getDataLayout().isBigEndian())
602 // The odd parts were reversed by getCopyToParts - unreverse them.
603 std::reverse(Parts + RoundParts, Parts + NumParts);
604
605 NumParts = RoundParts;
606 ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
607 Val = DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
608 }
609
610 // The number of parts is a power of 2. Repeatedly bisect the value using
611 // EXTRACT_ELEMENT.
612 Parts[0] = DAG.getNode(ISD::BITCAST, DL,
614 ValueVT.getSizeInBits()),
615 Val);
616
617 for (unsigned StepSize = NumParts; StepSize > 1; StepSize /= 2) {
618 for (unsigned i = 0; i < NumParts; i += StepSize) {
619 unsigned ThisBits = StepSize * PartBits / 2;
620 EVT ThisVT = EVT::getIntegerVT(*DAG.getContext(), ThisBits);
621 SDValue &Part0 = Parts[i];
622 SDValue &Part1 = Parts[i+StepSize/2];
623
624 Part1 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL,
625 ThisVT, Part0, DAG.getIntPtrConstant(1, DL));
626 Part0 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL,
627 ThisVT, Part0, DAG.getIntPtrConstant(0, DL));
628
629 if (ThisBits == PartBits && ThisVT != PartVT) {
630 Part0 = DAG.getNode(ISD::BITCAST, DL, PartVT, Part0);
631 Part1 = DAG.getNode(ISD::BITCAST, DL, PartVT, Part1);
632 }
633 }
634 }
635
636 if (DAG.getDataLayout().isBigEndian())
637 std::reverse(Parts, Parts + OrigNumParts);
638}
639
641 const SDLoc &DL, EVT PartVT) {
642 if (!PartVT.isVector())
643 return SDValue();
644
645 EVT ValueVT = Val.getValueType();
646 EVT PartEVT = PartVT.getVectorElementType();
647 EVT ValueEVT = ValueVT.getVectorElementType();
648 ElementCount PartNumElts = PartVT.getVectorElementCount();
649 ElementCount ValueNumElts = ValueVT.getVectorElementCount();
650
651 // We only support widening vectors with equivalent element types and
652 // fixed/scalable properties. If a target needs to widen a fixed-length type
653 // to a scalable one, it should be possible to use INSERT_SUBVECTOR below.
654 if (ElementCount::isKnownLE(PartNumElts, ValueNumElts) ||
655 PartNumElts.isScalable() != ValueNumElts.isScalable())
656 return SDValue();
657
658 // Have a try for bf16 because some targets share its ABI with fp16.
659 if (ValueEVT == MVT::bf16 && PartEVT == MVT::f16) {
661 "Cannot widen to illegal type");
662 Val = DAG.getNode(
664 ValueVT.changeVectorElementType(*DAG.getContext(), MVT::f16), Val);
665 } else if (PartEVT != ValueEVT) {
666 return SDValue();
667 }
668
669 // Widening a scalable vector to another scalable vector is done by inserting
670 // the vector into a larger undef one.
671 if (PartNumElts.isScalable())
672 return DAG.getNode(ISD::INSERT_SUBVECTOR, DL, PartVT, DAG.getUNDEF(PartVT),
673 Val, DAG.getVectorIdxConstant(0, DL));
674
675 // Vector widening case, e.g. <2 x float> -> <4 x float>. Shuffle in
676 // undef elements.
678 DAG.ExtractVectorElements(Val, Ops);
679 SDValue EltUndef = DAG.getUNDEF(PartEVT);
680 Ops.append((PartNumElts - ValueNumElts).getFixedValue(), EltUndef);
681
682 // FIXME: Use CONCAT for 2x -> 4x.
683 return DAG.getBuildVector(PartVT, DL, Ops);
684}
685
686/// getCopyToPartsVector - Create a series of nodes that contain the specified
687/// value split into legal parts.
688static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &DL,
689 SDValue Val, SDValue *Parts, unsigned NumParts,
690 MVT PartVT, const Value *V,
691 std::optional<CallingConv::ID> CallConv) {
692 EVT ValueVT = Val.getValueType();
693 assert(ValueVT.isVector() && "Not a vector");
694 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
695 const bool IsABIRegCopy = CallConv.has_value();
696
697 if (NumParts == 1) {
698 EVT PartEVT = PartVT;
699 if (PartEVT == ValueVT) {
700 // Nothing to do.
701 } else if (PartVT.getSizeInBits() == ValueVT.getSizeInBits()) {
702 // Bitconvert vector->vector case.
703 Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
704 } else if (SDValue Widened = widenVectorToPartType(DAG, Val, DL, PartVT)) {
705 Val = Widened;
706 } else if (PartVT.isVector() &&
708 ValueVT.getVectorElementType()) &&
709 PartEVT.getVectorElementCount() ==
710 ValueVT.getVectorElementCount()) {
711
712 // Promoted vector extract
713 Val = DAG.getAnyExtOrTrunc(Val, DL, PartVT);
714 } else if (PartEVT.isVector() &&
715 PartEVT.getVectorElementType() !=
716 ValueVT.getVectorElementType() &&
717 TLI.getTypeAction(*DAG.getContext(), ValueVT) ==
719 // Combination of widening and promotion.
720 EVT WidenVT =
722 PartVT.getVectorElementCount());
723 SDValue Widened = widenVectorToPartType(DAG, Val, DL, WidenVT);
724 Val = DAG.getAnyExtOrTrunc(Widened, DL, PartVT);
725 } else {
726 // Don't extract an integer from a float vector. This can happen if the
727 // FP type gets softened to integer and then promoted. The promotion
728 // prevents it from being picked up by the earlier bitcast case.
729 if (ValueVT.getVectorElementCount().isScalar() &&
730 (!ValueVT.isFloatingPoint() || !PartVT.isInteger())) {
731 // If we reach this condition and PartVT is FP, this means that
732 // ValueVT is also FP and both have a different size, otherwise we
733 // would have bitcasted them. Producing an EXTRACT_VECTOR_ELT here
734 // would be invalid since that would mean the smaller FP type has to
735 // be extended to the larger one.
736 if (PartVT.isFloatingPoint()) {
737 Val = DAG.getBitcast(ValueVT.getScalarType(), Val);
738 Val = DAG.getNode(ISD::FP_EXTEND, DL, PartVT, Val);
739 } else
740 Val = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, PartVT, Val,
741 DAG.getVectorIdxConstant(0, DL));
742 } else {
743 uint64_t ValueSize = ValueVT.getFixedSizeInBits();
744 assert(PartVT.getFixedSizeInBits() > ValueSize &&
745 "lossy conversion of vector to scalar type");
746 EVT IntermediateType = EVT::getIntegerVT(*DAG.getContext(), ValueSize);
747 Val = DAG.getBitcast(IntermediateType, Val);
748 Val = DAG.getAnyExtOrTrunc(Val, DL, PartVT);
749 }
750 }
751
752 assert(Val.getValueType() == PartVT && "Unexpected vector part value type");
753 Parts[0] = Val;
754 return;
755 }
756
757 // Handle a multi-element vector.
758 EVT IntermediateVT;
759 MVT RegisterVT;
760 unsigned NumIntermediates;
761 unsigned NumRegs;
762 if (IsABIRegCopy) {
764 *DAG.getContext(), *CallConv, ValueVT, IntermediateVT, NumIntermediates,
765 RegisterVT);
766 } else {
767 NumRegs =
768 TLI.getVectorTypeBreakdown(*DAG.getContext(), ValueVT, IntermediateVT,
769 NumIntermediates, RegisterVT);
770 }
771
772 assert(NumRegs == NumParts && "Part count doesn't match vector breakdown!");
773 NumParts = NumRegs; // Silence a compiler warning.
774 assert(RegisterVT == PartVT && "Part type doesn't match vector breakdown!");
775
776 assert(IntermediateVT.isScalableVector() == ValueVT.isScalableVector() &&
777 "Mixing scalable and fixed vectors when copying in parts");
778
779 std::optional<ElementCount> DestEltCnt;
780
781 if (IntermediateVT.isVector())
782 DestEltCnt = IntermediateVT.getVectorElementCount() * NumIntermediates;
783 else
784 DestEltCnt = ElementCount::getFixed(NumIntermediates);
785
786 EVT BuiltVectorTy = EVT::getVectorVT(
787 *DAG.getContext(), IntermediateVT.getScalarType(), *DestEltCnt);
788
789 if (ValueVT == BuiltVectorTy) {
790 // Nothing to do.
791 } else if (ValueVT.getSizeInBits() == BuiltVectorTy.getSizeInBits()) {
792 // Bitconvert vector->vector case.
793 Val = DAG.getNode(ISD::BITCAST, DL, BuiltVectorTy, Val);
794 } else {
795 if (BuiltVectorTy.getVectorElementType().bitsGT(
796 ValueVT.getVectorElementType())) {
797 // Integer promotion.
798 ValueVT = EVT::getVectorVT(*DAG.getContext(),
799 BuiltVectorTy.getVectorElementType(),
800 ValueVT.getVectorElementCount());
801 Val = DAG.getNode(ISD::ANY_EXTEND, DL, ValueVT, Val);
802 }
803
804 if (SDValue Widened = widenVectorToPartType(DAG, Val, DL, BuiltVectorTy)) {
805 Val = Widened;
806 }
807 }
808
809 assert(Val.getValueType() == BuiltVectorTy && "Unexpected vector value type");
810
811 // Split the vector into intermediate operands.
812 SmallVector<SDValue, 8> Ops(NumIntermediates);
813 for (unsigned i = 0; i != NumIntermediates; ++i) {
814 if (IntermediateVT.isVector()) {
815 // This does something sensible for scalable vectors - see the
816 // definition of EXTRACT_SUBVECTOR for further details.
817 unsigned IntermediateNumElts = IntermediateVT.getVectorMinNumElements();
818 Ops[i] =
819 DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, IntermediateVT, Val,
820 DAG.getVectorIdxConstant(i * IntermediateNumElts, DL));
821 } else {
822 Ops[i] = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, IntermediateVT, Val,
823 DAG.getVectorIdxConstant(i, DL));
824 }
825 }
826
827 // Split the intermediate operands into legal parts.
828 if (NumParts == NumIntermediates) {
829 // If the register was not expanded, promote or copy the value,
830 // as appropriate.
831 for (unsigned i = 0; i != NumParts; ++i)
832 getCopyToParts(DAG, DL, Ops[i], &Parts[i], 1, PartVT, V, CallConv);
833 } else if (NumParts > 0) {
834 // If the intermediate type was expanded, split each the value into
835 // legal parts.
836 assert(NumIntermediates != 0 && "division by zero");
837 assert(NumParts % NumIntermediates == 0 &&
838 "Must expand into a divisible number of parts!");
839 unsigned Factor = NumParts / NumIntermediates;
840 for (unsigned i = 0; i != NumIntermediates; ++i)
841 getCopyToParts(DAG, DL, Ops[i], &Parts[i * Factor], Factor, PartVT, V,
842 CallConv);
843 }
844}
845
846static void failForInvalidBundles(const CallBase &I, StringRef Name,
847 ArrayRef<uint32_t> AllowedBundles) {
848 if (I.hasOperandBundlesOtherThan(AllowedBundles)) {
849 ListSeparator LS;
850 std::string Error;
852 for (unsigned i = 0, e = I.getNumOperandBundles(); i != e; ++i) {
853 OperandBundleUse U = I.getOperandBundleAt(i);
854 if (!is_contained(AllowedBundles, U.getTagID()))
855 OS << LS << U.getTagName();
856 }
858 Twine("cannot lower ", Name)
859 .concat(Twine(" with arbitrary operand bundles: ", Error)));
860 }
861}
862
864 EVT valuevt, std::optional<CallingConv::ID> CC)
865 : ValueVTs(1, valuevt), RegVTs(1, regvt), Regs(regs),
866 RegCount(1, regs.size()), CallConv(CC) {}
867
869 const DataLayout &DL, Register Reg, Type *Ty,
870 std::optional<CallingConv::ID> CC) {
871 ComputeValueVTs(TLI, DL, Ty, ValueVTs);
872
873 CallConv = CC;
874
875 for (EVT ValueVT : ValueVTs) {
876 unsigned NumRegs =
878 ? TLI.getNumRegistersForCallingConv(Context, *CC, ValueVT)
879 : TLI.getNumRegisters(Context, ValueVT);
880 MVT RegisterVT =
882 ? TLI.getRegisterTypeForCallingConv(Context, *CC, ValueVT)
883 : TLI.getRegisterType(Context, ValueVT);
884 for (unsigned i = 0; i != NumRegs; ++i)
885 Regs.push_back(Reg + i);
886 RegVTs.push_back(RegisterVT);
887 RegCount.push_back(NumRegs);
888 Reg = Reg.id() + NumRegs;
889 }
890}
891
893 FunctionLoweringInfo &FuncInfo,
894 const SDLoc &dl, SDValue &Chain,
895 SDValue *Glue, const Value *V) const {
896 // A Value with type {} or [0 x %t] needs no registers.
897 if (ValueVTs.empty())
898 return SDValue();
899
900 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
901
902 // Assemble the legal parts into the final values.
905 for (unsigned Value = 0, Part = 0, e = ValueVTs.size(); Value != e; ++Value) {
906 // Copy the legal parts from the registers.
907 EVT ValueVT = ValueVTs[Value];
908 unsigned NumRegs = RegCount[Value];
909 MVT RegisterVT = isABIMangled()
911 *DAG.getContext(), *CallConv, RegVTs[Value])
912 : RegVTs[Value];
913
914 Parts.resize(NumRegs);
915 for (unsigned i = 0; i != NumRegs; ++i) {
916 SDValue P;
917 if (!Glue) {
918 P = DAG.getCopyFromReg(Chain, dl, Regs[Part+i], RegisterVT);
919 } else {
920 P = DAG.getCopyFromReg(Chain, dl, Regs[Part+i], RegisterVT, *Glue);
921 *Glue = P.getValue(2);
922 }
923
924 Chain = P.getValue(1);
925 Parts[i] = P;
926
927 // If the source register was virtual and if we know something about it,
928 // add an assert node.
929 if (!Regs[Part + i].isVirtual() || !RegisterVT.isInteger())
930 continue;
931
933 FuncInfo.GetLiveOutRegInfo(Regs[Part+i]);
934 if (!LOI)
935 continue;
936
937 unsigned RegSize = RegisterVT.getScalarSizeInBits();
938 unsigned NumSignBits = LOI->NumSignBits;
939 unsigned NumZeroBits = LOI->Known.countMinLeadingZeros();
940
941 if (NumZeroBits == RegSize) {
942 // The current value is a zero.
943 // Explicitly express that as it would be easier for
944 // optimizations to kick in.
945 Parts[i] = DAG.getConstant(0, dl, RegisterVT);
946 continue;
947 }
948
949 // FIXME: We capture more information than the dag can represent. For
950 // now, just use the tightest assertzext/assertsext possible.
951 bool isSExt;
952 EVT FromVT(MVT::Other);
953 if (NumZeroBits) {
954 FromVT = EVT::getIntegerVT(*DAG.getContext(), RegSize - NumZeroBits);
955 isSExt = false;
956 } else if (NumSignBits > 1) {
957 FromVT =
958 EVT::getIntegerVT(*DAG.getContext(), RegSize - NumSignBits + 1);
959 isSExt = true;
960 } else {
961 continue;
962 }
963 // Add an assertion node.
964 assert(FromVT != MVT::Other);
965 Parts[i] = DAG.getNode(isSExt ? ISD::AssertSext : ISD::AssertZext, dl,
966 RegisterVT, P, DAG.getValueType(FromVT));
967 }
968
969 Values[Value] = getCopyFromParts(DAG, dl, Parts.begin(), NumRegs,
970 RegisterVT, ValueVT, V, Chain, CallConv);
971 Part += NumRegs;
972 Parts.clear();
973 }
974
975 return DAG.getNode(ISD::MERGE_VALUES, dl, DAG.getVTList(ValueVTs), Values);
976}
977
979 const SDLoc &dl, SDValue &Chain, SDValue *Glue,
980 const Value *V,
981 ISD::NodeType PreferredExtendType) const {
982 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
983 ISD::NodeType ExtendKind = PreferredExtendType;
984
985 // Get the list of the values's legal parts.
986 unsigned NumRegs = Regs.size();
987 SmallVector<SDValue, 8> Parts(NumRegs);
988 for (unsigned Value = 0, Part = 0, e = ValueVTs.size(); Value != e; ++Value) {
989 unsigned NumParts = RegCount[Value];
990
991 MVT RegisterVT = isABIMangled()
993 *DAG.getContext(), *CallConv, RegVTs[Value])
994 : RegVTs[Value];
995
996 if (ExtendKind == ISD::ANY_EXTEND)
997 if (TLI.isZExtFree(peekThroughFreeze(Val), RegisterVT))
998 ExtendKind = ISD::ZERO_EXTEND;
999
1000 getCopyToParts(DAG, dl, Val.getValue(Val.getResNo() + Value), &Parts[Part],
1001 NumParts, RegisterVT, V, CallConv, ExtendKind);
1002 Part += NumParts;
1003 }
1004
1005 // Copy the parts into the registers.
1006 SmallVector<SDValue, 8> Chains(NumRegs);
1007 for (unsigned i = 0; i != NumRegs; ++i) {
1008 SDValue Part;
1009 if (!Glue) {
1010 Part = DAG.getCopyToReg(Chain, dl, Regs[i], Parts[i]);
1011 } else {
1012 Part = DAG.getCopyToReg(Chain, dl, Regs[i], Parts[i], *Glue);
1013 *Glue = Part.getValue(1);
1014 }
1015
1016 Chains[i] = Part.getValue(0);
1017 }
1018
1019 if (NumRegs == 1 || Glue)
1020 // If NumRegs > 1 && Glue is used then the use of the last CopyToReg is
1021 // flagged to it. That is the CopyToReg nodes and the user are considered
1022 // a single scheduling unit. If we create a TokenFactor and return it as
1023 // chain, then the TokenFactor is both a predecessor (operand) of the
1024 // user as well as a successor (the TF operands are flagged to the user).
1025 // c1, f1 = CopyToReg
1026 // c2, f2 = CopyToReg
1027 // c3 = TokenFactor c1, c2
1028 // ...
1029 // = op c3, ..., f2
1030 Chain = Chains[NumRegs-1];
1031 else
1032 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chains);
1033}
1034
1036 unsigned MatchingIdx, const SDLoc &dl,
1037 SelectionDAG &DAG,
1038 std::vector<SDValue> &Ops) const {
1039 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1040
1041 InlineAsm::Flag Flag(Code, Regs.size());
1042 if (HasMatching)
1043 Flag.setMatchingOp(MatchingIdx);
1044 else if (!Regs.empty() && Regs.front().isVirtual()) {
1045 // Put the register class of the virtual registers in the flag word. That
1046 // way, later passes can recompute register class constraints for inline
1047 // assembly as well as normal instructions.
1048 // Don't do this for tied operands that can use the regclass information
1049 // from the def.
1051 const TargetRegisterClass *RC = MRI.getRegClass(Regs.front());
1052 Flag.setRegClass(RC->getID());
1053 }
1054
1055 SDValue Res = DAG.getTargetConstant(Flag, dl, MVT::i32);
1056 Ops.push_back(Res);
1057
1058 if (Code == InlineAsm::Kind::Clobber) {
1059 // Clobbers should always have a 1:1 mapping with registers, and may
1060 // reference registers that have illegal (e.g. vector) types. Hence, we
1061 // shouldn't try to apply any sort of splitting logic to them.
1062 assert(Regs.size() == RegVTs.size() && Regs.size() == ValueVTs.size() &&
1063 "No 1:1 mapping from clobbers to regs?");
1065 (void)SP;
1066 for (unsigned I = 0, E = ValueVTs.size(); I != E; ++I) {
1067 Ops.push_back(DAG.getRegister(Regs[I], RegVTs[I]));
1068 assert(
1069 (Regs[I] != SP ||
1071 "If we clobbered the stack pointer, MFI should know about it.");
1072 }
1073 return;
1074 }
1075
1076 for (unsigned Value = 0, Reg = 0, e = ValueVTs.size(); Value != e; ++Value) {
1077 MVT RegisterVT = RegVTs[Value];
1078 unsigned NumRegs = TLI.getNumRegisters(*DAG.getContext(), ValueVTs[Value],
1079 RegisterVT);
1080 for (unsigned i = 0; i != NumRegs; ++i) {
1081 assert(Reg < Regs.size() && "Mismatch in # registers expected");
1082 Register TheReg = Regs[Reg++];
1083 Ops.push_back(DAG.getRegister(TheReg, RegisterVT));
1084 }
1085 }
1086}
1087
1091 unsigned I = 0;
1092 for (auto CountAndVT : zip_first(RegCount, RegVTs)) {
1093 unsigned RegCount = std::get<0>(CountAndVT);
1094 MVT RegisterVT = std::get<1>(CountAndVT);
1095 TypeSize RegisterSize = RegisterVT.getSizeInBits();
1096 for (unsigned E = I + RegCount; I != E; ++I)
1097 OutVec.push_back(std::make_pair(Regs[I], RegisterSize));
1098 }
1099 return OutVec;
1100}
1101
1103 AssumptionCache *ac, const TargetLibraryInfo *li,
1104 const TargetTransformInfo &TTI) {
1105 BatchAA = aa;
1106 AC = ac;
1107 GFI = gfi;
1108 LibInfo = li;
1109 Context = DAG.getContext();
1110 LPadToCallSiteMap.clear();
1111 this->TTI = &TTI;
1112 SL->init(DAG.getTargetLoweringInfo(), TM, DAG.getDataLayout());
1113 AssignmentTrackingEnabled = isAssignmentTrackingEnabled(
1114 *DAG.getMachineFunction().getFunction().getParent());
1115}
1116
1118 NodeMap.clear();
1119 UnusedArgNodeMap.clear();
1120 PendingLoads.clear();
1121 PendingExports.clear();
1122 PendingConstrainedFP.clear();
1123 PendingConstrainedFPStrict.clear();
1124 CurInst = nullptr;
1125 HasTailCall = false;
1126 SDNodeOrder = LowestSDNodeOrder;
1127 StatepointLowering.clear();
1128}
1129
1131 DanglingDebugInfoMap.clear();
1132}
1133
1134// Update DAG root to include dependencies on Pending chains.
1135SDValue SelectionDAGBuilder::updateRoot(SmallVectorImpl<SDValue> &Pending) {
1136 SDValue Root = DAG.getRoot();
1137
1138 if (Pending.empty())
1139 return Root;
1140
1141 // Add current root to PendingChains, unless we already indirectly
1142 // depend on it.
1143 if (Root.getOpcode() != ISD::EntryToken) {
1144 unsigned i = 0, e = Pending.size();
1145 for (; i != e; ++i) {
1146 assert(Pending[i].getNode()->getNumOperands() > 1);
1147 if (Pending[i].getNode()->getOperand(0) == Root)
1148 break; // Don't add the root if we already indirectly depend on it.
1149 }
1150
1151 if (i == e)
1152 Pending.push_back(Root);
1153 }
1154
1155 if (Pending.size() == 1)
1156 Root = Pending[0];
1157 else
1158 Root = DAG.getTokenFactor(getCurSDLoc(), Pending);
1159
1160 DAG.setRoot(Root);
1161 Pending.clear();
1162 return Root;
1163}
1164
1168
1170 // If the new exception behavior differs from that of the pending
1171 // ones, chain up them and update the root.
1172 switch (EB) {
1175 // Floating-point exceptions produced by such operations are not intended
1176 // to be observed, so the sequence of these operations does not need to be
1177 // preserved.
1178 //
1179 // They however must not be mixed with the instructions that have strict
1180 // exception behavior. Placing an operation with 'ebIgnore' behavior between
1181 // 'ebStrict' operations could distort the observed exception behavior.
1182 if (!PendingConstrainedFPStrict.empty()) {
1183 assert(PendingConstrainedFP.empty());
1184 updateRoot(PendingConstrainedFPStrict);
1185 }
1186 break;
1188 // Floating-point exception produced by these operations may be observed, so
1189 // they must be correctly chained. If trapping on FP exceptions is
1190 // disabled, the exceptions can be observed only by functions that read
1191 // exception flags, like 'llvm.get_fpenv' or 'fetestexcept'. It means that
1192 // the order of operations is not significant between barriers.
1193 //
1194 // If trapping is enabled, each operation becomes an implicit observation
1195 // point, so the operations must be sequenced according their original
1196 // source order.
1197 if (!PendingConstrainedFP.empty()) {
1198 assert(PendingConstrainedFPStrict.empty());
1199 updateRoot(PendingConstrainedFP);
1200 }
1201 // TODO: Add support for trapping-enabled scenarios.
1202 }
1203 return DAG.getRoot();
1204}
1205
1207 // Chain up all pending constrained intrinsics together with all
1208 // pending loads, by simply appending them to PendingLoads and
1209 // then calling getMemoryRoot().
1210 PendingLoads.reserve(PendingLoads.size() +
1211 PendingConstrainedFP.size() +
1212 PendingConstrainedFPStrict.size());
1213 PendingLoads.append(PendingConstrainedFP.begin(),
1214 PendingConstrainedFP.end());
1215 PendingLoads.append(PendingConstrainedFPStrict.begin(),
1216 PendingConstrainedFPStrict.end());
1217 PendingConstrainedFP.clear();
1218 PendingConstrainedFPStrict.clear();
1219 return getMemoryRoot();
1220}
1221
1223 // We need to emit pending fpexcept.strict constrained intrinsics,
1224 // so append them to the PendingExports list.
1225 PendingExports.append(PendingConstrainedFPStrict.begin(),
1226 PendingConstrainedFPStrict.end());
1227 PendingConstrainedFPStrict.clear();
1228 return updateRoot(PendingExports);
1229}
1230
1232 DILocalVariable *Variable,
1234 DebugLoc DL) {
1235 assert(Variable && "Missing variable");
1236
1237 // Check if address has undef value.
1238 if (!Address || isa<UndefValue>(Address) ||
1239 (Address->use_empty() && !isa<Argument>(Address))) {
1240 LLVM_DEBUG(
1241 dbgs()
1242 << "dbg_declare: Dropping debug info (bad/undef/unused-arg address)\n");
1243 return;
1244 }
1245
1246 bool IsParameter = Variable->isParameter() || isa<Argument>(Address);
1247
1248 SDValue &N = NodeMap[Address];
1249 if (!N.getNode() && isa<Argument>(Address))
1250 // Check unused arguments map.
1251 N = UnusedArgNodeMap[Address];
1252 SDDbgValue *SDV;
1253 if (N.getNode()) {
1254 if (const BitCastInst *BCI = dyn_cast<BitCastInst>(Address))
1255 Address = BCI->getOperand(0);
1256 // Parameters are handled specially.
1257 auto *FINode = dyn_cast<FrameIndexSDNode>(N.getNode());
1258 if (IsParameter && FINode) {
1259 // Byval parameter. We have a frame index at this point.
1260 SDV = DAG.getFrameIndexDbgValue(Variable, Expression, FINode->getIndex(),
1261 /*IsIndirect*/ true, DL, SDNodeOrder);
1262 } else if (isa<Argument>(Address)) {
1263 // Address is an argument, so try to emit its dbg value using
1264 // virtual register info from the FuncInfo.ValueMap.
1265 EmitFuncArgumentDbgValue(Address, Variable, Expression, DL,
1266 FuncArgumentDbgValueKind::Declare, N);
1267 return;
1268 } else {
1269 SDV = DAG.getDbgValue(Variable, Expression, N.getNode(), N.getResNo(),
1270 true, DL, SDNodeOrder);
1271 }
1272 DAG.AddDbgValue(SDV, IsParameter);
1273 } else {
1274 // If Address is an argument then try to emit its dbg value using
1275 // virtual register info from the FuncInfo.ValueMap.
1276 if (!EmitFuncArgumentDbgValue(Address, Variable, Expression, DL,
1277 FuncArgumentDbgValueKind::Declare, N)) {
1278 LLVM_DEBUG(dbgs() << "dbg_declare: Dropping debug info"
1279 << " (could not emit func-arg dbg_value)\n");
1280 }
1281 }
1282}
1283
1285 // Add SDDbgValue nodes for any var locs here. Do so before updating
1286 // SDNodeOrder, as this mapping is {Inst -> Locs BEFORE Inst}.
1287 if (FunctionVarLocs const *FnVarLocs = DAG.getFunctionVarLocs()) {
1288 // Add SDDbgValue nodes for any var locs here. Do so before updating
1289 // SDNodeOrder, as this mapping is {Inst -> Locs BEFORE Inst}.
1290 for (auto It = FnVarLocs->locs_begin(&I), End = FnVarLocs->locs_end(&I);
1291 It != End; ++It) {
1292 auto *Var = FnVarLocs->getDILocalVariable(It->VariableID);
1293 dropDanglingDebugInfo(Var, It->Expr);
1294 if (It->Values.isKillLocation(It->Expr)) {
1295 handleKillDebugValue(Var, It->Expr, It->DL, SDNodeOrder);
1296 continue;
1297 }
1298 SmallVector<Value *> Values(It->Values.location_ops());
1299 if (!handleDebugValue(Values, Var, It->Expr, It->DL, SDNodeOrder,
1300 It->Values.hasArgList())) {
1301 SmallVector<Value *, 4> Vals(It->Values.location_ops());
1303 FnVarLocs->getDILocalVariable(It->VariableID),
1304 It->Expr, Vals.size() > 1, It->DL, SDNodeOrder);
1305 }
1306 }
1307 }
1308
1309 // We must skip DbgVariableRecords if they've already been processed above as
1310 // we have just emitted the debug values resulting from assignment tracking
1311 // analysis, making any existing DbgVariableRecords redundant (and probably
1312 // less correct). We still need to process DbgLabelRecords. This does sink
1313 // DbgLabelRecords to the bottom of the group of debug records. That sholdn't
1314 // be important as it does so deterministcally and ordering between
1315 // DbgLabelRecords and DbgVariableRecords is immaterial (other than for MIR/IR
1316 // printing).
1317 bool SkipDbgVariableRecords = DAG.getFunctionVarLocs();
1318 // Is there is any debug-info attached to this instruction, in the form of
1319 // DbgRecord non-instruction debug-info records.
1320 for (DbgRecord &DR : I.getDbgRecordRange()) {
1321 if (DbgLabelRecord *DLR = dyn_cast<DbgLabelRecord>(&DR)) {
1322 assert(DLR->getLabel() && "Missing label");
1323 SDDbgLabel *SDV =
1324 DAG.getDbgLabel(DLR->getLabel(), DLR->getDebugLoc(), SDNodeOrder);
1325 DAG.AddDbgLabel(SDV);
1326 continue;
1327 }
1328
1329 if (SkipDbgVariableRecords)
1330 continue;
1332 DILocalVariable *Variable = DVR.getVariable();
1335
1337 if (FuncInfo.PreprocessedDVRDeclares.contains(&DVR))
1338 continue;
1339 LLVM_DEBUG(dbgs() << "SelectionDAG visiting dbg_declare: " << DVR
1340 << "\n");
1342 DVR.getDebugLoc());
1343 continue;
1344 }
1345
1346 // A DbgVariableRecord with no locations is a kill location.
1348 if (Values.empty()) {
1350 SDNodeOrder);
1351 continue;
1352 }
1353
1354 // A DbgVariableRecord with an undef or absent location is also a kill
1355 // location.
1356 if (llvm::any_of(Values,
1357 [](Value *V) { return !V || isa<UndefValue>(V); })) {
1359 SDNodeOrder);
1360 continue;
1361 }
1362
1363 bool IsVariadic = DVR.hasArgList();
1364 if (!handleDebugValue(Values, Variable, Expression, DVR.getDebugLoc(),
1365 SDNodeOrder, IsVariadic)) {
1366 addDanglingDebugInfo(Values, Variable, Expression, IsVariadic,
1367 DVR.getDebugLoc(), SDNodeOrder);
1368 }
1369 }
1370}
1371
1373 visitDbgInfo(I);
1374
1375 // Set up outgoing PHI node register values before emitting the terminator.
1376 if (I.isTerminator()) {
1377 HandlePHINodesInSuccessorBlocks(I.getParent());
1378 }
1379
1380 ++SDNodeOrder;
1381 CurInst = &I;
1382
1383 // Set inserted listener only if required.
1384 bool NodeInserted = false;
1385 std::unique_ptr<SelectionDAG::DAGNodeInsertedListener> InsertedListener;
1386 MDNode *PCSectionsMD = I.getMetadata(LLVMContext::MD_pcsections);
1387 MDNode *MMRA = I.getMetadata(LLVMContext::MD_mmra);
1388 if (PCSectionsMD || MMRA) {
1389 InsertedListener = std::make_unique<SelectionDAG::DAGNodeInsertedListener>(
1390 DAG, [&](SDNode *) { NodeInserted = true; });
1391 }
1392
1393 visit(I.getOpcode(), I);
1394
1395 if (!I.isTerminator() && !HasTailCall &&
1396 !isa<GCStatepointInst>(I)) // statepoints handle their exports internally
1398
1399 // Handle metadata.
1400 if (PCSectionsMD || MMRA) {
1401 auto It = NodeMap.find(&I);
1402 if (It != NodeMap.end()) {
1403 if (PCSectionsMD)
1404 DAG.addPCSections(It->second.getNode(), PCSectionsMD);
1405 if (MMRA)
1406 DAG.addMMRAMetadata(It->second.getNode(), MMRA);
1407 } else if (NodeInserted) {
1408 // This should not happen; if it does, don't let it go unnoticed so we can
1409 // fix it. Relevant visit*() function is probably missing a setValue().
1410 errs() << "warning: loosing !pcsections and/or !mmra metadata ["
1411 << I.getModule()->getName() << "]\n";
1412 LLVM_DEBUG(I.dump());
1413 assert(false);
1414 }
1415 }
1416
1417 CurInst = nullptr;
1418}
1419
1420void SelectionDAGBuilder::visitPHI(const PHINode &) {
1421 llvm_unreachable("SelectionDAGBuilder shouldn't visit PHI nodes!");
1422}
1423
1424void SelectionDAGBuilder::visit(unsigned Opcode, const User &I) {
1425 // Note: this doesn't use InstVisitor, because it has to work with
1426 // ConstantExpr's in addition to instructions.
1427 switch (Opcode) {
1428 default: llvm_unreachable("Unknown instruction type encountered!");
1429 // Build the switch statement using the Instruction.def file.
1430#define HANDLE_INST(NUM, OPCODE, CLASS) \
1431 case Instruction::OPCODE: visit##OPCODE((const CLASS&)I); break;
1432#include "llvm/IR/Instruction.def"
1433 }
1434}
1435
1437 DILocalVariable *Variable,
1438 DebugLoc DL, unsigned Order,
1441 // For variadic dbg_values we will now insert poison.
1442 // FIXME: We can potentially recover these!
1444 for (const Value *V : Values) {
1445 auto *Poison = PoisonValue::get(V->getType());
1447 }
1448 SDDbgValue *SDV = DAG.getDbgValueList(Variable, Expression, Locs, {},
1449 /*IsIndirect=*/false, DL, Order,
1450 /*IsVariadic=*/true);
1451 DAG.AddDbgValue(SDV, /*isParameter=*/false);
1452 return true;
1453}
1454
1456 DILocalVariable *Var,
1457 DIExpression *Expr,
1458 bool IsVariadic, DebugLoc DL,
1459 unsigned Order) {
1460 if (IsVariadic) {
1461 handleDanglingVariadicDebugInfo(DAG, Var, DL, Order, Values, Expr);
1462 return;
1463 }
1464 // TODO: Dangling debug info will eventually either be resolved or produce
1465 // a poison DBG_VALUE. However in the resolution case, a gap may appear
1466 // between the original dbg.value location and its resolved DBG_VALUE,
1467 // which we should ideally fill with an extra poison DBG_VALUE.
1468 assert(Values.size() == 1);
1469 DanglingDebugInfoMap[Values[0]].emplace_back(Var, Expr, DL, Order);
1470}
1471
1473 const DIExpression *Expr) {
1474 auto isMatchingDbgValue = [&](DanglingDebugInfo &DDI) {
1475 DIVariable *DanglingVariable = DDI.getVariable();
1476 DIExpression *DanglingExpr = DDI.getExpression();
1477 if (DanglingVariable == Variable && Expr->fragmentsOverlap(DanglingExpr)) {
1478 LLVM_DEBUG(dbgs() << "Dropping dangling debug info for "
1479 << printDDI(nullptr, DDI) << "\n");
1480 return true;
1481 }
1482 return false;
1483 };
1484
1485 for (auto &DDIMI : DanglingDebugInfoMap) {
1486 DanglingDebugInfoVector &DDIV = DDIMI.second;
1487
1488 // If debug info is to be dropped, run it through final checks to see
1489 // whether it can be salvaged.
1490 for (auto &DDI : DDIV)
1491 if (isMatchingDbgValue(DDI))
1492 salvageUnresolvedDbgValue(DDIMI.first, DDI);
1493
1494 erase_if(DDIV, isMatchingDbgValue);
1495 }
1496}
1497
1498// resolveDanglingDebugInfo - if we saw an earlier dbg_value referring to V,
1499// generate the debug data structures now that we've seen its definition.
1501 SDValue Val) {
1502 auto DanglingDbgInfoIt = DanglingDebugInfoMap.find(V);
1503 if (DanglingDbgInfoIt == DanglingDebugInfoMap.end())
1504 return;
1505
1506 DanglingDebugInfoVector &DDIV = DanglingDbgInfoIt->second;
1507 for (auto &DDI : DDIV) {
1508 DebugLoc DL = DDI.getDebugLoc();
1509 unsigned DbgSDNodeOrder = DDI.getSDNodeOrder();
1510 DILocalVariable *Variable = DDI.getVariable();
1511 DIExpression *Expr = DDI.getExpression();
1512 assert(Variable->isValidLocationForIntrinsic(DL) &&
1513 "Expected inlined-at fields to agree");
1514 SDDbgValue *SDV;
1515 if (Val.getNode()) {
1516 // FIXME: I doubt that it is correct to resolve a dangling DbgValue as a
1517 // FuncArgumentDbgValue (it would be hoisted to the function entry, and if
1518 // we couldn't resolve it directly when examining the DbgValue intrinsic
1519 // in the first place we should not be more successful here). Unless we
1520 // have some test case that prove this to be correct we should avoid
1521 // calling EmitFuncArgumentDbgValue here.
1522 unsigned ValSDNodeOrder = Val.getNode()->getIROrder();
1523 if (!EmitFuncArgumentDbgValue(V, Variable, Expr, DL,
1524 FuncArgumentDbgValueKind::Value, Val)) {
1525 LLVM_DEBUG(dbgs() << "Resolve dangling debug info for "
1526 << printDDI(V, DDI) << "\n");
1527 LLVM_DEBUG(dbgs() << " By mapping to:\n "; Val.dump());
1528 // Increase the SDNodeOrder for the DbgValue here to make sure it is
1529 // inserted after the definition of Val when emitting the instructions
1530 // after ISel. An alternative could be to teach
1531 // ScheduleDAGSDNodes::EmitSchedule to delay the insertion properly.
1532 LLVM_DEBUG(if (ValSDNodeOrder > DbgSDNodeOrder) dbgs()
1533 << "changing SDNodeOrder from " << DbgSDNodeOrder << " to "
1534 << ValSDNodeOrder << "\n");
1535 SDV = getDbgValue(Val, Variable, Expr, DL,
1536 std::max(DbgSDNodeOrder, ValSDNodeOrder));
1537 DAG.AddDbgValue(SDV, false);
1538 } else
1539 LLVM_DEBUG(dbgs() << "Resolved dangling debug info for "
1540 << printDDI(V, DDI)
1541 << " in EmitFuncArgumentDbgValue\n");
1542 } else {
1543 LLVM_DEBUG(dbgs() << "Dropping debug info for " << printDDI(V, DDI)
1544 << "\n");
1545 auto Poison = PoisonValue::get(V->getType());
1546 auto SDV =
1547 DAG.getConstantDbgValue(Variable, Expr, Poison, DL, DbgSDNodeOrder);
1548 DAG.AddDbgValue(SDV, false);
1549 }
1550 }
1551 DDIV.clear();
1552}
1553
1555 DanglingDebugInfo &DDI) {
1556 // TODO: For the variadic implementation, instead of only checking the fail
1557 // state of `handleDebugValue`, we need know specifically which values were
1558 // invalid, so that we attempt to salvage only those values when processing
1559 // a DIArgList.
1560 const Value *OrigV = V;
1561 DILocalVariable *Var = DDI.getVariable();
1562 DIExpression *Expr = DDI.getExpression();
1563 DebugLoc DL = DDI.getDebugLoc();
1564 unsigned SDOrder = DDI.getSDNodeOrder();
1565
1566 // Currently we consider only dbg.value intrinsics -- we tell the salvager
1567 // that DW_OP_stack_value is desired.
1568 bool StackValue = true;
1569
1570 // Can this Value can be encoded without any further work?
1571 if (handleDebugValue(V, Var, Expr, DL, SDOrder, /*IsVariadic=*/false))
1572 return;
1573
1574 // Attempt to salvage back through as many instructions as possible. Bail if
1575 // a non-instruction is seen, such as a constant expression or global
1576 // variable. FIXME: Further work could recover those too.
1577 while (isa<Instruction>(V)) {
1578 const Instruction &VAsInst = *cast<const Instruction>(V);
1579 // Temporary "0", awaiting real implementation.
1581 SmallVector<Value *, 4> AdditionalValues;
1582 V = salvageDebugInfoImpl(const_cast<Instruction &>(VAsInst),
1583 Expr->getNumLocationOperands(), Ops,
1584 AdditionalValues);
1585 // If we cannot salvage any further, and haven't yet found a suitable debug
1586 // expression, bail out.
1587 if (!V)
1588 break;
1589
1590 // TODO: If AdditionalValues isn't empty, then the salvage can only be
1591 // represented with a DBG_VALUE_LIST, so we give up. When we have support
1592 // here for variadic dbg_values, remove that condition.
1593 if (!AdditionalValues.empty())
1594 break;
1595
1596 // New value and expr now represent this debuginfo.
1597 Expr = DIExpression::appendOpsToArg(Expr, Ops, 0, StackValue);
1598
1599 // Some kind of simplification occurred: check whether the operand of the
1600 // salvaged debug expression can be encoded in this DAG.
1601 if (handleDebugValue(V, Var, Expr, DL, SDOrder, /*IsVariadic=*/false)) {
1602 LLVM_DEBUG(
1603 dbgs() << "Salvaged debug location info for:\n " << *Var << "\n"
1604 << *OrigV << "\nBy stripping back to:\n " << *V << "\n");
1605 return;
1606 }
1607 }
1608
1609 // This was the final opportunity to salvage this debug information, and it
1610 // couldn't be done. Place a poison DBG_VALUE at this location to terminate
1611 // any earlier variable location.
1612 assert(OrigV && "V shouldn't be null");
1613 auto *Poison = PoisonValue::get(OrigV->getType());
1614 auto *SDV = DAG.getConstantDbgValue(Var, Expr, Poison, DL, SDNodeOrder);
1615 DAG.AddDbgValue(SDV, false);
1616 LLVM_DEBUG(dbgs() << "Dropping debug value info for:\n "
1617 << printDDI(OrigV, DDI) << "\n");
1618}
1619
1621 DIExpression *Expr,
1622 DebugLoc DbgLoc,
1623 unsigned Order) {
1627 handleDebugValue(Poison, Var, NewExpr, DbgLoc, Order,
1628 /*IsVariadic*/ false);
1629}
1630
1632 DILocalVariable *Var,
1633 DIExpression *Expr, DebugLoc DbgLoc,
1634 unsigned Order, bool IsVariadic) {
1635 if (Values.empty())
1636 return true;
1637
1638 // Filter EntryValue locations out early.
1639 if (visitEntryValueDbgValue(Values, Var, Expr, DbgLoc))
1640 return true;
1641
1642 SmallVector<SDDbgOperand> LocationOps;
1643 SmallVector<SDNode *> Dependencies;
1644 for (const Value *V : Values) {
1645 // Constant value.
1648 LocationOps.emplace_back(SDDbgOperand::fromConst(V));
1649 continue;
1650 }
1651
1652 // Look through IntToPtr constants.
1653 if (auto *CE = dyn_cast<ConstantExpr>(V))
1654 if (CE->getOpcode() == Instruction::IntToPtr) {
1655 LocationOps.emplace_back(SDDbgOperand::fromConst(CE->getOperand(0)));
1656 continue;
1657 }
1658
1659 // If the Value is a frame index, we can create a FrameIndex debug value
1660 // without relying on the DAG at all.
1661 if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
1662 auto SI = FuncInfo.StaticAllocaMap.find(AI);
1663 if (SI != FuncInfo.StaticAllocaMap.end()) {
1664 LocationOps.emplace_back(SDDbgOperand::fromFrameIdx(SI->second));
1665 continue;
1666 }
1667 }
1668
1669 // Do not use getValue() in here; we don't want to generate code at
1670 // this point if it hasn't been done yet.
1671 SDValue N = NodeMap[V];
1672 if (!N.getNode() && isa<Argument>(V)) // Check unused arguments map.
1673 N = UnusedArgNodeMap[V];
1674
1675 if (N.getNode()) {
1676 // Only emit func arg dbg value for non-variadic dbg.values for now.
1677 if (!IsVariadic &&
1678 EmitFuncArgumentDbgValue(V, Var, Expr, DbgLoc,
1679 FuncArgumentDbgValueKind::Value, N))
1680 return true;
1681 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(N.getNode())) {
1682 // Construct a FrameIndexDbgValue for FrameIndexSDNodes so we can
1683 // describe stack slot locations.
1684 //
1685 // Consider "int x = 0; int *px = &x;". There are two kinds of
1686 // interesting debug values here after optimization:
1687 //
1688 // dbg.value(i32* %px, !"int *px", !DIExpression()), and
1689 // dbg.value(i32* %px, !"int x", !DIExpression(DW_OP_deref))
1690 //
1691 // Both describe the direct values of their associated variables.
1692 Dependencies.push_back(N.getNode());
1693 LocationOps.emplace_back(SDDbgOperand::fromFrameIdx(FISDN->getIndex()));
1694 continue;
1695 }
1696 LocationOps.emplace_back(
1697 SDDbgOperand::fromNode(N.getNode(), N.getResNo()));
1698 continue;
1699 }
1700
1701 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1702 // Special rules apply for the first dbg.values of parameter variables in a
1703 // function. Identify them by the fact they reference Argument Values, that
1704 // they're parameters, and they are parameters of the current function. We
1705 // need to let them dangle until they get an SDNode.
1706 bool IsParamOfFunc =
1707 isa<Argument>(V) && Var->isParameter() && !DbgLoc.getInlinedAt();
1708 if (IsParamOfFunc)
1709 return false;
1710
1711 // The value is not used in this block yet (or it would have an SDNode).
1712 // We still want the value to appear for the user if possible -- if it has
1713 // an associated VReg, we can refer to that instead.
1714 auto VMI = FuncInfo.ValueMap.find(V);
1715 if (VMI != FuncInfo.ValueMap.end()) {
1716 Register Reg = VMI->second;
1717 // If this is a PHI node, it may be split up into several MI PHI nodes
1718 // (in FunctionLoweringInfo::set).
1719 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), Reg,
1720 V->getType(), std::nullopt);
1721 if (RFV.occupiesMultipleRegs()) {
1722 // FIXME: We could potentially support variadic dbg_values here.
1723 if (IsVariadic)
1724 return false;
1725 unsigned Offset = 0;
1726 unsigned BitsToDescribe = 0;
1727 if (auto VarSize = Var->getSizeInBits())
1728 BitsToDescribe = *VarSize;
1729 if (auto Fragment = Expr->getFragmentInfo())
1730 BitsToDescribe = Fragment->SizeInBits;
1731 for (const auto &RegAndSize : RFV.getRegsAndSizes()) {
1732 // Bail out if all bits are described already.
1733 if (Offset >= BitsToDescribe)
1734 break;
1735 // TODO: handle scalable vectors.
1736 unsigned RegisterSize = RegAndSize.second;
1737 unsigned FragmentSize = (Offset + RegisterSize > BitsToDescribe)
1738 ? BitsToDescribe - Offset
1739 : RegisterSize;
1740 auto FragmentExpr = DIExpression::createFragmentExpression(
1741 Expr, Offset, FragmentSize);
1742 if (!FragmentExpr)
1743 continue;
1744 SDDbgValue *SDV = DAG.getVRegDbgValue(
1745 Var, *FragmentExpr, RegAndSize.first, false, DbgLoc, Order);
1746 DAG.AddDbgValue(SDV, false);
1747 Offset += RegisterSize;
1748 }
1749 return true;
1750 }
1751 // We can use simple vreg locations for variadic dbg_values as well.
1752 LocationOps.emplace_back(SDDbgOperand::fromVReg(Reg));
1753 continue;
1754 }
1755 // We failed to create a SDDbgOperand for V.
1756 return false;
1757 }
1758
1759 // We have created a SDDbgOperand for each Value in Values.
1760 assert(!LocationOps.empty());
1761 SDDbgValue *SDV =
1762 DAG.getDbgValueList(Var, Expr, LocationOps, Dependencies,
1763 /*IsIndirect=*/false, DbgLoc, Order, IsVariadic);
1764 DAG.AddDbgValue(SDV, /*isParameter=*/false);
1765 return true;
1766}
1767
1769 // Try to fixup any remaining dangling debug info -- and drop it if we can't.
1770 for (auto &Pair : DanglingDebugInfoMap)
1771 for (auto &DDI : Pair.second)
1772 salvageUnresolvedDbgValue(const_cast<Value *>(Pair.first), DDI);
1774}
1775
1776/// getCopyFromRegs - If there was virtual register allocated for the value V
1777/// emit CopyFromReg of the specified type Ty. Return empty SDValue() otherwise.
1779 auto It = FuncInfo.ValueMap.find(V);
1780 SDValue Result;
1781
1782 if (It != FuncInfo.ValueMap.end()) {
1783 Register InReg = It->second;
1784
1785 RegsForValue RFV(*DAG.getContext(), DAG.getTargetLoweringInfo(),
1786 DAG.getDataLayout(), InReg, Ty,
1787 std::nullopt); // This is not an ABI copy.
1788 SDValue Chain = DAG.getEntryNode();
1789 Result = RFV.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(), Chain, nullptr,
1790 V);
1791 resolveDanglingDebugInfo(V, Result);
1792 }
1793
1794 return Result;
1795}
1796
1797/// getValue - Return an SDValue for the given Value.
1799 // If we already have an SDValue for this value, use it. It's important
1800 // to do this first, so that we don't create a CopyFromReg if we already
1801 // have a regular SDValue.
1802 SDValue &N = NodeMap[V];
1803 if (N.getNode()) return N;
1804
1805 // If there's a virtual register allocated and initialized for this
1806 // value, use it.
1807 if (SDValue copyFromReg = getCopyFromRegs(V, V->getType()))
1808 return copyFromReg;
1809
1810 // Otherwise create a new SDValue and remember it.
1811 SDValue Val = getValueImpl(V);
1812 NodeMap[V] = Val;
1814 return Val;
1815}
1816
1817/// getNonRegisterValue - Return an SDValue for the given Value, but
1818/// don't look in FuncInfo.ValueMap for a virtual register.
1820 // If we already have an SDValue for this value, use it.
1821 SDValue &N = NodeMap[V];
1822 if (N.getNode()) {
1823 if (isIntOrFPConstant(N)) {
1824 // Remove the debug location from the node as the node is about to be used
1825 // in a location which may differ from the original debug location. This
1826 // is relevant to Constant and ConstantFP nodes because they can appear
1827 // as constant expressions inside PHI nodes.
1828 N->setDebugLoc(DebugLoc());
1829 }
1830 return N;
1831 }
1832
1833 // Otherwise create a new SDValue and remember it.
1834 SDValue Val = getValueImpl(V);
1835 NodeMap[V] = Val;
1837 return Val;
1838}
1839
1840/// getValueImpl - Helper function for getValue and getNonRegisterValue.
1841/// Create an SDValue for the given value.
1843 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
1844
1845 if (const Constant *C = dyn_cast<Constant>(V)) {
1846 EVT VT = TLI.getValueType(DAG.getDataLayout(), V->getType(), true);
1847
1848 if (const ConstantInt *CI = dyn_cast<ConstantInt>(C)) {
1849 SDLoc DL = getCurSDLoc();
1850
1851 // DAG.getConstant() may attempt to legalise the vector constant which can
1852 // significantly change the combines applied to the DAG. To reduce the
1853 // divergence when enabling ConstantInt based vectors we try to construct
1854 // the DAG in the same way as shufflevector based splats. TODO: The
1855 // divergence sometimes leads to better optimisations. Ideally we should
1856 // prevent DAG.getConstant() from legalising too early but there are some
1857 // degradations preventing this.
1858 if (VT.isScalableVector())
1859 return DAG.getNode(
1860 ISD::SPLAT_VECTOR, DL, VT,
1861 DAG.getConstant(CI->getValue(), DL, VT.getVectorElementType()));
1862 if (VT.isFixedLengthVector())
1863 return DAG.getSplatBuildVector(
1864 VT, DL,
1865 DAG.getConstant(CI->getValue(), DL, VT.getVectorElementType()));
1866 return DAG.getConstant(*CI, DL, VT);
1867 }
1868
1869 if (const ConstantByte *CB = dyn_cast<ConstantByte>(C))
1870 return DAG.getConstant(CB->getValue(), getCurSDLoc(), VT);
1871
1872 if (const GlobalValue *GV = dyn_cast<GlobalValue>(C))
1873 return DAG.getGlobalAddress(GV, getCurSDLoc(), VT);
1874
1875 if (const ConstantPtrAuth *CPA = dyn_cast<ConstantPtrAuth>(C)) {
1876 return DAG.getNode(ISD::PtrAuthGlobalAddress, getCurSDLoc(), VT,
1877 getValue(CPA->getPointer()), getValue(CPA->getKey()),
1878 getValue(CPA->getAddrDiscriminator()),
1879 getValue(CPA->getDiscriminator()));
1880 }
1881
1883 return DAG.getConstant(0, getCurSDLoc(), VT);
1884
1885 if (match(C, m_VScale()))
1886 return DAG.getVScale(getCurSDLoc(), VT, APInt(VT.getSizeInBits(), 1));
1887
1888 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C))
1889 return DAG.getConstantFP(*CFP, getCurSDLoc(), VT);
1890
1891 if (isa<UndefValue>(C) && !V->getType()->isAggregateType())
1892 return isa<PoisonValue>(C) ? DAG.getPOISON(VT) : DAG.getUNDEF(VT);
1893
1894 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
1895 visit(CE->getOpcode(), *CE);
1896 SDValue N1 = NodeMap[V];
1897 assert(N1.getNode() && "visit didn't populate the NodeMap!");
1898 return N1;
1899 }
1900
1902 SmallVector<SDValue, 4> Constants;
1903 for (const Use &U : C->operands()) {
1904 SDNode *Val = getValue(U).getNode();
1905 // If the operand is an empty aggregate, there are no values.
1906 if (!Val) continue;
1907 // Add each leaf value from the operand to the Constants list
1908 // to form a flattened list of all the values.
1909 for (unsigned i = 0, e = Val->getNumValues(); i != e; ++i)
1910 Constants.push_back(SDValue(Val, i));
1911 }
1912
1913 return DAG.getMergeValues(Constants, getCurSDLoc());
1914 }
1915
1916 if (const ConstantDataSequential *CDS =
1919 for (uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i) {
1920 SDNode *Val = getValue(CDS->getElementAsConstant(i)).getNode();
1921 // Add each leaf value from the operand to the Constants list
1922 // to form a flattened list of all the values.
1923 for (unsigned i = 0, e = Val->getNumValues(); i != e; ++i)
1924 Ops.push_back(SDValue(Val, i));
1925 }
1926
1927 if (isa<ArrayType>(CDS->getType()))
1928 return DAG.getMergeValues(Ops, getCurSDLoc());
1929 return DAG.getBuildVector(VT, getCurSDLoc(), Ops);
1930 }
1931
1932 if (C->getType()->isStructTy() || C->getType()->isArrayTy()) {
1934 "Unknown struct or array constant!");
1935
1936 SmallVector<EVT, 4> ValueVTs;
1937 ComputeValueVTs(TLI, DAG.getDataLayout(), C->getType(), ValueVTs);
1938 unsigned NumElts = ValueVTs.size();
1939 if (NumElts == 0)
1940 return SDValue(); // empty struct
1941 SmallVector<SDValue, 4> Constants(NumElts);
1942 for (unsigned i = 0; i != NumElts; ++i) {
1943 EVT EltVT = ValueVTs[i];
1944 if (isa<UndefValue>(C))
1945 Constants[i] = DAG.getUNDEF(EltVT);
1946 else if (EltVT.isFloatingPoint())
1947 Constants[i] = DAG.getConstantFP(0, getCurSDLoc(), EltVT);
1948 else
1949 Constants[i] = DAG.getConstant(0, getCurSDLoc(), EltVT);
1950 }
1951
1952 return DAG.getMergeValues(Constants, getCurSDLoc());
1953 }
1954
1955 if (const BlockAddress *BA = dyn_cast<BlockAddress>(C))
1956 return DAG.getBlockAddress(BA, VT);
1957
1958 if (const auto *Equiv = dyn_cast<DSOLocalEquivalent>(C))
1959 return getValue(Equiv->getGlobalValue());
1960
1961 if (const auto *NC = dyn_cast<NoCFIValue>(C))
1962 return getValue(NC->getGlobalValue());
1963
1964 if (VT == MVT::aarch64svcount) {
1965 assert(C->isNullValue() && "Can only zero this target type!");
1966 return DAG.getNode(ISD::BITCAST, getCurSDLoc(), VT,
1967 DAG.getConstant(0, getCurSDLoc(), MVT::nxv16i1));
1968 }
1969
1970 if (VT.isRISCVVectorTuple()) {
1971 assert(C->isNullValue() && "Can only zero this target type!");
1972 return DAG.getNode(
1974 DAG.getNode(
1976 EVT::getVectorVT(*DAG.getContext(), MVT::i8,
1977 VT.getSizeInBits().getKnownMinValue() / 8, true),
1978 DAG.getConstant(0, getCurSDLoc(), MVT::getIntegerVT(8))));
1979 }
1980
1981 if (VT == MVT::externref || VT == MVT::funcref) {
1982 assert(C->isNullValue() && "Can only zero this target type!");
1983 // The zero value of a WebAssembly reference type is the null reference,
1984 // materialized with ref.null.
1985 Intrinsic::ID IID = VT == MVT::externref ? Intrinsic::wasm_ref_null_extern
1986 : Intrinsic::wasm_ref_null_func;
1987 return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, getCurSDLoc(), VT,
1988 DAG.getTargetConstant(IID, getCurSDLoc(), MVT::i32));
1989 }
1990
1991 VectorType *VecTy = cast<VectorType>(V->getType());
1992
1993 // Now that we know the number and type of the elements, get that number of
1994 // elements into the Ops array based on what kind of constant it is.
1995 if (const ConstantVector *CV = dyn_cast<ConstantVector>(C)) {
1997 unsigned NumElements = cast<FixedVectorType>(VecTy)->getNumElements();
1998 for (unsigned i = 0; i != NumElements; ++i)
1999 Ops.push_back(getValue(CV->getOperand(i)));
2000
2001 return DAG.getBuildVector(VT, getCurSDLoc(), Ops);
2002 }
2003
2005 EVT EltVT =
2006 TLI.getValueType(DAG.getDataLayout(), VecTy->getElementType());
2007
2008 SDValue Op;
2009 if (EltVT.isFloatingPoint())
2010 Op = DAG.getConstantFP(0, getCurSDLoc(), EltVT);
2011 else
2012 Op = DAG.getConstant(0, getCurSDLoc(), EltVT);
2013
2014 return DAG.getSplat(VT, getCurSDLoc(), Op);
2015 }
2016
2017 llvm_unreachable("Unknown vector constant");
2018 }
2019
2020 // If this is a static alloca, generate it as the frameindex instead of
2021 // computation.
2022 if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
2023 auto SI = FuncInfo.StaticAllocaMap.find(AI);
2024 if (SI != FuncInfo.StaticAllocaMap.end())
2025 return DAG.getFrameIndex(
2026 SI->second, TLI.getValueType(DAG.getDataLayout(), AI->getType()));
2027 }
2028
2029 // If this is an instruction which fast-isel has deferred, select it now.
2030 if (const Instruction *Inst = dyn_cast<Instruction>(V)) {
2031 Register InReg = FuncInfo.InitializeRegForValue(Inst);
2032 RegsForValue RFV(*DAG.getContext(), TLI, DAG.getDataLayout(), InReg,
2033 Inst->getType(), std::nullopt);
2034 SDValue Chain = DAG.getEntryNode();
2035 return RFV.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(), Chain, nullptr, V);
2036 }
2037
2038 if (const MetadataAsValue *MD = dyn_cast<MetadataAsValue>(V))
2039 return DAG.getMDNode(cast<MDNode>(MD->getMetadata()));
2040
2041 if (const auto *BB = dyn_cast<BasicBlock>(V))
2042 return DAG.getBasicBlock(FuncInfo.getMBB(BB));
2043
2044 llvm_unreachable("Can't get register for value!");
2045}
2046
2047void SelectionDAGBuilder::visitCatchPad(const CatchPadInst &I) {
2049 bool IsMSVCCXX = Pers == EHPersonality::MSVC_CXX;
2050 bool IsCoreCLR = Pers == EHPersonality::CoreCLR;
2051 bool IsSEH = isAsynchronousEHPersonality(Pers);
2052 MachineBasicBlock *CatchPadMBB = FuncInfo.MBB;
2053 if (IsSEH) {
2054 // For SEH, EHCont Guard needs to know that this catchpad is a target.
2055 CatchPadMBB->setIsEHContTarget(true);
2057 } else
2058 CatchPadMBB->setIsEHScopeEntry();
2059 // In MSVC C++ and CoreCLR, catchblocks are funclets and need prologues.
2060 if (IsMSVCCXX || IsCoreCLR)
2061 CatchPadMBB->setIsEHFuncletEntry();
2062}
2063
2064void SelectionDAGBuilder::visitCatchRet(const CatchReturnInst &I) {
2065 // Update machine-CFG edge.
2066 MachineBasicBlock *TargetMBB = FuncInfo.getMBB(I.getSuccessor());
2067 FuncInfo.MBB->addSuccessor(TargetMBB);
2068
2069 auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn());
2070 bool IsSEH = isAsynchronousEHPersonality(Pers);
2071 if (IsSEH) {
2072 // If this is not a fall-through branch or optimizations are switched off,
2073 // emit the branch.
2074 if (TargetMBB != NextBlock(FuncInfo.MBB) ||
2075 TM.getOptLevel() == CodeGenOptLevel::None)
2076 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
2077 getControlRoot(), DAG.getBasicBlock(TargetMBB)));
2078 return;
2079 }
2080
2081 // For non-SEH, EHCont Guard needs to know that this catchret is a target.
2082 TargetMBB->setIsEHContTarget(true);
2083 DAG.getMachineFunction().setHasEHContTarget(true);
2084
2085 // Figure out the funclet membership for the catchret's successor.
2086 // This will be used by the FuncletLayout pass to determine how to order the
2087 // BB's.
2088 // A 'catchret' returns to the outer scope's color.
2089 Value *ParentPad = I.getCatchSwitchParentPad();
2090 const BasicBlock *SuccessorColor;
2091 if (isa<ConstantTokenNone>(ParentPad))
2092 SuccessorColor = &FuncInfo.Fn->getEntryBlock();
2093 else
2094 SuccessorColor = cast<Instruction>(ParentPad)->getParent();
2095 assert(SuccessorColor && "No parent funclet for catchret!");
2096 MachineBasicBlock *SuccessorColorMBB = FuncInfo.getMBB(SuccessorColor);
2097 assert(SuccessorColorMBB && "No MBB for SuccessorColor!");
2098
2099 // Create the terminator node.
2100 SDValue Ret = DAG.getNode(ISD::CATCHRET, getCurSDLoc(), MVT::Other,
2101 getControlRoot(), DAG.getBasicBlock(TargetMBB),
2102 DAG.getBasicBlock(SuccessorColorMBB));
2103 DAG.setRoot(Ret);
2104}
2105
2106void SelectionDAGBuilder::visitCleanupPad(const CleanupPadInst &CPI) {
2107 // Don't emit any special code for the cleanuppad instruction. It just marks
2108 // the start of an EH scope/funclet.
2109 FuncInfo.MBB->setIsEHScopeEntry();
2110 auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn());
2111 if (Pers != EHPersonality::Wasm_CXX) {
2112 FuncInfo.MBB->setIsEHFuncletEntry();
2113 FuncInfo.MBB->setIsCleanupFuncletEntry();
2114 }
2115}
2116
2117/// When an invoke or a cleanupret unwinds to the next EH pad, there are
2118/// many places it could ultimately go. In the IR, we have a single unwind
2119/// destination, but in the machine CFG, we enumerate all the possible blocks.
2120/// This function skips over imaginary basic blocks that hold catchswitch
2121/// instructions, and finds all the "real" machine
2122/// basic block destinations. As those destinations may not be successors of
2123/// EHPadBB, here we also calculate the edge probability to those destinations.
2124/// The passed-in Prob is the edge probability to EHPadBB.
2126 FunctionLoweringInfo &FuncInfo, const BasicBlock *EHPadBB,
2127 BranchProbability Prob,
2128 SmallVectorImpl<std::pair<MachineBasicBlock *, BranchProbability>>
2129 &UnwindDests) {
2130 EHPersonality Personality =
2132 bool IsMSVCCXX = Personality == EHPersonality::MSVC_CXX;
2133 bool IsCoreCLR = Personality == EHPersonality::CoreCLR;
2134 bool IsWasmCXX = Personality == EHPersonality::Wasm_CXX;
2135 bool IsSEH = isAsynchronousEHPersonality(Personality);
2136
2137 while (EHPadBB) {
2139 BasicBlock *NewEHPadBB = nullptr;
2140 if (isa<LandingPadInst>(Pad)) {
2141 // Stop on landingpads. They are not funclets.
2142 UnwindDests.emplace_back(FuncInfo.getMBB(EHPadBB), Prob);
2143 break;
2144 } else if (isa<CleanupPadInst>(Pad)) {
2145 // Stop on cleanup pads. Cleanups are always funclet entries for all known
2146 // personalities except Wasm. And in Wasm this becomes a catch_all(_ref),
2147 // which always catches an exception.
2148 UnwindDests.emplace_back(FuncInfo.getMBB(EHPadBB), Prob);
2149 UnwindDests.back().first->setIsEHScopeEntry();
2150 // In Wasm, EH scopes are not funclets
2151 if (!IsWasmCXX)
2152 UnwindDests.back().first->setIsEHFuncletEntry();
2153 break;
2154 } else if (const auto *CatchSwitch = dyn_cast<CatchSwitchInst>(Pad)) {
2155 // Add the catchpad handlers to the possible destinations.
2156 for (const BasicBlock *CatchPadBB : CatchSwitch->handlers()) {
2157 UnwindDests.emplace_back(FuncInfo.getMBB(CatchPadBB), Prob);
2158 // For MSVC++ and the CLR, catchblocks are funclets and need prologues.
2159 if (IsMSVCCXX || IsCoreCLR)
2160 UnwindDests.back().first->setIsEHFuncletEntry();
2161 if (!IsSEH)
2162 UnwindDests.back().first->setIsEHScopeEntry();
2163 }
2164 NewEHPadBB = CatchSwitch->getUnwindDest();
2165 } else {
2166 continue;
2167 }
2168
2169 BranchProbabilityInfo *BPI = FuncInfo.BPI;
2170 if (BPI && NewEHPadBB)
2171 Prob *= BPI->getEdgeProbability(EHPadBB, NewEHPadBB);
2172 EHPadBB = NewEHPadBB;
2173 }
2174}
2175
2176void SelectionDAGBuilder::visitCleanupRet(const CleanupReturnInst &I) {
2177 // Update successor info.
2179 auto UnwindDest = I.getUnwindDest();
2180 BranchProbabilityInfo *BPI = FuncInfo.BPI;
2181 BranchProbability UnwindDestProb =
2182 (BPI && UnwindDest)
2183 ? BPI->getEdgeProbability(FuncInfo.MBB->getBasicBlock(), UnwindDest)
2185 findUnwindDestinations(FuncInfo, UnwindDest, UnwindDestProb, UnwindDests);
2186 for (auto &UnwindDest : UnwindDests) {
2187 UnwindDest.first->setIsEHPad();
2188 addSuccessorWithProb(FuncInfo.MBB, UnwindDest.first, UnwindDest.second);
2189 }
2190 FuncInfo.MBB->normalizeSuccProbs();
2191
2192 // Create the terminator node.
2193 MachineBasicBlock *CleanupPadMBB =
2194 FuncInfo.getMBB(I.getCleanupPad()->getParent());
2195 SDValue Ret = DAG.getNode(ISD::CLEANUPRET, getCurSDLoc(), MVT::Other,
2196 getControlRoot(), DAG.getBasicBlock(CleanupPadMBB));
2197 DAG.setRoot(Ret);
2198}
2199
2200void SelectionDAGBuilder::visitCatchSwitch(const CatchSwitchInst &CSI) {
2201 report_fatal_error("visitCatchSwitch not yet implemented!");
2202}
2203
2204void SelectionDAGBuilder::visitRet(const ReturnInst &I) {
2205 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
2206 auto &DL = DAG.getDataLayout();
2207 SDValue Chain = getControlRoot();
2210
2211 // Calls to @llvm.experimental.deoptimize don't generate a return value, so
2212 // lower
2213 //
2214 // %val = call <ty> @llvm.experimental.deoptimize()
2215 // ret <ty> %val
2216 //
2217 // differently.
2218 if (I.getParent()->getTerminatingDeoptimizeCall()) {
2220 return;
2221 }
2222
2223 if (!FuncInfo.CanLowerReturn) {
2224 Register DemoteReg = FuncInfo.DemoteRegister;
2225
2226 // Emit a store of the return value through the virtual register.
2227 // Leave Outs empty so that LowerReturn won't try to load return
2228 // registers the usual way.
2229 MVT PtrValueVT = TLI.getPointerTy(DL, DL.getAllocaAddrSpace());
2230 SDValue RetPtr =
2231 DAG.getCopyFromReg(Chain, getCurSDLoc(), DemoteReg, PtrValueVT);
2232 Type *RetTy = I.getOperand(0)->getType();
2233 Align BaseAlign = DL.getPrefTypeAlign(RetTy);
2234 RetPtr =
2235 TLI.annotateStackObjectPointer(RetPtr, DAG, getCurSDLoc(), BaseAlign);
2236 SDValue RetOp = getValue(I.getOperand(0));
2237
2238 SmallVector<EVT, 4> ValueVTs, MemVTs;
2239 SmallVector<uint64_t, 4> Offsets;
2240 ComputeValueVTs(TLI, DL, RetTy, ValueVTs, &MemVTs, &Offsets, 0);
2241 unsigned NumValues = ValueVTs.size();
2242
2243 SmallVector<SDValue, 4> Chains(NumValues);
2244 for (unsigned i = 0; i != NumValues; ++i) {
2245 // An aggregate return value cannot wrap around the address space, so
2246 // offsets to its parts don't wrap either.
2247 SDValue Ptr = DAG.getObjectPtrOffset(getCurSDLoc(), RetPtr,
2248 TypeSize::getFixed(Offsets[i]));
2249
2250 SDValue Val = RetOp.getValue(RetOp.getResNo() + i);
2251 if (MemVTs[i] != ValueVTs[i])
2252 Val = DAG.getPtrExtOrTrunc(Val, getCurSDLoc(), MemVTs[i]);
2253 Chains[i] = DAG.getStore(
2254 Chain, getCurSDLoc(), Val,
2255 // FIXME: better loc info would be nice.
2256 Ptr, MachinePointerInfo::getUnknownStack(DAG.getMachineFunction()),
2257 commonAlignment(BaseAlign, Offsets[i]));
2258 }
2259
2260 Chain = DAG.getNode(ISD::TokenFactor, getCurSDLoc(),
2261 MVT::Other, Chains);
2262 } else if (I.getNumOperands() != 0) {
2264 ComputeValueTypes(DL, I.getOperand(0)->getType(), Types);
2265 unsigned NumValues = Types.size();
2266 if (NumValues) {
2267 SDValue RetOp = getValue(I.getOperand(0));
2268
2269 const Function *F = I.getParent()->getParent();
2270
2271 bool NeedsRegBlock = TLI.functionArgumentNeedsConsecutiveRegisters(
2272 I.getOperand(0)->getType(), F->getCallingConv(),
2273 /*IsVarArg*/ false, DL);
2274
2275 ISD::NodeType ExtendKind = ISD::ANY_EXTEND;
2276 if (F->getAttributes().hasRetAttr(Attribute::SExt))
2277 ExtendKind = ISD::SIGN_EXTEND;
2278 else if (F->getAttributes().hasRetAttr(Attribute::ZExt))
2279 ExtendKind = ISD::ZERO_EXTEND;
2280
2281 LLVMContext &Context = F->getContext();
2282 bool RetInReg = F->getAttributes().hasRetAttr(Attribute::InReg);
2283
2284 for (unsigned j = 0; j != NumValues; ++j) {
2285 EVT VT = TLI.getValueType(DL, Types[j]);
2286
2287 if (ExtendKind != ISD::ANY_EXTEND && VT.isInteger())
2288 VT = TLI.getTypeForExtReturn(Context, VT, ExtendKind);
2289
2290 CallingConv::ID CC = F->getCallingConv();
2291
2292 unsigned NumParts = TLI.getNumRegistersForCallingConv(Context, CC, VT);
2293 MVT PartVT = TLI.getRegisterTypeForCallingConv(Context, CC, VT);
2294 SmallVector<SDValue, 4> Parts(NumParts);
2296 SDValue(RetOp.getNode(), RetOp.getResNo() + j),
2297 &Parts[0], NumParts, PartVT, &I, CC, ExtendKind);
2298
2299 // 'inreg' on function refers to return value
2300 ISD::ArgFlagsTy Flags = ISD::ArgFlagsTy();
2301 if (RetInReg)
2302 Flags.setInReg();
2303
2304 if (I.getOperand(0)->getType()->isPointerTy()) {
2305 Flags.setPointer();
2306 Flags.setPointerAddrSpace(
2307 cast<PointerType>(I.getOperand(0)->getType())->getAddressSpace());
2308 }
2309
2310 if (NeedsRegBlock) {
2311 Flags.setInConsecutiveRegs();
2312 if (j == NumValues - 1)
2313 Flags.setInConsecutiveRegsLast();
2314 }
2315
2316 // Propagate extension type if any
2317 if (ExtendKind == ISD::SIGN_EXTEND)
2318 Flags.setSExt();
2319 else if (ExtendKind == ISD::ZERO_EXTEND)
2320 Flags.setZExt();
2321 else if (F->getAttributes().hasRetAttr(Attribute::NoExt))
2322 Flags.setNoExt();
2323
2324 for (unsigned i = 0; i < NumParts; ++i) {
2325 Outs.push_back(ISD::OutputArg(Flags,
2326 Parts[i].getValueType().getSimpleVT(),
2327 VT, Types[j], 0, 0));
2328 OutVals.push_back(Parts[i]);
2329 }
2330 }
2331 }
2332 }
2333
2334 // Push in swifterror virtual register as the last element of Outs. This makes
2335 // sure swifterror virtual register will be returned in the swifterror
2336 // physical register.
2337 const Function *F = I.getParent()->getParent();
2338 if (TLI.supportSwiftError() &&
2339 F->getAttributes().hasAttrSomewhere(Attribute::SwiftError)) {
2340 assert(SwiftError.getFunctionArg() && "Need a swift error argument");
2341 ISD::ArgFlagsTy Flags = ISD::ArgFlagsTy();
2342 Flags.setSwiftError();
2343 Outs.push_back(ISD::OutputArg(Flags, /*vt=*/TLI.getPointerTy(DL),
2344 /*argvt=*/EVT(TLI.getPointerTy(DL)),
2345 PointerType::getUnqual(*DAG.getContext()),
2346 /*origidx=*/1, /*partOffs=*/0));
2347 // Create SDNode for the swifterror virtual register.
2348 OutVals.push_back(
2349 DAG.getRegister(SwiftError.getOrCreateVRegUseAt(
2350 &I, FuncInfo.MBB, SwiftError.getFunctionArg()),
2351 EVT(TLI.getPointerTy(DL))));
2352 }
2353
2354 bool isVarArg = DAG.getMachineFunction().getFunction().isVarArg();
2355 CallingConv::ID CallConv =
2356 DAG.getMachineFunction().getFunction().getCallingConv();
2357 Chain = DAG.getTargetLoweringInfo().LowerReturn(
2358 Chain, CallConv, isVarArg, Outs, OutVals, getCurSDLoc(), DAG);
2359
2360 // Verify that the target's LowerReturn behaved as expected.
2361 assert(Chain.getNode() && Chain.getValueType() == MVT::Other &&
2362 "LowerReturn didn't return a valid chain!");
2363
2364 // Update the DAG with the new chain value resulting from return lowering.
2365 DAG.setRoot(Chain);
2366}
2367
2368/// CopyToExportRegsIfNeeded - If the given value has virtual registers
2369/// created for it, emit nodes to copy the value into the virtual
2370/// registers.
2372 // Skip empty types
2373 if (V->getType()->isEmptyTy())
2374 return;
2375
2376 auto VMI = FuncInfo.ValueMap.find(V);
2377 if (VMI != FuncInfo.ValueMap.end()) {
2378 assert((!V->use_empty() || isa<CallBrInst>(V)) &&
2379 "Unused value assigned virtual registers!");
2380 CopyValueToVirtualRegister(V, VMI->second);
2381 }
2382}
2383
2384/// ExportFromCurrentBlock - If this condition isn't known to be exported from
2385/// the current basic block, add it to ValueMap now so that we'll get a
2386/// CopyTo/FromReg.
2388 // No need to export constants.
2389 if (!isa<Instruction>(V) && !isa<Argument>(V)) return;
2390
2391 // Already exported?
2392 if (FuncInfo.isExportedInst(V)) return;
2393
2394 Register Reg = FuncInfo.InitializeRegForValue(V);
2396}
2397
2399 const BasicBlock *FromBB) {
2400 // The operands of the setcc have to be in this block. We don't know
2401 // how to export them from some other block.
2402 if (const Instruction *VI = dyn_cast<Instruction>(V)) {
2403 // Can export from current BB.
2404 if (VI->getParent() == FromBB)
2405 return true;
2406
2407 // Is already exported, noop.
2408 return FuncInfo.isExportedInst(V);
2409 }
2410
2411 // If this is an argument, we can export it if the BB is the entry block or
2412 // if it is already exported.
2413 if (isa<Argument>(V)) {
2414 if (FromBB->isEntryBlock())
2415 return true;
2416
2417 // Otherwise, can only export this if it is already exported.
2418 return FuncInfo.isExportedInst(V);
2419 }
2420
2421 // Otherwise, constants can always be exported.
2422 return true;
2423}
2424
2425/// Return branch probability calculated by BranchProbabilityInfo for IR blocks.
2427SelectionDAGBuilder::getEdgeProbability(const MachineBasicBlock *Src,
2428 const MachineBasicBlock *Dst) const {
2430 const BasicBlock *SrcBB = Src->getBasicBlock();
2431 const BasicBlock *DstBB = Dst->getBasicBlock();
2432 if (!BPI) {
2433 // If BPI is not available, set the default probability as 1 / N, where N is
2434 // the number of successors.
2435 auto SuccSize = std::max<uint32_t>(succ_size(SrcBB), 1);
2436 return BranchProbability(1, SuccSize);
2437 }
2438 return BPI->getEdgeProbability(SrcBB, DstBB);
2439}
2440
2441void SelectionDAGBuilder::addSuccessorWithProb(MachineBasicBlock *Src,
2442 MachineBasicBlock *Dst,
2443 BranchProbability Prob) {
2444 if (!FuncInfo.BPI)
2445 Src->addSuccessorWithoutProb(Dst);
2446 else {
2447 if (Prob.isUnknown())
2448 Prob = getEdgeProbability(Src, Dst);
2449 Src->addSuccessor(Dst, Prob);
2450 }
2451}
2452
2453static bool InBlock(const Value *V, const BasicBlock *BB) {
2454 if (const Instruction *I = dyn_cast<Instruction>(V))
2455 return I->getParent() == BB;
2456 return true;
2457}
2458
2459/// EmitBranchForMergedCondition - Helper method for FindMergedConditions.
2460/// This function emits a branch and is used at the leaves of an OR or an
2461/// AND operator tree.
2462void
2465 MachineBasicBlock *FBB,
2466 MachineBasicBlock *CurBB,
2467 MachineBasicBlock *SwitchBB,
2468 BranchProbability TProb,
2469 BranchProbability FProb,
2470 bool InvertCond) {
2471 const BasicBlock *BB = CurBB->getBasicBlock();
2472
2473 // If the leaf of the tree is a comparison, merge the condition into
2474 // the caseblock.
2475 if (const CmpInst *BOp = dyn_cast<CmpInst>(Cond)) {
2476 // The operands of the cmp have to be in this block. We don't know
2477 // how to export them from some other block. If this is the first block
2478 // of the sequence, no exporting is needed.
2479 if (CurBB == SwitchBB ||
2480 (isExportableFromCurrentBlock(BOp->getOperand(0), BB) &&
2481 isExportableFromCurrentBlock(BOp->getOperand(1), BB))) {
2482 ISD::CondCode Condition;
2483 if (const ICmpInst *IC = dyn_cast<ICmpInst>(Cond)) {
2484 ICmpInst::Predicate Pred =
2485 InvertCond ? IC->getInversePredicate() : IC->getPredicate();
2486 Condition = getICmpCondCode(Pred);
2487 } else {
2488 const FCmpInst *FC = cast<FCmpInst>(Cond);
2489 FCmpInst::Predicate Pred =
2490 InvertCond ? FC->getInversePredicate() : FC->getPredicate();
2491 Condition = getFCmpCondCode(Pred);
2492 if (FC->hasNoNaNs() ||
2493 (isKnownNeverNaN(FC->getOperand(0),
2494 SimplifyQuery(DAG.getDataLayout(), FC)) &&
2495 isKnownNeverNaN(FC->getOperand(1),
2496 SimplifyQuery(DAG.getDataLayout(), FC))))
2497 Condition = getFCmpCodeWithoutNaN(Condition);
2498 }
2499
2500 CaseBlock CB(Condition, BOp->getOperand(0), BOp->getOperand(1), nullptr,
2501 TBB, FBB, CurBB, getCurSDLoc(), TProb, FProb);
2502 SL->SwitchCases.push_back(CB);
2503 return;
2504 }
2505 }
2506
2507 // Create a CaseBlock record representing this branch.
2508 ISD::CondCode Opc = InvertCond ? ISD::SETNE : ISD::SETEQ;
2509 CaseBlock CB(Opc, Cond, ConstantInt::getTrue(*DAG.getContext()),
2510 nullptr, TBB, FBB, CurBB, getCurSDLoc(), TProb, FProb);
2511 SL->SwitchCases.push_back(CB);
2512}
2513
2514// Collect dependencies on V recursively. This is used for the cost analysis in
2515// `shouldKeepJumpConditionsTogether`.
2519 unsigned Depth = 0) {
2520 // Return false if we have an incomplete count.
2522 return false;
2523
2524 auto *I = dyn_cast<Instruction>(V);
2525 if (I == nullptr)
2526 return true;
2527
2528 if (Necessary != nullptr) {
2529 // This instruction is necessary for the other side of the condition so
2530 // don't count it.
2531 if (Necessary->contains(I))
2532 return true;
2533 }
2534
2535 // Already added this dep.
2536 if (!Deps->try_emplace(I, false).second)
2537 return true;
2538
2539 for (unsigned OpIdx = 0, E = I->getNumOperands(); OpIdx < E; ++OpIdx)
2540 if (!collectInstructionDeps(Deps, I->getOperand(OpIdx), Necessary,
2541 Depth + 1))
2542 return false;
2543 return true;
2544}
2545
2548 Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs,
2550 if (Params.BaseCost < 0)
2551 return false;
2552
2553 // Baseline cost.
2554 InstructionCost CostThresh = Params.BaseCost;
2555
2556 BranchProbabilityInfo *BPI = nullptr;
2557 if (Params.LikelyBias || Params.UnlikelyBias)
2558 BPI = FuncInfo.BPI;
2559 if (BPI != nullptr) {
2560 // See if we are either likely to get an early out or compute both lhs/rhs
2561 // of the condition.
2562 BasicBlock *IfFalse = I.getSuccessor(0);
2563 BasicBlock *IfTrue = I.getSuccessor(1);
2564
2565 std::optional<bool> Likely;
2566 if (BPI->isEdgeHot(I.getParent(), IfTrue))
2567 Likely = true;
2568 else if (BPI->isEdgeHot(I.getParent(), IfFalse))
2569 Likely = false;
2570
2571 if (Likely) {
2572 if (Opc == (*Likely ? Instruction::And : Instruction::Or))
2573 // Its likely we will have to compute both lhs and rhs of condition
2574 CostThresh += Params.LikelyBias;
2575 else {
2576 if (Params.UnlikelyBias < 0)
2577 return false;
2578 // Its likely we will get an early out.
2579 CostThresh -= Params.UnlikelyBias;
2580 }
2581 }
2582 }
2583
2584 if (CostThresh <= 0)
2585 return false;
2586
2587 // Collect "all" instructions that lhs condition is dependent on.
2588 // Use map for stable iteration (to avoid non-determanism of iteration of
2589 // SmallPtrSet). The `bool` value is just a dummy.
2591 collectInstructionDeps(&LhsDeps, Lhs);
2592 // Collect "all" instructions that rhs condition is dependent on AND are
2593 // dependencies of lhs. This gives us an estimate on which instructions we
2594 // stand to save by splitting the condition.
2595 if (!collectInstructionDeps(&RhsDeps, Rhs, &LhsDeps))
2596 return false;
2597 // Add the compare instruction itself unless its a dependency on the LHS.
2598 if (const auto *RhsI = dyn_cast<Instruction>(Rhs))
2599 if (!LhsDeps.contains(RhsI))
2600 RhsDeps.try_emplace(RhsI, false);
2601
2602 InstructionCost CostOfIncluding = 0;
2603 // See if this instruction will need to computed independently of whether RHS
2604 // is.
2605 Value *BrCond = I.getCondition();
2606 auto ShouldCountInsn = [&RhsDeps, &BrCond](const Instruction *Ins) {
2607 for (const auto *U : Ins->users()) {
2608 // If user is independent of RHS calculation we don't need to count it.
2609 if (auto *UIns = dyn_cast<Instruction>(U))
2610 if (UIns != BrCond && !RhsDeps.contains(UIns))
2611 return false;
2612 }
2613 return true;
2614 };
2615
2616 // Prune instructions from RHS Deps that are dependencies of unrelated
2617 // instructions. The value (SelectionDAG::MaxRecursionDepth) is fairly
2618 // arbitrary and just meant to cap the how much time we spend in the pruning
2619 // loop. Its highly unlikely to come into affect.
2620 const unsigned MaxPruneIters = SelectionDAG::MaxRecursionDepth;
2621 // Stop after a certain point. No incorrectness from including too many
2622 // instructions.
2623 for (unsigned PruneIters = 0; PruneIters < MaxPruneIters; ++PruneIters) {
2624 const Instruction *ToDrop = nullptr;
2625 for (const auto &InsPair : RhsDeps) {
2626 if (!ShouldCountInsn(InsPair.first)) {
2627 ToDrop = InsPair.first;
2628 break;
2629 }
2630 }
2631 if (ToDrop == nullptr)
2632 break;
2633 RhsDeps.erase(ToDrop);
2634 }
2635
2636 for (const auto &InsPair : RhsDeps) {
2637 // Finally accumulate latency that we can only attribute to computing the
2638 // RHS condition. Use latency because we are essentially trying to calculate
2639 // the cost of the dependency chain.
2640 // Possible TODO: We could try to estimate ILP and make this more precise.
2641 CostOfIncluding += TTI->getInstructionCost(
2642 InsPair.first, TargetTransformInfo::TCK_Latency);
2643
2644 if (CostOfIncluding > CostThresh)
2645 return false;
2646 }
2647 return true;
2648}
2649
2652 MachineBasicBlock *FBB,
2653 MachineBasicBlock *CurBB,
2654 MachineBasicBlock *SwitchBB,
2656 BranchProbability TProb,
2657 BranchProbability FProb,
2658 bool InvertCond) {
2659 // Skip over not part of the tree and remember to invert op and operands at
2660 // next level.
2661 Value *NotCond;
2662 if (match(Cond, m_OneUse(m_Not(m_Value(NotCond)))) &&
2663 InBlock(NotCond, CurBB->getBasicBlock())) {
2664 FindMergedConditions(NotCond, TBB, FBB, CurBB, SwitchBB, Opc, TProb, FProb,
2665 !InvertCond);
2666 return;
2667 }
2668
2670 const Value *BOpOp0, *BOpOp1;
2671 // Compute the effective opcode for Cond, taking into account whether it needs
2672 // to be inverted, e.g.
2673 // and (not (or A, B)), C
2674 // gets lowered as
2675 // and (and (not A, not B), C)
2677 if (BOp) {
2678 BOpc = match(BOp, m_LogicalAnd(m_Value(BOpOp0), m_Value(BOpOp1)))
2679 ? Instruction::And
2680 : (match(BOp, m_LogicalOr(m_Value(BOpOp0), m_Value(BOpOp1)))
2681 ? Instruction::Or
2683 if (InvertCond) {
2684 if (BOpc == Instruction::And)
2685 BOpc = Instruction::Or;
2686 else if (BOpc == Instruction::Or)
2687 BOpc = Instruction::And;
2688 }
2689 }
2690
2691 // If this node is not part of the or/and tree, emit it as a branch.
2692 // Note that all nodes in the tree should have same opcode.
2693 bool BOpIsInOrAndTree = BOpc && BOpc == Opc && BOp->hasOneUse();
2694 if (!BOpIsInOrAndTree || BOp->getParent() != CurBB->getBasicBlock() ||
2695 !InBlock(BOpOp0, CurBB->getBasicBlock()) ||
2696 !InBlock(BOpOp1, CurBB->getBasicBlock())) {
2697 EmitBranchForMergedCondition(Cond, TBB, FBB, CurBB, SwitchBB,
2698 TProb, FProb, InvertCond);
2699 return;
2700 }
2701
2702 // Create TmpBB after CurBB.
2703 MachineFunction::iterator BBI(CurBB);
2704 MachineFunction &MF = DAG.getMachineFunction();
2706 CurBB->getParent()->insert(++BBI, TmpBB);
2707
2708 if (Opc == Instruction::Or) {
2709 // Codegen X | Y as:
2710 // BB1:
2711 // jmp_if_X TBB
2712 // jmp TmpBB
2713 // TmpBB:
2714 // jmp_if_Y TBB
2715 // jmp FBB
2716 //
2717
2718 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
2719 // The requirement is that
2720 // TrueProb for BB1 + (FalseProb for BB1 * TrueProb for TmpBB)
2721 // = TrueProb for original BB.
2722 // Assuming the original probabilities are A and B, one choice is to set
2723 // BB1's probabilities to A/2 and A/2+B, and set TmpBB's probabilities to
2724 // A/(1+B) and 2B/(1+B). This choice assumes that
2725 // TrueProb for BB1 == FalseProb for BB1 * TrueProb for TmpBB.
2726 // Another choice is to assume TrueProb for BB1 equals to TrueProb for
2727 // TmpBB, but the math is more complicated.
2728
2729 auto NewTrueProb = TProb / 2;
2730 auto NewFalseProb = TProb / 2 + FProb;
2731 // Emit the LHS condition.
2732 FindMergedConditions(BOpOp0, TBB, TmpBB, CurBB, SwitchBB, Opc, NewTrueProb,
2733 NewFalseProb, InvertCond);
2734
2735 // Normalize A/2 and B to get A/(1+B) and 2B/(1+B).
2736 SmallVector<BranchProbability, 2> Probs{TProb / 2, FProb};
2738 // Emit the RHS condition into TmpBB.
2739 FindMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
2740 Probs[1], InvertCond);
2741 } else {
2742 assert(Opc == Instruction::And && "Unknown merge op!");
2743 // Codegen X & Y as:
2744 // BB1:
2745 // jmp_if_X TmpBB
2746 // jmp FBB
2747 // TmpBB:
2748 // jmp_if_Y TBB
2749 // jmp FBB
2750 //
2751 // This requires creation of TmpBB after CurBB.
2752
2753 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
2754 // The requirement is that
2755 // FalseProb for BB1 + (TrueProb for BB1 * FalseProb for TmpBB)
2756 // = FalseProb for original BB.
2757 // Assuming the original probabilities are A and B, one choice is to set
2758 // BB1's probabilities to A+B/2 and B/2, and set TmpBB's probabilities to
2759 // 2A/(1+A) and B/(1+A). This choice assumes that FalseProb for BB1 ==
2760 // TrueProb for BB1 * FalseProb for TmpBB.
2761
2762 auto NewTrueProb = TProb + FProb / 2;
2763 auto NewFalseProb = FProb / 2;
2764 // Emit the LHS condition.
2765 FindMergedConditions(BOpOp0, TmpBB, FBB, CurBB, SwitchBB, Opc, NewTrueProb,
2766 NewFalseProb, InvertCond);
2767
2768 // Normalize A and B/2 to get 2A/(1+A) and B/(1+A).
2769 SmallVector<BranchProbability, 2> Probs{TProb, FProb / 2};
2771 // Emit the RHS condition into TmpBB.
2772 FindMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
2773 Probs[1], InvertCond);
2774 }
2775}
2776
2777/// If the set of cases should be emitted as a series of branches, return true.
2778/// If we should emit this as a bunch of and/or'd together conditions, return
2779/// false.
2780bool
2781SelectionDAGBuilder::ShouldEmitAsBranches(const std::vector<CaseBlock> &Cases) {
2782 if (Cases.size() != 2) return true;
2783
2784 // If this is two comparisons of the same values or'd or and'd together, they
2785 // will get folded into a single comparison, so don't emit two blocks.
2786 if ((Cases[0].CmpLHS == Cases[1].CmpLHS &&
2787 Cases[0].CmpRHS == Cases[1].CmpRHS) ||
2788 (Cases[0].CmpRHS == Cases[1].CmpLHS &&
2789 Cases[0].CmpLHS == Cases[1].CmpRHS)) {
2790 return false;
2791 }
2792
2793 // Handle: (X != null) | (Y != null) --> (X|Y) != 0
2794 // Handle: (X == null) & (Y == null) --> (X|Y) == 0
2795 if (Cases[0].CmpRHS == Cases[1].CmpRHS &&
2796 Cases[0].CC == Cases[1].CC &&
2797 isa<Constant>(Cases[0].CmpRHS) &&
2798 cast<Constant>(Cases[0].CmpRHS)->isNullValue()) {
2799 if (Cases[0].CC == ISD::SETEQ && Cases[0].TrueBB == Cases[1].ThisBB)
2800 return false;
2801 if (Cases[0].CC == ISD::SETNE && Cases[0].FalseBB == Cases[1].ThisBB)
2802 return false;
2803 }
2804
2805 return true;
2806}
2807
2808void SelectionDAGBuilder::visitUncondBr(const UncondBrInst &I) {
2810
2811 MachineBasicBlock *Succ0MBB = FuncInfo.getMBB(I.getSuccessor(0));
2812
2813 // Update machine-CFG edges.
2814 BrMBB->addSuccessor(Succ0MBB);
2815
2816 // If this is not a fall-through branch or optimizations are switched off,
2817 // emit the branch.
2818 if (Succ0MBB != NextBlock(BrMBB) ||
2820 auto Br = DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other, getControlRoot(),
2821 DAG.getBasicBlock(Succ0MBB));
2822 setValue(&I, Br);
2823 DAG.setRoot(Br);
2824 }
2825}
2826
2827void SelectionDAGBuilder::visitCondBr(const CondBrInst &I) {
2828 MachineBasicBlock *BrMBB = FuncInfo.MBB;
2829
2830 MachineBasicBlock *Succ0MBB = FuncInfo.getMBB(I.getSuccessor(0));
2831
2832 // If this condition is one of the special cases we handle, do special stuff
2833 // now.
2834 const Value *CondVal = I.getCondition();
2835 MachineBasicBlock *Succ1MBB = FuncInfo.getMBB(I.getSuccessor(1));
2836
2837 // If this is a series of conditions that are or'd or and'd together, emit
2838 // this as a sequence of branches instead of setcc's with and/or operations.
2839 // As long as jumps are not expensive (exceptions for multi-use logic ops,
2840 // unpredictable branches, and vector extracts because those jumps are likely
2841 // expensive for any target), this should improve performance.
2842 // For example, instead of something like:
2843 // cmp A, B
2844 // C = seteq
2845 // cmp D, E
2846 // F = setle
2847 // or C, F
2848 // jnz foo
2849 // Emit:
2850 // cmp A, B
2851 // je foo
2852 // cmp D, E
2853 // jle foo
2854 bool IsUnpredictable = I.hasMetadata(LLVMContext::MD_unpredictable);
2855 const Instruction *BOp = dyn_cast<Instruction>(CondVal);
2856 if (!DAG.getTargetLoweringInfo().isJumpExpensive() && BOp &&
2857 BOp->hasOneUse() && !IsUnpredictable) {
2858 Value *Vec;
2859 const Value *BOp0, *BOp1;
2861 if (match(BOp, m_LogicalAnd(m_Value(BOp0), m_Value(BOp1))))
2862 Opcode = Instruction::And;
2863 else if (match(BOp, m_LogicalOr(m_Value(BOp0), m_Value(BOp1))))
2864 Opcode = Instruction::Or;
2865
2866 if (Opcode &&
2867 !(match(BOp0, m_ExtractElt(m_Value(Vec), m_Value())) &&
2868 match(BOp1, m_ExtractElt(m_Specific(Vec), m_Value()))) &&
2870 FuncInfo, I, Opcode, BOp0, BOp1,
2871 DAG.getTargetLoweringInfo().getJumpConditionMergingParams(
2872 Opcode, BOp0, BOp1))) {
2873 FindMergedConditions(BOp, Succ0MBB, Succ1MBB, BrMBB, BrMBB, Opcode,
2874 getEdgeProbability(BrMBB, Succ0MBB),
2875 getEdgeProbability(BrMBB, Succ1MBB),
2876 /*InvertCond=*/false);
2877 // If the compares in later blocks need to use values not currently
2878 // exported from this block, export them now. This block should always
2879 // be the first entry.
2880 assert(SL->SwitchCases[0].ThisBB == BrMBB && "Unexpected lowering!");
2881
2882 // Allow some cases to be rejected.
2883 if (ShouldEmitAsBranches(SL->SwitchCases)) {
2884 for (unsigned i = 1, e = SL->SwitchCases.size(); i != e; ++i) {
2885 ExportFromCurrentBlock(SL->SwitchCases[i].CmpLHS);
2886 ExportFromCurrentBlock(SL->SwitchCases[i].CmpRHS);
2887 }
2888
2889 // Emit the branch for this block.
2890 visitSwitchCase(SL->SwitchCases[0], BrMBB);
2891 SL->SwitchCases.erase(SL->SwitchCases.begin());
2892 return;
2893 }
2894
2895 // Okay, we decided not to do this, remove any inserted MBB's and clear
2896 // SwitchCases.
2897 for (unsigned i = 1, e = SL->SwitchCases.size(); i != e; ++i)
2898 FuncInfo.MF->erase(SL->SwitchCases[i].ThisBB);
2899
2900 SL->SwitchCases.clear();
2901 }
2902 }
2903
2904 // Create a CaseBlock record representing this branch.
2905 CaseBlock CB(ISD::SETEQ, CondVal, ConstantInt::getTrue(*DAG.getContext()),
2906 nullptr, Succ0MBB, Succ1MBB, BrMBB, getCurSDLoc(),
2908 IsUnpredictable);
2909
2910 // Use visitSwitchCase to actually insert the fast branch sequence for this
2911 // cond branch.
2912 visitSwitchCase(CB, BrMBB);
2913}
2914
2915/// visitSwitchCase - Emits the necessary code to represent a single node in
2916/// the binary search tree resulting from lowering a switch instruction.
2918 MachineBasicBlock *SwitchBB) {
2919 SDValue Cond;
2920 SDValue CondLHS = getValue(CB.CmpLHS);
2921 SDLoc dl = CB.DL;
2922
2923 if (CB.CC == ISD::SETTRUE) {
2924 // Branch or fall through to TrueBB.
2925 addSuccessorWithProb(SwitchBB, CB.TrueBB, CB.TrueProb);
2926 SwitchBB->normalizeSuccProbs();
2927 if (CB.TrueBB != NextBlock(SwitchBB)) {
2928 DAG.setRoot(DAG.getNode(ISD::BR, dl, MVT::Other, getControlRoot(),
2929 DAG.getBasicBlock(CB.TrueBB)));
2930 }
2931 return;
2932 }
2933
2934 auto &TLI = DAG.getTargetLoweringInfo();
2935 EVT MemVT = TLI.getMemValueType(DAG.getDataLayout(), CB.CmpLHS->getType());
2936
2937 // Build the setcc now.
2938 if (!CB.CmpMHS) {
2939 // Fold "(X == true)" to X and "(X == false)" to !X to
2940 // handle common cases produced by branch lowering.
2941 if (CB.CmpRHS == ConstantInt::getTrue(*DAG.getContext()) &&
2942 CB.CC == ISD::SETEQ)
2943 Cond = CondLHS;
2944 else if (CB.CmpRHS == ConstantInt::getFalse(*DAG.getContext()) &&
2945 CB.CC == ISD::SETEQ) {
2946 SDValue True = DAG.getConstant(1, dl, CondLHS.getValueType());
2947 Cond = DAG.getNode(ISD::XOR, dl, CondLHS.getValueType(), CondLHS, True);
2948 } else {
2949 SDValue CondRHS = getValue(CB.CmpRHS);
2950
2951 // If a pointer's DAG type is larger than its memory type then the DAG
2952 // values are zero-extended. This breaks signed comparisons so truncate
2953 // back to the underlying type before doing the compare.
2954 if (CondLHS.getValueType() != MemVT) {
2955 CondLHS = DAG.getPtrExtOrTrunc(CondLHS, getCurSDLoc(), MemVT);
2956 CondRHS = DAG.getPtrExtOrTrunc(CondRHS, getCurSDLoc(), MemVT);
2957 }
2958 Cond = DAG.getSetCC(dl, MVT::i1, CondLHS, CondRHS, CB.CC);
2959 }
2960 } else {
2961 assert(CB.CC == ISD::SETLE && "Can handle only LE ranges now");
2962
2963 const APInt& Low = cast<ConstantInt>(CB.CmpLHS)->getValue();
2964 const APInt& High = cast<ConstantInt>(CB.CmpRHS)->getValue();
2965
2966 SDValue CmpOp = getValue(CB.CmpMHS);
2967 EVT VT = CmpOp.getValueType();
2968
2969 if (cast<ConstantInt>(CB.CmpLHS)->isMinValue(true)) {
2970 Cond = DAG.getSetCC(dl, MVT::i1, CmpOp, DAG.getConstant(High, dl, VT),
2971 ISD::SETLE);
2972 } else {
2973 SDValue SUB = DAG.getNode(ISD::SUB, dl,
2974 VT, CmpOp, DAG.getConstant(Low, dl, VT));
2975 Cond = DAG.getSetCC(dl, MVT::i1, SUB,
2976 DAG.getConstant(High-Low, dl, VT), ISD::SETULE);
2977 }
2978 }
2979
2980 // Update successor info
2981 addSuccessorWithProb(SwitchBB, CB.TrueBB, CB.TrueProb);
2982 // TrueBB and FalseBB are always different unless the incoming IR is
2983 // degenerate. This only happens when running llc on weird IR.
2984 if (CB.TrueBB != CB.FalseBB)
2985 addSuccessorWithProb(SwitchBB, CB.FalseBB, CB.FalseProb);
2986 SwitchBB->normalizeSuccProbs();
2987
2988 // If the lhs block is the next block, invert the condition so that we can
2989 // fall through to the lhs instead of the rhs block.
2990 if (CB.TrueBB == NextBlock(SwitchBB)) {
2991 std::swap(CB.TrueBB, CB.FalseBB);
2992 SDValue True = DAG.getConstant(1, dl, Cond.getValueType());
2993 Cond = DAG.getNode(ISD::XOR, dl, Cond.getValueType(), Cond, True);
2994 }
2995
2996 SDNodeFlags Flags;
2998 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl, MVT::Other, getControlRoot(),
2999 Cond, DAG.getBasicBlock(CB.TrueBB), Flags);
3000
3001 setValue(CurInst, BrCond);
3002
3003 // Insert the false branch. Do this even if it's a fall through branch,
3004 // this makes it easier to do DAG optimizations which require inverting
3005 // the branch condition.
3006 BrCond = DAG.getNode(ISD::BR, dl, MVT::Other, BrCond,
3007 DAG.getBasicBlock(CB.FalseBB));
3008
3009 DAG.setRoot(BrCond);
3010}
3011
3012/// visitJumpTable - Emit JumpTable node in the current MBB
3014 // Emit the code for the jump table
3015 assert(JT.SL && "Should set SDLoc for SelectionDAG!");
3016 assert(JT.Reg && "Should lower JT Header first!");
3017 EVT PTy = DAG.getTargetLoweringInfo().getJumpTableRegTy(DAG.getDataLayout());
3018 SDValue Index = DAG.getCopyFromReg(getControlRoot(), *JT.SL, JT.Reg, PTy);
3019 SDValue Table = DAG.getJumpTable(JT.JTI, PTy);
3020 SDValue BrJumpTable = DAG.getNode(ISD::BR_JT, *JT.SL, MVT::Other,
3021 Index.getValue(1), Table, Index);
3022 DAG.setRoot(BrJumpTable);
3023}
3024
3025/// visitJumpTableHeader - This function emits necessary code to produce index
3026/// in the JumpTable from switch case.
3028 JumpTableHeader &JTH,
3029 MachineBasicBlock *SwitchBB) {
3030 assert(JT.SL && "Should set SDLoc for SelectionDAG!");
3031 const SDLoc &dl = *JT.SL;
3032
3033 // Subtract the lowest switch case value from the value being switched on.
3034 SDValue SwitchOp = getValue(JTH.SValue);
3035 EVT VT = SwitchOp.getValueType();
3036 SDValue Sub = DAG.getNode(ISD::SUB, dl, VT, SwitchOp,
3037 DAG.getConstant(JTH.First, dl, VT));
3038
3039 // The SDNode we just created, which holds the value being switched on minus
3040 // the smallest case value, needs to be copied to a virtual register so it
3041 // can be used as an index into the jump table in a subsequent basic block.
3042 // This value may be smaller or larger than the target's pointer type, and
3043 // therefore require extension or truncating.
3044 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3045 SwitchOp =
3046 DAG.getZExtOrTrunc(Sub, dl, TLI.getJumpTableRegTy(DAG.getDataLayout()));
3047
3048 Register JumpTableReg =
3049 FuncInfo.CreateReg(TLI.getJumpTableRegTy(DAG.getDataLayout()));
3050 SDValue CopyTo =
3051 DAG.getCopyToReg(getControlRoot(), dl, JumpTableReg, SwitchOp);
3052 JT.Reg = JumpTableReg;
3053
3054 if (!JTH.FallthroughUnreachable) {
3055 // Emit the range check for the jump table, and branch to the default block
3056 // for the switch statement if the value being switched on exceeds the
3057 // largest case in the switch.
3058 SDValue CMP = DAG.getSetCC(
3059 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
3060 Sub.getValueType()),
3061 Sub, DAG.getConstant(JTH.Last - JTH.First, dl, VT), ISD::SETUGT);
3062
3063 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl,
3064 MVT::Other, CopyTo, CMP,
3065 DAG.getBasicBlock(JT.Default));
3066
3067 // Avoid emitting unnecessary branches to the next block.
3068 if (JT.MBB != NextBlock(SwitchBB))
3069 BrCond = DAG.getNode(ISD::BR, dl, MVT::Other, BrCond,
3070 DAG.getBasicBlock(JT.MBB));
3071
3072 DAG.setRoot(BrCond);
3073 } else {
3074 // Avoid emitting unnecessary branches to the next block.
3075 if (JT.MBB != NextBlock(SwitchBB))
3076 DAG.setRoot(DAG.getNode(ISD::BR, dl, MVT::Other, CopyTo,
3077 DAG.getBasicBlock(JT.MBB)));
3078 else
3079 DAG.setRoot(CopyTo);
3080 }
3081}
3082
3083/// Create a LOAD_STACK_GUARD node, and let it carry the target specific global
3084/// variable if there exists one.
3086 SDValue &Chain) {
3087 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3088 EVT PtrTy = TLI.getPointerTy(DAG.getDataLayout());
3089 EVT PtrMemTy = TLI.getPointerMemTy(DAG.getDataLayout());
3091 Value *Global =
3094 DAG.getMachineNode(TargetOpcode::LOAD_STACK_GUARD, DL, PtrTy, Chain);
3095 if (Global) {
3096 MachinePointerInfo MPInfo(Global);
3100 MPInfo, Flags, PtrTy.getSizeInBits() / 8, DAG.getEVTAlign(PtrTy));
3101 DAG.setNodeMemRefs(Node, {MemRef});
3102 }
3103 if (PtrTy != PtrMemTy)
3104 return DAG.getPtrExtOrTrunc(SDValue(Node, 0), DL, PtrMemTy);
3105 return SDValue(Node, 0);
3106}
3107
3108/// Codegen a new tail for a stack protector check ParentMBB which has had its
3109/// tail spliced into a stack protector check success bb.
3110///
3111/// For a high level explanation of how this fits into the stack protector
3112/// generation see the comment on the declaration of class
3113/// StackProtectorDescriptor.
3115 MachineBasicBlock *ParentBB) {
3116
3117 // First create the loads to the guard/stack slot for the comparison.
3118 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3119 auto &DL = DAG.getDataLayout();
3120 EVT PtrTy = TLI.getFrameIndexTy(DL);
3121 EVT PtrMemTy = TLI.getPointerMemTy(DL, DL.getAllocaAddrSpace());
3122
3123 MachineFrameInfo &MFI = ParentBB->getParent()->getFrameInfo();
3124 int FI = MFI.getStackProtectorIndex();
3125
3126 SDValue Guard;
3127 SDLoc dl = getCurSDLoc();
3128 SDValue StackSlotPtr = DAG.getFrameIndex(FI, PtrTy);
3129 const Module &M = *ParentBB->getParent()->getFunction().getParent();
3130 Align Align = DL.getPrefTypeAlign(
3131 PointerType::get(M.getContext(), DL.getAllocaAddrSpace()));
3132
3133 // Generate code to load the content of the guard slot.
3134 SDValue GuardVal = DAG.getLoad(
3135 PtrMemTy, dl, DAG.getEntryNode(), StackSlotPtr,
3136 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI), Align,
3138
3139 // If cookie mixing is enabled, unmix the stored GuardVal to get back the
3140 // original cookie for comparison. The prologue stored (FP - Cookie) or
3141 // (FP XOR Cookie), so we apply the same operation again to unmix:
3142 // FP - (FP - Cookie) = Cookie, or (FP XOR Cookie) XOR FP = Cookie.
3143 if (TLI.useStackGuardMixFP())
3144 GuardVal = TLI.emitStackGuardMixFP(DAG, GuardVal, dl);
3145
3146 // If we're using function-based instrumentation, call the guard check
3147 // function
3149 // Get the guard check function from the target and verify it exists since
3150 // we're using function-based instrumentation
3151 const Function *GuardCheckFn =
3152 TLI.getSSPStackGuardCheck(M, DAG.getLibcalls());
3153 assert(GuardCheckFn && "Guard check function is null");
3154
3155 // The target provides a guard check function to validate the guard value.
3156 // Generate a call to that function with the content of the guard slot as
3157 // argument.
3158 FunctionType *FnTy = GuardCheckFn->getFunctionType();
3159 assert(FnTy->getNumParams() == 1 && "Invalid function signature");
3160
3162 TargetLowering::ArgListEntry Entry(GuardVal, FnTy->getParamType(0));
3163 if (GuardCheckFn->hasParamAttribute(0, Attribute::AttrKind::InReg))
3164 Entry.IsInReg = true;
3165 Args.push_back(Entry);
3166
3169 .setChain(DAG.getEntryNode())
3170 .setCallee(GuardCheckFn->getCallingConv(), FnTy->getReturnType(),
3171 getValue(GuardCheckFn), std::move(Args));
3172
3173 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
3174 DAG.setRoot(Result.second);
3175 return;
3176 }
3177
3178 // Load the fresh guard value for comparison.
3179 // For targets that mix the cookie in LOAD_STACK_GUARD expansion, we need to
3180 // load directly without using LOAD_STACK_GUARD to avoid unwanted mixing.
3181 SDValue Chain = DAG.getEntryNode();
3182 if (TLI.useStackGuardMixFP()) {
3183 // Mixing targets: load cookie directly to avoid mixing in LOAD_STACK_GUARD
3184 if (const Value *IRGuard = TLI.getSDagStackGuard(M, DAG.getLibcalls())) {
3185 SDValue GuardPtr = getValue(IRGuard);
3186 Guard = DAG.getLoad(PtrMemTy, dl, Chain, GuardPtr,
3187 MachinePointerInfo(IRGuard, 0), Align,
3189 } else {
3190 LLVMContext &Ctx = *DAG.getContext();
3191 Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
3192 Guard = DAG.getPOISON(PtrMemTy);
3193 }
3194 } else {
3195 // Non-mixing targets: use LOAD_STACK_GUARD or direct load as usual
3196 if (TLI.useLoadStackGuardNode(M)) {
3197 Guard = getLoadStackGuard(DAG, dl, Chain);
3198 } else {
3199 if (const Value *IRGuard = TLI.getSDagStackGuard(M, DAG.getLibcalls())) {
3200 SDValue GuardPtr = getValue(IRGuard);
3201 Guard = DAG.getLoad(PtrMemTy, dl, Chain, GuardPtr,
3202 MachinePointerInfo(IRGuard, 0), Align,
3204 } else {
3205 LLVMContext &Ctx = *DAG.getContext();
3206 Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
3207 Guard = DAG.getPOISON(PtrMemTy);
3208 }
3209 }
3210 }
3211
3212 // Now both Guard (fresh cookie) and GuardVal (unmixed from stored value)
3213 // contain unmixed cookie values that can be compared directly.
3214
3215 // Perform the comparison via a getsetcc.
3216 SDValue Cmp = DAG.getSetCC(
3217 dl, TLI.getSetCCResultType(DL, *DAG.getContext(), Guard.getValueType()),
3218 Guard, GuardVal, ISD::SETNE);
3219
3220 // If the guard/stackslot do not equal, branch to failure MBB.
3221 SDValue BrCond = DAG.getNode(ISD::BRCOND, dl, MVT::Other, getControlRoot(),
3222 Cmp, DAG.getBasicBlock(SPD.getFailureMBB()));
3223 // Otherwise branch to success MBB.
3224 SDValue Br = DAG.getNode(ISD::BR, dl,
3225 MVT::Other, BrCond,
3226 DAG.getBasicBlock(SPD.getSuccessMBB()));
3227
3228 DAG.setRoot(Br);
3229}
3230
3231/// Codegen the failure basic block for a stack protector check.
3232///
3233/// A failure stack protector machine basic block consists simply of a call to
3234/// __stack_chk_fail().
3235///
3236/// For a high level explanation of how this fits into the stack protector
3237/// generation see the comment on the declaration of class
3238/// StackProtectorDescriptor.
3241
3242 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3243 MachineBasicBlock *ParentBB = SPD.getParentMBB();
3244 const Module &M = *ParentBB->getParent()->getFunction().getParent();
3245 SDValue Chain;
3246
3247 // For -Oz builds with a guard check function, we use function-based
3248 // instrumentation. Otherwise, if we have a guard check function, we call it
3249 // in the failure block.
3250 auto *GuardCheckFn = TLI.getSSPStackGuardCheck(M, DAG.getLibcalls());
3251 if (GuardCheckFn && !SPD.shouldEmitFunctionBasedCheckStackProtector()) {
3252 // First create the loads to the guard/stack slot for the comparison.
3253 auto &DL = DAG.getDataLayout();
3254 EVT PtrTy = TLI.getFrameIndexTy(DL);
3255 EVT PtrMemTy = TLI.getPointerMemTy(DL, DL.getAllocaAddrSpace());
3256
3257 MachineFrameInfo &MFI = ParentBB->getParent()->getFrameInfo();
3258 int FI = MFI.getStackProtectorIndex();
3259
3260 SDLoc dl = getCurSDLoc();
3261 SDValue StackSlotPtr = DAG.getFrameIndex(FI, PtrTy);
3262 Align Align = DL.getPrefTypeAlign(
3263 PointerType::get(M.getContext(), DL.getAllocaAddrSpace()));
3264
3265 // Generate code to load the content of the guard slot.
3266 SDValue GuardVal = DAG.getLoad(
3267 PtrMemTy, dl, DAG.getEntryNode(), StackSlotPtr,
3268 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI), Align,
3270
3271 if (TLI.useStackGuardMixFP())
3272 GuardVal = TLI.emitStackGuardMixFP(DAG, GuardVal, dl);
3273
3274 // The target provides a guard check function to validate the guard value.
3275 // Generate a call to that function with the content of the guard slot as
3276 // argument.
3277 FunctionType *FnTy = GuardCheckFn->getFunctionType();
3278 assert(FnTy->getNumParams() == 1 && "Invalid function signature");
3279
3281 TargetLowering::ArgListEntry Entry(GuardVal, FnTy->getParamType(0));
3282 if (GuardCheckFn->hasParamAttribute(0, Attribute::AttrKind::InReg))
3283 Entry.IsInReg = true;
3284 Args.push_back(Entry);
3285
3288 .setChain(DAG.getEntryNode())
3289 .setCallee(GuardCheckFn->getCallingConv(), FnTy->getReturnType(),
3290 getValue(GuardCheckFn), std::move(Args));
3291
3292 Chain = TLI.LowerCallTo(CLI).second;
3293 } else {
3295 CallOptions.setDiscardResult(true);
3296 Chain = TLI.makeLibCall(DAG, RTLIB::STACKPROTECTOR_CHECK_FAIL, MVT::isVoid,
3297 {}, CallOptions, getCurSDLoc())
3298 .second;
3299 }
3300
3301 // Emit a trap instruction if we are required to do so.
3302 const TargetOptions &TargetOpts = DAG.getTarget().Options;
3303 if (TargetOpts.TrapUnreachable && !TargetOpts.NoTrapAfterNoreturn)
3304 Chain = DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, Chain);
3305
3306 DAG.setRoot(Chain);
3307}
3308
3309/// visitBitTestHeader - This function emits necessary code to produce value
3310/// suitable for "bit tests"
3312 MachineBasicBlock *SwitchBB) {
3313 SDLoc dl = getCurSDLoc();
3314
3315 // Subtract the minimum value.
3316 SDValue SwitchOp = getValue(B.SValue);
3317 EVT VT = SwitchOp.getValueType();
3318 SDValue RangeSub =
3319 DAG.getNode(ISD::SUB, dl, VT, SwitchOp, DAG.getConstant(B.First, dl, VT));
3320
3321 // Determine the type of the test operands.
3322 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3323 bool UsePtrType = false;
3324 if (!TLI.isTypeLegal(VT)) {
3325 UsePtrType = true;
3326 } else {
3327 for (const BitTestCase &Case : B.Cases)
3328 if (!isUIntN(VT.getSizeInBits(), Case.Mask)) {
3329 // Switch table case range are encoded into series of masks.
3330 // Just use pointer type, it's guaranteed to fit.
3331 UsePtrType = true;
3332 break;
3333 }
3334 }
3335 SDValue Sub = RangeSub;
3336 if (UsePtrType) {
3337 VT = TLI.getPointerTy(DAG.getDataLayout());
3338 Sub = DAG.getZExtOrTrunc(Sub, dl, VT);
3339 }
3340
3341 B.RegVT = VT.getSimpleVT();
3342 B.Reg = FuncInfo.CreateReg(B.RegVT);
3343 SDValue CopyTo = DAG.getCopyToReg(getControlRoot(), dl, B.Reg, Sub);
3344
3345 MachineBasicBlock* MBB = B.Cases[0].ThisBB;
3346
3347 if (!B.FallthroughUnreachable)
3348 addSuccessorWithProb(SwitchBB, B.Default, B.DefaultProb);
3349 addSuccessorWithProb(SwitchBB, MBB, B.Prob);
3350 SwitchBB->normalizeSuccProbs();
3351
3352 SDValue Root = CopyTo;
3353 if (!B.FallthroughUnreachable) {
3354 // Conditional branch to the default block.
3355 SDValue RangeCmp = DAG.getSetCC(dl,
3356 TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
3357 RangeSub.getValueType()),
3358 RangeSub, DAG.getConstant(B.Range, dl, RangeSub.getValueType()),
3359 ISD::SETUGT);
3360
3361 Root = DAG.getNode(ISD::BRCOND, dl, MVT::Other, Root, RangeCmp,
3362 DAG.getBasicBlock(B.Default));
3363 }
3364
3365 // Avoid emitting unnecessary branches to the next block.
3366 if (MBB != NextBlock(SwitchBB))
3367 Root = DAG.getNode(ISD::BR, dl, MVT::Other, Root, DAG.getBasicBlock(MBB));
3368
3369 DAG.setRoot(Root);
3370}
3371
3372/// visitBitTestCase - this function produces one "bit test"
3374 MachineBasicBlock *NextMBB,
3375 BranchProbability BranchProbToNext,
3376 Register Reg, BitTestCase &B,
3377 MachineBasicBlock *SwitchBB) {
3378 SDLoc dl = getCurSDLoc();
3379 MVT VT = BB.RegVT;
3380 SDValue ShiftOp = DAG.getCopyFromReg(getControlRoot(), dl, Reg, VT);
3381 SDValue Cmp;
3382 unsigned PopCount = llvm::popcount(B.Mask);
3383 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3384 if (PopCount == 1) {
3385 // Testing for a single bit; just compare the shift count with what it
3386 // would need to be to shift a 1 bit in that position.
3387 Cmp = DAG.getSetCC(
3388 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3389 ShiftOp, DAG.getConstant(llvm::countr_zero(B.Mask), dl, VT),
3390 ISD::SETEQ);
3391 } else if (PopCount == BB.Range) {
3392 // There is only one zero bit in the range, test for it directly.
3393 Cmp = DAG.getSetCC(
3394 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3395 ShiftOp, DAG.getConstant(llvm::countr_one(B.Mask), dl, VT), ISD::SETNE);
3396 } else {
3397 // Make desired shift
3398 SDValue SwitchVal = DAG.getNode(ISD::SHL, dl, VT,
3399 DAG.getConstant(1, dl, VT), ShiftOp);
3400
3401 // Emit bit tests and jumps
3402 SDValue AndOp = DAG.getNode(ISD::AND, dl,
3403 VT, SwitchVal, DAG.getConstant(B.Mask, dl, VT));
3404 Cmp = DAG.getSetCC(
3405 dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT),
3406 AndOp, DAG.getConstant(0, dl, VT), ISD::SETNE);
3407 }
3408
3409 // The branch probability from SwitchBB to B.TargetBB is B.ExtraProb.
3410 addSuccessorWithProb(SwitchBB, B.TargetBB, B.ExtraProb);
3411 // The branch probability from SwitchBB to NextMBB is BranchProbToNext.
3412 addSuccessorWithProb(SwitchBB, NextMBB, BranchProbToNext);
3413 // It is not guaranteed that the sum of B.ExtraProb and BranchProbToNext is
3414 // one as they are relative probabilities (and thus work more like weights),
3415 // and hence we need to normalize them to let the sum of them become one.
3416 SwitchBB->normalizeSuccProbs();
3417
3418 SDValue BrAnd = DAG.getNode(ISD::BRCOND, dl,
3419 MVT::Other, getControlRoot(),
3420 Cmp, DAG.getBasicBlock(B.TargetBB));
3421
3422 // Avoid emitting unnecessary branches to the next block.
3423 if (NextMBB != NextBlock(SwitchBB))
3424 BrAnd = DAG.getNode(ISD::BR, dl, MVT::Other, BrAnd,
3425 DAG.getBasicBlock(NextMBB));
3426
3427 DAG.setRoot(BrAnd);
3428}
3429
3430void SelectionDAGBuilder::visitInvoke(const InvokeInst &I) {
3431 MachineBasicBlock *InvokeMBB = FuncInfo.MBB;
3432
3433 // Retrieve successors. Look through artificial IR level blocks like
3434 // catchswitch for successors.
3435 MachineBasicBlock *Return = FuncInfo.getMBB(I.getSuccessor(0));
3436 const BasicBlock *EHPadBB = I.getSuccessor(1);
3437 MachineBasicBlock *EHPadMBB = FuncInfo.getMBB(EHPadBB);
3438
3439 // Deopt and ptrauth bundles are lowered in helper functions, and we don't
3440 // have to do anything here to lower funclet bundles.
3441 failForInvalidBundles(I, "invokes",
3447
3448 const Value *Callee(I.getCalledOperand());
3449 const Function *Fn = dyn_cast<Function>(Callee);
3450 if (isa<InlineAsm>(Callee))
3451 visitInlineAsm(I, EHPadBB);
3452 else if (Fn && Fn->isIntrinsic()) {
3453 switch (Fn->getIntrinsicID()) {
3454 default:
3455 llvm_unreachable("Cannot invoke this intrinsic");
3456 case Intrinsic::donothing:
3457 // Ignore invokes to @llvm.donothing: jump directly to the next BB.
3458 case Intrinsic::seh_try_begin:
3459 case Intrinsic::seh_scope_begin:
3460 case Intrinsic::seh_try_end:
3461 case Intrinsic::seh_scope_end:
3462 if (EHPadMBB)
3463 // a block referenced by EH table
3464 // so dtor-funclet not removed by opts
3465 EHPadMBB->setMachineBlockAddressTaken();
3466 break;
3467 case Intrinsic::experimental_patchpoint_void:
3468 case Intrinsic::experimental_patchpoint:
3469 visitPatchpoint(I, EHPadBB);
3470 break;
3471 case Intrinsic::experimental_gc_statepoint:
3473 break;
3474 // wasm_throw, wasm_rethrow: This is usually done in visitTargetIntrinsic,
3475 // but these intrinsics are special because they can be invoked, so we
3476 // manually lower it to a DAG node here.
3477 case Intrinsic::wasm_throw: {
3479 std::array<SDValue, 4> Ops = {
3480 getControlRoot(), // inchain for the terminator node
3481 DAG.getTargetConstant(Intrinsic::wasm_throw, getCurSDLoc(),
3483 getValue(I.getArgOperand(0)), // tag
3484 getValue(I.getArgOperand(1)) // thrown value
3485 };
3486 SDVTList VTs = DAG.getVTList(ArrayRef<EVT>({MVT::Other})); // outchain
3487 DAG.setRoot(DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops));
3488 break;
3489 }
3490 case Intrinsic::wasm_rethrow: {
3491 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3492 std::array<SDValue, 2> Ops = {
3493 getControlRoot(), // inchain for the terminator node
3494 DAG.getTargetConstant(Intrinsic::wasm_rethrow, getCurSDLoc(),
3495 TLI.getPointerTy(DAG.getDataLayout()))};
3496 SDVTList VTs = DAG.getVTList(ArrayRef<EVT>({MVT::Other})); // outchain
3497 DAG.setRoot(DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops));
3498 break;
3499 }
3500 }
3501 } else if (I.hasDeoptState()) {
3502 // Currently we do not lower any intrinsic calls with deopt operand bundles.
3503 // Eventually we will support lowering the @llvm.experimental.deoptimize
3504 // intrinsic, and right now there are no plans to support other intrinsics
3505 // with deopt state.
3506 LowerCallSiteWithDeoptBundle(&I, getValue(Callee), EHPadBB);
3507 } else if (I.countOperandBundlesOfType(LLVMContext::OB_ptrauth)) {
3509 } else {
3510 LowerCallTo(I, getValue(Callee), false, false, EHPadBB);
3511 }
3512
3513 // If the value of the invoke is used outside of its defining block, make it
3514 // available as a virtual register.
3515 // We already took care of the exported value for the statepoint instruction
3516 // during call to the LowerStatepoint.
3517 if (!isa<GCStatepointInst>(I)) {
3519 }
3520
3522 BranchProbabilityInfo *BPI = FuncInfo.BPI;
3523 BranchProbability EHPadBBProb =
3524 BPI ? BPI->getEdgeProbability(InvokeMBB->getBasicBlock(), EHPadBB)
3526 findUnwindDestinations(FuncInfo, EHPadBB, EHPadBBProb, UnwindDests);
3527
3528 // Update successor info.
3529 addSuccessorWithProb(InvokeMBB, Return);
3530 for (auto &UnwindDest : UnwindDests) {
3531 UnwindDest.first->setIsEHPad();
3532 addSuccessorWithProb(InvokeMBB, UnwindDest.first, UnwindDest.second);
3533 }
3534 InvokeMBB->normalizeSuccProbs();
3535
3536 // Drop into normal successor.
3537 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other, getControlRoot(),
3538 DAG.getBasicBlock(Return)));
3539}
3540
3541/// The intrinsics currently supported by callbr are implicit control flow
3542/// intrinsics such as amdgcn.kill.
3543/// - they should be called (no "dontcall-" attributes)
3544/// - they do not touch memory on the target (= !TLI.getTgtMemIntrinsic())
3545/// - they do not need custom argument handling (no
3546/// TLI.CollectTargetIntrinsicOperands())
3547void SelectionDAGBuilder::visitCallBrIntrinsic(const CallBrInst &I) {
3548#ifndef NDEBUG
3550 DAG.getTargetLoweringInfo().getTgtMemIntrinsic(
3551 Infos, I, DAG.getMachineFunction(), I.getIntrinsicID());
3552 assert(Infos.empty() && "Intrinsic touches memory");
3553#endif
3554
3555 auto [HasChain, OnlyLoad] = getTargetIntrinsicCallProperties(I);
3556
3558 getTargetIntrinsicOperands(I, HasChain, OnlyLoad);
3559 SDVTList VTs = getTargetIntrinsicVTList(I, HasChain);
3560
3561 // Create the node.
3562 SDValue Result =
3563 getTargetNonMemIntrinsicNode(*I.getType(), HasChain, Ops, VTs);
3564 Result = handleTargetIntrinsicRet(I, HasChain, OnlyLoad, Result);
3565
3566 setValue(&I, Result);
3567}
3568
3569void SelectionDAGBuilder::visitCallBr(const CallBrInst &I) {
3570 MachineBasicBlock *CallBrMBB = FuncInfo.MBB;
3571
3572 if (I.isInlineAsm()) {
3573 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
3574 // have to do anything here to lower funclet bundles.
3575 failForInvalidBundles(I, "callbrs",
3577 visitInlineAsm(I);
3578 } else {
3579 assert(!I.hasOperandBundles() &&
3580 "Can't have operand bundles for intrinsics");
3581 visitCallBrIntrinsic(I);
3582 }
3584
3585 // Retrieve successors.
3586 SmallPtrSet<BasicBlock *, 8> Dests;
3587 Dests.insert(I.getDefaultDest());
3588 MachineBasicBlock *Return = FuncInfo.getMBB(I.getDefaultDest());
3589
3590 // Update successor info.
3591 addSuccessorWithProb(CallBrMBB, Return, BranchProbability::getOne());
3592 // TODO: For most of the cases where there is an intrinsic callbr, we're
3593 // having exactly one indirect target, which will be unreachable. As soon as
3594 // this changes, we might need to enhance
3595 // Target->setIsInlineAsmBrIndirectTarget or add something similar for
3596 // intrinsic indirect branches.
3597 if (I.isInlineAsm()) {
3598 for (BasicBlock *Dest : I.getIndirectDests()) {
3599 MachineBasicBlock *Target = FuncInfo.getMBB(Dest);
3600 Target->setIsInlineAsmBrIndirectTarget();
3601 // If we introduce a type of asm goto statement that is permitted to use
3602 // an indirect call instruction to jump to its labels, then we should add
3603 // a call to Target->setMachineBlockAddressTaken() here, to mark the
3604 // target block as requiring a BTI.
3605
3606 Target->setLabelMustBeEmitted();
3607 // Don't add duplicate machine successors.
3608 if (Dests.insert(Dest).second)
3609 addSuccessorWithProb(CallBrMBB, Target, BranchProbability::getZero());
3610 }
3611 }
3612 CallBrMBB->normalizeSuccProbs();
3613
3614 // Drop into default successor.
3615 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(),
3616 MVT::Other, getControlRoot(),
3617 DAG.getBasicBlock(Return)));
3618}
3619
3620void SelectionDAGBuilder::visitResume(const ResumeInst &RI) {
3621 llvm_unreachable("SelectionDAGBuilder shouldn't visit resume instructions!");
3622}
3623
3624void SelectionDAGBuilder::visitLandingPad(const LandingPadInst &LP) {
3625 assert(FuncInfo.MBB->isEHPad() &&
3626 "Call to landingpad not in landing pad!");
3627
3628 // If there aren't registers to copy the values into (e.g., during SjLj
3629 // exceptions), then don't bother to create these DAG nodes.
3630 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3631 const Constant *PersonalityFn = FuncInfo.Fn->getPersonalityFn();
3632 if (TLI.getExceptionPointerRegister(PersonalityFn) == 0 &&
3633 TLI.getExceptionSelectorRegister(PersonalityFn) == 0)
3634 return;
3635
3636 // If landingpad's return type is token type, we don't create DAG nodes
3637 // for its exception pointer and selector value. The extraction of exception
3638 // pointer or selector value from token type landingpads is not currently
3639 // supported.
3640 if (LP.getType()->isTokenTy())
3641 return;
3642
3643 SmallVector<EVT, 2> ValueVTs;
3644 SDLoc dl = getCurSDLoc();
3645 ComputeValueVTs(TLI, DAG.getDataLayout(), LP.getType(), ValueVTs);
3646 assert(ValueVTs.size() == 2 && "Only two-valued landingpads are supported");
3647
3648 // Get the two live-in registers as SDValues. The physregs have already been
3649 // copied into virtual registers.
3650 SDValue Ops[2];
3651 if (FuncInfo.ExceptionPointerVirtReg) {
3652 Ops[0] = DAG.getZExtOrTrunc(
3653 DAG.getCopyFromReg(DAG.getEntryNode(), dl,
3654 FuncInfo.ExceptionPointerVirtReg,
3655 TLI.getPointerTy(DAG.getDataLayout())),
3656 dl, ValueVTs[0]);
3657 } else {
3658 Ops[0] = DAG.getConstant(0, dl, TLI.getPointerTy(DAG.getDataLayout()));
3659 }
3660 Ops[1] = DAG.getZExtOrTrunc(
3661 DAG.getCopyFromReg(DAG.getEntryNode(), dl,
3662 FuncInfo.ExceptionSelectorVirtReg,
3663 TLI.getPointerTy(DAG.getDataLayout())),
3664 dl, ValueVTs[1]);
3665
3666 // Merge into one.
3667 SDValue Res = DAG.getNode(ISD::MERGE_VALUES, dl,
3668 DAG.getVTList(ValueVTs), Ops);
3669 setValue(&LP, Res);
3670}
3671
3674 // Update JTCases.
3675 for (JumpTableBlock &JTB : SL->JTCases)
3676 if (JTB.first.HeaderBB == First)
3677 JTB.first.HeaderBB = Last;
3678
3679 // Update BitTestCases.
3680 for (BitTestBlock &BTB : SL->BitTestCases)
3681 if (BTB.Parent == First)
3682 BTB.Parent = Last;
3683}
3684
3685void SelectionDAGBuilder::visitIndirectBr(const IndirectBrInst &I) {
3686 MachineBasicBlock *IndirectBrMBB = FuncInfo.MBB;
3687
3688 // Update machine-CFG edges with unique successors.
3690 for (unsigned i = 0, e = I.getNumSuccessors(); i != e; ++i) {
3691 BasicBlock *BB = I.getSuccessor(i);
3692 bool Inserted = Done.insert(BB).second;
3693 if (!Inserted)
3694 continue;
3695
3696 MachineBasicBlock *Succ = FuncInfo.getMBB(BB);
3697 addSuccessorWithProb(IndirectBrMBB, Succ);
3698 }
3699 IndirectBrMBB->normalizeSuccProbs();
3700
3702 MVT::Other, getControlRoot(),
3703 getValue(I.getAddress())));
3704}
3705
3706void SelectionDAGBuilder::visitUnreachable(const UnreachableInst &I) {
3707 if (!I.shouldLowerToTrap(DAG.getTarget().Options.TrapUnreachable,
3708 DAG.getTarget().Options.NoTrapAfterNoreturn))
3709 return;
3710
3711 DAG.setRoot(DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, DAG.getRoot()));
3712}
3713
3714void SelectionDAGBuilder::visitUnary(const User &I, unsigned Opcode) {
3715 SDNodeFlags Flags;
3716 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3717 Flags.copyFMF(*FPOp);
3718
3719 SDValue Op = getValue(I.getOperand(0));
3720 SDValue UnNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op.getValueType(),
3721 Op, Flags);
3722 setValue(&I, UnNodeValue);
3723}
3724
3725void SelectionDAGBuilder::visitBinary(const User &I, unsigned Opcode) {
3726 SDNodeFlags Flags;
3727 if (auto *OFBinOp = dyn_cast<OverflowingBinaryOperator>(&I)) {
3728 Flags.setNoSignedWrap(OFBinOp->hasNoSignedWrap());
3729 Flags.setNoUnsignedWrap(OFBinOp->hasNoUnsignedWrap());
3730 }
3731 if (auto *ExactOp = dyn_cast<PossiblyExactOperator>(&I))
3732 Flags.setExact(ExactOp->isExact());
3733 if (auto *DisjointOp = dyn_cast<PossiblyDisjointInst>(&I))
3734 Flags.setDisjoint(DisjointOp->isDisjoint());
3735 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3736 Flags.copyFMF(*FPOp);
3737
3738 SDValue Op1 = getValue(I.getOperand(0));
3739 SDValue Op2 = getValue(I.getOperand(1));
3740 SDValue BinNodeValue = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(),
3741 Op1, Op2, Flags);
3742 setValue(&I, BinNodeValue);
3743}
3744
3745void SelectionDAGBuilder::visitShift(const User &I, unsigned Opcode) {
3746 SDValue Op1 = getValue(I.getOperand(0));
3747 SDValue Op2 = getValue(I.getOperand(1));
3748
3749 EVT ShiftTy = DAG.getTargetLoweringInfo().getShiftAmountTy(
3750 Op1.getValueType(), DAG.getDataLayout());
3751
3752 // Coerce the shift amount to the right type if we can. This exposes the
3753 // truncate or zext to optimization early.
3754 if (!I.getType()->isVectorTy() && Op2.getValueType() != ShiftTy) {
3756 "Unexpected shift type");
3757 Op2 = DAG.getZExtOrTrunc(Op2, getCurSDLoc(), ShiftTy);
3758 }
3759
3760 bool nuw = false;
3761 bool nsw = false;
3762 bool exact = false;
3763
3764 if (Opcode == ISD::SRL || Opcode == ISD::SRA || Opcode == ISD::SHL) {
3765
3766 if (const OverflowingBinaryOperator *OFBinOp =
3768 nuw = OFBinOp->hasNoUnsignedWrap();
3769 nsw = OFBinOp->hasNoSignedWrap();
3770 }
3771 if (const PossiblyExactOperator *ExactOp =
3773 exact = ExactOp->isExact();
3774 }
3775 SDNodeFlags Flags;
3776 Flags.setExact(exact);
3777 Flags.setNoSignedWrap(nsw);
3778 Flags.setNoUnsignedWrap(nuw);
3779 SDValue Res = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(), Op1, Op2,
3780 Flags);
3781 setValue(&I, Res);
3782}
3783
3784void SelectionDAGBuilder::visitSDiv(const User &I) {
3785 SDValue Op1 = getValue(I.getOperand(0));
3786 SDValue Op2 = getValue(I.getOperand(1));
3787
3788 SDNodeFlags Flags;
3789 Flags.setExact(isa<PossiblyExactOperator>(&I) &&
3790 cast<PossiblyExactOperator>(&I)->isExact());
3791 setValue(&I, DAG.getNode(ISD::SDIV, getCurSDLoc(), Op1.getValueType(), Op1,
3792 Op2, Flags));
3793}
3794
3795void SelectionDAGBuilder::visitICmp(const ICmpInst &I) {
3796 ICmpInst::Predicate predicate = I.getPredicate();
3797 SDValue Op1 = getValue(I.getOperand(0));
3798 SDValue Op2 = getValue(I.getOperand(1));
3799 ISD::CondCode Opcode = getICmpCondCode(predicate);
3800
3801 auto &TLI = DAG.getTargetLoweringInfo();
3802 EVT MemVT =
3803 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
3804
3805 // If a pointer's DAG type is larger than its memory type then the DAG values
3806 // are zero-extended. This breaks signed comparisons so truncate back to the
3807 // underlying type before doing the compare.
3808 if (Op1.getValueType() != MemVT) {
3809 Op1 = DAG.getPtrExtOrTrunc(Op1, getCurSDLoc(), MemVT);
3810 Op2 = DAG.getPtrExtOrTrunc(Op2, getCurSDLoc(), MemVT);
3811 }
3812
3813 SDNodeFlags Flags;
3814 Flags.setSameSign(I.hasSameSign());
3815
3816 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3817 I.getType());
3818 setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Opcode,
3819 /*Chain=*/{}, /*IsSignaling=*/false, Flags));
3820}
3821
3822void SelectionDAGBuilder::visitFCmp(const FCmpInst &I) {
3823 FCmpInst::Predicate predicate = I.getPredicate();
3824 SDValue Op1 = getValue(I.getOperand(0));
3825 SDValue Op2 = getValue(I.getOperand(1));
3826
3827 ISD::CondCode Condition = getFCmpCondCode(predicate);
3828 auto *FPMO = cast<FPMathOperator>(&I);
3829 if (FPMO->hasNoNaNs() ||
3830 (DAG.isKnownNeverNaN(Op1) && DAG.isKnownNeverNaN(Op2)))
3831 Condition = getFCmpCodeWithoutNaN(Condition);
3832
3833 SDNodeFlags Flags;
3834 Flags.copyFMF(*FPMO);
3835
3836 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
3837 I.getType());
3838 setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Condition,
3839 /*Chain=*/{}, /*IsSignaling=*/false, Flags));
3840}
3841
3842// Check if the condition of the select has one use or two users that are both
3843// selects with the same condition.
3844static bool hasOnlySelectUsers(const Value *Cond) {
3845 return llvm::all_of(Cond->users(), [](const Value *V) {
3846 return isa<SelectInst>(V);
3847 });
3848}
3849
3850void SelectionDAGBuilder::visitSelect(const User &I) {
3851 SmallVector<EVT, 4> ValueVTs;
3852 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
3853 ValueVTs);
3854 unsigned NumValues = ValueVTs.size();
3855 if (NumValues == 0) return;
3856
3858 SDValue Cond = getValue(I.getOperand(0));
3859 SDValue LHSVal = getValue(I.getOperand(1));
3860 SDValue RHSVal = getValue(I.getOperand(2));
3861 SmallVector<SDValue, 1> BaseOps(1, Cond);
3863 Cond.getValueType().isVector() ? ISD::VSELECT : ISD::SELECT;
3864
3865 bool IsUnaryAbs = false;
3866 bool Negate = false;
3867
3868 SDNodeFlags Flags;
3869 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
3870 Flags.copyFMF(*FPOp);
3871
3872 Flags.setUnpredictable(
3873 cast<SelectInst>(I).getMetadata(LLVMContext::MD_unpredictable));
3874
3875 // Min/max matching is only viable if all output VTs are the same.
3876 if (all_equal(ValueVTs)) {
3877 EVT VT = ValueVTs[0];
3878 LLVMContext &Ctx = *DAG.getContext();
3879 auto &TLI = DAG.getTargetLoweringInfo();
3880
3881 // We care about the legality of the operation after it has been type
3882 // legalized.
3883 while (TLI.getTypeAction(Ctx, VT) != TargetLoweringBase::TypeLegal)
3884 VT = TLI.getTypeToTransformTo(Ctx, VT);
3885
3886 // If the vselect is legal, assume we want to leave this as a vector setcc +
3887 // vselect. Otherwise, if this is going to be scalarized, we want to see if
3888 // min/max is legal on the scalar type.
3889 bool UseScalarMinMax = VT.isVector() &&
3891
3892 // ValueTracking's select pattern matching does not account for -0.0,
3893 // so we can't lower to FMINIMUM/FMAXIMUM because those nodes specify that
3894 // -0.0 is less than +0.0.
3895 const Value *LHS, *RHS;
3896 auto SPR = matchSelectPattern(&I, LHS, RHS);
3898 switch (SPR.Flavor) {
3899 case SPF_UMAX: Opc = ISD::UMAX; break;
3900 case SPF_UMIN: Opc = ISD::UMIN; break;
3901 case SPF_SMAX: Opc = ISD::SMAX; break;
3902 case SPF_SMIN: Opc = ISD::SMIN; break;
3903 case SPF_FMINNUM:
3905 break;
3906
3907 switch (SPR.NaNBehavior) {
3908 case SPNB_NA: llvm_unreachable("No NaN behavior for FP op?");
3909 case SPNB_RETURNS_NAN: break;
3910 case SPNB_RETURNS_OTHER:
3912 Flags.setNoSignedZeros(true);
3913 break;
3914 case SPNB_RETURNS_ANY:
3916 (UseScalarMinMax &&
3918 Opc = ISD::FMINNUM;
3919 break;
3920 }
3921 break;
3922 case SPF_FMAXNUM:
3924 break;
3925
3926 switch (SPR.NaNBehavior) {
3927 case SPNB_NA: llvm_unreachable("No NaN behavior for FP op?");
3928 case SPNB_RETURNS_NAN: break;
3929 case SPNB_RETURNS_OTHER:
3931 Flags.setNoSignedZeros(true);
3932 break;
3933 case SPNB_RETURNS_ANY:
3935 (UseScalarMinMax &&
3937 Opc = ISD::FMAXNUM;
3938 break;
3939 }
3940 break;
3941 case SPF_NABS:
3942 Negate = true;
3943 [[fallthrough]];
3944 case SPF_ABS:
3945 IsUnaryAbs = true;
3946 Opc = ISD::ABS;
3947 break;
3948 default: break;
3949 }
3950
3951 if (!IsUnaryAbs && Opc != ISD::DELETED_NODE &&
3952 (TLI.isOperationLegalOrCustom(Opc, VT) ||
3953 (UseScalarMinMax &&
3955 // If the underlying comparison instruction is used by any other
3956 // instruction, the consumed instructions won't be destroyed, so it is
3957 // not profitable to convert to a min/max.
3959 OpCode = Opc;
3960 LHSVal = getValue(LHS);
3961 RHSVal = getValue(RHS);
3962 BaseOps.clear();
3963 }
3964
3965 if (IsUnaryAbs) {
3966 OpCode = Opc;
3967 LHSVal = getValue(LHS);
3968 BaseOps.clear();
3969 }
3970 }
3971
3972 if (IsUnaryAbs) {
3973 for (unsigned i = 0; i != NumValues; ++i) {
3974 SDLoc dl = getCurSDLoc();
3975 EVT VT = LHSVal.getNode()->getValueType(LHSVal.getResNo() + i);
3976 Values[i] =
3977 DAG.getNode(OpCode, dl, VT, LHSVal.getValue(LHSVal.getResNo() + i));
3978 if (Negate)
3979 Values[i] = DAG.getNegative(Values[i], dl, VT);
3980 }
3981 } else {
3982 for (unsigned i = 0; i != NumValues; ++i) {
3983 SmallVector<SDValue, 3> Ops(BaseOps.begin(), BaseOps.end());
3984 Ops.push_back(SDValue(LHSVal.getNode(), LHSVal.getResNo() + i));
3985 Ops.push_back(SDValue(RHSVal.getNode(), RHSVal.getResNo() + i));
3986 Values[i] = DAG.getNode(
3987 OpCode, getCurSDLoc(),
3988 LHSVal.getNode()->getValueType(LHSVal.getResNo() + i), Ops, Flags);
3989 }
3990 }
3991
3993 DAG.getVTList(ValueVTs), Values));
3994}
3995
3996void SelectionDAGBuilder::visitTrunc(const User &I) {
3997 // TruncInst cannot be a no-op cast because sizeof(src) > sizeof(dest).
3998 SDValue N = getValue(I.getOperand(0));
3999 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4000 I.getType());
4001 SDNodeFlags Flags;
4002 if (auto *Trunc = dyn_cast<TruncInst>(&I)) {
4003 Flags.setNoSignedWrap(Trunc->hasNoSignedWrap());
4004 Flags.setNoUnsignedWrap(Trunc->hasNoUnsignedWrap());
4005 }
4006
4007 setValue(&I, DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), DestVT, N, Flags));
4008}
4009
4010void SelectionDAGBuilder::visitZExt(const User &I) {
4011 // ZExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
4012 // ZExt also can't be a cast to bool for same reason. So, nothing much to do
4013 SDValue N = getValue(I.getOperand(0));
4014 auto &TLI = DAG.getTargetLoweringInfo();
4015 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4016
4017 SDNodeFlags Flags;
4018 if (auto *PNI = dyn_cast<PossiblyNonNegInst>(&I))
4019 Flags.setNonNeg(PNI->hasNonNeg());
4020
4021 // Eagerly use nonneg information to canonicalize towards sign_extend if
4022 // that is the target's preference.
4023 // TODO: Let the target do this later.
4024 if (Flags.hasNonNeg() &&
4025 TLI.isSExtCheaperThanZExt(N.getValueType(), DestVT)) {
4026 setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));
4027 return;
4028 }
4029
4030 setValue(&I, DAG.getNode(ISD::ZERO_EXTEND, getCurSDLoc(), DestVT, N, Flags));
4031}
4032
4033void SelectionDAGBuilder::visitSExt(const User &I) {
4034 // SExt cannot be a no-op cast because sizeof(src) < sizeof(dest).
4035 // SExt also can't be a cast to bool for same reason. So, nothing much to do
4036 SDValue N = getValue(I.getOperand(0));
4037 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4038 I.getType());
4039 setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));
4040}
4041
4042void SelectionDAGBuilder::visitFPTrunc(const User &I) {
4043 // FPTrunc is never a no-op cast, no need to check
4044 SDValue N = getValue(I.getOperand(0));
4045 SDLoc dl = getCurSDLoc();
4046 SDNodeFlags Flags;
4047 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
4048 Flags.copyFMF(*FPOp);
4049 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4050 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4051 setValue(&I, DAG.getNode(ISD::FP_ROUND, dl, DestVT, N,
4052 DAG.getTargetConstant(
4053 0, dl, TLI.getPointerTy(DAG.getDataLayout())),
4054 Flags));
4055}
4056
4057void SelectionDAGBuilder::visitFPExt(const User &I) {
4058 // FPExt is never a no-op cast, no need to check
4059 SDValue N = getValue(I.getOperand(0));
4060 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4061 I.getType());
4062 SDNodeFlags Flags;
4063 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
4064 Flags.copyFMF(*FPOp);
4065 setValue(&I, DAG.getNode(ISD::FP_EXTEND, getCurSDLoc(), DestVT, N, Flags));
4066}
4067
4068void SelectionDAGBuilder::visitFPToUI(const User &I) {
4069 // FPToUI is never a no-op cast, no need to check
4070 SDValue N = getValue(I.getOperand(0));
4071 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4072 I.getType());
4073 setValue(&I, DAG.getNode(ISD::FP_TO_UINT, getCurSDLoc(), DestVT, N));
4074}
4075
4076void SelectionDAGBuilder::visitFPToSI(const User &I) {
4077 // FPToSI is never a no-op cast, no need to check
4078 SDValue N = getValue(I.getOperand(0));
4079 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4080 I.getType());
4081 setValue(&I, DAG.getNode(ISD::FP_TO_SINT, getCurSDLoc(), DestVT, N));
4082}
4083
4084void SelectionDAGBuilder::visitUIToFP(const User &I) {
4085 // UIToFP is never a no-op cast, no need to check
4086 SDValue N = getValue(I.getOperand(0));
4087 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4088 I.getType());
4089 SDNodeFlags Flags;
4090 Flags.setNonNeg(cast<PossiblyNonNegInst>(&I)->hasNonNeg());
4091 Flags.copyFMF(*cast<FPMathOperator>(&I));
4092
4093 setValue(&I, DAG.getNode(ISD::UINT_TO_FP, getCurSDLoc(), DestVT, N, Flags));
4094}
4095
4096void SelectionDAGBuilder::visitSIToFP(const User &I) {
4097 // SIToFP is never a no-op cast, no need to check
4098 SDValue N = getValue(I.getOperand(0));
4099 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4100 I.getType());
4101 SDNodeFlags Flags;
4102 Flags.copyFMF(*cast<FPMathOperator>(&I));
4103
4104 setValue(&I, DAG.getNode(ISD::SINT_TO_FP, getCurSDLoc(), DestVT, N, Flags));
4105}
4106
4107void SelectionDAGBuilder::visitPtrToAddr(const User &I) {
4108 SDValue N = getValue(I.getOperand(0));
4109 // By definition the type of the ptrtoaddr must be equal to the address type.
4110 const auto &TLI = DAG.getTargetLoweringInfo();
4111 EVT AddrVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4112 // The address width must be smaller or equal to the pointer representation
4113 // width, so we lower ptrtoaddr as a truncate (possibly folded to a no-op).
4114 N = DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), AddrVT, N);
4115 setValue(&I, N);
4116}
4117
4118void SelectionDAGBuilder::visitPtrToInt(const User &I) {
4119 // What to do depends on the size of the integer and the size of the pointer.
4120 // We can either truncate, zero extend, or no-op, accordingly.
4121 SDValue N = getValue(I.getOperand(0));
4122 auto &TLI = DAG.getTargetLoweringInfo();
4123 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4124 I.getType());
4125 EVT PtrMemVT =
4126 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
4127 N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), PtrMemVT);
4128 N = DAG.getZExtOrTrunc(N, getCurSDLoc(), DestVT);
4129 setValue(&I, N);
4130}
4131
4132void SelectionDAGBuilder::visitIntToPtr(const User &I) {
4133 // What to do depends on the size of the integer and the size of the pointer.
4134 // We can either truncate, zero extend, or no-op, accordingly.
4135 SDValue N = getValue(I.getOperand(0));
4136 auto &TLI = DAG.getTargetLoweringInfo();
4137 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4138 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(), I.getType());
4139 N = DAG.getZExtOrTrunc(N, getCurSDLoc(), PtrMemVT);
4140 N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), DestVT);
4141 setValue(&I, N);
4142}
4143
4144void SelectionDAGBuilder::visitBitCast(const User &I) {
4145 SDValue N = getValue(I.getOperand(0));
4146 SDLoc dl = getCurSDLoc();
4147 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
4148 I.getType());
4149
4150 // BitCast assures us that source and destination are the same size so this is
4151 // either a BITCAST or a no-op.
4152 if (DestVT != N.getValueType())
4153 setValue(&I, DAG.getNode(ISD::BITCAST, dl,
4154 DestVT, N)); // convert types.
4155 // Check if the original LLVM IR Operand was a ConstantInt, because getValue()
4156 // might fold any kind of constant expression to an integer constant and that
4157 // is not what we are looking for. Only recognize a bitcast of a genuine
4158 // constant integer as an opaque constant.
4159 else if(ConstantInt *C = dyn_cast<ConstantInt>(I.getOperand(0)))
4160 setValue(&I, DAG.getConstant(C->getValue(), dl, DestVT, /*isTarget=*/false,
4161 /*isOpaque*/true));
4162 else
4163 setValue(&I, N); // noop cast.
4164}
4165
4166void SelectionDAGBuilder::visitAddrSpaceCast(const User &I) {
4167 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4168 const Value *SV = I.getOperand(0);
4169 SDValue N = getValue(SV);
4170 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4171
4172 unsigned SrcAS = SV->getType()->getPointerAddressSpace();
4173 unsigned DestAS = I.getType()->getPointerAddressSpace();
4174
4175 if (!TM.isNoopAddrSpaceCast(SrcAS, DestAS))
4176 N = DAG.getAddrSpaceCast(getCurSDLoc(), DestVT, N, SrcAS, DestAS);
4177
4178 setValue(&I, N);
4179}
4180
4181void SelectionDAGBuilder::visitInsertElement(const User &I) {
4182 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4183 SDValue InVec = getValue(I.getOperand(0));
4184 SDValue InVal = getValue(I.getOperand(1));
4185 SDValue InIdx = DAG.getZExtOrTrunc(getValue(I.getOperand(2)), getCurSDLoc(),
4186 TLI.getVectorIdxTy(DAG.getDataLayout()));
4188 TLI.getValueType(DAG.getDataLayout(), I.getType()),
4189 InVec, InVal, InIdx));
4190}
4191
4192void SelectionDAGBuilder::visitExtractElement(const User &I) {
4193 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4194 SDValue InVec = getValue(I.getOperand(0));
4195 SDValue InIdx = DAG.getZExtOrTrunc(getValue(I.getOperand(1)), getCurSDLoc(),
4196 TLI.getVectorIdxTy(DAG.getDataLayout()));
4198 TLI.getValueType(DAG.getDataLayout(), I.getType()),
4199 InVec, InIdx));
4200}
4201
4202void SelectionDAGBuilder::visitShuffleVector(const User &I) {
4203 SDValue Src1 = getValue(I.getOperand(0));
4204 SDValue Src2 = getValue(I.getOperand(1));
4205 ArrayRef<int> Mask;
4206 if (auto *SVI = dyn_cast<ShuffleVectorInst>(&I))
4207 Mask = SVI->getShuffleMask();
4208 else
4209 Mask = cast<ConstantExpr>(I).getShuffleMask();
4210 SDLoc DL = getCurSDLoc();
4211 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4212 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
4213 EVT SrcVT = Src1.getValueType();
4214
4215 if (all_of(Mask, equal_to(0)) && VT.isScalableVector()) {
4216 // Canonical splat form of first element of first input vector.
4217 SDValue FirstElt =
4218 DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, SrcVT.getScalarType(), Src1,
4219 DAG.getVectorIdxConstant(0, DL));
4220 setValue(&I, DAG.getNode(ISD::SPLAT_VECTOR, DL, VT, FirstElt));
4221 return;
4222 }
4223
4224 // For now, we only handle splats for scalable vectors.
4225 // The DAGCombiner will perform a BUILD_VECTOR -> SPLAT_VECTOR transformation
4226 // for targets that support a SPLAT_VECTOR for non-scalable vector types.
4227 assert(!VT.isScalableVector() && "Unsupported scalable vector shuffle");
4228
4229 unsigned SrcNumElts = SrcVT.getVectorNumElements();
4230 unsigned MaskNumElts = Mask.size();
4231
4232 if (SrcNumElts == MaskNumElts) {
4233 setValue(&I, DAG.getVectorShuffle(VT, DL, Src1, Src2, Mask));
4234 return;
4235 }
4236
4237 // Normalize the shuffle vector since mask and vector length don't match.
4238 if (SrcNumElts < MaskNumElts) {
4239 // Mask is longer than the source vectors. We can use concatenate vector to
4240 // make the mask and vectors lengths match.
4241
4242 if (MaskNumElts % SrcNumElts == 0) {
4243 // Mask length is a multiple of the source vector length.
4244 // Check if the shuffle is some kind of concatenation of the input
4245 // vectors.
4246 unsigned NumConcat = MaskNumElts / SrcNumElts;
4247 bool IsConcat = true;
4248 SmallVector<int, 8> ConcatSrcs(NumConcat, -1);
4249 for (unsigned i = 0; i != MaskNumElts; ++i) {
4250 int Idx = Mask[i];
4251 if (Idx < 0)
4252 continue;
4253 // Ensure the indices in each SrcVT sized piece are sequential and that
4254 // the same source is used for the whole piece.
4255 if ((Idx % SrcNumElts != (i % SrcNumElts)) ||
4256 (ConcatSrcs[i / SrcNumElts] >= 0 &&
4257 ConcatSrcs[i / SrcNumElts] != (int)(Idx / SrcNumElts))) {
4258 IsConcat = false;
4259 break;
4260 }
4261 // Remember which source this index came from.
4262 ConcatSrcs[i / SrcNumElts] = Idx / SrcNumElts;
4263 }
4264
4265 // The shuffle is concatenating multiple vectors together. Just emit
4266 // a CONCAT_VECTORS operation.
4267 if (IsConcat) {
4268 SmallVector<SDValue, 8> ConcatOps;
4269 for (auto Src : ConcatSrcs) {
4270 if (Src < 0)
4271 ConcatOps.push_back(DAG.getUNDEF(SrcVT));
4272 else if (Src == 0)
4273 ConcatOps.push_back(Src1);
4274 else
4275 ConcatOps.push_back(Src2);
4276 }
4277 setValue(&I, DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, ConcatOps));
4278 return;
4279 }
4280 }
4281
4282 unsigned PaddedMaskNumElts = alignTo(MaskNumElts, SrcNumElts);
4283 unsigned NumConcat = PaddedMaskNumElts / SrcNumElts;
4284 EVT PaddedVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(),
4285 PaddedMaskNumElts);
4286
4287 // Pad both vectors with undefs to make them the same length as the mask.
4288 SDValue UndefVal = DAG.getUNDEF(SrcVT);
4289
4290 SmallVector<SDValue, 8> MOps1(NumConcat, UndefVal);
4291 SmallVector<SDValue, 8> MOps2(NumConcat, UndefVal);
4292 MOps1[0] = Src1;
4293 MOps2[0] = Src2;
4294
4295 Src1 = DAG.getNode(ISD::CONCAT_VECTORS, DL, PaddedVT, MOps1);
4296 Src2 = DAG.getNode(ISD::CONCAT_VECTORS, DL, PaddedVT, MOps2);
4297
4298 // Readjust mask for new input vector length.
4299 SmallVector<int, 8> MappedOps(PaddedMaskNumElts, -1);
4300 for (unsigned i = 0; i != MaskNumElts; ++i) {
4301 int Idx = Mask[i];
4302 if (Idx >= (int)SrcNumElts)
4303 Idx -= SrcNumElts - PaddedMaskNumElts;
4304 MappedOps[i] = Idx;
4305 }
4306
4307 SDValue Result = DAG.getVectorShuffle(PaddedVT, DL, Src1, Src2, MappedOps);
4308
4309 // If the concatenated vector was padded, extract a subvector with the
4310 // correct number of elements.
4311 if (MaskNumElts != PaddedMaskNumElts)
4312 Result = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Result,
4313 DAG.getVectorIdxConstant(0, DL));
4314
4315 setValue(&I, Result);
4316 return;
4317 }
4318
4319 assert(SrcNumElts > MaskNumElts);
4320
4321 // Analyze the access pattern of the vector to see if we can extract
4322 // two subvectors and do the shuffle.
4323 int StartIdx[2] = {-1, -1}; // StartIdx to extract from
4324 bool CanExtract = true;
4325 for (int Idx : Mask) {
4326 unsigned Input = 0;
4327 if (Idx < 0)
4328 continue;
4329
4330 if (Idx >= (int)SrcNumElts) {
4331 Input = 1;
4332 Idx -= SrcNumElts;
4333 }
4334
4335 // If all the indices come from the same MaskNumElts sized portion of
4336 // the sources we can use extract. Also make sure the extract wouldn't
4337 // extract past the end of the source.
4338 int NewStartIdx = alignDown(Idx, MaskNumElts);
4339 if (NewStartIdx + MaskNumElts > SrcNumElts ||
4340 (StartIdx[Input] >= 0 && StartIdx[Input] != NewStartIdx))
4341 CanExtract = false;
4342 // Make sure we always update StartIdx as we use it to track if all
4343 // elements are undef.
4344 StartIdx[Input] = NewStartIdx;
4345 }
4346
4347 if (StartIdx[0] < 0 && StartIdx[1] < 0) {
4348 setValue(&I, DAG.getUNDEF(VT)); // Vectors are not used.
4349 return;
4350 }
4351 if (CanExtract) {
4352 // Extract appropriate subvector and generate a vector shuffle
4353 for (unsigned Input = 0; Input < 2; ++Input) {
4354 SDValue &Src = Input == 0 ? Src1 : Src2;
4355 if (StartIdx[Input] < 0)
4356 Src = DAG.getUNDEF(VT);
4357 else {
4358 Src = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Src,
4359 DAG.getVectorIdxConstant(StartIdx[Input], DL));
4360 }
4361 }
4362
4363 // Calculate new mask.
4364 SmallVector<int, 8> MappedOps(Mask);
4365 for (int &Idx : MappedOps) {
4366 if (Idx >= (int)SrcNumElts)
4367 Idx -= SrcNumElts + StartIdx[1] - MaskNumElts;
4368 else if (Idx >= 0)
4369 Idx -= StartIdx[0];
4370 }
4371
4372 setValue(&I, DAG.getVectorShuffle(VT, DL, Src1, Src2, MappedOps));
4373 return;
4374 }
4375
4376 // We can't use either concat vectors or extract subvectors so fall back to
4377 // replacing the shuffle with extract and build vector.
4378 // to insert and build vector.
4379 EVT EltVT = VT.getVectorElementType();
4381 for (int Idx : Mask) {
4382 SDValue Res;
4383
4384 if (Idx < 0) {
4385 Res = DAG.getUNDEF(EltVT);
4386 } else {
4387 SDValue &Src = Idx < (int)SrcNumElts ? Src1 : Src2;
4388 if (Idx >= (int)SrcNumElts) Idx -= SrcNumElts;
4389
4390 Res = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Src,
4391 DAG.getVectorIdxConstant(Idx, DL));
4392 }
4393
4394 Ops.push_back(Res);
4395 }
4396
4397 setValue(&I, DAG.getBuildVector(VT, DL, Ops));
4398}
4399
4400void SelectionDAGBuilder::visitInsertValue(const InsertValueInst &I) {
4401 ArrayRef<unsigned> Indices = I.getIndices();
4402 const Value *Op0 = I.getOperand(0);
4403 const Value *Op1 = I.getOperand(1);
4404 Type *AggTy = I.getType();
4405 Type *ValTy = Op1->getType();
4406 bool IntoUndef = isa<UndefValue>(Op0);
4407 bool FromUndef = isa<UndefValue>(Op1);
4408
4409 unsigned LinearIndex = ComputeLinearIndex(AggTy, Indices);
4410
4411 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4412 SmallVector<EVT, 4> AggValueVTs;
4413 ComputeValueVTs(TLI, DAG.getDataLayout(), AggTy, AggValueVTs);
4414 SmallVector<EVT, 4> ValValueVTs;
4415 ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);
4416
4417 unsigned NumAggValues = AggValueVTs.size();
4418 unsigned NumValValues = ValValueVTs.size();
4419 SmallVector<SDValue, 4> Values(NumAggValues);
4420
4421 // Ignore an insertvalue that produces an empty object
4422 if (!NumAggValues) {
4423 setValue(&I, DAG.getUNDEF(MVT(MVT::Other)));
4424 return;
4425 }
4426
4427 SDValue Agg = getValue(Op0);
4428 unsigned i = 0;
4429 // Copy the beginning value(s) from the original aggregate.
4430 for (; i != LinearIndex; ++i)
4431 Values[i] = IntoUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4432 SDValue(Agg.getNode(), Agg.getResNo() + i);
4433 // Copy values from the inserted value(s).
4434 if (NumValValues) {
4435 SDValue Val = getValue(Op1);
4436 for (; i != LinearIndex + NumValValues; ++i)
4437 Values[i] = FromUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4438 SDValue(Val.getNode(), Val.getResNo() + i - LinearIndex);
4439 }
4440 // Copy remaining value(s) from the original aggregate.
4441 for (; i != NumAggValues; ++i)
4442 Values[i] = IntoUndef ? DAG.getUNDEF(AggValueVTs[i]) :
4443 SDValue(Agg.getNode(), Agg.getResNo() + i);
4444
4446 DAG.getVTList(AggValueVTs), Values));
4447}
4448
4449void SelectionDAGBuilder::visitExtractValue(const ExtractValueInst &I) {
4450 ArrayRef<unsigned> Indices = I.getIndices();
4451 const Value *Op0 = I.getOperand(0);
4452 Type *AggTy = Op0->getType();
4453 Type *ValTy = I.getType();
4454 bool OutOfUndef = isa<UndefValue>(Op0);
4455
4456 unsigned LinearIndex = ComputeLinearIndex(AggTy, Indices);
4457
4458 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4459 SmallVector<EVT, 4> ValValueVTs;
4460 ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);
4461
4462 unsigned NumValValues = ValValueVTs.size();
4463
4464 // Ignore a extractvalue that produces an empty object
4465 if (!NumValValues) {
4466 setValue(&I, DAG.getUNDEF(MVT(MVT::Other)));
4467 return;
4468 }
4469
4470 SmallVector<SDValue, 4> Values(NumValValues);
4471
4472 SDValue Agg = getValue(Op0);
4473 // Copy out the selected value(s).
4474 for (unsigned i = LinearIndex; i != LinearIndex + NumValValues; ++i)
4475 Values[i - LinearIndex] =
4476 OutOfUndef ?
4477 DAG.getUNDEF(Agg.getNode()->getValueType(Agg.getResNo() + i)) :
4478 SDValue(Agg.getNode(), Agg.getResNo() + i);
4479
4481 DAG.getVTList(ValValueVTs), Values));
4482}
4483
4484void SelectionDAGBuilder::visitGetElementPtr(const User &I) {
4485 Value *Op0 = I.getOperand(0);
4486 // Note that the pointer operand may be a vector of pointers. Take the scalar
4487 // element which holds a pointer.
4488 unsigned AS = Op0->getType()->getScalarType()->getPointerAddressSpace();
4489 SDValue N = getValue(Op0);
4490 SDLoc dl = getCurSDLoc();
4491 auto &TLI = DAG.getTargetLoweringInfo();
4492 GEPNoWrapFlags NW = cast<GEPOperator>(I).getNoWrapFlags();
4493
4494 // For a vector GEP, keep the prefix scalar as long as possible, then
4495 // convert any scalars encountered after the first vector operand to vectors.
4496 bool IsVectorGEP = I.getType()->isVectorTy();
4497 ElementCount VectorElementCount =
4498 IsVectorGEP ? cast<VectorType>(I.getType())->getElementCount()
4500
4502 GTI != E; ++GTI) {
4503 const Value *Idx = GTI.getOperand();
4504 if (StructType *StTy = GTI.getStructTypeOrNull()) {
4505 unsigned Field = cast<Constant>(Idx)->getUniqueInteger().getZExtValue();
4506 if (Field) {
4507 // N = N + Offset
4508 uint64_t Offset =
4509 DAG.getDataLayout().getStructLayout(StTy)->getElementOffset(Field);
4510
4511 // In an inbounds GEP with an offset that is nonnegative even when
4512 // interpreted as signed, assume there is no unsigned overflow.
4513 SDNodeFlags Flags;
4514 if (NW.hasNoUnsignedWrap() ||
4515 (int64_t(Offset) >= 0 && NW.hasNoUnsignedSignedWrap()))
4517 Flags.setInBounds(NW.isInBounds());
4518
4519 N = DAG.getMemBasePlusOffset(
4520 N, DAG.getConstant(Offset, dl, N.getValueType()), dl, Flags);
4521 }
4522 } else {
4523 // IdxSize is the width of the arithmetic according to IR semantics.
4524 // In SelectionDAG, we may prefer to do arithmetic in a wider bitwidth
4525 // (and fix up the result later).
4526 unsigned IdxSize = DAG.getDataLayout().getIndexSizeInBits(AS);
4527 MVT IdxTy = MVT::getIntegerVT(IdxSize);
4528 TypeSize ElementSize =
4529 GTI.getSequentialElementStride(DAG.getDataLayout());
4530 // We intentionally mask away the high bits here; ElementSize may not
4531 // fit in IdxTy.
4532 APInt ElementMul(IdxSize, ElementSize.getKnownMinValue(),
4533 /*isSigned=*/false, /*implicitTrunc=*/true);
4534 bool ElementScalable = ElementSize.isScalable();
4535
4536 // If this is a scalar constant or a splat vector of constants,
4537 // handle it quickly.
4538 const auto *C = dyn_cast<Constant>(Idx);
4539 if (C && isa<VectorType>(C->getType()))
4540 C = C->getSplatValue();
4541
4542 const auto *CI = dyn_cast_or_null<ConstantInt>(C);
4543 if (CI && CI->isZero())
4544 continue;
4545 if (CI && !ElementScalable) {
4546 APInt Offs = ElementMul * CI->getValue().sextOrTrunc(IdxSize);
4547 LLVMContext &Context = *DAG.getContext();
4548 SDValue OffsVal;
4549 if (N.getValueType().isVector())
4550 OffsVal = DAG.getConstant(
4551 Offs, dl, EVT::getVectorVT(Context, IdxTy, VectorElementCount));
4552 else
4553 OffsVal = DAG.getConstant(Offs, dl, IdxTy);
4554
4555 // In an inbounds GEP with an offset that is nonnegative even when
4556 // interpreted as signed, assume there is no unsigned overflow.
4557 SDNodeFlags Flags;
4558 if (NW.hasNoUnsignedWrap() ||
4559 (Offs.isNonNegative() && NW.hasNoUnsignedSignedWrap()))
4560 Flags.setNoUnsignedWrap(true);
4561 Flags.setInBounds(NW.isInBounds());
4562
4563 OffsVal = DAG.getSExtOrTrunc(OffsVal, dl, N.getValueType());
4564
4565 N = DAG.getMemBasePlusOffset(N, OffsVal, dl, Flags);
4566 continue;
4567 }
4568
4569 // N = N + Idx * ElementMul;
4570 SDValue IdxN = getValue(Idx);
4571
4572 if (IdxN.getValueType().isVector() != N.getValueType().isVector()) {
4573 if (N.getValueType().isVector()) {
4574 EVT VT = EVT::getVectorVT(*Context, IdxN.getValueType(),
4575 VectorElementCount);
4576 IdxN = DAG.getSplat(VT, dl, IdxN);
4577 } else {
4578 EVT VT =
4579 EVT::getVectorVT(*Context, N.getValueType(), VectorElementCount);
4580 N = DAG.getSplat(VT, dl, N);
4581 }
4582 }
4583
4584 // If the index is smaller or larger than intptr_t, truncate or extend
4585 // it.
4586 IdxN = DAG.getSExtOrTrunc(IdxN, dl, N.getValueType());
4587
4588 SDNodeFlags ScaleFlags;
4589 // The multiplication of an index by the type size does not wrap the
4590 // pointer index type in a signed sense (mul nsw).
4592
4593 // The multiplication of an index by the type size does not wrap the
4594 // pointer index type in an unsigned sense (mul nuw).
4595 ScaleFlags.setNoUnsignedWrap(NW.hasNoUnsignedWrap());
4596
4597 if (ElementScalable) {
4598 EVT VScaleTy = N.getValueType().getScalarType();
4599 SDValue VScale = DAG.getNode(
4600 ISD::VSCALE, dl, VScaleTy,
4601 DAG.getConstant(ElementMul.getZExtValue(), dl, VScaleTy));
4602 if (N.getValueType().isVector())
4603 VScale = DAG.getSplatVector(N.getValueType(), dl, VScale);
4604 IdxN = DAG.getNode(ISD::MUL, dl, N.getValueType(), IdxN, VScale,
4605 ScaleFlags);
4606 } else {
4607 // If this is a multiply by a power of two, turn it into a shl
4608 // immediately. This is a very common case.
4609 if (ElementMul != 1) {
4610 if (ElementMul.isPowerOf2()) {
4611 unsigned Amt = ElementMul.logBase2();
4612 IdxN = DAG.getNode(
4613 ISD::SHL, dl, N.getValueType(), IdxN,
4614 DAG.getShiftAmountConstant(Amt, N.getValueType(), dl),
4615 ScaleFlags);
4616 } else {
4617 SDValue Scale = DAG.getConstant(ElementMul.getZExtValue(), dl,
4618 IdxN.getValueType());
4619 IdxN = DAG.getNode(ISD::MUL, dl, N.getValueType(), IdxN, Scale,
4620 ScaleFlags);
4621 }
4622 }
4623 }
4624
4625 // The successive addition of the current address, truncated to the
4626 // pointer index type and interpreted as an unsigned number, and each
4627 // offset, also interpreted as an unsigned number, does not wrap the
4628 // pointer index type (add nuw).
4629 SDNodeFlags AddFlags;
4630 AddFlags.setNoUnsignedWrap(NW.hasNoUnsignedWrap());
4631 AddFlags.setInBounds(NW.isInBounds());
4632
4633 N = DAG.getMemBasePlusOffset(N, IdxN, dl, AddFlags);
4634 }
4635 }
4636
4637 if (IsVectorGEP && !N.getValueType().isVector()) {
4638 EVT VT = EVT::getVectorVT(*Context, N.getValueType(), VectorElementCount);
4639 N = DAG.getSplat(VT, dl, N);
4640 }
4641
4642 MVT PtrTy = TLI.getPointerTy(DAG.getDataLayout(), AS);
4643 MVT PtrMemTy = TLI.getPointerMemTy(DAG.getDataLayout(), AS);
4644 if (IsVectorGEP) {
4645 PtrTy = MVT::getVectorVT(PtrTy, VectorElementCount);
4646 PtrMemTy = MVT::getVectorVT(PtrMemTy, VectorElementCount);
4647 }
4648
4649 if (PtrMemTy != PtrTy && !cast<GEPOperator>(I).isInBounds())
4650 N = DAG.getPtrExtendInReg(N, dl, PtrMemTy);
4651
4652 setValue(&I, N);
4653}
4654
4655void SelectionDAGBuilder::visitAlloca(const AllocaInst &I) {
4656 // If this is a fixed sized alloca in the entry block of the function,
4657 // allocate it statically on the stack.
4658 if (FuncInfo.StaticAllocaMap.count(&I))
4659 return; // getValue will auto-populate this.
4660
4661 SDLoc dl = getCurSDLoc();
4662 Type *Ty = I.getAllocatedType();
4663 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4664 auto &DL = DAG.getDataLayout();
4665 TypeSize TySize = DL.getTypeAllocSize(Ty);
4666 MaybeAlign Alignment = I.getAlign();
4667
4668 SDValue AllocSize = getValue(I.getArraySize());
4669
4670 EVT IntPtr = TLI.getPointerTy(DL, I.getAddressSpace());
4671 if (AllocSize.getValueType() != IntPtr)
4672 AllocSize = DAG.getZExtOrTrunc(AllocSize, dl, IntPtr);
4673
4674 AllocSize = DAG.getNode(
4675 ISD::MUL, dl, IntPtr, AllocSize,
4676 DAG.getZExtOrTrunc(DAG.getTypeSize(dl, MVT::i64, TySize), dl, IntPtr));
4677
4678 // Handle alignment. If the requested alignment is less than or equal to
4679 // the stack alignment, ignore it. If the size is greater than or equal to
4680 // the stack alignment, we note this in the DYNAMIC_STACKALLOC node.
4681 Align StackAlign = DAG.getSubtarget().getFrameLowering()->getStackAlign();
4682 if (*Alignment <= StackAlign)
4683 Alignment = std::nullopt;
4684
4685 const uint64_t StackAlignMask = StackAlign.value() - 1U;
4686 // Round the size of the allocation up to the stack alignment size
4687 // by add SA-1 to the size. This doesn't overflow because we're computing
4688 // an address inside an alloca.
4689 AllocSize = DAG.getNode(ISD::ADD, dl, AllocSize.getValueType(), AllocSize,
4690 DAG.getConstant(StackAlignMask, dl, IntPtr),
4692
4693 // Mask out the low bits for alignment purposes.
4694 AllocSize = DAG.getNode(ISD::AND, dl, AllocSize.getValueType(), AllocSize,
4695 DAG.getSignedConstant(~StackAlignMask, dl, IntPtr));
4696
4697 SDValue Ops[] = {
4698 getRoot(), AllocSize,
4699 DAG.getConstant(Alignment ? Alignment->value() : 0, dl, IntPtr)};
4700 SDVTList VTs = DAG.getVTList(AllocSize.getValueType(), MVT::Other);
4701 SDValue DSA = DAG.getNode(ISD::DYNAMIC_STACKALLOC, dl, VTs, Ops);
4702 setValue(&I, DSA);
4703 DAG.setRoot(DSA.getValue(1));
4704
4705 assert(FuncInfo.MF->getFrameInfo().hasVarSizedObjects());
4706}
4707
4708static const MDNode *getRangeMetadata(const Instruction &I) {
4709 return I.getMetadata(LLVMContext::MD_range);
4710}
4711
4712static std::optional<ConstantRange> getRange(const Instruction &I) {
4713 if (const auto *CB = dyn_cast<CallBase>(&I))
4714 if (std::optional<ConstantRange> CR = CB->getRange())
4715 return CR;
4716 if (const MDNode *Range = getRangeMetadata(I))
4718 return std::nullopt;
4719}
4720
4722 if (const auto *CB = dyn_cast<CallBase>(&I))
4723 return CB->getRetNoFPClass();
4724 return fcNone;
4725}
4726
4727void SelectionDAGBuilder::visitLoad(const LoadInst &I) {
4728 if (I.isAtomic())
4729 return visitAtomicLoad(I);
4730
4731 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4732 const Value *SV = I.getOperand(0);
4733 if (TLI.supportSwiftError()) {
4734 // Swifterror values can come from either a function parameter with
4735 // swifterror attribute or an alloca with swifterror attribute.
4736 if (const Argument *Arg = dyn_cast<Argument>(SV)) {
4737 if (Arg->hasSwiftErrorAttr())
4738 return visitLoadFromSwiftError(I);
4739 }
4740
4741 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(SV)) {
4742 if (Alloca->isSwiftError())
4743 return visitLoadFromSwiftError(I);
4744 }
4745 }
4746
4747 SDValue Ptr = getValue(SV);
4748
4749 Type *Ty = I.getType();
4750 SmallVector<EVT, 4> ValueVTs, MemVTs;
4752 ComputeValueVTs(TLI, DAG.getDataLayout(), Ty, ValueVTs, &MemVTs, &Offsets);
4753 unsigned NumValues = ValueVTs.size();
4754 if (NumValues == 0)
4755 return;
4756
4757 Align Alignment = I.getAlign();
4758 AAMDNodes AAInfo = I.getAAMetadata();
4759 const MDNode *Ranges = getRangeMetadata(I);
4760 bool isVolatile = I.isVolatile();
4761 MachineMemOperand::Flags MMOFlags =
4762 TLI.getLoadMemOperandFlags(I, DAG.getDataLayout(), AC, LibInfo);
4763
4764 SDValue Root;
4765 bool ConstantMemory = false;
4766 if (isVolatile)
4767 // Serialize volatile loads with other side effects.
4768 Root = getRoot();
4769 else if (NumValues > MaxParallelChains)
4770 Root = getMemoryRoot();
4771 else if (BatchAA &&
4772 BatchAA->pointsToConstantMemory(MemoryLocation(
4773 SV,
4774 LocationSize::precise(DAG.getDataLayout().getTypeStoreSize(Ty)),
4775 AAInfo))) {
4776 // Do not serialize (non-volatile) loads of constant memory with anything.
4777 Root = DAG.getEntryNode();
4778 ConstantMemory = true;
4780 } else {
4781 // Do not serialize non-volatile loads against each other.
4782 Root = DAG.getRoot();
4783 }
4784
4785 SDLoc dl = getCurSDLoc();
4786
4787 if (isVolatile)
4788 Root = TLI.prepareVolatileOrAtomicLoad(Root, dl, DAG);
4789
4791 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4792
4793 unsigned ChainI = 0;
4794 for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
4795 // Serializing loads here may result in excessive register pressure, and
4796 // TokenFactor places arbitrary choke points on the scheduler. SD scheduling
4797 // could recover a bit by hoisting nodes upward in the chain by recognizing
4798 // they are side-effect free or do not alias. The optimizer should really
4799 // avoid this case by converting large object/array copies to llvm.memcpy
4800 // (MaxParallelChains should always remain as failsafe).
4801 if (ChainI == MaxParallelChains) {
4802 assert(PendingLoads.empty() && "PendingLoads must be serialized first");
4803 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4804 ArrayRef(Chains.data(), ChainI));
4805 Root = Chain;
4806 ChainI = 0;
4807 }
4808
4809 // TODO: MachinePointerInfo only supports a fixed length offset.
4810 MachinePointerInfo PtrInfo =
4811 !Offsets[i].isScalable() || Offsets[i].isZero()
4812 ? MachinePointerInfo(SV, Offsets[i].getKnownMinValue())
4813 : MachinePointerInfo();
4814
4815 SDValue A = DAG.getObjectPtrOffset(dl, Ptr, Offsets[i]);
4816 SDValue L = DAG.getLoad(MemVTs[i], dl, Root, A, PtrInfo, Alignment,
4817 MMOFlags, AAInfo, Ranges);
4818 Chains[ChainI] = L.getValue(1);
4819
4820 if (MemVTs[i] != ValueVTs[i])
4821 L = DAG.getPtrExtOrTrunc(L, dl, ValueVTs[i]);
4822
4823 if (MDNode *NoFPClassMD = I.getMetadata(LLVMContext::MD_nofpclass)) {
4824 uint64_t FPTestInt =
4825 cast<ConstantInt>(
4826 cast<ConstantAsMetadata>(NoFPClassMD->getOperand(0))->getValue())
4827 ->getZExtValue();
4828 if (FPTestInt != fcNone) {
4829 SDValue FPTestConst =
4830 DAG.getTargetConstant(FPTestInt, SDLoc(), MVT::i32);
4831 L = DAG.getNode(ISD::AssertNoFPClass, dl, L.getValueType(), L,
4832 FPTestConst);
4833 }
4834 }
4835 Values[i] = L;
4836 }
4837
4838 if (!ConstantMemory) {
4839 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4840 ArrayRef(Chains.data(), ChainI));
4841 if (isVolatile)
4842 DAG.setRoot(Chain);
4843 else
4844 PendingLoads.push_back(Chain);
4845 }
4846
4847 setValue(&I, DAG.getNode(ISD::MERGE_VALUES, dl,
4848 DAG.getVTList(ValueVTs), Values));
4849}
4850
4851void SelectionDAGBuilder::visitStoreToSwiftError(const StoreInst &I) {
4852 assert(DAG.getTargetLoweringInfo().supportSwiftError() &&
4853 "call visitStoreToSwiftError when backend supports swifterror");
4854
4855 SmallVector<EVT, 4> ValueVTs;
4856 SmallVector<uint64_t, 4> Offsets;
4857 const Value *SrcV = I.getOperand(0);
4858 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(),
4859 SrcV->getType(), ValueVTs, /*MemVTs=*/nullptr, &Offsets, 0);
4860 assert(ValueVTs.size() == 1 && Offsets[0] == 0 &&
4861 "expect a single EVT for swifterror");
4862
4863 SDValue Src = getValue(SrcV);
4864 // Create a virtual register, then update the virtual register.
4865 Register VReg =
4866 SwiftError.getOrCreateVRegDefAt(&I, FuncInfo.MBB, I.getPointerOperand());
4867 // Chain, DL, Reg, N or Chain, DL, Reg, N, Glue
4868 // Chain can be getRoot or getControlRoot.
4869 SDValue CopyNode = DAG.getCopyToReg(getRoot(), getCurSDLoc(), VReg,
4870 SDValue(Src.getNode(), Src.getResNo()));
4871 DAG.setRoot(CopyNode);
4872}
4873
4874void SelectionDAGBuilder::visitLoadFromSwiftError(const LoadInst &I) {
4875 assert(DAG.getTargetLoweringInfo().supportSwiftError() &&
4876 "call visitLoadFromSwiftError when backend supports swifterror");
4877
4878 assert(!I.isVolatile() &&
4879 !I.hasMetadata(LLVMContext::MD_nontemporal) &&
4880 !I.hasMetadata(LLVMContext::MD_invariant_load) &&
4881 "Support volatile, non temporal, invariant for load_from_swift_error");
4882
4883 const Value *SV = I.getOperand(0);
4884 Type *Ty = I.getType();
4885 assert(
4886 (!BatchAA ||
4887 !BatchAA->pointsToConstantMemory(MemoryLocation(
4888 SV, LocationSize::precise(DAG.getDataLayout().getTypeStoreSize(Ty)),
4889 I.getAAMetadata()))) &&
4890 "load_from_swift_error should not be constant memory");
4891
4892 SmallVector<EVT, 4> ValueVTs;
4893 SmallVector<uint64_t, 4> Offsets;
4894 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), Ty,
4895 ValueVTs, /*MemVTs=*/nullptr, &Offsets, 0);
4896 assert(ValueVTs.size() == 1 && Offsets[0] == 0 &&
4897 "expect a single EVT for swifterror");
4898
4899 // Chain, DL, Reg, VT, Glue or Chain, DL, Reg, VT
4900 SDValue L = DAG.getCopyFromReg(
4901 getRoot(), getCurSDLoc(),
4902 SwiftError.getOrCreateVRegUseAt(&I, FuncInfo.MBB, SV), ValueVTs[0]);
4903
4904 setValue(&I, L);
4905}
4906
4907void SelectionDAGBuilder::visitStore(const StoreInst &I) {
4908 if (I.isAtomic())
4909 return visitAtomicStore(I);
4910
4911 const Value *SrcV = I.getOperand(0);
4912 const Value *PtrV = I.getOperand(1);
4913
4914 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
4915 if (TLI.supportSwiftError()) {
4916 // Swifterror values can come from either a function parameter with
4917 // swifterror attribute or an alloca with swifterror attribute.
4918 if (const Argument *Arg = dyn_cast<Argument>(PtrV)) {
4919 if (Arg->hasSwiftErrorAttr())
4920 return visitStoreToSwiftError(I);
4921 }
4922
4923 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(PtrV)) {
4924 if (Alloca->isSwiftError())
4925 return visitStoreToSwiftError(I);
4926 }
4927 }
4928
4929 SmallVector<EVT, 4> ValueVTs, MemVTs;
4931 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(),
4932 SrcV->getType(), ValueVTs, &MemVTs, &Offsets);
4933 unsigned NumValues = ValueVTs.size();
4934 if (NumValues == 0)
4935 return;
4936
4937 // Get the lowered operands. Note that we do this after
4938 // checking if NumResults is zero, because with zero results
4939 // the operands won't have values in the map.
4940 SDValue Src = getValue(SrcV);
4941 SDValue Ptr = getValue(PtrV);
4942
4943 SDValue Root = I.isVolatile() ? getRoot() : getMemoryRoot();
4944 SmallVector<SDValue, 4> Chains(std::min(MaxParallelChains, NumValues));
4945 SDLoc dl = getCurSDLoc();
4946 Align Alignment = I.getAlign();
4947 AAMDNodes AAInfo = I.getAAMetadata();
4948
4949 auto MMOFlags = TLI.getStoreMemOperandFlags(I, DAG.getDataLayout());
4950
4951 unsigned ChainI = 0;
4952 for (unsigned i = 0; i != NumValues; ++i, ++ChainI) {
4953 // See visitLoad comments.
4954 if (ChainI == MaxParallelChains) {
4955 SDValue Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4956 ArrayRef(Chains.data(), ChainI));
4957 Root = Chain;
4958 ChainI = 0;
4959 }
4960
4961 // TODO: MachinePointerInfo only supports a fixed length offset.
4962 MachinePointerInfo PtrInfo =
4963 !Offsets[i].isScalable() || Offsets[i].isZero()
4964 ? MachinePointerInfo(PtrV, Offsets[i].getKnownMinValue())
4965 : MachinePointerInfo();
4966
4967 SDValue Add = DAG.getObjectPtrOffset(dl, Ptr, Offsets[i]);
4968 SDValue Val = SDValue(Src.getNode(), Src.getResNo() + i);
4969 if (MemVTs[i] != ValueVTs[i])
4970 Val = DAG.getPtrExtOrTrunc(Val, dl, MemVTs[i]);
4971 SDValue St =
4972 DAG.getStore(Root, dl, Val, Add, PtrInfo, Alignment, MMOFlags, AAInfo);
4973 Chains[ChainI] = St;
4974 }
4975
4976 SDValue StoreNode = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
4977 ArrayRef(Chains.data(), ChainI));
4978 setValue(&I, StoreNode);
4979 DAG.setRoot(StoreNode);
4980}
4981
4982void SelectionDAGBuilder::visitMaskedStore(const CallInst &I,
4983 bool IsCompressing) {
4984 SDLoc sdl = getCurSDLoc();
4985
4986 Value *Src0Operand = I.getArgOperand(0);
4987 Value *PtrOperand = I.getArgOperand(1);
4988 Value *MaskOperand = I.getArgOperand(2);
4989 Align Alignment = I.getParamAlign(1).valueOrOne();
4990
4991 SDValue Ptr = getValue(PtrOperand);
4992 SDValue Src0 = getValue(Src0Operand);
4993 SDValue Mask = getValue(MaskOperand);
4994 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
4995
4996 EVT VT = Src0.getValueType();
4997
4998 auto MMOFlags = MachineMemOperand::MOStore;
4999 if (I.hasMetadata(LLVMContext::MD_nontemporal))
5001
5002 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5003 MachinePointerInfo(PtrOperand), MMOFlags,
5004 LocationSize::upperBound(VT.getStoreSize()), Alignment,
5005 I.getAAMetadata());
5006
5007 const auto &TLI = DAG.getTargetLoweringInfo();
5008
5009 SDValue StoreNode =
5010 !IsCompressing && TTI->hasConditionalLoadStoreForType(
5011 I.getArgOperand(0)->getType(), /*IsStore=*/true)
5012 ? TLI.visitMaskedStore(DAG, sdl, getMemoryRoot(), MMO, Ptr, Src0,
5013 Mask)
5014 : DAG.getMaskedStore(getMemoryRoot(), sdl, Src0, Ptr, Offset, Mask,
5015 VT, MMO, ISD::UNINDEXED, /*Truncating=*/false,
5016 IsCompressing);
5017 DAG.setRoot(StoreNode);
5018 setValue(&I, StoreNode);
5019}
5020
5021// Get a uniform base for the Gather/Scatter intrinsic.
5022// The first argument of the Gather/Scatter intrinsic is a vector of pointers.
5023// We try to represent it as a base pointer + vector of indices.
5024// Usually, the vector of pointers comes from a 'getelementptr' instruction.
5025// The first operand of the GEP may be a single pointer or a vector of pointers
5026// Example:
5027// %gep.ptr = getelementptr i32, <8 x i32*> %vptr, <8 x i32> %ind
5028// or
5029// %gep.ptr = getelementptr i32, i32* %ptr, <8 x i32> %ind
5030// %res = call <8 x i32> @llvm.masked.gather.v8i32(<8 x i32*> %gep.ptr, ..
5031//
5032// When the first GEP operand is a single pointer - it is the uniform base we
5033// are looking for. If first operand of the GEP is a splat vector - we
5034// extract the splat value and use it as a uniform base.
5035// In all other cases the function returns 'false'.
5036static bool getUniformBase(const Value *Ptr, SDValue &Base, SDValue &Index,
5037 SDValue &Scale, SelectionDAGBuilder *SDB,
5038 const BasicBlock *CurBB, uint64_t ElemSize) {
5039 SelectionDAG& DAG = SDB->DAG;
5040 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5041 const DataLayout &DL = DAG.getDataLayout();
5042
5043 assert(Ptr->getType()->isVectorTy() && "Unexpected pointer type");
5044
5045 // Handle splat constant pointer.
5046 if (auto *C = dyn_cast<Constant>(Ptr)) {
5047 C = C->getSplatValue();
5048 if (!C)
5049 return false;
5050
5051 Base = SDB->getValue(C);
5052
5053 ElementCount NumElts = cast<VectorType>(Ptr->getType())->getElementCount();
5054 EVT VT = EVT::getVectorVT(*DAG.getContext(), TLI.getPointerTy(DL), NumElts);
5055 Index = DAG.getConstant(0, SDB->getCurSDLoc(), VT);
5056 Scale = DAG.getTargetConstant(1, SDB->getCurSDLoc(), TLI.getPointerTy(DL));
5057 return true;
5058 }
5059
5061 if (!GEP || GEP->getParent() != CurBB)
5062 return false;
5063
5064 if (GEP->getNumOperands() != 2)
5065 return false;
5066
5067 const Value *BasePtr = GEP->getPointerOperand();
5068 const Value *IndexVal = GEP->getOperand(GEP->getNumOperands() - 1);
5069
5070 // Make sure the base is scalar and the index is a vector.
5071 if (BasePtr->getType()->isVectorTy() || !IndexVal->getType()->isVectorTy())
5072 return false;
5073
5074 TypeSize ScaleVal = DL.getTypeAllocSize(GEP->getResultElementType());
5075 if (ScaleVal.isScalable())
5076 return false;
5077
5078 // Target may not support the required addressing mode.
5079 if (ScaleVal != 1 &&
5080 !TLI.isLegalScaleForGatherScatter(ScaleVal.getFixedValue(), ElemSize))
5081 return false;
5082
5083 Base = SDB->getValue(BasePtr);
5084 Index = SDB->getValue(IndexVal);
5085
5086 Scale =
5087 DAG.getTargetConstant(ScaleVal, SDB->getCurSDLoc(), TLI.getPointerTy(DL));
5088 return true;
5089}
5090
5091void SelectionDAGBuilder::visitMaskedScatter(const CallInst &I) {
5092 SDLoc sdl = getCurSDLoc();
5093
5094 // llvm.masked.scatter.*(Src0, Ptrs, Mask)
5095 const Value *Ptr = I.getArgOperand(1);
5096 SDValue Src0 = getValue(I.getArgOperand(0));
5097 SDValue Mask = getValue(I.getArgOperand(2));
5098 EVT VT = Src0.getValueType();
5099 Align Alignment = I.getParamAlign(1).valueOrOne();
5100 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5101
5102 SDValue Base;
5103 SDValue Index;
5104 SDValue Scale;
5105 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
5106 I.getParent(), VT.getScalarStoreSize());
5107
5108 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
5109 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5110 MachinePointerInfo(AS), MachineMemOperand::MOStore,
5111 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata());
5112 if (!UniformBase) {
5113 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5114 Index = getValue(Ptr);
5115 Scale =
5116 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5117 }
5118
5119 EVT IdxVT = Index.getValueType();
5120 EVT EltTy = IdxVT.getVectorElementType();
5121 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
5122 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
5123 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
5124 }
5125
5126 SDValue Ops[] = { getMemoryRoot(), Src0, Mask, Base, Index, Scale };
5127 SDValue Scatter = DAG.getMaskedScatter(DAG.getVTList(MVT::Other), VT, sdl,
5128 Ops, MMO, ISD::SIGNED_SCALED, false);
5129 DAG.setRoot(Scatter);
5130 setValue(&I, Scatter);
5131}
5132
5133void SelectionDAGBuilder::visitMaskedLoad(const CallInst &I, bool IsExpanding) {
5134 SDLoc sdl = getCurSDLoc();
5135
5136 Value *PtrOperand = I.getArgOperand(0);
5137 Value *MaskOperand = I.getArgOperand(1);
5138 Value *Src0Operand = I.getArgOperand(2);
5139 Align Alignment = I.getParamAlign(0).valueOrOne();
5140
5141 SDValue Ptr = getValue(PtrOperand);
5142 SDValue Src0 = getValue(Src0Operand);
5143 SDValue Mask = getValue(MaskOperand);
5144 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
5145
5146 EVT VT = Src0.getValueType();
5147 AAMDNodes AAInfo = I.getAAMetadata();
5148 const MDNode *Ranges = getRangeMetadata(I);
5149
5150 // Do not serialize masked loads of constant memory with anything.
5151 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
5152 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
5153
5154 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
5155
5156 auto MMOFlags = MachineMemOperand::MOLoad;
5157 if (I.hasMetadata(LLVMContext::MD_nontemporal))
5159 if (I.hasMetadata(LLVMContext::MD_invariant_load))
5161
5162 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5163 MachinePointerInfo(PtrOperand), MMOFlags,
5164 LocationSize::upperBound(VT.getStoreSize()), Alignment, AAInfo, Ranges);
5165
5166 const auto &TLI = DAG.getTargetLoweringInfo();
5167
5168 // The Load/Res may point to different values and both of them are output
5169 // variables.
5170 SDValue Load;
5171 SDValue Res;
5172 if (!IsExpanding &&
5173 TTI->hasConditionalLoadStoreForType(Src0Operand->getType(),
5174 /*IsStore=*/false))
5175 Res = TLI.visitMaskedLoad(DAG, sdl, InChain, MMO, Load, Ptr, Src0, Mask);
5176 else
5177 Res = Load =
5178 DAG.getMaskedLoad(VT, sdl, InChain, Ptr, Offset, Mask, Src0, VT, MMO,
5179 ISD::UNINDEXED, ISD::NON_EXTLOAD, IsExpanding);
5180 if (AddToChain)
5181 PendingLoads.push_back(Load.getValue(1));
5182 setValue(&I, Res);
5183}
5184
5185void SelectionDAGBuilder::visitMaskedGather(const CallInst &I) {
5186 SDLoc sdl = getCurSDLoc();
5187
5188 // @llvm.masked.gather.*(Ptrs, Mask, Src0)
5189 const Value *Ptr = I.getArgOperand(0);
5190 SDValue Src0 = getValue(I.getArgOperand(2));
5191 SDValue Mask = getValue(I.getArgOperand(1));
5192
5193 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5194 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
5195 Align Alignment = I.getParamAlign(0).valueOrOne();
5196
5197 const MDNode *Ranges = getRangeMetadata(I);
5198
5199 SDValue Root = DAG.getRoot();
5200 SDValue Base;
5201 SDValue Index;
5202 SDValue Scale;
5203 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
5204 I.getParent(), VT.getScalarStoreSize());
5205 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
5206 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5207 MachinePointerInfo(AS), MachineMemOperand::MOLoad,
5208 LocationSize::beforeOrAfterPointer(), Alignment, I.getAAMetadata(),
5209 Ranges);
5210
5211 if (!UniformBase) {
5212 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5213 Index = getValue(Ptr);
5214 Scale =
5215 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
5216 }
5217
5218 EVT IdxVT = Index.getValueType();
5219 EVT EltTy = IdxVT.getVectorElementType();
5220 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
5221 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
5222 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
5223 }
5224
5225 SDValue Ops[] = { Root, Src0, Mask, Base, Index, Scale };
5226 SDValue Gather =
5227 DAG.getMaskedGather(DAG.getVTList(VT, MVT::Other), VT, sdl, Ops, MMO,
5229
5230 PendingLoads.push_back(Gather.getValue(1));
5231 setValue(&I, Gather);
5232}
5233
5234void SelectionDAGBuilder::visitAtomicCmpXchg(const AtomicCmpXchgInst &I) {
5235 SDLoc dl = getCurSDLoc();
5236 AtomicOrdering SuccessOrdering = I.getSuccessOrdering();
5237 AtomicOrdering FailureOrdering = I.getFailureOrdering();
5238 SyncScope::ID SSID = I.getSyncScopeID();
5239
5240 SDValue InChain = getRoot();
5241
5242 MVT MemVT = getValue(I.getCompareOperand()).getSimpleValueType();
5243 SDVTList VTs = DAG.getVTList(MemVT, MVT::i1, MVT::Other);
5244
5245 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5246 auto Flags = TLI.getAtomicMemOperandFlags(I, DAG.getDataLayout());
5247
5248 MachineFunction &MF = DAG.getMachineFunction();
5249 MachineMemOperand *MMO =
5250 MF.getMachineMemOperand(MachinePointerInfo(I.getPointerOperand()), Flags,
5251 MemVT.getStoreSize(), I.getAlign(), AAMDNodes(),
5252 nullptr, SSID, SuccessOrdering, FailureOrdering);
5253
5255 dl, MemVT, VTs, InChain,
5256 getValue(I.getPointerOperand()),
5257 getValue(I.getCompareOperand()),
5258 getValue(I.getNewValOperand()), MMO);
5259
5260 SDValue OutChain = L.getValue(2);
5261
5262 setValue(&I, L);
5263 DAG.setRoot(OutChain);
5264}
5265
5266void SelectionDAGBuilder::visitAtomicRMW(const AtomicRMWInst &I) {
5267 SDLoc dl = getCurSDLoc();
5269 switch (I.getOperation()) {
5270 default: llvm_unreachable("Unknown atomicrmw operation");
5288 break;
5291 break;
5294 break;
5297 break;
5300 break;
5303 break;
5306 break;
5309 break;
5310 }
5311 AtomicOrdering Ordering = I.getOrdering();
5312 SyncScope::ID SSID = I.getSyncScopeID();
5313
5314 SDValue InChain = getRoot();
5315
5316 auto MemVT = getValue(I.getValOperand()).getSimpleValueType();
5317 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5318 auto Flags = TLI.getAtomicMemOperandFlags(I, DAG.getDataLayout());
5319
5320 MachineFunction &MF = DAG.getMachineFunction();
5321 MachineMemOperand *MMO = MF.getMachineMemOperand(
5322 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5323 I.getAlign(), AAMDNodes(), nullptr, SSID, Ordering);
5324
5325 SDValue L =
5326 DAG.getAtomic(NT, dl, MemVT, InChain,
5327 getValue(I.getPointerOperand()), getValue(I.getValOperand()),
5328 MMO);
5329
5330 SDValue OutChain = L.getValue(1);
5331
5332 setValue(&I, L);
5333 DAG.setRoot(OutChain);
5334}
5335
5336void SelectionDAGBuilder::visitFence(const FenceInst &I) {
5337 SDLoc dl = getCurSDLoc();
5338 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5339 SDValue Ops[3];
5340 Ops[0] = getRoot();
5341 Ops[1] = DAG.getTargetConstant((unsigned)I.getOrdering(), dl,
5342 TLI.getFenceOperandTy(DAG.getDataLayout()));
5343 Ops[2] = DAG.getTargetConstant(I.getSyncScopeID(), dl,
5344 TLI.getFenceOperandTy(DAG.getDataLayout()));
5345 SDValue N = DAG.getNode(ISD::ATOMIC_FENCE, dl, MVT::Other, Ops);
5346 setValue(&I, N);
5347 DAG.setRoot(N);
5348}
5349
5350void SelectionDAGBuilder::visitAtomicLoad(const LoadInst &I) {
5351 SDLoc dl = getCurSDLoc();
5352 AtomicOrdering Order = I.getOrdering();
5353 SyncScope::ID SSID = I.getSyncScopeID();
5354
5355 SDValue InChain = getRoot();
5356
5357 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5358 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
5359 EVT MemVT = TLI.getMemValueType(DAG.getDataLayout(), I.getType());
5360
5361 if (!TLI.supportsUnalignedAtomics() &&
5362 I.getAlign().value() < MemVT.getSizeInBits() / 8)
5363 report_fatal_error("Cannot generate unaligned atomic load");
5364
5365 auto Flags = TLI.getLoadMemOperandFlags(I, DAG.getDataLayout(), AC, LibInfo);
5366
5367 const MDNode *Ranges = getRangeMetadata(I);
5368 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
5369 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5370 I.getAlign(), AAMDNodes(), Ranges, SSID, Order);
5371
5372 InChain = TLI.prepareVolatileOrAtomicLoad(InChain, dl, DAG);
5373
5374 SDValue Ptr = getValue(I.getPointerOperand());
5375 SDValue L =
5376 DAG.getAtomicLoad(ISD::NON_EXTLOAD, dl, MemVT, MemVT, InChain, Ptr, MMO);
5377
5378 SDValue OutChain = L.getValue(1);
5379 if (MemVT != VT)
5380 L = DAG.getPtrExtOrTrunc(L, dl, VT);
5381
5382 setValue(&I, L);
5383 DAG.setRoot(OutChain);
5384}
5385
5386void SelectionDAGBuilder::visitAtomicStore(const StoreInst &I) {
5387 SDLoc dl = getCurSDLoc();
5388
5389 AtomicOrdering Ordering = I.getOrdering();
5390 SyncScope::ID SSID = I.getSyncScopeID();
5391
5392 SDValue InChain = getRoot();
5393
5394 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5395 EVT MemVT =
5396 TLI.getMemValueType(DAG.getDataLayout(), I.getValueOperand()->getType());
5397
5398 if (!TLI.supportsUnalignedAtomics() &&
5399 I.getAlign().value() < MemVT.getSizeInBits() / 8)
5400 report_fatal_error("Cannot generate unaligned atomic store");
5401
5402 auto Flags = TLI.getStoreMemOperandFlags(I, DAG.getDataLayout());
5403
5404 MachineFunction &MF = DAG.getMachineFunction();
5405 MachineMemOperand *MMO = MF.getMachineMemOperand(
5406 MachinePointerInfo(I.getPointerOperand()), Flags, MemVT.getStoreSize(),
5407 I.getAlign(), AAMDNodes(), nullptr, SSID, Ordering);
5408
5409 SDValue Val = getValue(I.getValueOperand());
5410 if (Val.getValueType() != MemVT)
5411 Val = DAG.getPtrExtOrTrunc(Val, dl, MemVT);
5412 SDValue Ptr = getValue(I.getPointerOperand());
5413
5414 SDValue OutChain =
5415 DAG.getAtomic(ISD::ATOMIC_STORE, dl, MemVT, InChain, Val, Ptr, MMO);
5416
5417 setValue(&I, OutChain);
5418 DAG.setRoot(OutChain);
5419}
5420
5421/// Check if this intrinsic call depends on the chain (1st return value)
5422/// and if it only *loads* memory.
5423/// Ignore the callsite's attributes. A specific call site may be marked with
5424/// readnone, but the lowering code will expect the chain based on the
5425/// definition.
5426std::pair<bool, bool>
5427SelectionDAGBuilder::getTargetIntrinsicCallProperties(const CallBase &I) {
5428 const Function *F = I.getCalledFunction();
5429 bool HasChain = !F->doesNotAccessMemory();
5430 bool OnlyLoad =
5431 HasChain && F->onlyReadsMemory() && F->willReturn() && F->doesNotThrow();
5432
5433 return {HasChain, OnlyLoad};
5434}
5435
5436SmallVector<SDValue, 8> SelectionDAGBuilder::getTargetIntrinsicOperands(
5437 const CallBase &I, bool HasChain, bool OnlyLoad,
5438 TargetLowering::IntrinsicInfo *TgtMemIntrinsicInfo) {
5439 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5440
5441 // Build the operand list.
5443 if (HasChain) { // If this intrinsic has side-effects, chainify it.
5444 if (OnlyLoad) {
5445 // We don't need to serialize loads against other loads.
5446 Ops.push_back(DAG.getRoot());
5447 } else {
5448 Ops.push_back(getRoot());
5449 }
5450 }
5451
5452 // Add the intrinsic ID as an integer operand if it's not a target intrinsic.
5453 if (!TgtMemIntrinsicInfo || TgtMemIntrinsicInfo->opc == ISD::INTRINSIC_VOID ||
5454 TgtMemIntrinsicInfo->opc == ISD::INTRINSIC_W_CHAIN)
5455 Ops.push_back(DAG.getTargetConstant(I.getIntrinsicID(), getCurSDLoc(),
5456 TLI.getPointerTy(DAG.getDataLayout())));
5457
5458 // Add all operands of the call to the operand list.
5459 for (unsigned i = 0, e = I.arg_size(); i != e; ++i) {
5460 const Value *Arg = I.getArgOperand(i);
5461 if (!I.paramHasAttr(i, Attribute::ImmArg)) {
5462 Ops.push_back(getValue(Arg));
5463 continue;
5464 }
5465
5466 // Use TargetConstant instead of a regular constant for immarg.
5467 EVT VT = TLI.getValueType(DAG.getDataLayout(), Arg->getType(), true);
5468 if (const ConstantInt *CI = dyn_cast<ConstantInt>(Arg)) {
5469 assert(CI->getBitWidth() <= 64 &&
5470 "large intrinsic immediates not handled");
5471 Ops.push_back(DAG.getTargetConstant(*CI, SDLoc(), VT));
5472 } else {
5473 Ops.push_back(
5474 DAG.getTargetConstantFP(*cast<ConstantFP>(Arg), SDLoc(), VT));
5475 }
5476 }
5477
5478 if (std::optional<OperandBundleUse> Bundle =
5479 I.getOperandBundle(LLVMContext::OB_deactivation_symbol)) {
5480 auto *Sym = Bundle->Inputs[0].get();
5481 SDValue SDSym = getValue(Sym);
5482 SDSym = DAG.getDeactivationSymbol(cast<GlobalValue>(Sym));
5483 Ops.push_back(SDSym);
5484 }
5485
5486 if (std::optional<OperandBundleUse> Bundle =
5487 I.getOperandBundle(LLVMContext::OB_convergencectrl)) {
5488 Value *Token = Bundle->Inputs[0].get();
5489 SDValue ConvControlToken = getValue(Token);
5490 assert(Ops.back().getValueType() != MVT::Glue &&
5491 "Did not expect another glue node here.");
5492 ConvControlToken =
5493 DAG.getNode(ISD::CONVERGENCECTRL_GLUE, {}, MVT::Glue, ConvControlToken);
5494 Ops.push_back(ConvControlToken);
5495 }
5496
5497 return Ops;
5498}
5499
5500SDVTList SelectionDAGBuilder::getTargetIntrinsicVTList(const CallBase &I,
5501 bool HasChain) {
5502 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5503
5504 SmallVector<EVT, 4> ValueVTs;
5505 ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);
5506
5507 if (HasChain)
5508 ValueVTs.push_back(MVT::Other);
5509
5510 return DAG.getVTList(ValueVTs);
5511}
5512
5513/// Get an INTRINSIC node for a target intrinsic which does not touch memory.
5514SDValue SelectionDAGBuilder::getTargetNonMemIntrinsicNode(
5515 const Type &IntrinsicVT, bool HasChain, ArrayRef<SDValue> Ops,
5516 const SDVTList &VTs) {
5517 if (!HasChain)
5518 return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, getCurSDLoc(), VTs, Ops);
5519 if (!IntrinsicVT.isVoidTy())
5520 return DAG.getNode(ISD::INTRINSIC_W_CHAIN, getCurSDLoc(), VTs, Ops);
5521 return DAG.getNode(ISD::INTRINSIC_VOID, getCurSDLoc(), VTs, Ops);
5522}
5523
5524/// Set root, convert return type if necessary and check alignment.
5525SDValue SelectionDAGBuilder::handleTargetIntrinsicRet(const CallBase &I,
5526 bool HasChain,
5527 bool OnlyLoad,
5528 SDValue Result) {
5529 if (HasChain) {
5530 SDValue Chain = Result.getValue(Result.getNode()->getNumValues() - 1);
5531 if (OnlyLoad)
5532 PendingLoads.push_back(Chain);
5533 else
5534 DAG.setRoot(Chain);
5535 }
5536
5537 if (I.getType()->isVoidTy())
5538 return Result;
5539
5540 if (MaybeAlign Alignment = I.getRetAlign(); InsertAssertAlign && Alignment) {
5541 // Insert `assertalign` node if there's an alignment.
5542 Result = DAG.getAssertAlign(getCurSDLoc(), Result, Alignment.valueOrOne());
5543 } else if (!isa<VectorType>(I.getType())) {
5544 Result = lowerRangeToAssertZExt(DAG, I, Result);
5545 }
5546
5547 return Result;
5548}
5549
5550/// visitTargetIntrinsic - Lower a call of a target intrinsic to an INTRINSIC
5551/// node.
5552void SelectionDAGBuilder::visitTargetIntrinsic(const CallInst &I,
5553 unsigned Intrinsic) {
5554 auto [HasChain, OnlyLoad] = getTargetIntrinsicCallProperties(I);
5555 Intrinsic::ID IntrinsicID = static_cast<Intrinsic::ID>(Intrinsic);
5556
5557 if (!DAG.getMachineFunction().getSubtarget().isIntrinsicSupported(
5558 Intrinsic)) {
5559 SDLoc DL = getCurSDLoc();
5560 DAG.getContext()->diagnose(DiagnosticInfoUnsupportedTargetIntrinsic(
5561 *I.getFunction(), IntrinsicID, DL.getDebugLoc()));
5562
5563 // The intrinsic is not available on this subtarget. Preserve the chain for
5564 // side-effecting intrinsics and lower any result to poison so that
5565 // compilation can continue and collect further diagnostics.
5566 if (HasChain && !OnlyLoad)
5567 DAG.setRoot(getRoot());
5568
5569 if (!I.getType()->isVoidTy()) {
5570 SmallVector<EVT, 4> ValueVTs;
5571 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(),
5572 I.getType(), ValueVTs);
5574 for (EVT VT : ValueVTs)
5575 Results.push_back(DAG.getPOISON(VT));
5576 setValue(&I, DAG.getMergeValues(Results, DL));
5577 }
5578 return;
5579 }
5580
5581 // Infos is set by getTgtMemIntrinsic.
5583 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5584 TLI.getTgtMemIntrinsic(Infos, I, DAG.getMachineFunction(), Intrinsic);
5585 // Use the first (primary) info determines the node opcode.
5586 TargetLowering::IntrinsicInfo *Info = !Infos.empty() ? &Infos[0] : nullptr;
5587
5589 getTargetIntrinsicOperands(I, HasChain, OnlyLoad, Info);
5590 SDVTList VTs = getTargetIntrinsicVTList(I, HasChain);
5591
5592 // Propagate fast-math-flags from IR to node(s).
5593 SDNodeFlags Flags;
5594 if (auto *FPMO = dyn_cast<FPMathOperator>(&I))
5595 Flags.copyFMF(*FPMO);
5596 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
5597
5598 // Create the node.
5600
5601 // In some cases, custom collection of operands from CallInst I may be needed.
5603 if (!Infos.empty()) {
5604 // This is target intrinsic that touches memory
5605 // Create MachineMemOperands for each memory access described by the target.
5606 MachineFunction &MF = DAG.getMachineFunction();
5608 for (const auto &Info : Infos) {
5609 // TODO: We currently just fallback to address space 0 if
5610 // getTgtMemIntrinsic didn't yield anything useful.
5611 MachinePointerInfo MPI;
5612 if (Info.ptrVal)
5613 MPI = MachinePointerInfo(Info.ptrVal, Info.offset);
5614 else if (Info.fallbackAddressSpace)
5615 MPI = MachinePointerInfo(*Info.fallbackAddressSpace);
5616 EVT MemVT = Info.memVT;
5617 LocationSize Size = LocationSize::precise(Info.size);
5618 if (Size.hasValue() && !Size.getValue())
5620 Align Alignment = Info.align.value_or(DAG.getEVTAlign(MemVT));
5621 MachineMemOperand *MMO = MF.getMachineMemOperand(
5622 MPI, Info.flags, Size, Alignment, I.getAAMetadata(),
5623 /*Ranges=*/nullptr, Info.ssid, Info.order, Info.failureOrder);
5624 MMOs.push_back(MMO);
5625 }
5626
5627 Result = DAG.getMemIntrinsicNode(Info->opc, getCurSDLoc(), VTs, Ops,
5628 Info->memVT, MMOs);
5629 } else {
5630 Result = getTargetNonMemIntrinsicNode(*I.getType(), HasChain, Ops, VTs);
5631 }
5632
5633 Result = handleTargetIntrinsicRet(I, HasChain, OnlyLoad, Result);
5634
5635 setValue(&I, Result);
5636}
5637
5638/// GetSignificand - Get the significand and build it into a floating-point
5639/// number with exponent of 1:
5640///
5641/// Op = (Op & 0x007fffff) | 0x3f800000;
5642///
5643/// where Op is the hexadecimal representation of floating point value.
5645 SDValue t1 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
5646 DAG.getConstant(0x007fffff, dl, MVT::i32));
5647 SDValue t2 = DAG.getNode(ISD::OR, dl, MVT::i32, t1,
5648 DAG.getConstant(0x3f800000, dl, MVT::i32));
5649 return DAG.getNode(ISD::BITCAST, dl, MVT::f32, t2);
5650}
5651
5652/// GetExponent - Get the exponent:
5653///
5654/// (float)(int)(((Op & 0x7f800000) >> 23) - 127);
5655///
5656/// where Op is the hexadecimal representation of floating point value.
5658 const TargetLowering &TLI, const SDLoc &dl) {
5659 SDValue t0 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,
5660 DAG.getConstant(0x7f800000, dl, MVT::i32));
5661 SDValue t1 = DAG.getNode(ISD::SRL, dl, MVT::i32, t0,
5662 DAG.getShiftAmountConstant(23, MVT::i32, dl));
5663 SDValue t2 = DAG.getNode(ISD::SUB, dl, MVT::i32, t1,
5664 DAG.getConstant(127, dl, MVT::i32));
5665 return DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, t2);
5666}
5667
5668/// getF32Constant - Get 32-bit floating point constant.
5669static SDValue getF32Constant(SelectionDAG &DAG, unsigned Flt,
5670 const SDLoc &dl) {
5671 return DAG.getConstantFP(APFloat(APFloat::IEEEsingle(), APInt(32, Flt)), dl,
5672 MVT::f32);
5673}
5674
5676 SelectionDAG &DAG) {
5677 // TODO: What fast-math-flags should be set on the floating-point nodes?
5678
5679 // IntegerPartOfX = ((int32_t)(t0);
5680 SDValue IntegerPartOfX = DAG.getNode(ISD::FP_TO_SINT, dl, MVT::i32, t0);
5681
5682 // FractionalPartOfX = t0 - (float)IntegerPartOfX;
5683 SDValue t1 = DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, IntegerPartOfX);
5684 SDValue X = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0, t1);
5685
5686 // IntegerPartOfX <<= 23;
5687 IntegerPartOfX = DAG.getNode(ISD::SHL, dl, MVT::i32, IntegerPartOfX,
5688 DAG.getShiftAmountConstant(23, MVT::i32, dl));
5689
5690 SDValue TwoToFractionalPartOfX;
5691 if (LimitFloatPrecision <= 6) {
5692 // For floating-point precision of 6:
5693 //
5694 // TwoToFractionalPartOfX =
5695 // 0.997535578f +
5696 // (0.735607626f + 0.252464424f * x) * x;
5697 //
5698 // error 0.0144103317, which is 6 bits
5699 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5700 getF32Constant(DAG, 0x3e814304, dl));
5701 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5702 getF32Constant(DAG, 0x3f3c50c8, dl));
5703 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5704 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5705 getF32Constant(DAG, 0x3f7f5e7e, dl));
5706 } else if (LimitFloatPrecision <= 12) {
5707 // For floating-point precision of 12:
5708 //
5709 // TwoToFractionalPartOfX =
5710 // 0.999892986f +
5711 // (0.696457318f +
5712 // (0.224338339f + 0.792043434e-1f * x) * x) * x;
5713 //
5714 // error 0.000107046256, which is 13 to 14 bits
5715 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5716 getF32Constant(DAG, 0x3da235e3, dl));
5717 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5718 getF32Constant(DAG, 0x3e65b8f3, dl));
5719 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5720 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5721 getF32Constant(DAG, 0x3f324b07, dl));
5722 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5723 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5724 getF32Constant(DAG, 0x3f7ff8fd, dl));
5725 } else { // LimitFloatPrecision <= 18
5726 // For floating-point precision of 18:
5727 //
5728 // TwoToFractionalPartOfX =
5729 // 0.999999982f +
5730 // (0.693148872f +
5731 // (0.240227044f +
5732 // (0.554906021e-1f +
5733 // (0.961591928e-2f +
5734 // (0.136028312e-2f + 0.157059148e-3f *x)*x)*x)*x)*x)*x;
5735 // error 2.47208000*10^(-7), which is better than 18 bits
5736 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5737 getF32Constant(DAG, 0x3924b03e, dl));
5738 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
5739 getF32Constant(DAG, 0x3ab24b87, dl));
5740 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5741 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5742 getF32Constant(DAG, 0x3c1d8c17, dl));
5743 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5744 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
5745 getF32Constant(DAG, 0x3d634a1d, dl));
5746 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5747 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5748 getF32Constant(DAG, 0x3e75fe14, dl));
5749 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5750 SDValue t11 = DAG.getNode(ISD::FADD, dl, MVT::f32, t10,
5751 getF32Constant(DAG, 0x3f317234, dl));
5752 SDValue t12 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t11, X);
5753 TwoToFractionalPartOfX = DAG.getNode(ISD::FADD, dl, MVT::f32, t12,
5754 getF32Constant(DAG, 0x3f800000, dl));
5755 }
5756
5757 // Add the exponent into the result in integer domain.
5758 SDValue t13 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, TwoToFractionalPartOfX);
5759 return DAG.getNode(ISD::BITCAST, dl, MVT::f32,
5760 DAG.getNode(ISD::ADD, dl, MVT::i32, t13, IntegerPartOfX));
5761}
5762
5763/// expandExp - Lower an exp intrinsic. Handles the special sequences for
5764/// limited-precision mode.
5766 const TargetLowering &TLI, SDNodeFlags Flags) {
5767 if (Op.getValueType() == MVT::f32 &&
5769
5770 // Put the exponent in the right bit position for later addition to the
5771 // final result:
5772 //
5773 // t0 = Op * log2(e)
5774
5775 // TODO: What fast-math-flags should be set here?
5776 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, Op,
5777 DAG.getConstantFP(numbers::log2ef, dl, MVT::f32));
5778 return getLimitedPrecisionExp2(t0, dl, DAG);
5779 }
5780
5781 // No special expansion.
5782 return DAG.getNode(ISD::FEXP, dl, Op.getValueType(), Op, Flags);
5783}
5784
5785/// expandLog - Lower a log intrinsic. Handles the special sequences for
5786/// limited-precision mode.
5788 const TargetLowering &TLI, SDNodeFlags Flags) {
5789 // TODO: What fast-math-flags should be set on the floating-point nodes?
5790
5791 if (Op.getValueType() == MVT::f32 &&
5793 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5794
5795 // Scale the exponent by log(2).
5796 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5797 SDValue LogOfExponent =
5798 DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5799 DAG.getConstantFP(numbers::ln2f, dl, MVT::f32));
5800
5801 // Get the significand and build it into a floating-point number with
5802 // exponent of 1.
5803 SDValue X = GetSignificand(DAG, Op1, dl);
5804
5805 SDValue LogOfMantissa;
5806 if (LimitFloatPrecision <= 6) {
5807 // For floating-point precision of 6:
5808 //
5809 // LogofMantissa =
5810 // -1.1609546f +
5811 // (1.4034025f - 0.23903021f * x) * x;
5812 //
5813 // error 0.0034276066, which is better than 8 bits
5814 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5815 getF32Constant(DAG, 0xbe74c456, dl));
5816 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5817 getF32Constant(DAG, 0x3fb3a2b1, dl));
5818 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5819 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5820 getF32Constant(DAG, 0x3f949a29, dl));
5821 } else if (LimitFloatPrecision <= 12) {
5822 // For floating-point precision of 12:
5823 //
5824 // LogOfMantissa =
5825 // -1.7417939f +
5826 // (2.8212026f +
5827 // (-1.4699568f +
5828 // (0.44717955f - 0.56570851e-1f * x) * x) * x) * x;
5829 //
5830 // error 0.000061011436, which is 14 bits
5831 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5832 getF32Constant(DAG, 0xbd67b6d6, dl));
5833 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5834 getF32Constant(DAG, 0x3ee4f4b8, dl));
5835 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5836 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5837 getF32Constant(DAG, 0x3fbc278b, dl));
5838 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5839 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5840 getF32Constant(DAG, 0x40348e95, dl));
5841 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5842 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5843 getF32Constant(DAG, 0x3fdef31a, dl));
5844 } else { // LimitFloatPrecision <= 18
5845 // For floating-point precision of 18:
5846 //
5847 // LogOfMantissa =
5848 // -2.1072184f +
5849 // (4.2372794f +
5850 // (-3.7029485f +
5851 // (2.2781945f +
5852 // (-0.87823314f +
5853 // (0.19073739f - 0.17809712e-1f * x) * x) * x) * x) * x)*x;
5854 //
5855 // error 0.0000023660568, which is better than 18 bits
5856 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5857 getF32Constant(DAG, 0xbc91e5ac, dl));
5858 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5859 getF32Constant(DAG, 0x3e4350aa, dl));
5860 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5861 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5862 getF32Constant(DAG, 0x3f60d3e3, dl));
5863 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5864 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5865 getF32Constant(DAG, 0x4011cdf0, dl));
5866 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5867 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5868 getF32Constant(DAG, 0x406cfd1c, dl));
5869 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5870 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5871 getF32Constant(DAG, 0x408797cb, dl));
5872 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5873 LogOfMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t10,
5874 getF32Constant(DAG, 0x4006dcab, dl));
5875 }
5876
5877 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, LogOfMantissa);
5878 }
5879
5880 // No special expansion.
5881 return DAG.getNode(ISD::FLOG, dl, Op.getValueType(), Op, Flags);
5882}
5883
5884/// expandLog2 - Lower a log2 intrinsic. Handles the special sequences for
5885/// limited-precision mode.
5887 const TargetLowering &TLI, SDNodeFlags Flags) {
5888 // TODO: What fast-math-flags should be set on the floating-point nodes?
5889
5890 if (Op.getValueType() == MVT::f32 &&
5892 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5893
5894 // Get the exponent.
5895 SDValue LogOfExponent = GetExponent(DAG, Op1, TLI, dl);
5896
5897 // Get the significand and build it into a floating-point number with
5898 // exponent of 1.
5899 SDValue X = GetSignificand(DAG, Op1, dl);
5900
5901 // Different possible minimax approximations of significand in
5902 // floating-point for various degrees of accuracy over [1,2].
5903 SDValue Log2ofMantissa;
5904 if (LimitFloatPrecision <= 6) {
5905 // For floating-point precision of 6:
5906 //
5907 // Log2ofMantissa = -1.6749035f + (2.0246817f - .34484768f * x) * x;
5908 //
5909 // error 0.0049451742, which is more than 7 bits
5910 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5911 getF32Constant(DAG, 0xbeb08fe0, dl));
5912 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5913 getF32Constant(DAG, 0x40019463, dl));
5914 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5915 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5916 getF32Constant(DAG, 0x3fd6633d, dl));
5917 } else if (LimitFloatPrecision <= 12) {
5918 // For floating-point precision of 12:
5919 //
5920 // Log2ofMantissa =
5921 // -2.51285454f +
5922 // (4.07009056f +
5923 // (-2.12067489f +
5924 // (.645142248f - 0.816157886e-1f * x) * x) * x) * x;
5925 //
5926 // error 0.0000876136000, which is better than 13 bits
5927 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5928 getF32Constant(DAG, 0xbda7262e, dl));
5929 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5930 getF32Constant(DAG, 0x3f25280b, dl));
5931 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5932 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5933 getF32Constant(DAG, 0x4007b923, dl));
5934 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5935 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5936 getF32Constant(DAG, 0x40823e2f, dl));
5937 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5938 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5939 getF32Constant(DAG, 0x4020d29c, dl));
5940 } else { // LimitFloatPrecision <= 18
5941 // For floating-point precision of 18:
5942 //
5943 // Log2ofMantissa =
5944 // -3.0400495f +
5945 // (6.1129976f +
5946 // (-5.3420409f +
5947 // (3.2865683f +
5948 // (-1.2669343f +
5949 // (0.27515199f -
5950 // 0.25691327e-1f * x) * x) * x) * x) * x) * x;
5951 //
5952 // error 0.0000018516, which is better than 18 bits
5953 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
5954 getF32Constant(DAG, 0xbcd2769e, dl));
5955 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
5956 getF32Constant(DAG, 0x3e8ce0b9, dl));
5957 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
5958 SDValue t3 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
5959 getF32Constant(DAG, 0x3fa22ae7, dl));
5960 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
5961 SDValue t5 = DAG.getNode(ISD::FADD, dl, MVT::f32, t4,
5962 getF32Constant(DAG, 0x40525723, dl));
5963 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
5964 SDValue t7 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t6,
5965 getF32Constant(DAG, 0x40aaf200, dl));
5966 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
5967 SDValue t9 = DAG.getNode(ISD::FADD, dl, MVT::f32, t8,
5968 getF32Constant(DAG, 0x40c39dad, dl));
5969 SDValue t10 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t9, X);
5970 Log2ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t10,
5971 getF32Constant(DAG, 0x4042902c, dl));
5972 }
5973
5974 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, Log2ofMantissa);
5975 }
5976
5977 // No special expansion.
5978 return DAG.getNode(ISD::FLOG2, dl, Op.getValueType(), Op, Flags);
5979}
5980
5981/// expandLog10 - Lower a log10 intrinsic. Handles the special sequences for
5982/// limited-precision mode.
5984 const TargetLowering &TLI, SDNodeFlags Flags) {
5985 // TODO: What fast-math-flags should be set on the floating-point nodes?
5986
5987 if (Op.getValueType() == MVT::f32 &&
5989 SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
5990
5991 // Scale the exponent by log10(2) [0.30102999f].
5992 SDValue Exp = GetExponent(DAG, Op1, TLI, dl);
5993 SDValue LogOfExponent = DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp,
5994 getF32Constant(DAG, 0x3e9a209a, dl));
5995
5996 // Get the significand and build it into a floating-point number with
5997 // exponent of 1.
5998 SDValue X = GetSignificand(DAG, Op1, dl);
5999
6000 SDValue Log10ofMantissa;
6001 if (LimitFloatPrecision <= 6) {
6002 // For floating-point precision of 6:
6003 //
6004 // Log10ofMantissa =
6005 // -0.50419619f +
6006 // (0.60948995f - 0.10380950f * x) * x;
6007 //
6008 // error 0.0014886165, which is 6 bits
6009 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
6010 getF32Constant(DAG, 0xbdd49a13, dl));
6011 SDValue t1 = DAG.getNode(ISD::FADD, dl, MVT::f32, t0,
6012 getF32Constant(DAG, 0x3f1c0789, dl));
6013 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
6014 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t2,
6015 getF32Constant(DAG, 0x3f011300, dl));
6016 } else if (LimitFloatPrecision <= 12) {
6017 // For floating-point precision of 12:
6018 //
6019 // Log10ofMantissa =
6020 // -0.64831180f +
6021 // (0.91751397f +
6022 // (-0.31664806f + 0.47637168e-1f * x) * x) * x;
6023 //
6024 // error 0.00019228036, which is better than 12 bits
6025 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
6026 getF32Constant(DAG, 0x3d431f31, dl));
6027 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
6028 getF32Constant(DAG, 0x3ea21fb2, dl));
6029 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
6030 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
6031 getF32Constant(DAG, 0x3f6ae232, dl));
6032 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
6033 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
6034 getF32Constant(DAG, 0x3f25f7c3, dl));
6035 } else { // LimitFloatPrecision <= 18
6036 // For floating-point precision of 18:
6037 //
6038 // Log10ofMantissa =
6039 // -0.84299375f +
6040 // (1.5327582f +
6041 // (-1.0688956f +
6042 // (0.49102474f +
6043 // (-0.12539807f + 0.13508273e-1f * x) * x) * x) * x) * x;
6044 //
6045 // error 0.0000037995730, which is better than 18 bits
6046 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, X,
6047 getF32Constant(DAG, 0x3c5d51ce, dl));
6048 SDValue t1 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t0,
6049 getF32Constant(DAG, 0x3e00685a, dl));
6050 SDValue t2 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t1, X);
6051 SDValue t3 = DAG.getNode(ISD::FADD, dl, MVT::f32, t2,
6052 getF32Constant(DAG, 0x3efb6798, dl));
6053 SDValue t4 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t3, X);
6054 SDValue t5 = DAG.getNode(ISD::FSUB, dl, MVT::f32, t4,
6055 getF32Constant(DAG, 0x3f88d192, dl));
6056 SDValue t6 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t5, X);
6057 SDValue t7 = DAG.getNode(ISD::FADD, dl, MVT::f32, t6,
6058 getF32Constant(DAG, 0x3fc4316c, dl));
6059 SDValue t8 = DAG.getNode(ISD::FMUL, dl, MVT::f32, t7, X);
6060 Log10ofMantissa = DAG.getNode(ISD::FSUB, dl, MVT::f32, t8,
6061 getF32Constant(DAG, 0x3f57ce70, dl));
6062 }
6063
6064 return DAG.getNode(ISD::FADD, dl, MVT::f32, LogOfExponent, Log10ofMantissa);
6065 }
6066
6067 // No special expansion.
6068 return DAG.getNode(ISD::FLOG10, dl, Op.getValueType(), Op, Flags);
6069}
6070
6071/// expandExp2 - Lower an exp2 intrinsic. Handles the special sequences for
6072/// limited-precision mode.
6074 const TargetLowering &TLI, SDNodeFlags Flags) {
6075 if (Op.getValueType() == MVT::f32 &&
6077 return getLimitedPrecisionExp2(Op, dl, DAG);
6078
6079 // No special expansion.
6080 return DAG.getNode(ISD::FEXP2, dl, Op.getValueType(), Op, Flags);
6081}
6082
6083/// visitPow - Lower a pow intrinsic. Handles the special sequences for
6084/// limited-precision mode with x == 10.0f.
6086 SelectionDAG &DAG, const TargetLowering &TLI,
6087 SDNodeFlags Flags) {
6088 bool IsExp10 = false;
6089 if (LHS.getValueType() == MVT::f32 && RHS.getValueType() == MVT::f32 &&
6092 APFloat Ten(10.0f);
6093 IsExp10 = LHSC->isExactlyValue(Ten);
6094 }
6095 }
6096
6097 // TODO: What fast-math-flags should be set on the FMUL node?
6098 if (IsExp10) {
6099 // Put the exponent in the right bit position for later addition to the
6100 // final result:
6101 //
6102 // #define LOG2OF10 3.3219281f
6103 // t0 = Op * LOG2OF10;
6104 SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, RHS,
6105 getF32Constant(DAG, 0x40549a78, dl));
6106 return getLimitedPrecisionExp2(t0, dl, DAG);
6107 }
6108
6109 // No special expansion.
6110 return DAG.getNode(ISD::FPOW, dl, LHS.getValueType(), LHS, RHS, Flags);
6111}
6112
6113/// ExpandPowI - Expand a llvm.powi intrinsic.
6115 SelectionDAG &DAG) {
6116 // If RHS is a constant, we can expand this out to a multiplication tree if
6117 // it's beneficial on the target, otherwise we end up lowering to a call to
6118 // __powidf2 (for example).
6120 unsigned Val = RHSC->getSExtValue();
6121
6122 // powi(x, 0) -> 1.0
6123 if (Val == 0)
6124 return DAG.getConstantFP(1.0, DL, LHS.getValueType());
6125
6127 Val, DAG.shouldOptForSize())) {
6128 // Get the exponent as a positive value.
6129 if ((int)Val < 0)
6130 Val = -Val;
6131 // We use the simple binary decomposition method to generate the multiply
6132 // sequence. There are more optimal ways to do this (for example,
6133 // powi(x,15) generates one more multiply than it should), but this has
6134 // the benefit of being both really simple and much better than a libcall.
6135 SDValue Res; // Logically starts equal to 1.0
6136 SDValue CurSquare = LHS;
6137 // TODO: Intrinsics should have fast-math-flags that propagate to these
6138 // nodes.
6139 while (Val) {
6140 if (Val & 1) {
6141 if (Res.getNode())
6142 Res =
6143 DAG.getNode(ISD::FMUL, DL, Res.getValueType(), Res, CurSquare);
6144 else
6145 Res = CurSquare; // 1.0*CurSquare.
6146 }
6147
6148 CurSquare = DAG.getNode(ISD::FMUL, DL, CurSquare.getValueType(),
6149 CurSquare, CurSquare);
6150 Val >>= 1;
6151 }
6152
6153 // If the original was negative, invert the result, producing 1/(x*x*x).
6154 if (RHSC->getSExtValue() < 0)
6155 Res = DAG.getNode(ISD::FDIV, DL, LHS.getValueType(),
6156 DAG.getConstantFP(1.0, DL, LHS.getValueType()), Res);
6157 return Res;
6158 }
6159 }
6160
6161 // Otherwise, expand to a libcall.
6162 return DAG.getNode(ISD::FPOWI, DL, LHS.getValueType(), LHS, RHS);
6163}
6164
6165static SDValue expandDivFix(unsigned Opcode, const SDLoc &DL,
6166 SDValue LHS, SDValue RHS, SDValue Scale,
6167 SelectionDAG &DAG, const TargetLowering &TLI) {
6168 EVT VT = LHS.getValueType();
6169 bool Signed = Opcode == ISD::SDIVFIX || Opcode == ISD::SDIVFIXSAT;
6170 bool Saturating = Opcode == ISD::SDIVFIXSAT || Opcode == ISD::UDIVFIXSAT;
6171 LLVMContext &Ctx = *DAG.getContext();
6172
6173 // If the type is legal but the operation isn't, this node might survive all
6174 // the way to operation legalization. If we end up there and we do not have
6175 // the ability to widen the type (if VT*2 is not legal), we cannot expand the
6176 // node.
6177
6178 // Coax the legalizer into expanding the node during type legalization instead
6179 // by bumping the size by one bit. This will force it to Promote, enabling the
6180 // early expansion and avoiding the need to expand later.
6181
6182 // We don't have to do this if Scale is 0; that can always be expanded, unless
6183 // it's a saturating signed operation. Those can experience true integer
6184 // division overflow, a case which we must avoid.
6185
6186 // FIXME: We wouldn't have to do this (or any of the early
6187 // expansion/promotion) if it was possible to expand a libcall of an
6188 // illegal type during operation legalization. But it's not, so things
6189 // get a bit hacky.
6190 unsigned ScaleInt = Scale->getAsZExtVal();
6191 if ((ScaleInt > 0 || (Saturating && Signed)) &&
6192 (TLI.isTypeLegal(VT) ||
6193 (VT.isVector() && TLI.isTypeLegal(VT.getVectorElementType())))) {
6195 Opcode, VT, ScaleInt);
6196 if (Action != TargetLowering::Legal && Action != TargetLowering::Custom) {
6197 EVT PromVT;
6198 if (VT.isScalarInteger())
6199 PromVT = EVT::getIntegerVT(Ctx, VT.getSizeInBits() + 1);
6200 else if (VT.isVector()) {
6201 PromVT = VT.getVectorElementType();
6202 PromVT = EVT::getIntegerVT(Ctx, PromVT.getSizeInBits() + 1);
6203 PromVT = EVT::getVectorVT(Ctx, PromVT, VT.getVectorElementCount());
6204 } else
6205 llvm_unreachable("Wrong VT for DIVFIX?");
6206 LHS = DAG.getExtOrTrunc(Signed, LHS, DL, PromVT);
6207 RHS = DAG.getExtOrTrunc(Signed, RHS, DL, PromVT);
6208 EVT ShiftTy = TLI.getShiftAmountTy(PromVT, DAG.getDataLayout());
6209 // For saturating operations, we need to shift up the LHS to get the
6210 // proper saturation width, and then shift down again afterwards.
6211 if (Saturating)
6212 LHS = DAG.getNode(ISD::SHL, DL, PromVT, LHS,
6213 DAG.getConstant(1, DL, ShiftTy));
6214 SDValue Res = DAG.getNode(Opcode, DL, PromVT, LHS, RHS, Scale);
6215 if (Saturating)
6216 Res = DAG.getNode(Signed ? ISD::SRA : ISD::SRL, DL, PromVT, Res,
6217 DAG.getConstant(1, DL, ShiftTy));
6218 return DAG.getZExtOrTrunc(Res, DL, VT);
6219 }
6220 }
6221
6222 return DAG.getNode(Opcode, DL, VT, LHS, RHS, Scale);
6223}
6224
6225// getUnderlyingArgRegs - Find underlying registers used for a truncated,
6226// bitcasted, or split argument. Returns a list of <Register, size in bits>
6227static void
6228getUnderlyingArgRegs(SmallVectorImpl<std::pair<Register, TypeSize>> &Regs,
6229 const SDValue &N) {
6230 switch (N.getOpcode()) {
6231 case ISD::CopyFromReg: {
6232 SDValue Op = N.getOperand(1);
6233 Regs.emplace_back(cast<RegisterSDNode>(Op)->getReg(),
6234 Op.getValueType().getSizeInBits());
6235 return;
6236 }
6237 case ISD::BITCAST:
6238 case ISD::AssertZext:
6239 case ISD::AssertSext:
6240 case ISD::TRUNCATE:
6241 getUnderlyingArgRegs(Regs, N.getOperand(0));
6242 return;
6243 case ISD::BUILD_PAIR:
6244 case ISD::BUILD_VECTOR:
6246 for (SDValue Op : N->op_values())
6247 getUnderlyingArgRegs(Regs, Op);
6248 return;
6249 default:
6250 return;
6251 }
6252}
6253
6254/// If the DbgValueInst is a dbg_value of a function argument, create the
6255/// corresponding DBG_VALUE machine instruction for it now. At the end of
6256/// instruction selection, they will be inserted to the entry BB.
6257/// We don't currently support this for variadic dbg_values, as they shouldn't
6258/// appear for function arguments or in the prologue.
6259bool SelectionDAGBuilder::EmitFuncArgumentDbgValue(
6260 const Value *V, DILocalVariable *Variable, DIExpression *Expr,
6261 DILocation *DL, FuncArgumentDbgValueKind Kind, const SDValue &N) {
6262 const Argument *Arg = dyn_cast<Argument>(V);
6263 if (!Arg)
6264 return false;
6265
6266 MachineFunction &MF = DAG.getMachineFunction();
6267 const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo();
6268
6269 // Helper to create DBG_INSTR_REFs or DBG_VALUEs, depending on what kind
6270 // we've been asked to pursue.
6271 auto MakeVRegDbgValue = [&](Register Reg, DIExpression *FragExpr,
6272 bool Indirect) {
6273 if (Reg.isVirtual() && MF.useDebugInstrRef()) {
6274 // For VRegs, in instruction referencing mode, create a DBG_INSTR_REF
6275 // pointing at the VReg, which will be patched up later.
6276 auto &Inst = TII->get(TargetOpcode::DBG_INSTR_REF);
6278 /* Reg */ Reg, /* isDef */ false, /* isImp */ false,
6279 /* isKill */ false, /* isDead */ false,
6280 /* isUndef */ false, /* isEarlyClobber */ false,
6281 /* SubReg */ 0, /* isDebug */ true)});
6282
6283 auto *NewDIExpr = FragExpr;
6284 // We don't have an "Indirect" field in DBG_INSTR_REF, fold that into
6285 // the DIExpression.
6286 if (Indirect)
6287 NewDIExpr = DIExpression::prepend(FragExpr, DIExpression::DerefBefore);
6289 NewDIExpr = DIExpression::prependOpcodes(NewDIExpr, Ops);
6290 return BuildMI(MF, DL, Inst, false, MOs, Variable, NewDIExpr);
6291 } else {
6292 // Create a completely standard DBG_VALUE.
6293 auto &Inst = TII->get(TargetOpcode::DBG_VALUE);
6294 return BuildMI(MF, DL, Inst, Indirect, Reg, Variable, FragExpr);
6295 }
6296 };
6297
6298 if (Kind == FuncArgumentDbgValueKind::Value) {
6299 // ArgDbgValues are hoisted to the beginning of the entry block. So we
6300 // should only emit as ArgDbgValue if the dbg.value intrinsic is found in
6301 // the entry block.
6302 bool IsInEntryBlock = FuncInfo.MBB == &FuncInfo.MF->front();
6303 if (!IsInEntryBlock)
6304 return false;
6305
6306 // ArgDbgValues are hoisted to the beginning of the entry block. So we
6307 // should only emit as ArgDbgValue if the dbg.value intrinsic describes a
6308 // variable that also is a param.
6309 //
6310 // Although, if we are at the top of the entry block already, we can still
6311 // emit using ArgDbgValue. This might catch some situations when the
6312 // dbg.value refers to an argument that isn't used in the entry block, so
6313 // any CopyToReg node would be optimized out and the only way to express
6314 // this DBG_VALUE is by using the physical reg (or FI) as done in this
6315 // method. ArgDbgValues are hoisted to the beginning of the entry block. So
6316 // we should only emit as ArgDbgValue if the Variable is an argument to the
6317 // current function, and the dbg.value intrinsic is found in the entry
6318 // block.
6319 bool VariableIsFunctionInputArg = Variable->isParameter() &&
6320 !DL->getInlinedAt();
6321 bool IsInPrologue = SDNodeOrder == LowestSDNodeOrder;
6322 if (!IsInPrologue && !VariableIsFunctionInputArg)
6323 return false;
6324
6325 // Here we assume that a function argument on IR level only can be used to
6326 // describe one input parameter on source level. If we for example have
6327 // source code like this
6328 //
6329 // struct A { long x, y; };
6330 // void foo(struct A a, long b) {
6331 // ...
6332 // b = a.x;
6333 // ...
6334 // }
6335 //
6336 // and IR like this
6337 //
6338 // define void @foo(i32 %a1, i32 %a2, i32 %b) {
6339 // entry:
6340 // call void @llvm.dbg.value(metadata i32 %a1, "a", DW_OP_LLVM_fragment
6341 // call void @llvm.dbg.value(metadata i32 %a2, "a", DW_OP_LLVM_fragment
6342 // call void @llvm.dbg.value(metadata i32 %b, "b",
6343 // ...
6344 // call void @llvm.dbg.value(metadata i32 %a1, "b"
6345 // ...
6346 //
6347 // then the last dbg.value is describing a parameter "b" using a value that
6348 // is an argument. But since we already has used %a1 to describe a parameter
6349 // we should not handle that last dbg.value here (that would result in an
6350 // incorrect hoisting of the DBG_VALUE to the function entry).
6351 // Notice that we allow one dbg.value per IR level argument, to accommodate
6352 // for the situation with fragments above.
6353 // If there is no node for the value being handled, we return true to skip
6354 // the normal generation of debug info, as it would kill existing debug
6355 // info for the parameter in case of duplicates.
6356 if (VariableIsFunctionInputArg) {
6357 unsigned ArgNo = Arg->getArgNo();
6358 if (ArgNo >= FuncInfo.DescribedArgs.size())
6359 FuncInfo.DescribedArgs.resize(ArgNo + 1, false);
6360 else if (!IsInPrologue && FuncInfo.DescribedArgs.test(ArgNo))
6361 return !NodeMap[V].getNode();
6362 FuncInfo.DescribedArgs.set(ArgNo);
6363 }
6364 }
6365
6366 bool IsIndirect = false;
6367 std::optional<MachineOperand> Op;
6368 // Some arguments' frame index is recorded during argument lowering.
6369 int FI = FuncInfo.getArgumentFrameIndex(Arg);
6370 if (FI != std::numeric_limits<int>::max())
6372
6374 if (!Op && N.getNode()) {
6375 getUnderlyingArgRegs(ArgRegsAndSizes, N);
6376 Register Reg;
6377 if (ArgRegsAndSizes.size() == 1)
6378 Reg = ArgRegsAndSizes.front().first;
6379
6380 if (Reg && Reg.isVirtual()) {
6381 MachineRegisterInfo &RegInfo = MF.getRegInfo();
6382 Register PR = RegInfo.getLiveInPhysReg(Reg);
6383 if (PR)
6384 Reg = PR;
6385 }
6386 if (Reg) {
6388 IsIndirect = Kind != FuncArgumentDbgValueKind::Value;
6389 }
6390 }
6391
6392 if (!Op && N.getNode()) {
6393 // Check if frame index is available.
6394 SDValue LCandidate = peekThroughBitcasts(N);
6395 if (LoadSDNode *LNode = dyn_cast<LoadSDNode>(LCandidate.getNode()))
6396 if (FrameIndexSDNode *FINode =
6397 dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
6398 Op = MachineOperand::CreateFI(FINode->getIndex());
6399 }
6400
6401 if (!Op) {
6402 // Create a DBG_VALUE for each decomposed value in ArgRegs to cover Reg
6403 auto splitMultiRegDbgValue =
6404 [&](ArrayRef<std::pair<Register, TypeSize>> SplitRegs) -> bool {
6405 unsigned Offset = 0;
6406 for (const auto &[Reg, RegSizeInBits] : SplitRegs) {
6407 // FIXME: Scalable sizes are not supported in fragment expressions.
6408 if (RegSizeInBits.isScalable())
6409 return false;
6410
6411 // If the expression is already a fragment, the current register
6412 // offset+size might extend beyond the fragment. In this case, only
6413 // the register bits that are inside the fragment are relevant.
6414 int RegFragmentSizeInBits = RegSizeInBits.getFixedValue();
6415 if (auto ExprFragmentInfo = Expr->getFragmentInfo()) {
6416 uint64_t ExprFragmentSizeInBits = ExprFragmentInfo->SizeInBits;
6417 // The register is entirely outside the expression fragment,
6418 // so is irrelevant for debug info.
6419 if (Offset >= ExprFragmentSizeInBits)
6420 break;
6421 // The register is partially outside the expression fragment, only
6422 // the low bits within the fragment are relevant for debug info.
6423 if (Offset + RegFragmentSizeInBits > ExprFragmentSizeInBits) {
6424 RegFragmentSizeInBits = ExprFragmentSizeInBits - Offset;
6425 }
6426 }
6427
6428 auto FragmentExpr = DIExpression::createFragmentExpression(
6429 Expr, Offset, RegFragmentSizeInBits);
6430 Offset += RegSizeInBits.getFixedValue();
6431 // If a valid fragment expression cannot be created, the variable's
6432 // correct value cannot be determined and so it is set as poison.
6433 if (!FragmentExpr) {
6434 SDDbgValue *SDV = DAG.getConstantDbgValue(
6435 Variable, Expr, PoisonValue::get(V->getType()), DL, SDNodeOrder);
6436 DAG.AddDbgValue(SDV, false);
6437 continue;
6438 }
6439 MachineInstr *NewMI = MakeVRegDbgValue(
6440 Reg, *FragmentExpr, Kind != FuncArgumentDbgValueKind::Value);
6441 FuncInfo.ArgDbgValues.push_back(NewMI);
6442 }
6443
6444 return true;
6445 };
6446
6447 // Check if ValueMap has reg number.
6449 VMI = FuncInfo.ValueMap.find(V);
6450 if (VMI != FuncInfo.ValueMap.end()) {
6451 const auto &TLI = DAG.getTargetLoweringInfo();
6452 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), VMI->second,
6453 V->getType(), std::nullopt);
6454 if (RFV.occupiesMultipleRegs())
6455 return splitMultiRegDbgValue(RFV.getRegsAndSizes());
6456
6457 Op = MachineOperand::CreateReg(VMI->second, false);
6458 IsIndirect = Kind != FuncArgumentDbgValueKind::Value;
6459 } else if (ArgRegsAndSizes.size() > 1) {
6460 // This was split due to the calling convention, and no virtual register
6461 // mapping exists for the value.
6462 return splitMultiRegDbgValue(ArgRegsAndSizes);
6463 }
6464 }
6465
6466 if (!Op)
6467 return false;
6468
6469 assert(Variable->isValidLocationForIntrinsic(DL) &&
6470 "Expected inlined-at fields to agree");
6471 MachineInstr *NewMI = nullptr;
6472
6473 if (Op->isReg())
6474 NewMI = MakeVRegDbgValue(Op->getReg(), Expr, IsIndirect);
6475 else
6476 NewMI = BuildMI(MF, DL, TII->get(TargetOpcode::DBG_VALUE), true, *Op,
6477 Variable, Expr);
6478
6479 // Otherwise, use ArgDbgValues.
6480 FuncInfo.ArgDbgValues.push_back(NewMI);
6481 return true;
6482}
6483
6484/// Return the appropriate SDDbgValue based on N.
6485SDDbgValue *SelectionDAGBuilder::getDbgValue(SDValue N,
6486 DILocalVariable *Variable,
6487 DIExpression *Expr,
6488 const DebugLoc &dl,
6489 unsigned DbgSDNodeOrder) {
6490 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(N.getNode())) {
6491 // Construct a FrameIndexDbgValue for FrameIndexSDNodes so we can describe
6492 // stack slot locations.
6493 //
6494 // Consider "int x = 0; int *px = &x;". There are two kinds of interesting
6495 // debug values here after optimization:
6496 //
6497 // dbg.value(i32* %px, !"int *px", !DIExpression()), and
6498 // dbg.value(i32* %px, !"int x", !DIExpression(DW_OP_deref))
6499 //
6500 // Both describe the direct values of their associated variables.
6501 return DAG.getFrameIndexDbgValue(Variable, Expr, FISDN->getIndex(),
6502 /*IsIndirect*/ false, dl, DbgSDNodeOrder);
6503 }
6504 return DAG.getDbgValue(Variable, Expr, N.getNode(), N.getResNo(),
6505 /*IsIndirect*/ false, dl, DbgSDNodeOrder);
6506}
6507
6508static unsigned FixedPointIntrinsicToOpcode(unsigned Intrinsic) {
6509 switch (Intrinsic) {
6510 case Intrinsic::smul_fix:
6511 return ISD::SMULFIX;
6512 case Intrinsic::umul_fix:
6513 return ISD::UMULFIX;
6514 case Intrinsic::smul_fix_sat:
6515 return ISD::SMULFIXSAT;
6516 case Intrinsic::umul_fix_sat:
6517 return ISD::UMULFIXSAT;
6518 case Intrinsic::sdiv_fix:
6519 return ISD::SDIVFIX;
6520 case Intrinsic::udiv_fix:
6521 return ISD::UDIVFIX;
6522 case Intrinsic::sdiv_fix_sat:
6523 return ISD::SDIVFIXSAT;
6524 case Intrinsic::udiv_fix_sat:
6525 return ISD::UDIVFIXSAT;
6526 default:
6527 llvm_unreachable("Unhandled fixed point intrinsic");
6528 }
6529}
6530
6531/// Given a @llvm.call.preallocated.setup, return the corresponding
6532/// preallocated call.
6533static const CallBase *FindPreallocatedCall(const Value *PreallocatedSetup) {
6534 assert(cast<CallBase>(PreallocatedSetup)
6536 ->getIntrinsicID() == Intrinsic::call_preallocated_setup &&
6537 "expected call_preallocated_setup Value");
6538 for (const auto *U : PreallocatedSetup->users()) {
6539 auto *UseCall = cast<CallBase>(U);
6540 const Function *Fn = UseCall->getCalledFunction();
6541 if (!Fn || Fn->getIntrinsicID() != Intrinsic::call_preallocated_arg) {
6542 return UseCall;
6543 }
6544 }
6545 llvm_unreachable("expected corresponding call to preallocated setup/arg");
6546}
6547
6548/// If DI is a debug value with an EntryValue expression, lower it using the
6549/// corresponding physical register of the associated Argument value
6550/// (guaranteed to exist by the verifier).
6551bool SelectionDAGBuilder::visitEntryValueDbgValue(
6553 DIExpression *Expr, DebugLoc DbgLoc) {
6554 if (!Expr->isEntryValue() || !hasSingleElement(Values))
6555 return false;
6556
6557 // These properties are guaranteed by the verifier.
6558 const Argument *Arg = cast<Argument>(Values[0]);
6559 assert(Arg->hasAttribute(Attribute::AttrKind::SwiftAsync));
6560
6561 auto ArgIt = FuncInfo.ValueMap.find(Arg);
6562 if (ArgIt == FuncInfo.ValueMap.end()) {
6563 LLVM_DEBUG(
6564 dbgs() << "Dropping dbg.value: expression is entry_value but "
6565 "couldn't find an associated register for the Argument\n");
6566 return true;
6567 }
6568 Register ArgVReg = ArgIt->getSecond();
6569
6570 for (auto [PhysReg, VirtReg] : FuncInfo.RegInfo->liveins())
6571 if (ArgVReg == VirtReg || ArgVReg == PhysReg) {
6572 SDDbgValue *SDV = DAG.getVRegDbgValue(
6573 Variable, Expr, PhysReg, false /*IsIndidrect*/, DbgLoc, SDNodeOrder);
6574 DAG.AddDbgValue(SDV, false /*treat as dbg.declare byval parameter*/);
6575 return true;
6576 }
6577 LLVM_DEBUG(dbgs() << "Dropping dbg.value: expression is entry_value but "
6578 "couldn't find a physical register\n");
6579 return true;
6580}
6581
6582/// Lower the call to the specified intrinsic function.
6583void SelectionDAGBuilder::visitConvergenceControl(const CallInst &I,
6584 unsigned Intrinsic) {
6585 SDLoc sdl = getCurSDLoc();
6586 switch (Intrinsic) {
6587 case Intrinsic::experimental_convergence_anchor:
6588 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_ANCHOR, sdl, MVT::Untyped));
6589 break;
6590 case Intrinsic::experimental_convergence_entry:
6591 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_ENTRY, sdl, MVT::Untyped));
6592 break;
6593 case Intrinsic::experimental_convergence_loop: {
6594 auto Bundle = I.getOperandBundle(LLVMContext::OB_convergencectrl);
6595 auto *Token = Bundle->Inputs[0].get();
6596 setValue(&I, DAG.getNode(ISD::CONVERGENCECTRL_LOOP, sdl, MVT::Untyped,
6597 getValue(Token)));
6598 break;
6599 }
6600 }
6601}
6602
6603void SelectionDAGBuilder::visitVectorHistogram(const CallInst &I,
6604 unsigned IntrinsicID) {
6605 // For now, we're only lowering an 'add' histogram.
6606 // We can add others later, e.g. saturating adds, min/max.
6607 assert(IntrinsicID == Intrinsic::experimental_vector_histogram_add &&
6608 "Tried to lower unsupported histogram type");
6609 SDLoc sdl = getCurSDLoc();
6610 Value *Ptr = I.getOperand(0);
6611 SDValue Inc = getValue(I.getOperand(1));
6612 SDValue Mask = getValue(I.getOperand(2));
6613
6614 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6615 DataLayout TargetDL = DAG.getDataLayout();
6616 EVT VT = Inc.getValueType();
6617 Align Alignment = DAG.getEVTAlign(VT);
6618
6619 const MDNode *Ranges = getRangeMetadata(I);
6620
6621 SDValue Root = DAG.getRoot();
6622 SDValue Base;
6623 SDValue Index;
6624 SDValue Scale;
6625 bool UniformBase = getUniformBase(Ptr, Base, Index, Scale, this,
6626 I.getParent(), VT.getScalarStoreSize());
6627
6628 unsigned AS = Ptr->getType()->getScalarType()->getPointerAddressSpace();
6629
6630 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
6631 MachinePointerInfo(AS),
6633 MemoryLocation::UnknownSize, Alignment, I.getAAMetadata(), Ranges);
6634
6635 if (!UniformBase) {
6636 Base = DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));
6637 Index = getValue(Ptr);
6638 Scale =
6639 DAG.getTargetConstant(1, sdl, TLI.getPointerTy(DAG.getDataLayout()));
6640 }
6641
6642 EVT IdxVT = Index.getValueType();
6643
6644 // Avoid using e.g. i32 as index type when the increment must be performed
6645 // on i64's.
6646 bool MustExtendIndex = VT.getScalarSizeInBits() > IdxVT.getScalarSizeInBits();
6647 EVT EltTy = MustExtendIndex ? VT : IdxVT.getVectorElementType();
6648 if (MustExtendIndex || TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
6649 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
6650 Index = DAG.getNode(ISD::SIGN_EXTEND, sdl, NewIdxVT, Index);
6651 }
6652
6653 SDValue ID = DAG.getTargetConstant(IntrinsicID, sdl, MVT::i32);
6654
6655 SDValue Ops[] = {Root, Inc, Mask, Base, Index, Scale, ID};
6656 SDValue Histogram = DAG.getMaskedHistogram(DAG.getVTList(MVT::Other), VT, sdl,
6657 Ops, MMO, ISD::SIGNED_SCALED);
6658
6659 setValue(&I, Histogram);
6660 DAG.setRoot(Histogram);
6661}
6662
6663void SelectionDAGBuilder::visitVectorExtractLastActive(const CallInst &I,
6664 unsigned Intrinsic) {
6665 assert(Intrinsic == Intrinsic::experimental_vector_extract_last_active &&
6666 "Tried lowering invalid vector extract last");
6667 SDLoc sdl = getCurSDLoc();
6668 const DataLayout &Layout = DAG.getDataLayout();
6669 SDValue Data = getValue(I.getOperand(0));
6670 SDValue Mask = getValue(I.getOperand(1));
6671
6672 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6673 EVT ResVT = TLI.getValueType(Layout, I.getType());
6674
6675 EVT ExtVT = TLI.getVectorIdxTy(Layout);
6676 SDValue Idx = DAG.getNode(ISD::VECTOR_FIND_LAST_ACTIVE, sdl, ExtVT, Mask);
6677 SDValue Result = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, sdl, ResVT, Data, Idx);
6678
6679 Value *Default = I.getOperand(2);
6681 SDValue PassThru = getValue(Default);
6682 EVT BoolVT = Mask.getValueType().getScalarType();
6683 SDValue AnyActive = DAG.getNode(ISD::VECREDUCE_OR, sdl, BoolVT, Mask);
6684 Result = DAG.getSelect(sdl, ResVT, AnyActive, Result, PassThru);
6685 }
6686
6687 setValue(&I, Result);
6688}
6689
6690/// Lower the call to the specified intrinsic function.
6691void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
6692 unsigned Intrinsic) {
6693 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
6694 SDLoc sdl = getCurSDLoc();
6695 DebugLoc dl = getCurDebugLoc();
6696 SDValue Res;
6697
6698 SDNodeFlags Flags;
6699 if (auto *FPOp = dyn_cast<FPMathOperator>(&I))
6700 Flags.copyFMF(*FPOp);
6701
6702 switch (Intrinsic) {
6703 default:
6704 // By default, turn this into a target intrinsic node.
6705 visitTargetIntrinsic(I, Intrinsic);
6706 return;
6707 case Intrinsic::vscale: {
6708 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6709 setValue(&I, DAG.getVScale(sdl, VT, APInt(VT.getSizeInBits(), 1)));
6710 return;
6711 }
6712 case Intrinsic::vastart: visitVAStart(I); return;
6713 case Intrinsic::vaend: visitVAEnd(I); return;
6714 case Intrinsic::vacopy: visitVACopy(I); return;
6715 case Intrinsic::returnaddress:
6716 setValue(&I, DAG.getNode(ISD::RETURNADDR, sdl,
6717 TLI.getValueType(DAG.getDataLayout(), I.getType()),
6718 getValue(I.getArgOperand(0))));
6719 return;
6720 case Intrinsic::addressofreturnaddress:
6721 setValue(&I,
6722 DAG.getNode(ISD::ADDROFRETURNADDR, sdl,
6723 TLI.getValueType(DAG.getDataLayout(), I.getType())));
6724 return;
6725 case Intrinsic::sponentry:
6726 setValue(&I,
6727 DAG.getNode(ISD::SPONENTRY, sdl,
6728 TLI.getValueType(DAG.getDataLayout(), I.getType())));
6729 return;
6730 case Intrinsic::frameaddress:
6731 setValue(&I, DAG.getNode(ISD::FRAMEADDR, sdl,
6732 TLI.getFrameIndexTy(DAG.getDataLayout()),
6733 getValue(I.getArgOperand(0))));
6734 return;
6735 case Intrinsic::read_volatile_register:
6736 case Intrinsic::read_register: {
6737 Value *Reg = I.getArgOperand(0);
6738 SDValue Chain = getRoot();
6740 DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
6741 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
6742 Res = DAG.getNode(ISD::READ_REGISTER, sdl,
6743 DAG.getVTList(VT, MVT::Other), Chain, RegName);
6744 setValue(&I, Res);
6745 DAG.setRoot(Res.getValue(1));
6746 return;
6747 }
6748 case Intrinsic::write_register: {
6749 Value *Reg = I.getArgOperand(0);
6750 Value *RegValue = I.getArgOperand(1);
6751 SDValue Chain = getRoot();
6753 DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
6754 DAG.setRoot(DAG.getNode(ISD::WRITE_REGISTER, sdl, MVT::Other, Chain,
6755 RegName, getValue(RegValue)));
6756 return;
6757 }
6758 case Intrinsic::write_volatile_register: {
6759 Value *Reg = I.getArgOperand(0);
6760 Value *RegValue = I.getArgOperand(1);
6761 SDValue Chain = getRoot();
6762 const MDNode *MD = cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata());
6763 SDValue RegName = DAG.getMDNode(MD);
6764 EVT VT = TLI.getValueType(DAG.getDataLayout(), RegValue->getType());
6765 SDValue WriteChain = DAG.getNode(ISD::WRITE_REGISTER, sdl, MVT::Other,
6766 Chain, RegName, getValue(RegValue));
6767 // FAKE_USE of the physical register marks it live after the WRITE_REGISTER,
6768 // preventing the backend from dead-eliminating the write. This is
6769 // preferred over READ_REGISTER, which would emit extra register copies
6770 // (e.g. fmov xN, dN for FP/SIMD registers).
6771 const MDString *RegStr = cast<MDString>(MD->getOperand(0));
6772 LLT Ty = VT.isSimple() ? getLLTForMVT(VT.getSimpleVT()) : LLT();
6773 const MachineFunction &MF = DAG.getMachineFunction();
6774 Register PhysReg =
6775 TLI.getRegisterByName(RegStr->getString().data(), Ty, MF);
6776 if (PhysReg.isValid()) {
6777 const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
6778 const TargetRegisterClass *RC = TRI->getMinimalPhysRegClass(PhysReg);
6779 MVT RegVT = *TRI->legalclasstypes_begin(*RC);
6780 DAG.setRoot(DAG.getNode(ISD::FAKE_USE, sdl, MVT::Other,
6781 {WriteChain, DAG.getRegister(PhysReg, RegVT)}));
6782 } else {
6783 DAG.setRoot(WriteChain);
6784 }
6785 return;
6786 }
6787 case Intrinsic::memcpy:
6788 case Intrinsic::memcpy_inline: {
6789 const auto &MCI = cast<MemCpyInst>(I);
6790 SDValue Dst = getValue(I.getArgOperand(0));
6791 SDValue Src = getValue(I.getArgOperand(1));
6792 SDValue Size = getValue(I.getArgOperand(2));
6793 assert((!MCI.isForceInlined() || isa<ConstantSDNode>(Size)) &&
6794 "memcpy_inline needs constant size");
6795 // @llvm.memcpy.inline defines 0 and 1 to both mean no alignment.
6796 Align DstAlign = MCI.getDestAlign().valueOrOne();
6797 Align SrcAlign = MCI.getSourceAlign().valueOrOne();
6798 bool isVol = MCI.isVolatile();
6799 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6800 SDValue MC = DAG.getMemcpy(Root, sdl, Dst, Src, Size, DstAlign, SrcAlign,
6801 isVol, MCI.isForceInlined(), &I, std::nullopt,
6802 MachinePointerInfo(I.getArgOperand(0)),
6803 MachinePointerInfo(I.getArgOperand(1)),
6804 I.getAAMetadata(), BatchAA);
6805 updateDAGForMaybeTailCall(MC);
6806 return;
6807 }
6808 case Intrinsic::memset:
6809 case Intrinsic::memset_inline: {
6810 const auto &MSII = cast<MemSetInst>(I);
6811 SDValue Dst = getValue(I.getArgOperand(0));
6812 SDValue Value = getValue(I.getArgOperand(1));
6813 SDValue Size = getValue(I.getArgOperand(2));
6814 assert((!MSII.isForceInlined() || isa<ConstantSDNode>(Size)) &&
6815 "memset_inline needs constant size");
6816 // @llvm.memset defines 0 and 1 to both mean no alignment.
6817 Align DstAlign = MSII.getDestAlign().valueOrOne();
6818 bool isVol = MSII.isVolatile();
6819 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6820 SDValue MC = DAG.getMemset(
6821 Root, sdl, Dst, Value, Size, DstAlign, isVol, MSII.isForceInlined(),
6822 &I, MachinePointerInfo(I.getArgOperand(0)), I.getAAMetadata());
6823 updateDAGForMaybeTailCall(MC);
6824 return;
6825 }
6826 case Intrinsic::memmove: {
6827 const auto &MMI = cast<MemMoveInst>(I);
6828 SDValue Op1 = getValue(I.getArgOperand(0));
6829 SDValue Op2 = getValue(I.getArgOperand(1));
6830 SDValue Op3 = getValue(I.getArgOperand(2));
6831 // @llvm.memmove defines 0 and 1 to both mean no alignment.
6832 Align DstAlign = MMI.getDestAlign().valueOrOne();
6833 Align SrcAlign = MMI.getSourceAlign().valueOrOne();
6834 bool isVol = MMI.isVolatile();
6835 SDValue Root = isVol ? getRoot() : getMemoryRoot();
6836 SDValue MM = DAG.getMemmove(
6837 Root, sdl, Op1, Op2, Op3, DstAlign, SrcAlign, isVol, &I,
6838 /* OverrideTailCall */ std::nullopt,
6839 MachinePointerInfo(I.getArgOperand(0)),
6840 MachinePointerInfo(I.getArgOperand(1)), I.getAAMetadata(), BatchAA);
6841 updateDAGForMaybeTailCall(MM);
6842 return;
6843 }
6844 case Intrinsic::memcpy_element_unordered_atomic: {
6845 auto &MI = cast<AnyMemCpyInst>(I);
6846 SDValue Dst = getValue(MI.getRawDest());
6847 SDValue Src = getValue(MI.getRawSource());
6848 SDValue Length = getValue(MI.getLength());
6849
6850 Type *LengthTy = MI.getLength()->getType();
6851 unsigned ElemSz = MI.getElementSizeInBytes();
6852 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6853 SDValue MC =
6854 DAG.getAtomicMemcpy(getRoot(), sdl, Dst, Src, Length, LengthTy, ElemSz,
6855 isTC, MachinePointerInfo(MI.getRawDest()),
6856 MachinePointerInfo(MI.getRawSource()));
6857 updateDAGForMaybeTailCall(MC);
6858 return;
6859 }
6860 case Intrinsic::memmove_element_unordered_atomic: {
6861 auto &MI = cast<AnyMemMoveInst>(I);
6862 SDValue Dst = getValue(MI.getRawDest());
6863 SDValue Src = getValue(MI.getRawSource());
6864 SDValue Length = getValue(MI.getLength());
6865
6866 Type *LengthTy = MI.getLength()->getType();
6867 unsigned ElemSz = MI.getElementSizeInBytes();
6868 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6869 SDValue MC =
6870 DAG.getAtomicMemmove(getRoot(), sdl, Dst, Src, Length, LengthTy, ElemSz,
6871 isTC, MachinePointerInfo(MI.getRawDest()),
6872 MachinePointerInfo(MI.getRawSource()));
6873 updateDAGForMaybeTailCall(MC);
6874 return;
6875 }
6876 case Intrinsic::memset_element_unordered_atomic: {
6877 auto &MI = cast<AnyMemSetInst>(I);
6878 SDValue Dst = getValue(MI.getRawDest());
6879 SDValue Val = getValue(MI.getValue());
6880 SDValue Length = getValue(MI.getLength());
6881
6882 Type *LengthTy = MI.getLength()->getType();
6883 unsigned ElemSz = MI.getElementSizeInBytes();
6884 bool isTC = I.isTailCall() && isInTailCallPosition(I, DAG.getTarget());
6885 SDValue MC =
6886 DAG.getAtomicMemset(getRoot(), sdl, Dst, Val, Length, LengthTy, ElemSz,
6887 isTC, MachinePointerInfo(MI.getRawDest()));
6888 updateDAGForMaybeTailCall(MC);
6889 return;
6890 }
6891 case Intrinsic::call_preallocated_setup: {
6892 const CallBase *PreallocatedCall = FindPreallocatedCall(&I);
6893 SDValue SrcValue = DAG.getSrcValue(PreallocatedCall);
6894 SDValue Res = DAG.getNode(ISD::PREALLOCATED_SETUP, sdl, MVT::Other,
6895 getRoot(), SrcValue);
6896 setValue(&I, Res);
6897 DAG.setRoot(Res);
6898 return;
6899 }
6900 case Intrinsic::call_preallocated_arg: {
6901 const CallBase *PreallocatedCall = FindPreallocatedCall(I.getOperand(0));
6902 SDValue SrcValue = DAG.getSrcValue(PreallocatedCall);
6903 SDValue Ops[3];
6904 Ops[0] = getRoot();
6905 Ops[1] = SrcValue;
6906 Ops[2] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(1)), sdl,
6907 MVT::i32); // arg index
6908 SDValue Res = DAG.getNode(
6910 DAG.getVTList(TLI.getPointerTy(DAG.getDataLayout()), MVT::Other), Ops);
6911 setValue(&I, Res);
6912 DAG.setRoot(Res.getValue(1));
6913 return;
6914 }
6915
6916 case Intrinsic::eh_typeid_for: {
6917 // Find the type id for the given typeinfo.
6918 GlobalValue *GV = ExtractTypeInfo(I.getArgOperand(0));
6919 unsigned TypeID = DAG.getMachineFunction().getTypeIDFor(GV);
6920 Res = DAG.getConstant(TypeID, sdl, MVT::i32);
6921 setValue(&I, Res);
6922 return;
6923 }
6924
6925 case Intrinsic::eh_return_i32:
6926 case Intrinsic::eh_return_i64:
6927 DAG.getMachineFunction().setCallsEHReturn(true);
6928 DAG.setRoot(DAG.getNode(ISD::EH_RETURN, sdl,
6929 MVT::Other,
6931 getValue(I.getArgOperand(0)),
6932 getValue(I.getArgOperand(1))));
6933 return;
6934 case Intrinsic::eh_unwind_init:
6935 DAG.getMachineFunction().setCallsUnwindInit(true);
6936 return;
6937 case Intrinsic::eh_dwarf_cfa:
6938 setValue(&I, DAG.getNode(ISD::EH_DWARF_CFA, sdl,
6939 TLI.getPointerTy(DAG.getDataLayout()),
6940 getValue(I.getArgOperand(0))));
6941 return;
6942 case Intrinsic::eh_sjlj_callsite: {
6943 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(0));
6944 assert(FuncInfo.getCurrentCallSite() == 0 && "Overlapping call sites!");
6945
6946 FuncInfo.setCurrentCallSite(CI->getZExtValue());
6947 return;
6948 }
6949 case Intrinsic::eh_sjlj_functioncontext: {
6950 // Get and store the index of the function context.
6951 MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo();
6952 AllocaInst *FnCtx =
6953 cast<AllocaInst>(I.getArgOperand(0)->stripPointerCasts());
6954 int FI = FuncInfo.StaticAllocaMap[FnCtx];
6956 return;
6957 }
6958 case Intrinsic::eh_sjlj_setjmp: {
6959 SDValue Ops[2];
6960 Ops[0] = getRoot();
6961 Ops[1] = getValue(I.getArgOperand(0));
6962 SDValue Op = DAG.getNode(ISD::EH_SJLJ_SETJMP, sdl,
6963 DAG.getVTList(MVT::i32, MVT::Other), Ops);
6964 setValue(&I, Op.getValue(0));
6965 DAG.setRoot(Op.getValue(1));
6966 return;
6967 }
6968 case Intrinsic::eh_sjlj_longjmp:
6969 DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_LONGJMP, sdl, MVT::Other,
6970 getRoot(), getValue(I.getArgOperand(0))));
6971 return;
6972 case Intrinsic::eh_sjlj_setup_dispatch:
6973 DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_SETUP_DISPATCH, sdl, MVT::Other,
6974 getRoot()));
6975 return;
6976 case Intrinsic::masked_gather:
6977 visitMaskedGather(I);
6978 return;
6979 case Intrinsic::masked_load:
6980 visitMaskedLoad(I);
6981 return;
6982 case Intrinsic::masked_scatter:
6983 visitMaskedScatter(I);
6984 return;
6985 case Intrinsic::masked_store:
6986 visitMaskedStore(I);
6987 return;
6988 case Intrinsic::masked_expandload:
6989 visitMaskedLoad(I, true /* IsExpanding */);
6990 return;
6991 case Intrinsic::masked_compressstore:
6992 visitMaskedStore(I, true /* IsCompressing */);
6993 return;
6994 case Intrinsic::powi:
6995 setValue(&I, ExpandPowI(sdl, getValue(I.getArgOperand(0)),
6996 getValue(I.getArgOperand(1)), DAG));
6997 return;
6998 case Intrinsic::log:
6999 setValue(&I, expandLog(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
7000 return;
7001 case Intrinsic::log2:
7002 setValue(&I,
7003 expandLog2(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
7004 return;
7005 case Intrinsic::log10:
7006 setValue(&I,
7007 expandLog10(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
7008 return;
7009 case Intrinsic::exp:
7010 setValue(&I, expandExp(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
7011 return;
7012 case Intrinsic::exp2:
7013 setValue(&I,
7014 expandExp2(sdl, getValue(I.getArgOperand(0)), DAG, TLI, Flags));
7015 return;
7016 case Intrinsic::pow:
7017 setValue(&I, expandPow(sdl, getValue(I.getArgOperand(0)),
7018 getValue(I.getArgOperand(1)), DAG, TLI, Flags));
7019 return;
7020 case Intrinsic::sqrt:
7021 case Intrinsic::fabs:
7022 case Intrinsic::sin:
7023 case Intrinsic::cos:
7024 case Intrinsic::tan:
7025 case Intrinsic::asin:
7026 case Intrinsic::acos:
7027 case Intrinsic::atan:
7028 case Intrinsic::sinh:
7029 case Intrinsic::cosh:
7030 case Intrinsic::tanh:
7031 case Intrinsic::exp10:
7032 case Intrinsic::floor:
7033 case Intrinsic::ceil:
7034 case Intrinsic::trunc:
7035 case Intrinsic::rint:
7036 case Intrinsic::nearbyint:
7037 case Intrinsic::round:
7038 case Intrinsic::roundeven:
7039 case Intrinsic::canonicalize: {
7040 unsigned Opcode;
7041 // clang-format off
7042 switch (Intrinsic) {
7043 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
7044 case Intrinsic::sqrt: Opcode = ISD::FSQRT; break;
7045 case Intrinsic::fabs: Opcode = ISD::FABS; break;
7046 case Intrinsic::sin: Opcode = ISD::FSIN; break;
7047 case Intrinsic::cos: Opcode = ISD::FCOS; break;
7048 case Intrinsic::tan: Opcode = ISD::FTAN; break;
7049 case Intrinsic::asin: Opcode = ISD::FASIN; break;
7050 case Intrinsic::acos: Opcode = ISD::FACOS; break;
7051 case Intrinsic::atan: Opcode = ISD::FATAN; break;
7052 case Intrinsic::sinh: Opcode = ISD::FSINH; break;
7053 case Intrinsic::cosh: Opcode = ISD::FCOSH; break;
7054 case Intrinsic::tanh: Opcode = ISD::FTANH; break;
7055 case Intrinsic::exp10: Opcode = ISD::FEXP10; break;
7056 case Intrinsic::floor: Opcode = ISD::FFLOOR; break;
7057 case Intrinsic::ceil: Opcode = ISD::FCEIL; break;
7058 case Intrinsic::trunc: Opcode = ISD::FTRUNC; break;
7059 case Intrinsic::rint: Opcode = ISD::FRINT; break;
7060 case Intrinsic::nearbyint: Opcode = ISD::FNEARBYINT; break;
7061 case Intrinsic::round: Opcode = ISD::FROUND; break;
7062 case Intrinsic::roundeven: Opcode = ISD::FROUNDEVEN; break;
7063 case Intrinsic::canonicalize: Opcode = ISD::FCANONICALIZE; break;
7064 }
7065 // clang-format on
7066
7067 setValue(&I, DAG.getNode(Opcode, sdl,
7068 getValue(I.getArgOperand(0)).getValueType(),
7069 getValue(I.getArgOperand(0)), Flags));
7070 return;
7071 }
7072 case Intrinsic::atan2:
7073 setValue(&I, DAG.getNode(ISD::FATAN2, sdl,
7074 getValue(I.getArgOperand(0)).getValueType(),
7075 getValue(I.getArgOperand(0)),
7076 getValue(I.getArgOperand(1)), Flags));
7077 return;
7078 case Intrinsic::lround:
7079 case Intrinsic::llround:
7080 case Intrinsic::lrint:
7081 case Intrinsic::llrint: {
7082 unsigned Opcode;
7083 // clang-format off
7084 switch (Intrinsic) {
7085 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
7086 case Intrinsic::lround: Opcode = ISD::LROUND; break;
7087 case Intrinsic::llround: Opcode = ISD::LLROUND; break;
7088 case Intrinsic::lrint: Opcode = ISD::LRINT; break;
7089 case Intrinsic::llrint: Opcode = ISD::LLRINT; break;
7090 }
7091 // clang-format on
7092
7093 EVT RetVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7094 setValue(&I, DAG.getNode(Opcode, sdl, RetVT,
7095 getValue(I.getArgOperand(0))));
7096 return;
7097 }
7098 case Intrinsic::minnum:
7099 setValue(&I, DAG.getNode(ISD::FMINNUM, sdl,
7100 getValue(I.getArgOperand(0)).getValueType(),
7101 getValue(I.getArgOperand(0)),
7102 getValue(I.getArgOperand(1)), Flags));
7103 return;
7104 case Intrinsic::maxnum:
7105 setValue(&I, DAG.getNode(ISD::FMAXNUM, sdl,
7106 getValue(I.getArgOperand(0)).getValueType(),
7107 getValue(I.getArgOperand(0)),
7108 getValue(I.getArgOperand(1)), Flags));
7109 return;
7110 case Intrinsic::minimum:
7111 setValue(&I, DAG.getNode(ISD::FMINIMUM, sdl,
7112 getValue(I.getArgOperand(0)).getValueType(),
7113 getValue(I.getArgOperand(0)),
7114 getValue(I.getArgOperand(1)), Flags));
7115 return;
7116 case Intrinsic::maximum:
7117 setValue(&I, DAG.getNode(ISD::FMAXIMUM, sdl,
7118 getValue(I.getArgOperand(0)).getValueType(),
7119 getValue(I.getArgOperand(0)),
7120 getValue(I.getArgOperand(1)), Flags));
7121 return;
7122 case Intrinsic::minimumnum:
7123 setValue(&I, DAG.getNode(ISD::FMINIMUMNUM, sdl,
7124 getValue(I.getArgOperand(0)).getValueType(),
7125 getValue(I.getArgOperand(0)),
7126 getValue(I.getArgOperand(1)), Flags));
7127 return;
7128 case Intrinsic::maximumnum:
7129 setValue(&I, DAG.getNode(ISD::FMAXIMUMNUM, sdl,
7130 getValue(I.getArgOperand(0)).getValueType(),
7131 getValue(I.getArgOperand(0)),
7132 getValue(I.getArgOperand(1)), Flags));
7133 return;
7134 case Intrinsic::copysign:
7135 setValue(&I, DAG.getNode(ISD::FCOPYSIGN, sdl,
7136 getValue(I.getArgOperand(0)).getValueType(),
7137 getValue(I.getArgOperand(0)),
7138 getValue(I.getArgOperand(1)), Flags));
7139 return;
7140 case Intrinsic::ldexp:
7141 setValue(&I, DAG.getNode(ISD::FLDEXP, sdl,
7142 getValue(I.getArgOperand(0)).getValueType(),
7143 getValue(I.getArgOperand(0)),
7144 getValue(I.getArgOperand(1)), Flags));
7145 return;
7146 case Intrinsic::modf:
7147 case Intrinsic::sincos:
7148 case Intrinsic::sincospi:
7149 case Intrinsic::frexp: {
7150 unsigned Opcode;
7151 switch (Intrinsic) {
7152 default:
7153 llvm_unreachable("unexpected intrinsic");
7154 case Intrinsic::sincos:
7155 Opcode = ISD::FSINCOS;
7156 break;
7157 case Intrinsic::sincospi:
7158 Opcode = ISD::FSINCOSPI;
7159 break;
7160 case Intrinsic::modf:
7161 Opcode = ISD::FMODF;
7162 break;
7163 case Intrinsic::frexp:
7164 Opcode = ISD::FFREXP;
7165 break;
7166 }
7167 SmallVector<EVT, 2> ValueVTs;
7168 ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);
7169 SDVTList VTs = DAG.getVTList(ValueVTs);
7170 setValue(
7171 &I, DAG.getNode(Opcode, sdl, VTs, getValue(I.getArgOperand(0)), Flags));
7172 return;
7173 }
7174 case Intrinsic::arithmetic_fence: {
7175 setValue(&I, DAG.getNode(ISD::ARITH_FENCE, sdl,
7176 getValue(I.getArgOperand(0)).getValueType(),
7177 getValue(I.getArgOperand(0)), Flags));
7178 return;
7179 }
7180 case Intrinsic::fma:
7181 setValue(&I, DAG.getNode(
7182 ISD::FMA, sdl, getValue(I.getArgOperand(0)).getValueType(),
7183 getValue(I.getArgOperand(0)), getValue(I.getArgOperand(1)),
7184 getValue(I.getArgOperand(2)), Flags));
7185 return;
7186#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
7187 case Intrinsic::INTRINSIC:
7188#include "llvm/IR/ConstrainedOps.def"
7189 visitConstrainedFPIntrinsic(cast<ConstrainedFPIntrinsic>(I));
7190 return;
7191#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID:
7192#include "llvm/IR/VPIntrinsics.def"
7193 visitVectorPredicationIntrinsic(cast<VPIntrinsic>(I));
7194 return;
7195 case Intrinsic::fptrunc_round: {
7196 // Get the last argument, the metadata and convert it to an integer in the
7197 // call
7198 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(1))->getMetadata();
7199 std::optional<RoundingMode> RoundMode =
7200 convertStrToRoundingMode(cast<MDString>(MD)->getString());
7201
7202 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7203
7204 // Propagate fast-math-flags from IR to node(s).
7205 SDNodeFlags Flags;
7206 Flags.copyFMF(*cast<FPMathOperator>(&I));
7207 SelectionDAG::FlagInserter FlagsInserter(DAG, Flags);
7208
7210 Result = DAG.getNode(
7211 ISD::FPTRUNC_ROUND, sdl, VT, getValue(I.getArgOperand(0)),
7212 DAG.getTargetConstant((int)*RoundMode, sdl, MVT::i32));
7213 setValue(&I, Result);
7214
7215 return;
7216 }
7217 case Intrinsic::fmuladd: {
7218 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7219 if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
7220 TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), VT)) {
7221 setValue(&I, DAG.getNode(ISD::FMA, sdl,
7222 getValue(I.getArgOperand(0)).getValueType(),
7223 getValue(I.getArgOperand(0)),
7224 getValue(I.getArgOperand(1)),
7225 getValue(I.getArgOperand(2)), Flags));
7226 } else if (TLI.isOperationLegalOrCustom(ISD::FMULADD, VT)) {
7227 // TODO: Support splitting the vector.
7228 setValue(&I, DAG.getNode(ISD::FMULADD, sdl,
7229 getValue(I.getArgOperand(0)).getValueType(),
7230 getValue(I.getArgOperand(0)),
7231 getValue(I.getArgOperand(1)),
7232 getValue(I.getArgOperand(2)), Flags));
7233 } else {
7234 // TODO: Intrinsic calls should have fast-math-flags.
7235 SDValue Mul = DAG.getNode(
7236 ISD::FMUL, sdl, getValue(I.getArgOperand(0)).getValueType(),
7237 getValue(I.getArgOperand(0)), getValue(I.getArgOperand(1)), Flags);
7238 SDValue Add = DAG.getNode(ISD::FADD, sdl,
7239 getValue(I.getArgOperand(0)).getValueType(),
7240 Mul, getValue(I.getArgOperand(2)), Flags);
7241 setValue(&I, Add);
7242 }
7243 return;
7244 }
7245 case Intrinsic::fptosi_sat: {
7246 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7247 setValue(&I, DAG.getNode(ISD::FP_TO_SINT_SAT, sdl, VT,
7248 getValue(I.getArgOperand(0)),
7249 DAG.getValueType(VT.getScalarType())));
7250 return;
7251 }
7252 case Intrinsic::fptoui_sat: {
7253 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7254 setValue(&I, DAG.getNode(ISD::FP_TO_UINT_SAT, sdl, VT,
7255 getValue(I.getArgOperand(0)),
7256 DAG.getValueType(VT.getScalarType())));
7257 return;
7258 }
7259 case Intrinsic::convert_from_arbitrary_fp: {
7260 // Extract format metadata and convert to semantics enum.
7261 EVT DstVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7262 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(1))->getMetadata();
7263 StringRef FormatStr = cast<MDString>(MD)->getString();
7264 const fltSemantics *SrcSem =
7266 if (!SrcSem) {
7267 DAG.getContext()->emitError(
7268 "convert_from_arbitrary_fp: not implemented format '" + FormatStr +
7269 "'");
7270 setValue(&I, DAG.getPOISON(DstVT));
7271 return;
7272 }
7274
7275 SDValue IntVal = getValue(I.getArgOperand(0));
7276
7277 // Emit ISD::CONVERT_FROM_ARBITRARY_FP node.
7278 SDValue SemConst =
7279 DAG.getTargetConstant(static_cast<int>(SemEnum), sdl, MVT::i32);
7280 setValue(&I, DAG.getNode(ISD::CONVERT_FROM_ARBITRARY_FP, sdl, DstVT, IntVal,
7281 SemConst));
7282 return;
7283 }
7284 case Intrinsic::convert_to_arbitrary_fp: {
7285 // Extract format metadata and convert to semantics enum.
7286 EVT DstVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7287 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(1))->getMetadata();
7288 StringRef FormatStr = cast<MDString>(MD)->getString();
7289 const fltSemantics *DstSem =
7291 if (!DstSem) {
7292 DAG.getContext()->emitError(
7293 "convert_to_arbitrary_fp: not implemented format '" + FormatStr +
7294 "'");
7295 setValue(&I, DAG.getPOISON(DstVT));
7296 return;
7297 }
7299
7300 Metadata *RoundMD =
7301 cast<MetadataAsValue>(I.getArgOperand(2))->getMetadata();
7302 StringRef RoundStr = cast<MDString>(RoundMD)->getString();
7303 std::optional<RoundingMode> RoundMode = convertStrToRoundingMode(RoundStr);
7304 assert(RoundMode && *RoundMode != RoundingMode::Dynamic &&
7305 "Dynamic rounding mode should have been rejected by the verifier");
7306
7307 uint64_t Saturate =
7308 cast<ConstantInt>(I.getArgOperand(3))->getZExtValue() ? 1 : 0;
7309
7310 SDValue FloatVal = getValue(I.getArgOperand(0));
7311
7312 SDValue SemConst =
7313 DAG.getTargetConstant(static_cast<int>(SemEnum), sdl, MVT::i32);
7314 SDValue RoundConst =
7315 DAG.getTargetConstant(static_cast<int>(*RoundMode), sdl, MVT::i32);
7316 SDValue SatConst = DAG.getTargetConstant(Saturate, sdl, MVT::i32);
7317 setValue(&I, DAG.getNode(ISD::CONVERT_TO_ARBITRARY_FP, sdl, DstVT, FloatVal,
7318 SemConst, RoundConst, SatConst));
7319 return;
7320 }
7321 case Intrinsic::set_rounding:
7322 Res = DAG.getNode(ISD::SET_ROUNDING, sdl, MVT::Other,
7323 {getRoot(), getValue(I.getArgOperand(0))});
7324 setValue(&I, Res);
7325 DAG.setRoot(Res.getValue(0));
7326 return;
7327 case Intrinsic::is_fpclass: {
7328 const DataLayout DLayout = DAG.getDataLayout();
7329 EVT DestVT = TLI.getValueType(DLayout, I.getType());
7330 EVT ArgVT = TLI.getValueType(DLayout, I.getArgOperand(0)->getType());
7331 FPClassTest Test = static_cast<FPClassTest>(
7332 cast<ConstantInt>(I.getArgOperand(1))->getZExtValue());
7333 MachineFunction &MF = DAG.getMachineFunction();
7334 const Function &F = MF.getFunction();
7335 SDValue Op = getValue(I.getArgOperand(0));
7336 SDNodeFlags Flags;
7337 Flags.setNoFPExcept(
7338 !F.getAttributes().hasFnAttr(llvm::Attribute::StrictFP));
7339 // If ISD::IS_FPCLASS should be expanded, do it right now, because the
7340 // expansion can use illegal types. Making expansion early allows
7341 // legalizing these types prior to selection.
7342 if (!TLI.isOperationLegal(ISD::IS_FPCLASS, ArgVT) &&
7343 !TLI.isOperationCustom(ISD::IS_FPCLASS, ArgVT)) {
7344 SDValue Result = TLI.expandIS_FPCLASS(DestVT, Op, Test, Flags, sdl, DAG);
7345 setValue(&I, Result);
7346 return;
7347 }
7348
7349 SDValue Check = DAG.getTargetConstant(Test, sdl, MVT::i32);
7350 SDValue V = DAG.getNode(ISD::IS_FPCLASS, sdl, DestVT, {Op, Check}, Flags);
7351 setValue(&I, V);
7352 return;
7353 }
7354 case Intrinsic::get_fpenv: {
7355 const DataLayout DLayout = DAG.getDataLayout();
7356 EVT EnvVT = TLI.getValueType(DLayout, I.getType());
7357 Align TempAlign = DAG.getEVTAlign(EnvVT);
7358 SDValue Chain = getRoot();
7359 // Use GET_FPENV if it is legal or custom. Otherwise use memory-based node
7360 // and temporary storage in stack.
7361 if (TLI.isOperationLegalOrCustom(ISD::GET_FPENV, EnvVT)) {
7362 Res = DAG.getNode(
7363 ISD::GET_FPENV, sdl,
7364 DAG.getVTList(TLI.getValueType(DAG.getDataLayout(), I.getType()),
7365 MVT::Other),
7366 Chain);
7367 } else {
7368 SDValue Temp = DAG.CreateStackTemporary(EnvVT, TempAlign.value());
7369 int SPFI = cast<FrameIndexSDNode>(Temp.getNode())->getIndex();
7370 auto MPI =
7371 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI);
7372 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
7374 TempAlign);
7375 Chain = DAG.getGetFPEnv(Chain, sdl, Temp, EnvVT, MMO);
7376 Res = DAG.getLoad(EnvVT, sdl, Chain, Temp, MPI);
7377 }
7378 setValue(&I, Res);
7379 DAG.setRoot(Res.getValue(1));
7380 return;
7381 }
7382 case Intrinsic::set_fpenv: {
7383 const DataLayout DLayout = DAG.getDataLayout();
7384 SDValue Env = getValue(I.getArgOperand(0));
7385 EVT EnvVT = Env.getValueType();
7386 Align TempAlign = DAG.getEVTAlign(EnvVT);
7387 SDValue Chain = getRoot();
7388 // If SET_FPENV is custom or legal, use it. Otherwise use loading
7389 // environment from memory.
7390 if (TLI.isOperationLegalOrCustom(ISD::SET_FPENV, EnvVT)) {
7391 Chain = DAG.getNode(ISD::SET_FPENV, sdl, MVT::Other, Chain, Env);
7392 } else {
7393 // Allocate space in stack, copy environment bits into it and use this
7394 // memory in SET_FPENV_MEM.
7395 SDValue Temp = DAG.CreateStackTemporary(EnvVT, TempAlign.value());
7396 int SPFI = cast<FrameIndexSDNode>(Temp.getNode())->getIndex();
7397 auto MPI =
7398 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI);
7399 Chain = DAG.getStore(Chain, sdl, Env, Temp, MPI, TempAlign,
7401 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
7403 TempAlign);
7404 Chain = DAG.getSetFPEnv(Chain, sdl, Temp, EnvVT, MMO);
7405 }
7406 DAG.setRoot(Chain);
7407 return;
7408 }
7409 case Intrinsic::reset_fpenv:
7410 DAG.setRoot(DAG.getNode(ISD::RESET_FPENV, sdl, MVT::Other, getRoot()));
7411 return;
7412 case Intrinsic::get_fpmode:
7413 Res = DAG.getNode(
7414 ISD::GET_FPMODE, sdl,
7415 DAG.getVTList(TLI.getValueType(DAG.getDataLayout(), I.getType()),
7416 MVT::Other),
7417 DAG.getRoot());
7418 setValue(&I, Res);
7419 DAG.setRoot(Res.getValue(1));
7420 return;
7421 case Intrinsic::set_fpmode:
7422 Res = DAG.getNode(ISD::SET_FPMODE, sdl, MVT::Other, {DAG.getRoot()},
7423 getValue(I.getArgOperand(0)));
7424 DAG.setRoot(Res);
7425 return;
7426 case Intrinsic::reset_fpmode: {
7427 Res = DAG.getNode(ISD::RESET_FPMODE, sdl, MVT::Other, getRoot());
7428 DAG.setRoot(Res);
7429 return;
7430 }
7431 case Intrinsic::pcmarker: {
7432 SDValue Tmp = getValue(I.getArgOperand(0));
7433 DAG.setRoot(DAG.getNode(ISD::PCMARKER, sdl, MVT::Other, getRoot(), Tmp));
7434 return;
7435 }
7436 case Intrinsic::readcyclecounter: {
7437 SDValue Op = getRoot();
7438 Res = DAG.getNode(ISD::READCYCLECOUNTER, sdl,
7439 DAG.getVTList(MVT::i64, MVT::Other), Op);
7440 setValue(&I, Res);
7441 DAG.setRoot(Res.getValue(1));
7442 return;
7443 }
7444 case Intrinsic::readsteadycounter: {
7445 SDValue Op = getRoot();
7446 Res = DAG.getNode(ISD::READSTEADYCOUNTER, sdl,
7447 DAG.getVTList(MVT::i64, MVT::Other), Op);
7448 setValue(&I, Res);
7449 DAG.setRoot(Res.getValue(1));
7450 return;
7451 }
7452 case Intrinsic::bitreverse:
7453 setValue(&I, DAG.getNode(ISD::BITREVERSE, sdl,
7454 getValue(I.getArgOperand(0)).getValueType(),
7455 getValue(I.getArgOperand(0))));
7456 return;
7457 case Intrinsic::bswap:
7458 setValue(&I, DAG.getNode(ISD::BSWAP, sdl,
7459 getValue(I.getArgOperand(0)).getValueType(),
7460 getValue(I.getArgOperand(0))));
7461 return;
7462 case Intrinsic::cttz: {
7463 SDValue Arg = getValue(I.getArgOperand(0));
7464 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
7465 EVT Ty = Arg.getValueType();
7466 setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTTZ : ISD::CTTZ_ZERO_POISON,
7467 sdl, Ty, Arg));
7468 return;
7469 }
7470 case Intrinsic::ctlz: {
7471 SDValue Arg = getValue(I.getArgOperand(0));
7472 ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
7473 EVT Ty = Arg.getValueType();
7474 setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTLZ : ISD::CTLZ_ZERO_POISON,
7475 sdl, Ty, Arg));
7476 return;
7477 }
7478 case Intrinsic::ctpop: {
7479 SDValue Arg = getValue(I.getArgOperand(0));
7480 EVT Ty = Arg.getValueType();
7481 setValue(&I, DAG.getNode(ISD::CTPOP, sdl, Ty, Arg));
7482 return;
7483 }
7484 case Intrinsic::fshl:
7485 case Intrinsic::fshr: {
7486 bool IsFSHL = Intrinsic == Intrinsic::fshl;
7487 SDValue X = getValue(I.getArgOperand(0));
7488 SDValue Y = getValue(I.getArgOperand(1));
7489 SDValue Z = getValue(I.getArgOperand(2));
7490 EVT VT = X.getValueType();
7491
7492 if (X == Y) {
7493 auto RotateOpcode = IsFSHL ? ISD::ROTL : ISD::ROTR;
7494 setValue(&I, DAG.getNode(RotateOpcode, sdl, VT, X, Z));
7495 } else {
7496 auto FunnelOpcode = IsFSHL ? ISD::FSHL : ISD::FSHR;
7497 setValue(&I, DAG.getNode(FunnelOpcode, sdl, VT, X, Y, Z));
7498 }
7499 return;
7500 }
7501 case Intrinsic::clmul: {
7502 SDValue X = getValue(I.getArgOperand(0));
7503 SDValue Y = getValue(I.getArgOperand(1));
7504 setValue(&I, DAG.getNode(ISD::CLMUL, sdl, X.getValueType(), X, Y));
7505 return;
7506 }
7507 case Intrinsic::pext: {
7508 SDValue X = getValue(I.getArgOperand(0));
7509 SDValue Y = getValue(I.getArgOperand(1));
7510 setValue(&I, DAG.getNode(ISD::PEXT, sdl, X.getValueType(), X, Y));
7511 return;
7512 }
7513 case Intrinsic::pdep: {
7514 SDValue X = getValue(I.getArgOperand(0));
7515 SDValue Y = getValue(I.getArgOperand(1));
7516 setValue(&I, DAG.getNode(ISD::PDEP, sdl, X.getValueType(), X, Y));
7517 return;
7518 }
7519 case Intrinsic::sadd_sat: {
7520 SDValue Op1 = getValue(I.getArgOperand(0));
7521 SDValue Op2 = getValue(I.getArgOperand(1));
7522 setValue(&I, DAG.getNode(ISD::SADDSAT, sdl, Op1.getValueType(), Op1, Op2));
7523 return;
7524 }
7525 case Intrinsic::uadd_sat: {
7526 SDValue Op1 = getValue(I.getArgOperand(0));
7527 SDValue Op2 = getValue(I.getArgOperand(1));
7528 setValue(&I, DAG.getNode(ISD::UADDSAT, sdl, Op1.getValueType(), Op1, Op2));
7529 return;
7530 }
7531 case Intrinsic::ssub_sat: {
7532 SDValue Op1 = getValue(I.getArgOperand(0));
7533 SDValue Op2 = getValue(I.getArgOperand(1));
7534 setValue(&I, DAG.getNode(ISD::SSUBSAT, sdl, Op1.getValueType(), Op1, Op2));
7535 return;
7536 }
7537 case Intrinsic::usub_sat: {
7538 SDValue Op1 = getValue(I.getArgOperand(0));
7539 SDValue Op2 = getValue(I.getArgOperand(1));
7540 setValue(&I, DAG.getNode(ISD::USUBSAT, sdl, Op1.getValueType(), Op1, Op2));
7541 return;
7542 }
7543 case Intrinsic::sshl_sat:
7544 case Intrinsic::ushl_sat: {
7545 SDValue Op1 = getValue(I.getArgOperand(0));
7546 SDValue Op2 = getValue(I.getArgOperand(1));
7547
7548 EVT ShiftTy = DAG.getTargetLoweringInfo().getShiftAmountTy(
7549 Op1.getValueType(), DAG.getDataLayout());
7550
7551 // Coerce the shift amount to the right type if we can. This exposes the
7552 // truncate or zext to optimization early.
7553 if (!I.getType()->isVectorTy() && Op2.getValueType() != ShiftTy) {
7554 assert(ShiftTy.getSizeInBits() >=
7556 "Unexpected shift type");
7557 Op2 = DAG.getZExtOrTrunc(Op2, getCurSDLoc(), ShiftTy);
7558 }
7559
7560 unsigned Opc =
7561 Intrinsic == Intrinsic::sshl_sat ? ISD::SSHLSAT : ISD::USHLSAT;
7562 setValue(&I, DAG.getNode(Opc, sdl, Op1.getValueType(), Op1, Op2));
7563 return;
7564 }
7565 case Intrinsic::smul_fix:
7566 case Intrinsic::umul_fix:
7567 case Intrinsic::smul_fix_sat:
7568 case Intrinsic::umul_fix_sat: {
7569 SDValue Op1 = getValue(I.getArgOperand(0));
7570 SDValue Op2 = getValue(I.getArgOperand(1));
7571 SDValue Op3 = getValue(I.getArgOperand(2));
7572 setValue(&I, DAG.getNode(FixedPointIntrinsicToOpcode(Intrinsic), sdl,
7573 Op1.getValueType(), Op1, Op2, Op3));
7574 return;
7575 }
7576 case Intrinsic::sdiv_fix:
7577 case Intrinsic::udiv_fix:
7578 case Intrinsic::sdiv_fix_sat:
7579 case Intrinsic::udiv_fix_sat: {
7580 SDValue Op1 = getValue(I.getArgOperand(0));
7581 SDValue Op2 = getValue(I.getArgOperand(1));
7582 SDValue Op3 = getValue(I.getArgOperand(2));
7584 Op1, Op2, Op3, DAG, TLI));
7585 return;
7586 }
7587 case Intrinsic::smax: {
7588 SDValue Op1 = getValue(I.getArgOperand(0));
7589 SDValue Op2 = getValue(I.getArgOperand(1));
7590 setValue(&I, DAG.getNode(ISD::SMAX, sdl, Op1.getValueType(), Op1, Op2));
7591 return;
7592 }
7593 case Intrinsic::smin: {
7594 SDValue Op1 = getValue(I.getArgOperand(0));
7595 SDValue Op2 = getValue(I.getArgOperand(1));
7596 setValue(&I, DAG.getNode(ISD::SMIN, sdl, Op1.getValueType(), Op1, Op2));
7597 return;
7598 }
7599 case Intrinsic::umax: {
7600 SDValue Op1 = getValue(I.getArgOperand(0));
7601 SDValue Op2 = getValue(I.getArgOperand(1));
7602 setValue(&I, DAG.getNode(ISD::UMAX, sdl, Op1.getValueType(), Op1, Op2));
7603 return;
7604 }
7605 case Intrinsic::umin: {
7606 SDValue Op1 = getValue(I.getArgOperand(0));
7607 SDValue Op2 = getValue(I.getArgOperand(1));
7608 setValue(&I, DAG.getNode(ISD::UMIN, sdl, Op1.getValueType(), Op1, Op2));
7609 return;
7610 }
7611 case Intrinsic::abs: {
7612 SDValue Op1 = getValue(I.getArgOperand(0));
7613 bool IntMinIsPoison = cast<ConstantInt>(I.getArgOperand(1))->isOne();
7614 unsigned Opc = IntMinIsPoison ? ISD::ABS_MIN_POISON : ISD::ABS;
7615 setValue(&I, DAG.getNode(Opc, sdl, Op1.getValueType(), Op1));
7616 return;
7617 }
7618 case Intrinsic::scmp: {
7619 SDValue Op1 = getValue(I.getArgOperand(0));
7620 SDValue Op2 = getValue(I.getArgOperand(1));
7621 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7622 setValue(&I, DAG.getNode(ISD::SCMP, sdl, DestVT, Op1, Op2));
7623 break;
7624 }
7625 case Intrinsic::ucmp: {
7626 SDValue Op1 = getValue(I.getArgOperand(0));
7627 SDValue Op2 = getValue(I.getArgOperand(1));
7628 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7629 setValue(&I, DAG.getNode(ISD::UCMP, sdl, DestVT, Op1, Op2));
7630 break;
7631 }
7632 case Intrinsic::stackaddress:
7633 case Intrinsic::stacksave: {
7634 unsigned SDOpcode = Intrinsic == Intrinsic::stackaddress ? ISD::STACKADDRESS
7636 SDValue Op = getRoot();
7637 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
7638 Res = DAG.getNode(SDOpcode, sdl, DAG.getVTList(VT, MVT::Other), Op);
7639 setValue(&I, Res);
7640 DAG.setRoot(Res.getValue(1));
7641 return;
7642 }
7643 case Intrinsic::stackrestore:
7644 Res = getValue(I.getArgOperand(0));
7645 DAG.setRoot(DAG.getNode(ISD::STACKRESTORE, sdl, MVT::Other, getRoot(), Res));
7646 return;
7647 case Intrinsic::get_dynamic_area_offset: {
7648 SDValue Op = getRoot();
7649 EVT ResTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
7650 Res = DAG.getNode(ISD::GET_DYNAMIC_AREA_OFFSET, sdl, DAG.getVTList(ResTy),
7651 Op);
7652 DAG.setRoot(Op);
7653 setValue(&I, Res);
7654 return;
7655 }
7656 case Intrinsic::stackguard: {
7657 MachineFunction &MF = DAG.getMachineFunction();
7658 const Module &M = *MF.getFunction().getParent();
7659 EVT PtrTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
7660 SDValue Chain = getRoot();
7661 if (TLI.useLoadStackGuardNode(M)) {
7662 Res = getLoadStackGuard(DAG, sdl, Chain);
7663 Res = DAG.getPtrExtOrTrunc(Res, sdl, PtrTy);
7664 } else {
7665 const Value *Global = TLI.getSDagStackGuard(M, DAG.getLibcalls());
7666 if (!Global) {
7667 LLVMContext &Ctx = *DAG.getContext();
7668 Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
7669 setValue(&I, DAG.getPOISON(PtrTy));
7670 return;
7671 }
7672
7673 Align Align = DAG.getDataLayout().getPrefTypeAlign(Global->getType());
7674 Res = DAG.getLoad(PtrTy, sdl, Chain, getValue(Global),
7675 MachinePointerInfo(Global, 0), Align,
7677 }
7678 // Mix the cookie with FP if enabled. Skip if using LOAD_STACK_GUARD
7679 // with post-RA mixing (AArch64 MSVCRT), as the mixing will be done during
7680 // post-RA expansion of LOAD_STACK_GUARD.
7681 if (TLI.useStackGuardMixFP() && !TLI.useLoadStackGuardNode(M))
7682 Res = TLI.emitStackGuardMixFP(DAG, Res, sdl);
7683 DAG.setRoot(Chain);
7684 setValue(&I, Res);
7685 return;
7686 }
7687 case Intrinsic::stackprotector: {
7688 // Emit code into the DAG to store the stack guard onto the stack.
7689 MachineFunction &MF = DAG.getMachineFunction();
7690 MachineFrameInfo &MFI = MF.getFrameInfo();
7691 const Module &M = *MF.getFunction().getParent();
7692 SDValue Src, Chain = getRoot();
7693
7694 if (TLI.useLoadStackGuardNode(M))
7695 Src = getLoadStackGuard(DAG, sdl, Chain);
7696 else
7697 Src = getValue(I.getArgOperand(0)); // The guard's value.
7698
7699 AllocaInst *Slot = cast<AllocaInst>(I.getArgOperand(1));
7700
7701 int FI = FuncInfo.StaticAllocaMap[Slot];
7702 MFI.setStackProtectorIndex(FI);
7703 EVT PtrTy = TLI.getFrameIndexTy(DAG.getDataLayout());
7704
7705 SDValue FIN = DAG.getFrameIndex(FI, PtrTy);
7706
7707 // Store the stack protector onto the stack.
7708 Res = DAG.getStore(
7709 Chain, sdl, Src, FIN,
7710 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI),
7711 MaybeAlign(), MachineMemOperand::MOVolatile);
7712 setValue(&I, Res);
7713 DAG.setRoot(Res);
7714 return;
7715 }
7716 case Intrinsic::objectsize:
7717 llvm_unreachable("llvm.objectsize.* should have been lowered already");
7718
7719 case Intrinsic::is_constant:
7720 llvm_unreachable("llvm.is.constant.* should have been lowered already");
7721
7722 case Intrinsic::annotation:
7723 case Intrinsic::ptr_annotation:
7724 case Intrinsic::launder_invariant_group:
7725 case Intrinsic::strip_invariant_group:
7726 // Drop the intrinsic, but forward the value
7727 setValue(&I, getValue(I.getOperand(0)));
7728 return;
7729
7730 case Intrinsic::type_test:
7731 case Intrinsic::public_type_test:
7732 reportFatalUsageError("llvm.type.test intrinsic must be lowered by the "
7733 "LowerTypeTests pass before code generation");
7734 return;
7735
7736 case Intrinsic::assume:
7737 case Intrinsic::experimental_noalias_scope_decl:
7738 case Intrinsic::var_annotation:
7739 case Intrinsic::sideeffect:
7740 // Discard annotate attributes, noalias scope declarations, assumptions, and
7741 // artificial side-effects.
7742 return;
7743
7744 case Intrinsic::codeview_annotation: {
7745 // Emit a label associated with this metadata.
7746 MachineFunction &MF = DAG.getMachineFunction();
7747 MCSymbol *Label = MF.getContext().createTempSymbol("annotation", true);
7748 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(0))->getMetadata();
7749 MF.addCodeViewAnnotation(Label, cast<MDNode>(MD));
7750 Res = DAG.getLabelNode(ISD::ANNOTATION_LABEL, sdl, getRoot(), Label);
7751 DAG.setRoot(Res);
7752 return;
7753 }
7754
7755 case Intrinsic::init_trampoline: {
7756 const Function *F = cast<Function>(I.getArgOperand(1)->stripPointerCasts());
7757
7758 SDValue Ops[6];
7759 Ops[0] = getRoot();
7760 Ops[1] = getValue(I.getArgOperand(0));
7761 Ops[2] = getValue(I.getArgOperand(1));
7762 Ops[3] = getValue(I.getArgOperand(2));
7763 Ops[4] = DAG.getSrcValue(I.getArgOperand(0));
7764 Ops[5] = DAG.getSrcValue(F);
7765
7766 Res = DAG.getNode(ISD::INIT_TRAMPOLINE, sdl, MVT::Other, Ops);
7767
7768 DAG.setRoot(Res);
7769 return;
7770 }
7771 case Intrinsic::adjust_trampoline:
7772 setValue(&I, DAG.getNode(ISD::ADJUST_TRAMPOLINE, sdl,
7773 TLI.getPointerTy(DAG.getDataLayout()),
7774 getValue(I.getArgOperand(0))));
7775 return;
7776 case Intrinsic::gcroot: {
7777 assert(DAG.getMachineFunction().getFunction().hasGC() &&
7778 "only valid in functions with gc specified, enforced by Verifier");
7779 assert(GFI && "implied by previous");
7780 const Value *Alloca = I.getArgOperand(0)->stripPointerCasts();
7781 const Constant *TypeMap = cast<Constant>(I.getArgOperand(1));
7782
7783 FrameIndexSDNode *FI = cast<FrameIndexSDNode>(getValue(Alloca).getNode());
7784 GFI->addStackRoot(FI->getIndex(), TypeMap);
7785 return;
7786 }
7787 case Intrinsic::gcread:
7788 case Intrinsic::gcwrite:
7789 llvm_unreachable("GC failed to lower gcread/gcwrite intrinsics!");
7790 case Intrinsic::get_rounding:
7791 Res = DAG.getNode(ISD::GET_ROUNDING, sdl, {MVT::i32, MVT::Other}, getRoot());
7792 setValue(&I, Res);
7793 DAG.setRoot(Res.getValue(1));
7794 return;
7795
7796 case Intrinsic::expect:
7797 case Intrinsic::expect_with_probability:
7798 // Just replace __builtin_expect(exp, c) and
7799 // __builtin_expect_with_probability(exp, c, p) with EXP.
7800 setValue(&I, getValue(I.getArgOperand(0)));
7801 return;
7802
7803 case Intrinsic::ubsantrap:
7804 case Intrinsic::debugtrap:
7805 case Intrinsic::trap: {
7806 StringRef TrapFuncName =
7807 I.getAttributes().getFnAttr("trap-func-name").getValueAsString();
7808 if (TrapFuncName.empty()) {
7809 switch (Intrinsic) {
7810 case Intrinsic::trap:
7811 DAG.setRoot(DAG.getNode(ISD::TRAP, sdl, MVT::Other, getRoot()));
7812 break;
7813 case Intrinsic::debugtrap:
7814 DAG.setRoot(DAG.getNode(ISD::DEBUGTRAP, sdl, MVT::Other, getRoot()));
7815 break;
7816 case Intrinsic::ubsantrap:
7817 DAG.setRoot(DAG.getNode(
7818 ISD::UBSANTRAP, sdl, MVT::Other, getRoot(),
7819 DAG.getTargetConstant(
7820 cast<ConstantInt>(I.getArgOperand(0))->getZExtValue(), sdl,
7821 MVT::i32)));
7822 break;
7823 default: llvm_unreachable("unknown trap intrinsic");
7824 }
7825 DAG.addNoMergeSiteInfo(DAG.getRoot().getNode(),
7826 I.hasFnAttr(Attribute::NoMerge));
7827 return;
7828 }
7830 if (Intrinsic == Intrinsic::ubsantrap) {
7831 Value *Arg = I.getArgOperand(0);
7832 Args.emplace_back(Arg, getValue(Arg));
7833 }
7834
7835 TargetLowering::CallLoweringInfo CLI(DAG);
7836 CLI.setDebugLoc(sdl).setChain(getRoot()).setLibCallee(
7837 CallingConv::C, I.getType(),
7838 DAG.getExternalSymbol(TrapFuncName.data(),
7839 TLI.getPointerTy(DAG.getDataLayout())),
7840 std::move(Args));
7841 CLI.NoMerge = I.hasFnAttr(Attribute::NoMerge);
7842 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
7843 DAG.setRoot(Result.second);
7844 return;
7845 }
7846
7847 case Intrinsic::allow_runtime_check:
7848 case Intrinsic::allow_ubsan_check:
7849 setValue(&I, getValue(ConstantInt::getTrue(I.getType())));
7850 return;
7851
7852 case Intrinsic::uadd_with_overflow:
7853 case Intrinsic::sadd_with_overflow:
7854 case Intrinsic::usub_with_overflow:
7855 case Intrinsic::ssub_with_overflow:
7856 case Intrinsic::umul_with_overflow:
7857 case Intrinsic::smul_with_overflow: {
7859 switch (Intrinsic) {
7860 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
7861 case Intrinsic::uadd_with_overflow: Op = ISD::UADDO; break;
7862 case Intrinsic::sadd_with_overflow: Op = ISD::SADDO; break;
7863 case Intrinsic::usub_with_overflow: Op = ISD::USUBO; break;
7864 case Intrinsic::ssub_with_overflow: Op = ISD::SSUBO; break;
7865 case Intrinsic::umul_with_overflow: Op = ISD::UMULO; break;
7866 case Intrinsic::smul_with_overflow: Op = ISD::SMULO; break;
7867 }
7868 SDValue Op1 = getValue(I.getArgOperand(0));
7869 SDValue Op2 = getValue(I.getArgOperand(1));
7870
7871 EVT ResultVT = Op1.getValueType();
7872 EVT OverflowVT = ResultVT.changeElementType(*Context, MVT::i1);
7873
7874 SDVTList VTs = DAG.getVTList(ResultVT, OverflowVT);
7875 setValue(&I, DAG.getNode(Op, sdl, VTs, Op1, Op2));
7876 return;
7877 }
7878 case Intrinsic::prefetch: {
7879 SDValue Ops[5];
7880 unsigned rw = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
7882 Ops[0] = DAG.getRoot();
7883 Ops[1] = getValue(I.getArgOperand(0));
7884 Ops[2] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(1)), sdl,
7885 MVT::i32);
7886 Ops[3] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(2)), sdl,
7887 MVT::i32);
7888 Ops[4] = DAG.getTargetConstant(*cast<ConstantInt>(I.getArgOperand(3)), sdl,
7889 MVT::i32);
7890 SDValue Result = DAG.getMemIntrinsicNode(
7891 ISD::PREFETCH, sdl, DAG.getVTList(MVT::Other), Ops,
7892 EVT::getIntegerVT(*Context, 8), MachinePointerInfo(I.getArgOperand(0)),
7893 /* align */ std::nullopt, Flags);
7894
7895 // Chain the prefetch in parallel with any pending loads, to stay out of
7896 // the way of later optimizations.
7897 PendingLoads.push_back(Result);
7898 Result = getRoot();
7899 DAG.setRoot(Result);
7900 return;
7901 }
7902 case Intrinsic::lifetime_start:
7903 case Intrinsic::lifetime_end: {
7904 bool IsStart = (Intrinsic == Intrinsic::lifetime_start);
7905 // Stack coloring is not enabled in O0, discard region information.
7906 if (TM.getOptLevel() == CodeGenOptLevel::None)
7907 return;
7908
7909 const AllocaInst *LifetimeObject = dyn_cast<AllocaInst>(I.getArgOperand(0));
7910 if (!LifetimeObject)
7911 return;
7912
7913 // First check that the Alloca is static, otherwise it won't have a
7914 // valid frame index.
7915 auto SI = FuncInfo.StaticAllocaMap.find(LifetimeObject);
7916 if (SI == FuncInfo.StaticAllocaMap.end())
7917 return;
7918
7919 const int FrameIndex = SI->second;
7920 Res = DAG.getLifetimeNode(IsStart, sdl, getRoot(), FrameIndex);
7921 DAG.setRoot(Res);
7922 return;
7923 }
7924 case Intrinsic::pseudoprobe: {
7925 auto Guid = cast<ConstantInt>(I.getArgOperand(0))->getZExtValue();
7926 auto Index = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
7927 auto Attr = cast<ConstantInt>(I.getArgOperand(2))->getZExtValue();
7928 Res = DAG.getPseudoProbeNode(sdl, getRoot(), Guid, Index, Attr);
7929 DAG.setRoot(Res);
7930 return;
7931 }
7932 case Intrinsic::invariant_start:
7933 // Discard region information.
7934 setValue(&I,
7935 DAG.getUNDEF(TLI.getValueType(DAG.getDataLayout(), I.getType())));
7936 return;
7937 case Intrinsic::invariant_end:
7938 // Discard region information.
7939 return;
7940 case Intrinsic::clear_cache: {
7941 SDValue InputChain = DAG.getRoot();
7942 SDValue StartVal = getValue(I.getArgOperand(0));
7943 SDValue EndVal = getValue(I.getArgOperand(1));
7944 Res = DAG.getNode(ISD::CLEAR_CACHE, sdl, DAG.getVTList(MVT::Other),
7945 {InputChain, StartVal, EndVal});
7946 setValue(&I, Res);
7947 DAG.setRoot(Res);
7948 return;
7949 }
7950 case Intrinsic::donothing:
7951 case Intrinsic::seh_try_begin:
7952 case Intrinsic::seh_scope_begin:
7953 case Intrinsic::seh_try_end:
7954 case Intrinsic::seh_scope_end:
7955 // ignore
7956 return;
7957 case Intrinsic::experimental_stackmap:
7958 visitStackmap(I);
7959 return;
7960 case Intrinsic::experimental_patchpoint_void:
7961 case Intrinsic::experimental_patchpoint:
7962 visitPatchpoint(I);
7963 return;
7964 case Intrinsic::experimental_gc_statepoint:
7966 return;
7967 case Intrinsic::experimental_gc_result:
7968 visitGCResult(cast<GCResultInst>(I));
7969 return;
7970 case Intrinsic::experimental_gc_relocate:
7971 visitGCRelocate(cast<GCRelocateInst>(I));
7972 return;
7973 case Intrinsic::instrprof_cover:
7974 llvm_unreachable("instrprof failed to lower a cover");
7975 case Intrinsic::instrprof_increment:
7976 llvm_unreachable("instrprof failed to lower an increment");
7977 case Intrinsic::instrprof_timestamp:
7978 llvm_unreachable("instrprof failed to lower a timestamp");
7979 case Intrinsic::instrprof_value_profile:
7980 llvm_unreachable("instrprof failed to lower a value profiling call");
7981 case Intrinsic::instrprof_mcdc_parameters:
7982 llvm_unreachable("instrprof failed to lower mcdc parameters");
7983 case Intrinsic::instrprof_mcdc_tvbitmap_update:
7984 llvm_unreachable("instrprof failed to lower an mcdc tvbitmap update");
7985 case Intrinsic::localescape: {
7986 MachineFunction &MF = DAG.getMachineFunction();
7987 const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo();
7988
7989 // Directly emit some LOCAL_ESCAPE machine instrs. Label assignment emission
7990 // is the same on all targets.
7991 for (unsigned Idx = 0, E = I.arg_size(); Idx < E; ++Idx) {
7992 Value *Arg = I.getArgOperand(Idx)->stripPointerCasts();
7993 if (isa<ConstantPointerNull>(Arg))
7994 continue; // Skip null pointers. They represent a hole in index space.
7995 AllocaInst *Slot = cast<AllocaInst>(Arg);
7996 assert(FuncInfo.StaticAllocaMap.count(Slot) &&
7997 "can only escape static allocas");
7998 int FI = FuncInfo.StaticAllocaMap[Slot];
7999 MCSymbol *FrameAllocSym = MF.getContext().getOrCreateFrameAllocSymbol(
8001 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, dl,
8002 TII->get(TargetOpcode::LOCAL_ESCAPE))
8003 .addSym(FrameAllocSym)
8004 .addFrameIndex(FI);
8005 }
8006
8007 return;
8008 }
8009
8010 case Intrinsic::localrecover: {
8011 // i8* @llvm.localrecover(i8* %fn, i8* %fp, i32 %idx)
8012 MachineFunction &MF = DAG.getMachineFunction();
8013
8014 // Get the symbol that defines the frame offset.
8015 auto *Fn = cast<Function>(I.getArgOperand(0)->stripPointerCasts());
8016 auto *Idx = cast<ConstantInt>(I.getArgOperand(2));
8017 unsigned IdxVal =
8018 unsigned(Idx->getLimitedValue(std::numeric_limits<int>::max()));
8019 MCSymbol *FrameAllocSym = MF.getContext().getOrCreateFrameAllocSymbol(
8021
8022 Value *FP = I.getArgOperand(1);
8023 SDValue FPVal = getValue(FP);
8024 EVT PtrVT = FPVal.getValueType();
8025
8026 // Create a MCSymbol for the label to avoid any target lowering
8027 // that would make this PC relative.
8028 SDValue OffsetSym = DAG.getMCSymbol(FrameAllocSym, PtrVT);
8029 SDValue OffsetVal =
8030 DAG.getNode(ISD::LOCAL_RECOVER, sdl, PtrVT, OffsetSym);
8031
8032 // Add the offset to the FP.
8033 SDValue Add = DAG.getMemBasePlusOffset(FPVal, OffsetVal, sdl);
8034 setValue(&I, Add);
8035
8036 return;
8037 }
8038
8039 case Intrinsic::fake_use: {
8040 Value *V = I.getArgOperand(0);
8041 SDValue Ops[2];
8042 // For Values not declared or previously used in this basic block, the
8043 // NodeMap will not have an entry, and `getValue` will assert if V has no
8044 // valid register value.
8045 auto FakeUseValue = [&]() -> SDValue {
8046 SDValue &N = NodeMap[V];
8047 if (N.getNode())
8048 return N;
8049
8050 // If there's a virtual register allocated and initialized for this
8051 // value, use it.
8052 if (SDValue copyFromReg = getCopyFromRegs(V, V->getType()))
8053 return copyFromReg;
8054 // FIXME: Do we want to preserve constants? It seems pointless.
8055 if (isa<Constant>(V))
8056 return getValue(V);
8057 return SDValue();
8058 }();
8059 if (!FakeUseValue || FakeUseValue.isUndef())
8060 return;
8061 Ops[0] = getRoot();
8062 Ops[1] = FakeUseValue;
8063 // Also, do not translate a fake use with an undef operand, or any other
8064 // empty SDValues.
8065 if (!Ops[1] || Ops[1].isUndef())
8066 return;
8067 DAG.setRoot(DAG.getNode(ISD::FAKE_USE, sdl, MVT::Other, Ops));
8068 return;
8069 }
8070
8071 case Intrinsic::reloc_none: {
8072 Metadata *MD = cast<MetadataAsValue>(I.getArgOperand(0))->getMetadata();
8073 StringRef SymbolName = cast<MDString>(MD)->getString();
8074 SDValue Ops[2] = {
8075 getRoot(),
8076 DAG.getTargetExternalSymbol(
8077 SymbolName.data(), TLI.getProgramPointerTy(DAG.getDataLayout()))};
8078 DAG.setRoot(DAG.getNode(ISD::RELOC_NONE, sdl, MVT::Other, Ops));
8079 return;
8080 }
8081
8082 case Intrinsic::cond_loop: {
8083 SDValue InputChain = DAG.getRoot();
8084 SDValue P = getValue(I.getArgOperand(0));
8085 Res = DAG.getNode(ISD::COND_LOOP, sdl, DAG.getVTList(MVT::Other),
8086 {InputChain, P});
8087 setValue(&I, Res);
8088 DAG.setRoot(Res);
8089 return;
8090 }
8091
8092 case Intrinsic::eh_exceptionpointer:
8093 case Intrinsic::eh_exceptioncode: {
8094 // Get the exception pointer vreg, copy from it, and resize it to fit.
8095 const auto *CPI = cast<CatchPadInst>(I.getArgOperand(0));
8096 MVT PtrVT = TLI.getPointerTy(DAG.getDataLayout());
8097 const TargetRegisterClass *PtrRC = TLI.getRegClassFor(PtrVT);
8098 Register VReg = FuncInfo.getCatchPadExceptionPointerVReg(CPI, PtrRC);
8099 SDValue N = DAG.getCopyFromReg(DAG.getEntryNode(), sdl, VReg, PtrVT);
8100 if (Intrinsic == Intrinsic::eh_exceptioncode)
8101 N = DAG.getZExtOrTrunc(N, sdl, MVT::i32);
8102 setValue(&I, N);
8103 return;
8104 }
8105 case Intrinsic::xray_customevent: {
8106 // Here we want to make sure that the intrinsic behaves as if it has a
8107 // specific calling convention.
8108 const auto &Triple = DAG.getTarget().getTargetTriple();
8109 if (!Triple.isAArch64(64) && Triple.getArch() != Triple::x86_64 &&
8110 Triple.getArch() != Triple::hexagon)
8111 return;
8112
8114
8115 // We want to say that we always want the arguments in registers.
8116 SDValue LogEntryVal = getValue(I.getArgOperand(0));
8117 SDValue StrSizeVal = getValue(I.getArgOperand(1));
8118 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
8119 SDValue Chain = getRoot();
8120 Ops.push_back(LogEntryVal);
8121 Ops.push_back(StrSizeVal);
8122 Ops.push_back(Chain);
8123
8124 // We need to enforce the calling convention for the callsite, so that
8125 // argument ordering is enforced correctly, and that register allocation can
8126 // see that some registers may be assumed clobbered and have to preserve
8127 // them across calls to the intrinsic.
8128 MachineSDNode *MN = DAG.getMachineNode(TargetOpcode::PATCHABLE_EVENT_CALL,
8129 sdl, NodeTys, Ops);
8130 SDValue patchableNode = SDValue(MN, 0);
8131 DAG.setRoot(patchableNode);
8132 setValue(&I, patchableNode);
8133 return;
8134 }
8135 case Intrinsic::xray_typedevent: {
8136 // Here we want to make sure that the intrinsic behaves as if it has a
8137 // specific calling convention.
8138 const auto &Triple = DAG.getTarget().getTargetTriple();
8139 if (!Triple.isAArch64(64) && Triple.getArch() != Triple::x86_64 &&
8140 Triple.getArch() != Triple::hexagon)
8141 return;
8142
8144
8145 // We want to say that we always want the arguments in registers.
8146 // It's unclear to me how manipulating the selection DAG here forces callers
8147 // to provide arguments in registers instead of on the stack.
8148 SDValue LogTypeId = getValue(I.getArgOperand(0));
8149 SDValue LogEntryVal = getValue(I.getArgOperand(1));
8150 SDValue StrSizeVal = getValue(I.getArgOperand(2));
8151 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
8152 SDValue Chain = getRoot();
8153 Ops.push_back(LogTypeId);
8154 Ops.push_back(LogEntryVal);
8155 Ops.push_back(StrSizeVal);
8156 Ops.push_back(Chain);
8157
8158 // We need to enforce the calling convention for the callsite, so that
8159 // argument ordering is enforced correctly, and that register allocation can
8160 // see that some registers may be assumed clobbered and have to preserve
8161 // them across calls to the intrinsic.
8162 MachineSDNode *MN = DAG.getMachineNode(
8163 TargetOpcode::PATCHABLE_TYPED_EVENT_CALL, sdl, NodeTys, Ops);
8164 SDValue patchableNode = SDValue(MN, 0);
8165 DAG.setRoot(patchableNode);
8166 setValue(&I, patchableNode);
8167 return;
8168 }
8169 case Intrinsic::experimental_deoptimize:
8171 return;
8172 case Intrinsic::stepvector:
8173 visitStepVector(I);
8174 return;
8175 case Intrinsic::vector_reduce_fadd:
8176 case Intrinsic::vector_reduce_fmul:
8177 case Intrinsic::vector_reduce_add:
8178 case Intrinsic::vector_reduce_mul:
8179 case Intrinsic::vector_reduce_and:
8180 case Intrinsic::vector_reduce_or:
8181 case Intrinsic::vector_reduce_xor:
8182 case Intrinsic::vector_reduce_smax:
8183 case Intrinsic::vector_reduce_smin:
8184 case Intrinsic::vector_reduce_umax:
8185 case Intrinsic::vector_reduce_umin:
8186 case Intrinsic::vector_reduce_fmax:
8187 case Intrinsic::vector_reduce_fmin:
8188 case Intrinsic::vector_reduce_fmaximum:
8189 case Intrinsic::vector_reduce_fminimum:
8190 visitVectorReduce(I, Intrinsic);
8191 return;
8192
8193 case Intrinsic::icall_branch_funnel: {
8195 Ops.push_back(getValue(I.getArgOperand(0)));
8196
8197 int64_t Offset;
8199 I.getArgOperand(1), Offset, DAG.getDataLayout()));
8200 if (!Base)
8202 "llvm.icall.branch.funnel operand must be a GlobalValue");
8203 Ops.push_back(DAG.getTargetGlobalAddress(Base, sdl, MVT::i64, 0));
8204
8205 struct BranchFunnelTarget {
8206 int64_t Offset;
8208 };
8210
8211 for (unsigned Op = 1, N = I.arg_size(); Op != N; Op += 2) {
8213 I.getArgOperand(Op), Offset, DAG.getDataLayout()));
8214 if (ElemBase != Base)
8215 report_fatal_error("all llvm.icall.branch.funnel operands must refer "
8216 "to the same GlobalValue");
8217
8218 SDValue Val = getValue(I.getArgOperand(Op + 1));
8219 auto *GA = dyn_cast<GlobalAddressSDNode>(Val);
8220 if (!GA)
8222 "llvm.icall.branch.funnel operand must be a GlobalValue");
8223 Targets.push_back({Offset, DAG.getTargetGlobalAddress(
8224 GA->getGlobal(), sdl, Val.getValueType(),
8225 GA->getOffset())});
8226 }
8227 llvm::sort(Targets,
8228 [](const BranchFunnelTarget &T1, const BranchFunnelTarget &T2) {
8229 return T1.Offset < T2.Offset;
8230 });
8231
8232 for (auto &T : Targets) {
8233 Ops.push_back(DAG.getTargetConstant(T.Offset, sdl, MVT::i32));
8234 Ops.push_back(T.Target);
8235 }
8236
8237 Ops.push_back(DAG.getRoot()); // Chain
8238 SDValue N(DAG.getMachineNode(TargetOpcode::ICALL_BRANCH_FUNNEL, sdl,
8239 MVT::Other, Ops),
8240 0);
8241 DAG.setRoot(N);
8242 setValue(&I, N);
8243 HasTailCall = true;
8244 return;
8245 }
8246
8247 case Intrinsic::wasm_landingpad_index:
8248 // Information this intrinsic contained has been transferred to
8249 // MachineFunction in SelectionDAGISel::PrepareEHLandingPad. We can safely
8250 // delete it now.
8251 return;
8252
8253 case Intrinsic::aarch64_settag:
8254 case Intrinsic::aarch64_settag_zero: {
8255 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
8256 bool ZeroMemory = Intrinsic == Intrinsic::aarch64_settag_zero;
8258 DAG, sdl, getRoot(), getValue(I.getArgOperand(0)),
8259 getValue(I.getArgOperand(1)), MachinePointerInfo(I.getArgOperand(0)),
8260 ZeroMemory);
8261 DAG.setRoot(Val);
8262 setValue(&I, Val);
8263 return;
8264 }
8265 case Intrinsic::amdgcn_cs_chain: {
8266 // At this point we don't care if it's amdgpu_cs_chain or
8267 // amdgpu_cs_chain_preserve.
8269
8270 Type *RetTy = I.getType();
8271 assert(RetTy->isVoidTy() && "Should not return");
8272
8273 SDValue Callee = getValue(I.getOperand(0));
8274
8275 // We only have 2 actual args: one for the SGPRs and one for the VGPRs.
8276 // We'll also tack the value of the EXEC mask at the end.
8278 Args.reserve(3);
8279
8280 for (unsigned Idx : {2, 3, 1}) {
8281 TargetLowering::ArgListEntry Arg(getValue(I.getOperand(Idx)),
8282 I.getOperand(Idx)->getType());
8283 Arg.setAttributes(&I, Idx);
8284 Args.push_back(Arg);
8285 }
8286
8287 assert(Args[0].IsInReg && "SGPR args should be marked inreg");
8288 assert(!Args[1].IsInReg && "VGPR args should not be marked inreg");
8289 Args[2].IsInReg = true; // EXEC should be inreg
8290
8291 // Forward the flags and any additional arguments.
8292 for (unsigned Idx = 4; Idx < I.arg_size(); ++Idx) {
8293 TargetLowering::ArgListEntry Arg(getValue(I.getOperand(Idx)),
8294 I.getOperand(Idx)->getType());
8295 Arg.setAttributes(&I, Idx);
8296 Args.push_back(Arg);
8297 }
8298
8299 TargetLowering::CallLoweringInfo CLI(DAG);
8300 CLI.setDebugLoc(getCurSDLoc())
8301 .setChain(getRoot())
8302 .setCallee(CC, RetTy, Callee, std::move(Args))
8303 .setNoReturn(true)
8304 .setTailCall(true)
8305 .setConvergent(I.isConvergent());
8306 CLI.CB = &I;
8307 std::pair<SDValue, SDValue> Result =
8308 lowerInvokable(CLI, /*EHPadBB*/ nullptr);
8309 (void)Result;
8310 assert(!Result.first.getNode() && !Result.second.getNode() &&
8311 "Should've lowered as tail call");
8312
8313 HasTailCall = true;
8314 return;
8315 }
8316 case Intrinsic::amdgcn_call_whole_wave: {
8318 bool isTailCall = I.isTailCall();
8319
8320 // The first argument is the callee. Skip it when assembling the call args.
8321 for (unsigned Idx = 1; Idx < I.arg_size(); ++Idx) {
8322 TargetLowering::ArgListEntry Arg(getValue(I.getArgOperand(Idx)),
8323 I.getArgOperand(Idx)->getType());
8324 Arg.setAttributes(&I, Idx);
8325
8326 // If we have an explicit sret argument that is an Instruction, (i.e., it
8327 // might point to function-local memory), we can't meaningfully tail-call.
8328 if (Arg.IsSRet && isa<Instruction>(I.getArgOperand(Idx)))
8329 isTailCall = false;
8330
8331 Args.push_back(Arg);
8332 }
8333
8334 SDValue ConvControlToken;
8335 if (auto Bundle = I.getOperandBundle(LLVMContext::OB_convergencectrl)) {
8336 auto *Token = Bundle->Inputs[0].get();
8337 ConvControlToken = getValue(Token);
8338 }
8339
8340 TargetLowering::CallLoweringInfo CLI(DAG);
8341 CLI.setDebugLoc(getCurSDLoc())
8342 .setChain(getRoot())
8343 .setCallee(CallingConv::AMDGPU_Gfx_WholeWave, I.getType(),
8344 getValue(I.getArgOperand(0)), std::move(Args))
8345 .setTailCall(isTailCall && canTailCall(I))
8346 .setIsPreallocated(
8347 I.countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0)
8348 .setConvergent(I.isConvergent())
8349 .setConvergenceControlToken(ConvControlToken);
8350 CLI.CB = &I;
8351
8352 std::pair<SDValue, SDValue> Result =
8353 lowerInvokable(CLI, /*EHPadBB=*/nullptr);
8354
8355 if (Result.first.getNode())
8356 setValue(&I, Result.first);
8357 return;
8358 }
8359 case Intrinsic::ptrmask: {
8360 SDValue Ptr = getValue(I.getOperand(0));
8361 SDValue Mask = getValue(I.getOperand(1));
8362
8363 // On arm64_32, pointers are 32 bits when stored in memory, but
8364 // zero-extended to 64 bits when in registers. Thus the mask is 32 bits to
8365 // match the index type, but the pointer is 64 bits, so the mask must be
8366 // zero-extended up to 64 bits to match the pointer.
8367 EVT PtrVT =
8368 TLI.getValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
8369 EVT MemVT =
8370 TLI.getMemValueType(DAG.getDataLayout(), I.getOperand(0)->getType());
8371 assert(PtrVT == Ptr.getValueType());
8372 if (Mask.getValueType().getFixedSizeInBits() < MemVT.getFixedSizeInBits()) {
8373 // For AMDGPU buffer descriptors the mask is 48 bits, but the pointer is
8374 // 128-bit, so we have to pad the mask with ones for unused bits.
8375 auto HighOnes = DAG.getNode(
8376 ISD::SHL, sdl, PtrVT, DAG.getAllOnesConstant(sdl, PtrVT),
8377 DAG.getShiftAmountConstant(Mask.getValueType().getFixedSizeInBits(),
8378 PtrVT, sdl));
8379 Mask = DAG.getNode(ISD::OR, sdl, PtrVT,
8380 DAG.getZExtOrTrunc(Mask, sdl, PtrVT), HighOnes);
8381 } else if (Mask.getValueType() != PtrVT)
8382 Mask = DAG.getPtrExtOrTrunc(Mask, sdl, PtrVT);
8383
8384 assert(Mask.getValueType() == PtrVT);
8385 setValue(&I, DAG.getNode(ISD::AND, sdl, PtrVT, Ptr, Mask));
8386 return;
8387 }
8388 case Intrinsic::threadlocal_address: {
8389 setValue(&I, getValue(I.getOperand(0)));
8390 return;
8391 }
8392 case Intrinsic::get_active_lane_mask: {
8393 EVT CCVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8394 SDValue Index = getValue(I.getOperand(0));
8395 SDValue TripCount = getValue(I.getOperand(1));
8396 EVT ElementVT = Index.getValueType();
8397
8398 if (!TLI.shouldExpandGetActiveLaneMask(CCVT, ElementVT)) {
8399 setValue(&I, DAG.getNode(ISD::GET_ACTIVE_LANE_MASK, sdl, CCVT, Index,
8400 TripCount));
8401 return;
8402 }
8403
8404 EVT VecTy = EVT::getVectorVT(*DAG.getContext(), ElementVT,
8405 CCVT.getVectorElementCount());
8406
8407 SDValue VectorIndex = DAG.getSplat(VecTy, sdl, Index);
8408 SDValue VectorTripCount = DAG.getSplat(VecTy, sdl, TripCount);
8409 SDValue VectorStep = DAG.getStepVector(sdl, VecTy);
8410 SDValue VectorInduction = DAG.getNode(
8411 ISD::UADDSAT, sdl, VecTy, VectorIndex, VectorStep);
8412 SDValue SetCC = DAG.getSetCC(sdl, CCVT, VectorInduction,
8413 VectorTripCount, ISD::CondCode::SETULT);
8414 setValue(&I, SetCC);
8415 return;
8416 }
8417 case Intrinsic::experimental_get_vector_length: {
8418 assert(cast<ConstantInt>(I.getOperand(1))->getSExtValue() > 0 &&
8419 "Expected positive VF");
8420 unsigned VF = cast<ConstantInt>(I.getOperand(1))->getZExtValue();
8421 bool IsScalable = cast<ConstantInt>(I.getOperand(2))->isOne();
8422
8423 SDValue Count = getValue(I.getOperand(0));
8424 EVT CountVT = Count.getValueType();
8425
8426 if (!TLI.shouldExpandGetVectorLength(CountVT, VF, IsScalable)) {
8427 visitTargetIntrinsic(I, Intrinsic);
8428 return;
8429 }
8430
8431 // Expand to a umin between the trip count and the maximum elements the type
8432 // can hold.
8433 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8434
8435 // Extend the trip count to at least the result VT.
8436 if (CountVT.bitsLT(VT)) {
8437 Count = DAG.getNode(ISD::ZERO_EXTEND, sdl, VT, Count);
8438 CountVT = VT;
8439 }
8440
8441 SDValue MaxEVL = DAG.getElementCount(sdl, CountVT,
8442 ElementCount::get(VF, IsScalable));
8443
8444 SDValue UMin = DAG.getNode(ISD::UMIN, sdl, CountVT, Count, MaxEVL);
8445 // Clip to the result type if needed.
8446 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, sdl, VT, UMin);
8447
8448 setValue(&I, Trunc);
8449 return;
8450 }
8451 case Intrinsic::vector_partial_reduce_add: {
8452 SDValue Acc = getValue(I.getOperand(0));
8453 SDValue Input = getValue(I.getOperand(1));
8454 setValue(&I,
8455 DAG.getNode(ISD::PARTIAL_REDUCE_UMLA, sdl, Acc.getValueType(), Acc,
8456 Input, DAG.getConstant(1, sdl, Input.getValueType())));
8457 return;
8458 }
8459 case Intrinsic::vector_partial_reduce_fadd: {
8460 SDValue Acc = getValue(I.getOperand(0));
8461 SDValue Input = getValue(I.getOperand(1));
8462 setValue(&I, DAG.getNode(
8463 ISD::PARTIAL_REDUCE_FMLA, sdl, Acc.getValueType(), Acc,
8464 Input, DAG.getConstantFP(1.0, sdl, Input.getValueType())));
8465 return;
8466 }
8467 case Intrinsic::experimental_cttz_elts: {
8468 SDValue Op = getValue(I.getOperand(0));
8469 EVT OpVT = Op.getValueType();
8470 EVT RetTy = TLI.getValueType(DAG.getDataLayout(), I.getType());
8471 bool ZeroIsPoison =
8472 !cast<ConstantSDNode>(getValue(I.getOperand(1)))->isZero();
8473 if (OpVT.getVectorElementType() != MVT::i1) {
8474 // Compare the input vector elements to zero & use to count trailing
8475 // zeros.
8476 SDValue AllZero = DAG.getConstant(0, sdl, OpVT);
8477 EVT I1OpVT = OpVT.changeVectorElementType(*DAG.getContext(), MVT::i1);
8478 Op = DAG.getSetCC(sdl, I1OpVT, Op, AllZero, ISD::SETNE);
8479 }
8480 setValue(&I, DAG.getNode(ZeroIsPoison ? ISD::CTTZ_ELTS_ZERO_POISON
8482 sdl, RetTy, Op));
8483 return;
8484 }
8485 case Intrinsic::vector_insert: {
8486 SDValue Vec = getValue(I.getOperand(0));
8487 SDValue SubVec = getValue(I.getOperand(1));
8488 SDValue Index = getValue(I.getOperand(2));
8489
8490 // The intrinsic's index type is i64, but the SDNode requires an index type
8491 // suitable for the target. Convert the index as required.
8492 MVT VectorIdxTy = TLI.getVectorIdxTy(DAG.getDataLayout());
8493 if (Index.getValueType() != VectorIdxTy)
8494 Index = DAG.getVectorIdxConstant(Index->getAsZExtVal(), sdl);
8495
8496 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8497 setValue(&I, DAG.getNode(ISD::INSERT_SUBVECTOR, sdl, ResultVT, Vec, SubVec,
8498 Index));
8499 return;
8500 }
8501 case Intrinsic::vector_extract: {
8502 SDValue Vec = getValue(I.getOperand(0));
8503 SDValue Index = getValue(I.getOperand(1));
8504 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
8505
8506 // The intrinsic's index type is i64, but the SDNode requires an index type
8507 // suitable for the target. Convert the index as required.
8508 MVT VectorIdxTy = TLI.getVectorIdxTy(DAG.getDataLayout());
8509 if (Index.getValueType() != VectorIdxTy)
8510 Index = DAG.getVectorIdxConstant(Index->getAsZExtVal(), sdl);
8511
8512 setValue(&I,
8513 DAG.getNode(ISD::EXTRACT_SUBVECTOR, sdl, ResultVT, Vec, Index));
8514 return;
8515 }
8516 case Intrinsic::experimental_vector_match: {
8517 SDValue Op1 = getValue(I.getOperand(0));
8518 SDValue Op2 = getValue(I.getOperand(1));
8519 SDValue Mask = getValue(I.getOperand(2));
8520 EVT Op1VT = Op1.getValueType();
8521 EVT Op2VT = Op2.getValueType();
8522 EVT ResVT = Mask.getValueType();
8523 unsigned SearchSize = Op2VT.getVectorNumElements();
8524
8525 // If the target has native support for this vector match operation, lower
8526 // the intrinsic untouched; otherwise, expand it below.
8527 if (!TLI.shouldExpandVectorMatch(Op1VT, SearchSize)) {
8528 visitTargetIntrinsic(I, Intrinsic);
8529 return;
8530 }
8531
8532 SDValue Ret = DAG.getConstant(0, sdl, ResVT);
8533
8534 for (unsigned i = 0; i < SearchSize; ++i) {
8535 SDValue Op2Elem = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, sdl,
8536 Op2VT.getVectorElementType(), Op2,
8537 DAG.getVectorIdxConstant(i, sdl));
8538 SDValue Splat = DAG.getNode(ISD::SPLAT_VECTOR, sdl, Op1VT, Op2Elem);
8539 SDValue Cmp = DAG.getSetCC(sdl, ResVT, Op1, Splat, ISD::SETEQ);
8540 Ret = DAG.getNode(ISD::OR, sdl, ResVT, Ret, Cmp);
8541 }
8542
8543 setValue(&I, DAG.getNode(ISD::AND, sdl, ResVT, Ret, Mask));
8544 return;
8545 }
8546 case Intrinsic::vector_reverse:
8547 visitVectorReverse(I);
8548 return;
8549 case Intrinsic::vector_splice_left:
8550 case Intrinsic::vector_splice_right:
8551 visitVectorSplice(I);
8552 return;
8553 case Intrinsic::callbr_landingpad:
8554 visitCallBrLandingPad(I);
8555 return;
8556 case Intrinsic::vector_interleave2:
8557 visitVectorInterleave(I, 2);
8558 return;
8559 case Intrinsic::vector_interleave3:
8560 visitVectorInterleave(I, 3);
8561 return;
8562 case Intrinsic::vector_interleave4:
8563 visitVectorInterleave(I, 4);
8564 return;
8565 case Intrinsic::vector_interleave5:
8566 visitVectorInterleave(I, 5);
8567 return;
8568 case Intrinsic::vector_interleave6:
8569 visitVectorInterleave(I, 6);
8570 return;
8571 case Intrinsic::vector_interleave7:
8572 visitVectorInterleave(I, 7);
8573 return;
8574 case Intrinsic::vector_interleave8:
8575 visitVectorInterleave(I, 8);
8576 return;
8577 case Intrinsic::vector_deinterleave2:
8578 visitVectorDeinterleave(I, 2);
8579 return;
8580 case Intrinsic::vector_deinterleave3:
8581 visitVectorDeinterleave(I, 3);
8582 return;
8583 case Intrinsic::vector_deinterleave4:
8584 visitVectorDeinterleave(I, 4);
8585 return;
8586 case Intrinsic::vector_deinterleave5:
8587 visitVectorDeinterleave(I, 5);
8588 return;
8589 case Intrinsic::vector_deinterleave6:
8590 visitVectorDeinterleave(I, 6);
8591 return;
8592 case Intrinsic::vector_deinterleave7:
8593 visitVectorDeinterleave(I, 7);
8594 return;
8595 case Intrinsic::vector_deinterleave8:
8596 visitVectorDeinterleave(I, 8);
8597 return;
8598 case Intrinsic::experimental_vector_compress:
8599 setValue(&I, DAG.getNode(ISD::VECTOR_COMPRESS, sdl,
8600 getValue(I.getArgOperand(0)).getValueType(),
8601 getValue(I.getArgOperand(0)),
8602 getValue(I.getArgOperand(1)),
8603 getValue(I.getArgOperand(2)), Flags));
8604 return;
8605 case Intrinsic::experimental_convergence_anchor:
8606 case Intrinsic::experimental_convergence_entry:
8607 case Intrinsic::experimental_convergence_loop:
8608 visitConvergenceControl(I, Intrinsic);
8609 return;
8610 case Intrinsic::experimental_vector_histogram_add: {
8611 visitVectorHistogram(I, Intrinsic);
8612 return;
8613 }
8614 case Intrinsic::experimental_vector_extract_last_active: {
8615 visitVectorExtractLastActive(I, Intrinsic);
8616 return;
8617 }
8618 case Intrinsic::loop_dependence_war_mask:
8619 setValue(&I,
8621 EVT::getEVT(I.getType()), getValue(I.getOperand(0)),
8622 getValue(I.getOperand(1)), getValue(I.getOperand(2)),
8623 DAG.getConstant(0, sdl, MVT::i64)));
8624 return;
8625 case Intrinsic::loop_dependence_raw_mask:
8626 setValue(&I,
8628 EVT::getEVT(I.getType()), getValue(I.getOperand(0)),
8629 getValue(I.getOperand(1)), getValue(I.getOperand(2)),
8630 DAG.getConstant(0, sdl, MVT::i64)));
8631 return;
8632 case Intrinsic::masked_udiv:
8633 setValue(&I,
8634 DAG.getNode(ISD::MASKED_UDIV, sdl, EVT::getEVT(I.getType()),
8635 getValue(I.getOperand(0)), getValue(I.getOperand(1)),
8636 getValue(I.getOperand(2))));
8637 return;
8638 case Intrinsic::masked_sdiv:
8639 setValue(&I,
8640 DAG.getNode(ISD::MASKED_SDIV, sdl, EVT::getEVT(I.getType()),
8641 getValue(I.getOperand(0)), getValue(I.getOperand(1)),
8642 getValue(I.getOperand(2))));
8643 return;
8644 case Intrinsic::masked_urem:
8645 setValue(&I,
8646 DAG.getNode(ISD::MASKED_UREM, sdl, EVT::getEVT(I.getType()),
8647 getValue(I.getOperand(0)), getValue(I.getOperand(1)),
8648 getValue(I.getOperand(2))));
8649 return;
8650 case Intrinsic::masked_srem:
8651 setValue(&I,
8652 DAG.getNode(ISD::MASKED_SREM, sdl, EVT::getEVT(I.getType()),
8653 getValue(I.getOperand(0)), getValue(I.getOperand(1)),
8654 getValue(I.getOperand(2))));
8655 return;
8656 }
8657}
8658
8659void SelectionDAGBuilder::pushFPOpOutChain(SDValue Result,
8661 assert(Result.getNode()->getNumValues() == 2);
8662 SDValue OutChain = Result.getValue(1);
8663 assert(OutChain.getValueType() == MVT::Other);
8664
8665 // Instead of updating the root immediately, push the produced chain to the
8666 // appropriate list, deferring the update until the root is requested. In this
8667 // case, the nodes from the lists are chained using TokenFactor, indicating
8668 // that the operations are independent.
8669 //
8670 // In particular, the root is updated before any call that might access the
8671 // floating-point environment, except for constrained intrinsics.
8672 switch (EB) {
8675 PendingConstrainedFP.push_back(OutChain);
8676 break;
8678 PendingConstrainedFPStrict.push_back(OutChain);
8679 break;
8680 }
8681}
8682
8683void SelectionDAGBuilder::visitConstrainedFPIntrinsic(
8684 const ConstrainedFPIntrinsic &FPI) {
8685 SDLoc sdl = getCurSDLoc();
8686
8687 // We do not need to serialize constrained FP intrinsics against
8688 // each other or against (nonvolatile) loads, so they can be
8689 // chained like loads.
8691 SDValue Chain = getFPOperationRoot(EB);
8693 Opers.push_back(Chain);
8694 for (unsigned I = 0, E = FPI.getNonMetadataArgCount(); I != E; ++I)
8695 Opers.push_back(getValue(FPI.getArgOperand(I)));
8696
8697 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8698 EVT VT = TLI.getValueType(DAG.getDataLayout(), FPI.getType());
8699 SDVTList VTs = DAG.getVTList(VT, MVT::Other);
8700
8701 SDNodeFlags Flags;
8703 Flags.setNoFPExcept(true);
8704
8705 if (auto *FPOp = dyn_cast<FPMathOperator>(&FPI))
8706 Flags.copyFMF(*FPOp);
8707
8708 unsigned Opcode;
8709 switch (FPI.getIntrinsicID()) {
8710 default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
8711#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
8712 case Intrinsic::INTRINSIC: \
8713 Opcode = ISD::STRICT_##DAGN; \
8714 break;
8715#include "llvm/IR/ConstrainedOps.def"
8716 case Intrinsic::experimental_constrained_fmuladd: {
8717 Opcode = ISD::STRICT_FMA;
8718 // Break fmuladd into fmul and fadd.
8719 if (TM.Options.AllowFPOpFusion == FPOpFusion::Strict ||
8720 !TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), VT)) {
8721 Opers.pop_back();
8722 SDValue Mul = DAG.getNode(ISD::STRICT_FMUL, sdl, VTs, Opers, Flags);
8723 pushFPOpOutChain(Mul, EB);
8724 Opcode = ISD::STRICT_FADD;
8725 Opers.clear();
8726 Opers.push_back(Mul.getValue(1));
8727 Opers.push_back(Mul.getValue(0));
8728 Opers.push_back(getValue(FPI.getArgOperand(2)));
8729 }
8730 break;
8731 }
8732 }
8733
8734 // A few strict DAG nodes carry additional operands that are not
8735 // set up by the default code above.
8736 switch (Opcode) {
8737 default: break;
8739 Opers.push_back(
8740 DAG.getTargetConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout())));
8741 break;
8742 case ISD::STRICT_FSETCC:
8743 case ISD::STRICT_FSETCCS: {
8744 auto *FPCmp = dyn_cast<ConstrainedFPCmpIntrinsic>(&FPI);
8745 ISD::CondCode Condition = getFCmpCondCode(FPCmp->getPredicate());
8746 if (DAG.isKnownNeverNaN(Opers[1]) && DAG.isKnownNeverNaN(Opers[2]))
8747 Condition = getFCmpCodeWithoutNaN(Condition);
8748 Opers.push_back(DAG.getCondCode(Condition));
8749 break;
8750 }
8751 }
8752
8753 SDValue Result = DAG.getNode(Opcode, sdl, VTs, Opers, Flags);
8754 pushFPOpOutChain(Result, EB);
8755
8756 SDValue FPResult = Result.getValue(0);
8757 setValue(&FPI, FPResult);
8758}
8759
8760static unsigned getISDForVPIntrinsic(const VPIntrinsic &VPIntrin) {
8761 std::optional<unsigned> ResOPC;
8762 switch (VPIntrin.getIntrinsicID()) {
8763 case Intrinsic::vp_ctlz: {
8764 bool IsZeroUndef = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8765 ResOPC = IsZeroUndef ? ISD::VP_CTLZ_ZERO_POISON : ISD::VP_CTLZ;
8766 break;
8767 }
8768 case Intrinsic::vp_cttz: {
8769 bool IsZeroUndef = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8770 ResOPC = IsZeroUndef ? ISD::VP_CTTZ_ZERO_POISON : ISD::VP_CTTZ;
8771 break;
8772 }
8773 case Intrinsic::vp_cttz_elts: {
8774 bool IsZeroPoison = cast<ConstantInt>(VPIntrin.getArgOperand(1))->isOne();
8775 ResOPC = IsZeroPoison ? ISD::VP_CTTZ_ELTS_ZERO_POISON : ISD::VP_CTTZ_ELTS;
8776 break;
8777 }
8778#define HELPER_MAP_VPID_TO_VPSD(VPID, VPSD) \
8779 case Intrinsic::VPID: \
8780 ResOPC = ISD::VPSD; \
8781 break;
8782#include "llvm/IR/VPIntrinsics.def"
8783 }
8784
8785 if (!ResOPC)
8787 "Inconsistency: no SDNode available for this VPIntrinsic!");
8788
8789 if (*ResOPC == ISD::VP_REDUCE_SEQ_FADD ||
8790 *ResOPC == ISD::VP_REDUCE_SEQ_FMUL) {
8791 if (VPIntrin.getFastMathFlags().allowReassoc())
8792 return *ResOPC == ISD::VP_REDUCE_SEQ_FADD ? ISD::VP_REDUCE_FADD
8793 : ISD::VP_REDUCE_FMUL;
8794 }
8795
8796 return *ResOPC;
8797}
8798
8799void SelectionDAGBuilder::visitVPLoad(
8800 const VPIntrinsic &VPIntrin, EVT VT,
8801 const SmallVectorImpl<SDValue> &OpValues) {
8802 SDLoc DL = getCurSDLoc();
8803 Value *PtrOperand = VPIntrin.getArgOperand(0);
8804 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8805 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8806 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8807 SDValue LD;
8808 // Do not serialize variable-length loads of constant memory with
8809 // anything.
8810 if (!Alignment)
8811 Alignment = DAG.getEVTAlign(VT);
8812 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8813 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8814 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8815 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8816 MachineMemOperand::Flags MMOFlags =
8817 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8818 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8819 MachinePointerInfo(PtrOperand), MMOFlags,
8820 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo, Ranges);
8821 LD = DAG.getLoadVP(VT, DL, InChain, OpValues[0], OpValues[1], OpValues[2],
8822 MMO, false /*IsExpanding */);
8823 if (AddToChain)
8824 PendingLoads.push_back(LD.getValue(1));
8825 setValue(&VPIntrin, LD);
8826}
8827
8828void SelectionDAGBuilder::visitVPLoadFF(
8829 const VPIntrinsic &VPIntrin, EVT VT, EVT EVLVT,
8830 const SmallVectorImpl<SDValue> &OpValues) {
8831 assert(OpValues.size() == 3 && "Unexpected number of operands");
8832 SDLoc DL = getCurSDLoc();
8833 Value *PtrOperand = VPIntrin.getArgOperand(0);
8834 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8835 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8836 const MDNode *Ranges = VPIntrin.getMetadata(LLVMContext::MD_range);
8837 SDValue LD;
8838 // Do not serialize variable-length loads of constant memory with
8839 // anything.
8840 if (!Alignment)
8841 Alignment = DAG.getEVTAlign(VT);
8842 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8843 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8844 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8845 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8846 MachinePointerInfo(PtrOperand), MachineMemOperand::MOLoad,
8847 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo, Ranges);
8848 LD = DAG.getLoadFFVP(VT, DL, InChain, OpValues[0], OpValues[1], OpValues[2],
8849 MMO);
8850 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, EVLVT, LD.getValue(1));
8851 if (AddToChain)
8852 PendingLoads.push_back(LD.getValue(2));
8853 setValue(&VPIntrin, DAG.getMergeValues({LD.getValue(0), Trunc}, DL));
8854}
8855
8856void SelectionDAGBuilder::visitVPGather(
8857 const VPIntrinsic &VPIntrin, EVT VT,
8858 const SmallVectorImpl<SDValue> &OpValues) {
8859 SDLoc DL = getCurSDLoc();
8860 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8861 Value *PtrOperand = VPIntrin.getArgOperand(0);
8862 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8863 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8864 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8865 SDValue LD;
8866 if (!Alignment)
8867 Alignment = DAG.getEVTAlign(VT.getScalarType());
8868 unsigned AS =
8869 PtrOperand->getType()->getScalarType()->getPointerAddressSpace();
8870 MachineMemOperand::Flags MMOFlags =
8871 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8872 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8873 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8874 *Alignment, AAInfo, Ranges);
8875 SDValue Base, Index, Scale;
8876 bool UniformBase =
8877 getUniformBase(PtrOperand, Base, Index, Scale, this, VPIntrin.getParent(),
8878 VT.getScalarStoreSize());
8879 if (!UniformBase) {
8880 Base = DAG.getConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout()));
8881 Index = getValue(PtrOperand);
8882 Scale = DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout()));
8883 }
8884 EVT IdxVT = Index.getValueType();
8885 EVT EltTy = IdxVT.getVectorElementType();
8886 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
8887 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
8888 Index = DAG.getNode(ISD::SIGN_EXTEND, DL, NewIdxVT, Index);
8889 }
8890 LD = DAG.getGatherVP(
8891 DAG.getVTList(VT, MVT::Other), VT, DL,
8892 {DAG.getRoot(), Base, Index, Scale, OpValues[1], OpValues[2]}, MMO,
8894 PendingLoads.push_back(LD.getValue(1));
8895 setValue(&VPIntrin, LD);
8896}
8897
8898void SelectionDAGBuilder::visitVPStore(
8899 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8900 SDLoc DL = getCurSDLoc();
8901 Value *PtrOperand = VPIntrin.getArgOperand(1);
8902 EVT VT = OpValues[0].getValueType();
8903 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8904 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8905 SDValue ST;
8906 if (!Alignment)
8907 Alignment = DAG.getEVTAlign(VT);
8908 SDValue Ptr = OpValues[1];
8909 SDValue Offset = DAG.getUNDEF(Ptr.getValueType());
8910 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8911 MachineMemOperand::Flags MMOFlags =
8912 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8913 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8914 MachinePointerInfo(PtrOperand), MMOFlags,
8915 LocationSize::beforeOrAfterPointer(), *Alignment, AAInfo);
8916 ST = DAG.getStoreVP(getMemoryRoot(), DL, OpValues[0], Ptr, Offset,
8917 OpValues[2], OpValues[3], VT, MMO, ISD::UNINDEXED,
8918 /* IsTruncating */ false, /*IsCompressing*/ false);
8919 DAG.setRoot(ST);
8920 setValue(&VPIntrin, ST);
8921}
8922
8923void SelectionDAGBuilder::visitVPScatter(
8924 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8925 SDLoc DL = getCurSDLoc();
8926 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8927 Value *PtrOperand = VPIntrin.getArgOperand(1);
8928 EVT VT = OpValues[0].getValueType();
8929 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8930 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8931 SDValue ST;
8932 if (!Alignment)
8933 Alignment = DAG.getEVTAlign(VT.getScalarType());
8934 unsigned AS =
8935 PtrOperand->getType()->getScalarType()->getPointerAddressSpace();
8936 MachineMemOperand::Flags MMOFlags =
8937 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8938 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8939 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8940 *Alignment, AAInfo);
8941 SDValue Base, Index, Scale;
8942 bool UniformBase =
8943 getUniformBase(PtrOperand, Base, Index, Scale, this, VPIntrin.getParent(),
8944 VT.getScalarStoreSize());
8945 if (!UniformBase) {
8946 Base = DAG.getConstant(0, DL, TLI.getPointerTy(DAG.getDataLayout()));
8947 Index = getValue(PtrOperand);
8948 Scale = DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout()));
8949 }
8950 EVT IdxVT = Index.getValueType();
8951 EVT EltTy = IdxVT.getVectorElementType();
8952 if (TLI.shouldExtendGSIndex(IdxVT, EltTy)) {
8953 EVT NewIdxVT = IdxVT.changeVectorElementType(*DAG.getContext(), EltTy);
8954 Index = DAG.getNode(ISD::SIGN_EXTEND, DL, NewIdxVT, Index);
8955 }
8956 ST = DAG.getScatterVP(DAG.getVTList(MVT::Other), VT, DL,
8957 {getMemoryRoot(), OpValues[0], Base, Index, Scale,
8958 OpValues[2], OpValues[3]},
8959 MMO, ISD::SIGNED_SCALED);
8960 DAG.setRoot(ST);
8961 setValue(&VPIntrin, ST);
8962}
8963
8964void SelectionDAGBuilder::visitVPStridedLoad(
8965 const VPIntrinsic &VPIntrin, EVT VT,
8966 const SmallVectorImpl<SDValue> &OpValues) {
8967 SDLoc DL = getCurSDLoc();
8968 Value *PtrOperand = VPIntrin.getArgOperand(0);
8969 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
8970 if (!Alignment)
8971 Alignment = DAG.getEVTAlign(VT.getScalarType());
8972 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
8973 const MDNode *Ranges = getRangeMetadata(VPIntrin);
8974 MemoryLocation ML = MemoryLocation::getAfter(PtrOperand, AAInfo);
8975 bool AddToChain = !BatchAA || !BatchAA->pointsToConstantMemory(ML);
8976 SDValue InChain = AddToChain ? DAG.getRoot() : DAG.getEntryNode();
8977 unsigned AS = PtrOperand->getType()->getPointerAddressSpace();
8978 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8979 MachineMemOperand::Flags MMOFlags =
8980 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
8981 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
8982 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
8983 *Alignment, AAInfo, Ranges);
8984
8985 SDValue LD = DAG.getStridedLoadVP(VT, DL, InChain, OpValues[0], OpValues[1],
8986 OpValues[2], OpValues[3], MMO,
8987 false /*IsExpanding*/);
8988
8989 if (AddToChain)
8990 PendingLoads.push_back(LD.getValue(1));
8991 setValue(&VPIntrin, LD);
8992}
8993
8994void SelectionDAGBuilder::visitVPStridedStore(
8995 const VPIntrinsic &VPIntrin, const SmallVectorImpl<SDValue> &OpValues) {
8996 SDLoc DL = getCurSDLoc();
8997 Value *PtrOperand = VPIntrin.getArgOperand(1);
8998 EVT VT = OpValues[0].getValueType();
8999 MaybeAlign Alignment = VPIntrin.getPointerAlignment();
9000 if (!Alignment)
9001 Alignment = DAG.getEVTAlign(VT.getScalarType());
9002 AAMDNodes AAInfo = VPIntrin.getAAMetadata();
9003 unsigned AS = PtrOperand->getType()->getPointerAddressSpace();
9004 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9005 MachineMemOperand::Flags MMOFlags =
9006 TLI.getVPIntrinsicMemOperandFlags(VPIntrin);
9007 MachineMemOperand *MMO = DAG.getMachineFunction().getMachineMemOperand(
9008 MachinePointerInfo(AS), MMOFlags, LocationSize::beforeOrAfterPointer(),
9009 *Alignment, AAInfo);
9010
9011 SDValue ST = DAG.getStridedStoreVP(
9012 getMemoryRoot(), DL, OpValues[0], OpValues[1],
9013 DAG.getUNDEF(OpValues[1].getValueType()), OpValues[2], OpValues[3],
9014 OpValues[4], VT, MMO, ISD::UNINDEXED, /*IsTruncating*/ false,
9015 /*IsCompressing*/ false);
9016
9017 DAG.setRoot(ST);
9018 setValue(&VPIntrin, ST);
9019}
9020
9021void SelectionDAGBuilder::visitVPCmp(const VPCmpIntrinsic &VPIntrin) {
9022 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9023 SDLoc DL = getCurSDLoc();
9024
9025 ISD::CondCode Condition;
9027
9028 Value *Op1 = VPIntrin.getOperand(0);
9029 Value *Op2 = VPIntrin.getOperand(1);
9030 // #2 is the condition code
9031 SDValue MaskOp = getValue(VPIntrin.getOperand(3));
9032 SDValue EVL = getValue(VPIntrin.getOperand(4));
9033 MVT EVLParamVT = TLI.getVPExplicitVectorLengthTy();
9034 assert(EVLParamVT.isScalarInteger() && EVLParamVT.bitsGE(MVT::i32) &&
9035 "Unexpected target EVL type");
9036 EVL = DAG.getNode(ISD::ZERO_EXTEND, DL, EVLParamVT, EVL);
9037
9038 if (VPIntrin.getOperand(0)->getType()->isFPOrFPVectorTy()) {
9039 Condition = getFCmpCondCode(CondCode);
9040 SimplifyQuery SQ(DAG.getDataLayout(), &VPIntrin);
9041 if (isKnownNeverNaN(Op2, SQ) && isKnownNeverNaN(Op1, SQ))
9042 Condition = getFCmpCodeWithoutNaN(Condition);
9043 } else {
9044 Condition = getICmpCondCode(CondCode);
9045 }
9046
9047 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9048 VPIntrin.getType());
9049 setValue(&VPIntrin, DAG.getSetCCVP(DL, DestVT, getValue(Op1), getValue(Op2),
9050 Condition, MaskOp, EVL));
9051}
9052
9053void SelectionDAGBuilder::visitVectorPredicationIntrinsic(
9054 const VPIntrinsic &VPIntrin) {
9055 SDLoc DL = getCurSDLoc();
9056 unsigned Opcode = getISDForVPIntrinsic(VPIntrin);
9057
9058 auto IID = VPIntrin.getIntrinsicID();
9059
9060 if (const auto *CmpI = dyn_cast<VPCmpIntrinsic>(&VPIntrin))
9061 return visitVPCmp(*CmpI);
9062
9063 SmallVector<EVT, 4> ValueVTs;
9064 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9065 ComputeValueVTs(TLI, DAG.getDataLayout(), VPIntrin.getType(), ValueVTs);
9066 SDVTList VTs = DAG.getVTList(ValueVTs);
9067
9068 auto EVLParamPos = VPIntrinsic::getVectorLengthParamPos(IID);
9069
9070 MVT EVLParamVT = TLI.getVPExplicitVectorLengthTy();
9071 assert(EVLParamVT.isScalarInteger() && EVLParamVT.bitsGE(MVT::i32) &&
9072 "Unexpected target EVL type");
9073
9074 // Request operands.
9075 SmallVector<SDValue, 7> OpValues;
9076 for (unsigned I = 0; I < VPIntrin.arg_size(); ++I) {
9077 auto Op = getValue(VPIntrin.getArgOperand(I));
9078 if (I == EVLParamPos)
9079 Op = DAG.getNode(ISD::ZERO_EXTEND, DL, EVLParamVT, Op);
9080 OpValues.push_back(Op);
9081 }
9082
9083 switch (Opcode) {
9084 default: {
9085 SDNodeFlags SDFlags;
9086 if (auto *FPMO = dyn_cast<FPMathOperator>(&VPIntrin))
9087 SDFlags.copyFMF(*FPMO);
9088 SDValue Result = DAG.getNode(Opcode, DL, VTs, OpValues, SDFlags);
9089 setValue(&VPIntrin, Result);
9090 break;
9091 }
9092 case ISD::VP_LOAD:
9093 visitVPLoad(VPIntrin, ValueVTs[0], OpValues);
9094 break;
9095 case ISD::VP_LOAD_FF:
9096 visitVPLoadFF(VPIntrin, ValueVTs[0], ValueVTs[1], OpValues);
9097 break;
9098 case ISD::VP_GATHER:
9099 visitVPGather(VPIntrin, ValueVTs[0], OpValues);
9100 break;
9101 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
9102 visitVPStridedLoad(VPIntrin, ValueVTs[0], OpValues);
9103 break;
9104 case ISD::VP_STORE:
9105 visitVPStore(VPIntrin, OpValues);
9106 break;
9107 case ISD::VP_SCATTER:
9108 visitVPScatter(VPIntrin, OpValues);
9109 break;
9110 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
9111 visitVPStridedStore(VPIntrin, OpValues);
9112 break;
9113 case ISD::VP_FMULADD: {
9114 assert(OpValues.size() == 5 && "Unexpected number of operands");
9115 SDNodeFlags SDFlags;
9116 if (auto *FPMO = dyn_cast<FPMathOperator>(&VPIntrin))
9117 SDFlags.copyFMF(*FPMO);
9118 if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
9119 TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), ValueVTs[0])) {
9120 setValue(&VPIntrin, DAG.getNode(ISD::VP_FMA, DL, VTs, OpValues, SDFlags));
9121 } else {
9122 SDValue Mul = DAG.getNode(
9123 ISD::VP_FMUL, DL, VTs,
9124 {OpValues[0], OpValues[1], OpValues[3], OpValues[4]}, SDFlags);
9125 SDValue Add =
9126 DAG.getNode(ISD::VP_FADD, DL, VTs,
9127 {Mul, OpValues[2], OpValues[3], OpValues[4]}, SDFlags);
9128 setValue(&VPIntrin, Add);
9129 }
9130 break;
9131 }
9132 case ISD::VP_IS_FPCLASS: {
9133 const DataLayout DLayout = DAG.getDataLayout();
9134 EVT DestVT = TLI.getValueType(DLayout, VPIntrin.getType());
9135 auto Constant = OpValues[1]->getAsZExtVal();
9136 SDValue Check = DAG.getTargetConstant(Constant, DL, MVT::i32);
9137 SDValue V = DAG.getNode(ISD::VP_IS_FPCLASS, DL, DestVT,
9138 {OpValues[0], Check, OpValues[2], OpValues[3]});
9139 setValue(&VPIntrin, V);
9140 return;
9141 }
9142 case ISD::VP_INTTOPTR: {
9143 SDValue N = OpValues[0];
9144 EVT DestVT = TLI.getValueType(DAG.getDataLayout(), VPIntrin.getType());
9145 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(), VPIntrin.getType());
9146 N = DAG.getVPPtrExtOrTrunc(getCurSDLoc(), DestVT, N, OpValues[1],
9147 OpValues[2]);
9148 N = DAG.getVPZExtOrTrunc(getCurSDLoc(), PtrMemVT, N, OpValues[1],
9149 OpValues[2]);
9150 setValue(&VPIntrin, N);
9151 break;
9152 }
9153 case ISD::VP_PTRTOINT: {
9154 SDValue N = OpValues[0];
9155 EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9156 VPIntrin.getType());
9157 EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(),
9158 VPIntrin.getOperand(0)->getType());
9159 N = DAG.getVPPtrExtOrTrunc(getCurSDLoc(), PtrMemVT, N, OpValues[1],
9160 OpValues[2]);
9161 N = DAG.getVPZExtOrTrunc(getCurSDLoc(), DestVT, N, OpValues[1],
9162 OpValues[2]);
9163 setValue(&VPIntrin, N);
9164 break;
9165 }
9166 case ISD::VP_ABS:
9167 case ISD::VP_CTLZ:
9168 case ISD::VP_CTLZ_ZERO_POISON:
9169 case ISD::VP_CTTZ:
9170 case ISD::VP_CTTZ_ZERO_POISON:
9171 case ISD::VP_CTTZ_ELTS_ZERO_POISON:
9172 case ISD::VP_CTTZ_ELTS: {
9173 SDValue Result =
9174 DAG.getNode(Opcode, DL, VTs, {OpValues[0], OpValues[2], OpValues[3]});
9175 setValue(&VPIntrin, Result);
9176 break;
9177 }
9178 }
9179}
9180
9182 const BasicBlock *EHPadBB,
9183 MCSymbol *&BeginLabel) {
9184 MachineFunction &MF = DAG.getMachineFunction();
9185
9186 // Insert a label before the invoke call to mark the try range. This can be
9187 // used to detect deletion of the invoke via the MachineModuleInfo.
9188 BeginLabel = MF.getContext().createTempSymbol();
9189
9190 // For SjLj, keep track of which landing pads go with which invokes
9191 // so as to maintain the ordering of pads in the LSDA.
9192 unsigned CallSiteIndex = FuncInfo.getCurrentCallSite();
9193 if (CallSiteIndex) {
9194 MF.setCallSiteBeginLabel(BeginLabel, CallSiteIndex);
9195 LPadToCallSiteMap[FuncInfo.getMBB(EHPadBB)].push_back(CallSiteIndex);
9196
9197 // Now that the call site is handled, stop tracking it.
9198 FuncInfo.setCurrentCallSite(0);
9199 }
9200
9201 return DAG.getEHLabel(getCurSDLoc(), Chain, BeginLabel);
9202}
9203
9204SDValue SelectionDAGBuilder::lowerEndEH(SDValue Chain, const InvokeInst *II,
9205 const BasicBlock *EHPadBB,
9206 MCSymbol *BeginLabel) {
9207 assert(BeginLabel && "BeginLabel should've been set");
9208
9210
9211 // Insert a label at the end of the invoke call to mark the try range. This
9212 // can be used to detect deletion of the invoke via the MachineModuleInfo.
9213 MCSymbol *EndLabel = MF.getContext().createTempSymbol();
9214 Chain = DAG.getEHLabel(getCurSDLoc(), Chain, EndLabel);
9215
9216 // Inform MachineModuleInfo of range.
9218 // There is a platform (e.g. wasm) that uses funclet style IR but does not
9219 // actually use outlined funclets and their LSDA info style.
9220 if (MF.hasEHFunclets() && isFuncletEHPersonality(Pers)) {
9221 assert(II && "II should've been set");
9222 WinEHFuncInfo *EHInfo = MF.getWinEHFuncInfo();
9223 EHInfo->addIPToStateRange(II, BeginLabel, EndLabel);
9224 } else if (!isScopedEHPersonality(Pers)) {
9225 assert(EHPadBB);
9226 MF.addInvoke(FuncInfo.getMBB(EHPadBB), BeginLabel, EndLabel);
9227 }
9228
9229 return Chain;
9230}
9231
9232std::pair<SDValue, SDValue>
9234 const BasicBlock *EHPadBB) {
9235 MCSymbol *BeginLabel = nullptr;
9236
9237 if (EHPadBB) {
9238 // Both PendingLoads and PendingExports must be flushed here;
9239 // this call might not return.
9240 (void)getRoot();
9241 DAG.setRoot(lowerStartEH(getControlRoot(), EHPadBB, BeginLabel));
9242 CLI.setChain(getRoot());
9243 }
9244
9245 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9246 std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);
9247
9248 assert((CLI.IsTailCall || Result.second.getNode()) &&
9249 "Non-null chain expected with non-tail call!");
9250 assert((Result.second.getNode() || !Result.first.getNode()) &&
9251 "Null value expected with tail call!");
9252
9253 if (!Result.second.getNode()) {
9254 // As a special case, a null chain means that a tail call has been emitted
9255 // and the DAG root is already updated.
9256 HasTailCall = true;
9257
9258 // Since there's no actual continuation from this block, nothing can be
9259 // relying on us setting vregs for them.
9260 PendingExports.clear();
9261 } else {
9262 DAG.setRoot(Result.second);
9263 }
9264
9265 if (EHPadBB) {
9266 DAG.setRoot(lowerEndEH(getRoot(), cast_or_null<InvokeInst>(CLI.CB), EHPadBB,
9267 BeginLabel));
9268 Result.second = getRoot();
9269 }
9270
9271 return Result;
9272}
9273
9275 bool isMustTailCall = CB.isMustTailCall();
9276
9277 // Avoid emitting tail calls in functions with the disable-tail-calls
9278 // attribute.
9279 const Function *Caller = CB.getParent()->getParent();
9280 if (!isMustTailCall &&
9281 Caller->getFnAttribute("disable-tail-calls").getValueAsBool())
9282 return false;
9283
9284 // We can't tail call inside a function with a swifterror argument. Lowering
9285 // does not support this yet. It would have to move into the swifterror
9286 // register before the call.
9287 if (DAG.getTargetLoweringInfo().supportSwiftError() &&
9288 Caller->getAttributes().hasAttrSomewhere(Attribute::SwiftError))
9289 return false;
9290
9291 // Check if target-independent constraints permit a tail call here.
9292 // Target-dependent constraints are checked within TLI->LowerCallTo.
9293 return isInTailCallPosition(CB, DAG.getTarget());
9294}
9295
9297 bool isTailCall, bool isMustTailCall,
9298 const BasicBlock *EHPadBB,
9299 const TargetLowering::PtrAuthInfo *PAI) {
9300 auto &DL = DAG.getDataLayout();
9301 FunctionType *FTy = CB.getFunctionType();
9302 Type *RetTy = CB.getType();
9303
9305 Args.reserve(CB.arg_size());
9306
9307 const Value *SwiftErrorVal = nullptr;
9308 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9309
9310 if (isTailCall)
9311 isTailCall = canTailCall(CB);
9312
9313 for (auto I = CB.arg_begin(), E = CB.arg_end(); I != E; ++I) {
9314 const Value *V = *I;
9315
9316 // Skip empty types
9317 if (V->getType()->isEmptyTy())
9318 continue;
9319
9320 SDValue ArgNode = getValue(V);
9321 TargetLowering::ArgListEntry Entry(ArgNode, V->getType());
9322 Entry.setAttributes(&CB, I - CB.arg_begin());
9323
9324 // Use swifterror virtual register as input to the call.
9325 if (Entry.IsSwiftError && TLI.supportSwiftError()) {
9326 SwiftErrorVal = V;
9327 // We find the virtual register for the actual swifterror argument.
9328 // Instead of using the Value, we use the virtual register instead.
9329 Entry.Node =
9330 DAG.getRegister(SwiftError.getOrCreateVRegUseAt(&CB, FuncInfo.MBB, V),
9331 EVT(TLI.getPointerTy(DL)));
9332 }
9333
9334 Args.push_back(Entry);
9335
9336 // If we have an explicit sret argument that is an Instruction, (i.e., it
9337 // might point to function-local memory), we can't meaningfully tail-call.
9338 if (Entry.IsSRet && isa<Instruction>(V))
9339 isTailCall = false;
9340 }
9341
9342 // If call site has a cfguardtarget operand bundle, create and add an
9343 // additional ArgListEntry.
9344 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_cfguardtarget)) {
9345 Value *V = Bundle->Inputs[0];
9347 Entry.IsCFGuardTarget = true;
9348 Args.push_back(Entry);
9349 }
9350
9351 // Disable tail calls if there is an swifterror argument. Targets have not
9352 // been updated to support tail calls.
9353 if (TLI.supportSwiftError() && SwiftErrorVal)
9354 isTailCall = false;
9355
9356 ConstantInt *CFIType = nullptr;
9357 if (CB.isIndirectCall()) {
9358 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_kcfi)) {
9359 if (!TLI.supportKCFIBundles())
9361 "Target doesn't support calls with kcfi operand bundles.");
9362 CFIType = cast<ConstantInt>(Bundle->Inputs[0]);
9363 assert(CFIType->getType()->isIntegerTy(32) && "Invalid CFI type");
9364 }
9365 }
9366
9367 SDValue ConvControlToken;
9368 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_convergencectrl)) {
9369 auto *Token = Bundle->Inputs[0].get();
9370 ConvControlToken = getValue(Token);
9371 }
9372
9373 GlobalValue *DeactivationSymbol = nullptr;
9375 DeactivationSymbol = cast<GlobalValue>(Bundle->Inputs[0].get());
9376 }
9377
9380 .setChain(getRoot())
9381 .setCallee(RetTy, FTy, Callee, std::move(Args), CB)
9382 .setTailCall(isTailCall)
9386 .setCFIType(CFIType)
9387 .setConvergenceControlToken(ConvControlToken)
9388 .setDeactivationSymbol(DeactivationSymbol);
9389
9390 // Set the pointer authentication info if we have it.
9391 if (PAI) {
9392 if (!TLI.supportPtrAuthBundles())
9394 "This target doesn't support calls with ptrauth operand bundles.");
9395 CLI.setPtrAuth(*PAI);
9396 }
9397
9398 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
9399
9400 if (Result.first.getNode()) {
9401 Result.first = lowerRangeToAssertZExt(DAG, CB, Result.first);
9402 Result.first = lowerNoFPClassToAssertNoFPClass(DAG, CB, Result.first);
9403 setValue(&CB, Result.first);
9404 }
9405
9406 // The last element of CLI.InVals has the SDValue for swifterror return.
9407 // Here we copy it to a virtual register and update SwiftErrorMap for
9408 // book-keeping.
9409 if (SwiftErrorVal && TLI.supportSwiftError()) {
9410 // Get the last element of InVals.
9411 SDValue Src = CLI.InVals.back();
9412 Register VReg =
9413 SwiftError.getOrCreateVRegDefAt(&CB, FuncInfo.MBB, SwiftErrorVal);
9414 SDValue CopyNode = CLI.DAG.getCopyToReg(Result.second, CLI.DL, VReg, Src);
9415 DAG.setRoot(CopyNode);
9416 }
9417}
9418
9419static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT,
9420 SelectionDAGBuilder &Builder) {
9421 // Check to see if this load can be trivially constant folded, e.g. if the
9422 // input is from a string literal.
9423 if (const Constant *LoadInput = dyn_cast<Constant>(PtrVal)) {
9424 // Cast pointer to the type we really want to load.
9425 Type *LoadTy =
9426 Type::getIntNTy(PtrVal->getContext(), LoadVT.getScalarSizeInBits());
9427 if (LoadVT.isVector())
9428 LoadTy = FixedVectorType::get(LoadTy, LoadVT.getVectorNumElements());
9429 if (const Constant *LoadCst =
9430 ConstantFoldLoadFromConstPtr(const_cast<Constant *>(LoadInput),
9431 LoadTy, Builder.DAG.getDataLayout()))
9432 return Builder.getValue(LoadCst);
9433 }
9434
9435 // Otherwise, we have to emit the load. If the pointer is to unfoldable but
9436 // still constant memory, the input chain can be the entry node.
9437 SDValue Root;
9438 bool ConstantMemory = false;
9439
9440 // Do not serialize (non-volatile) loads of constant memory with anything.
9441 if (Builder.BatchAA && Builder.BatchAA->pointsToConstantMemory(PtrVal)) {
9442 Root = Builder.DAG.getEntryNode();
9443 ConstantMemory = true;
9444 } else {
9445 // Do not serialize non-volatile loads against each other.
9446 Root = Builder.DAG.getRoot();
9447 }
9448
9449 SDValue Ptr = Builder.getValue(PtrVal);
9450 SDValue LoadVal =
9451 Builder.DAG.getLoad(LoadVT, Builder.getCurSDLoc(), Root, Ptr,
9452 MachinePointerInfo(PtrVal), Align(1));
9453
9454 if (!ConstantMemory)
9455 Builder.PendingLoads.push_back(LoadVal.getValue(1));
9456 return LoadVal;
9457}
9458
9459/// Record the value for an instruction that produces an integer result,
9460/// converting the type where necessary.
9461void SelectionDAGBuilder::processIntegerCallValue(const Instruction &I,
9462 SDValue Value,
9463 bool IsSigned) {
9464 EVT VT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9465 I.getType(), true);
9466 Value = DAG.getExtOrTrunc(IsSigned, Value, getCurSDLoc(), VT);
9467 setValue(&I, Value);
9468}
9469
9470/// See if we can lower a memcmp/bcmp call into an optimized form. If so, return
9471/// true and lower it. Otherwise return false, and it will be lowered like a
9472/// normal call.
9473/// The caller already checked that \p I calls the appropriate LibFunc with a
9474/// correct prototype.
9475bool SelectionDAGBuilder::visitMemCmpBCmpCall(const CallInst &I) {
9476 const Value *LHS = I.getArgOperand(0), *RHS = I.getArgOperand(1);
9477 const Value *Size = I.getArgOperand(2);
9478 const ConstantSDNode *CSize = dyn_cast<ConstantSDNode>(getValue(Size));
9479 if (CSize && CSize->getZExtValue() == 0) {
9480 EVT CallVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
9481 I.getType(), true);
9482 setValue(&I, DAG.getConstant(0, getCurSDLoc(), CallVT));
9483 return true;
9484 }
9485
9486 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9487 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForMemcmp(
9488 DAG, getCurSDLoc(), DAG.getRoot(), getValue(LHS), getValue(RHS),
9489 getValue(Size), &I);
9490 if (Res.first.getNode()) {
9491 processIntegerCallValue(I, Res.first, true);
9492 PendingLoads.push_back(Res.second);
9493 return true;
9494 }
9495
9496 // memcmp(S1,S2,2) != 0 -> (*(short*)LHS != *(short*)RHS) != 0
9497 // memcmp(S1,S2,4) != 0 -> (*(int*)LHS != *(int*)RHS) != 0
9498 if (!CSize || !isOnlyUsedInZeroEqualityComparison(&I))
9499 return false;
9500
9501 // If the target has a fast compare for the given size, it will return a
9502 // preferred load type for that size. Require that the load VT is legal and
9503 // that the target supports unaligned loads of that type. Otherwise, return
9504 // INVALID.
9505 auto hasFastLoadsAndCompare = [&](unsigned NumBits) {
9506 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9507 MVT LVT = TLI.hasFastEqualityCompare(NumBits);
9508 if (LVT != MVT::INVALID_SIMPLE_VALUE_TYPE) {
9509 // TODO: Handle 5 byte compare as 4-byte + 1 byte.
9510 // TODO: Handle 8 byte compare on x86-32 as two 32-bit loads.
9511 // TODO: Check alignment of src and dest ptrs.
9512 unsigned DstAS = LHS->getType()->getPointerAddressSpace();
9513 unsigned SrcAS = RHS->getType()->getPointerAddressSpace();
9514 if (!TLI.isTypeLegal(LVT) ||
9515 !TLI.allowsMisalignedMemoryAccesses(LVT, SrcAS) ||
9516 !TLI.allowsMisalignedMemoryAccesses(LVT, DstAS))
9518 }
9519
9520 return LVT;
9521 };
9522
9523 // This turns into unaligned loads. We only do this if the target natively
9524 // supports the MVT we'll be loading or if it is small enough (<= 4) that
9525 // we'll only produce a small number of byte loads.
9526 MVT LoadVT;
9527 unsigned NumBitsToCompare = CSize->getZExtValue() * 8;
9528 switch (NumBitsToCompare) {
9529 default:
9530 return false;
9531 case 16:
9532 LoadVT = MVT::i16;
9533 break;
9534 case 32:
9535 LoadVT = MVT::i32;
9536 break;
9537 case 64:
9538 case 128:
9539 case 256:
9540 LoadVT = hasFastLoadsAndCompare(NumBitsToCompare);
9541 break;
9542 }
9543
9544 if (LoadVT == MVT::INVALID_SIMPLE_VALUE_TYPE)
9545 return false;
9546
9547 SDValue LoadL = getMemCmpLoad(LHS, LoadVT, *this);
9548 SDValue LoadR = getMemCmpLoad(RHS, LoadVT, *this);
9549
9550 // Bitcast to a wide integer type if the loads are vectors.
9551 if (LoadVT.isVector()) {
9552 EVT CmpVT = EVT::getIntegerVT(LHS->getContext(), LoadVT.getSizeInBits());
9553 LoadL = DAG.getBitcast(CmpVT, LoadL);
9554 LoadR = DAG.getBitcast(CmpVT, LoadR);
9555 }
9556
9557 SDValue Cmp = DAG.getSetCC(getCurSDLoc(), MVT::i1, LoadL, LoadR, ISD::SETNE);
9558 processIntegerCallValue(I, Cmp, false);
9559 return true;
9560}
9561
9562/// See if we can lower a memchr call into an optimized form. If so, return
9563/// true and lower it. Otherwise return false, and it will be lowered like a
9564/// normal call.
9565/// The caller already checked that \p I calls the appropriate LibFunc with a
9566/// correct prototype.
9567bool SelectionDAGBuilder::visitMemChrCall(const CallInst &I) {
9568 const Value *Src = I.getArgOperand(0);
9569 const Value *Char = I.getArgOperand(1);
9570 const Value *Length = I.getArgOperand(2);
9571
9572 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9573 std::pair<SDValue, SDValue> Res =
9574 TSI.EmitTargetCodeForMemchr(DAG, getCurSDLoc(), DAG.getRoot(),
9575 getValue(Src), getValue(Char), getValue(Length),
9576 MachinePointerInfo(Src));
9577 if (Res.first.getNode()) {
9578 setValue(&I, Res.first);
9579 PendingLoads.push_back(Res.second);
9580 return true;
9581 }
9582
9583 return false;
9584}
9585
9586/// See if we can lower a memccpy call into an optimized form. If so, return
9587/// true and lower it, otherwise return false and it will be lowered like a
9588/// normal call.
9589/// The caller already checked that \p I calls the appropriate LibFunc with a
9590/// correct prototype.
9591bool SelectionDAGBuilder::visitMemCCpyCall(const CallInst &I) {
9592 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9593 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForMemccpy(
9594 DAG, getCurSDLoc(), DAG.getRoot(), getValue(I.getArgOperand(0)),
9595 getValue(I.getArgOperand(1)), getValue(I.getArgOperand(2)),
9596 getValue(I.getArgOperand(3)), &I);
9597
9598 if (Res.first) {
9599 processIntegerCallValue(I, Res.first, true);
9600 PendingLoads.push_back(Res.second);
9601 return true;
9602 }
9603 return false;
9604}
9605
9606/// See if we can lower a mempcpy call into an optimized form. If so, return
9607/// true and lower it. Otherwise return false, and it will be lowered like a
9608/// normal call.
9609/// The caller already checked that \p I calls the appropriate LibFunc with a
9610/// correct prototype.
9611bool SelectionDAGBuilder::visitMemPCpyCall(const CallInst &I) {
9612 SDValue Dst = getValue(I.getArgOperand(0));
9613 SDValue Src = getValue(I.getArgOperand(1));
9614 SDValue Size = getValue(I.getArgOperand(2));
9615
9616 Align DstAlign = DAG.InferPtrAlign(Dst).valueOrOne();
9617 Align SrcAlign = DAG.InferPtrAlign(Src).valueOrOne();
9618
9619 SDLoc sdl = getCurSDLoc();
9620
9621 // In the mempcpy context we need to pass in a false value for isTailCall
9622 // because the return pointer needs to be adjusted by the size of
9623 // the copied memory.
9624 SDValue Root = getMemoryRoot();
9625 SDValue MC = DAG.getMemcpy(
9626 Root, sdl, Dst, Src, Size, DstAlign, SrcAlign, false, false,
9627 /*CI=*/nullptr, std::nullopt, MachinePointerInfo(I.getArgOperand(0)),
9628 MachinePointerInfo(I.getArgOperand(1)), I.getAAMetadata());
9629 assert(MC.getNode() != nullptr &&
9630 "** memcpy should not be lowered as TailCall in mempcpy context **");
9631 DAG.setRoot(MC);
9632
9633 // Check if Size needs to be truncated or extended.
9634 Size = DAG.getSExtOrTrunc(Size, sdl, Dst.getValueType());
9635
9636 // Adjust return pointer to point just past the last dst byte.
9637 SDValue DstPlusSize = DAG.getMemBasePlusOffset(Dst, Size, sdl);
9638 setValue(&I, DstPlusSize);
9639 return true;
9640}
9641
9642/// See if we can lower a strcpy call into an optimized form. If so, return
9643/// true and lower it, otherwise return false and it will be lowered like a
9644/// normal call.
9645/// The caller already checked that \p I calls the appropriate LibFunc with a
9646/// correct prototype.
9647bool SelectionDAGBuilder::visitStrCpyCall(const CallInst &I, bool isStpcpy) {
9648 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9649
9650 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9651 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrcpy(
9652 DAG, getCurSDLoc(), getRoot(), getValue(Arg0), getValue(Arg1),
9653 MachinePointerInfo(Arg0), MachinePointerInfo(Arg1), isStpcpy, &I);
9654 if (Res.first.getNode()) {
9655 setValue(&I, Res.first);
9656 DAG.setRoot(Res.second);
9657 return true;
9658 }
9659
9660 return false;
9661}
9662
9663/// See if we can lower a strcmp call into an optimized form. If so, return
9664/// true and lower it, otherwise return false and it will be lowered like a
9665/// normal call.
9666/// The caller already checked that \p I calls the appropriate LibFunc with a
9667/// correct prototype.
9668bool SelectionDAGBuilder::visitStrCmpCall(const CallInst &I) {
9669 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9670
9671 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9672 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrcmp(
9673 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), getValue(Arg1),
9674 MachinePointerInfo(Arg0), MachinePointerInfo(Arg1), &I);
9675 if (Res.first.getNode()) {
9676 processIntegerCallValue(I, Res.first, true);
9677 PendingLoads.push_back(Res.second);
9678 return true;
9679 }
9680
9681 return false;
9682}
9683
9684/// See if we can lower a strlen call into an optimized form. If so, return
9685/// true and lower it, otherwise return false and it will be lowered like a
9686/// normal call.
9687/// The caller already checked that \p I calls the appropriate LibFunc with a
9688/// correct prototype.
9689bool SelectionDAGBuilder::visitStrLenCall(const CallInst &I) {
9690 const Value *Arg0 = I.getArgOperand(0);
9691
9692 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9693 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrlen(
9694 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), &I);
9695 if (Res.first.getNode()) {
9696 processIntegerCallValue(I, Res.first, false);
9697 PendingLoads.push_back(Res.second);
9698 return true;
9699 }
9700
9701 return false;
9702}
9703
9704/// See if we can lower a strnlen call into an optimized form. If so, return
9705/// true and lower it, otherwise return false and it will be lowered like a
9706/// normal call.
9707/// The caller already checked that \p I calls the appropriate LibFunc with a
9708/// correct prototype.
9709bool SelectionDAGBuilder::visitStrNLenCall(const CallInst &I) {
9710 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9711
9712 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9713 std::pair<SDValue, SDValue> Res =
9714 TSI.EmitTargetCodeForStrnlen(DAG, getCurSDLoc(), DAG.getRoot(),
9715 getValue(Arg0), getValue(Arg1),
9716 MachinePointerInfo(Arg0));
9717 if (Res.first.getNode()) {
9718 processIntegerCallValue(I, Res.first, false);
9719 PendingLoads.push_back(Res.second);
9720 return true;
9721 }
9722
9723 return false;
9724}
9725
9726/// See if we can lower a Strstr call into an optimized form. If so, return
9727/// true and lower it, otherwise return false and it will be lowered like a
9728/// normal call.
9729/// The caller already checked that \p I calls the appropriate LibFunc with a
9730/// correct prototype.
9731bool SelectionDAGBuilder::visitStrstrCall(const CallInst &I) {
9732 const SelectionDAGTargetInfo &TSI = DAG.getSelectionDAGInfo();
9733 const Value *Arg0 = I.getArgOperand(0), *Arg1 = I.getArgOperand(1);
9734 std::pair<SDValue, SDValue> Res = TSI.EmitTargetCodeForStrstr(
9735 DAG, getCurSDLoc(), DAG.getRoot(), getValue(Arg0), getValue(Arg1), &I);
9736 if (Res.first) {
9737 processIntegerCallValue(I, Res.first, false);
9738 PendingLoads.push_back(Res.second);
9739 return true;
9740 }
9741 return false;
9742}
9743
9744/// See if we can lower a unary floating-point operation into an SDNode with
9745/// the specified Opcode. If so, return true and lower it, otherwise return
9746/// false and it will be lowered like a normal call.
9747/// The caller already checked that \p I calls the appropriate LibFunc with a
9748/// correct prototype.
9749bool SelectionDAGBuilder::visitUnaryFloatCall(const CallInst &I,
9750 unsigned Opcode) {
9751 // We already checked this call's prototype; verify it doesn't modify errno.
9752 // Do not perform optimizations for call sites that require strict
9753 // floating-point semantics.
9754 if (!I.onlyReadsMemory() || I.isStrictFP())
9755 return false;
9756
9757 SDNodeFlags Flags;
9758 Flags.copyFMF(cast<FPMathOperator>(I));
9759
9760 SDValue Tmp = getValue(I.getArgOperand(0));
9761 setValue(&I,
9762 DAG.getNode(Opcode, getCurSDLoc(), Tmp.getValueType(), Tmp, Flags));
9763 return true;
9764}
9765
9766/// See if we can lower a binary floating-point operation into an SDNode with
9767/// the specified Opcode. If so, return true and lower it. Otherwise return
9768/// false, and it will be lowered like a normal call.
9769/// The caller already checked that \p I calls the appropriate LibFunc with a
9770/// correct prototype.
9771bool SelectionDAGBuilder::visitBinaryFloatCall(const CallInst &I,
9772 unsigned Opcode) {
9773 // We already checked this call's prototype; verify it doesn't modify errno.
9774 // Do not perform optimizations for call sites that require strict
9775 // floating-point semantics.
9776 if (!I.onlyReadsMemory() || I.isStrictFP())
9777 return false;
9778
9779 SDNodeFlags Flags;
9780 Flags.copyFMF(cast<FPMathOperator>(I));
9781
9782 SDValue Tmp0 = getValue(I.getArgOperand(0));
9783 SDValue Tmp1 = getValue(I.getArgOperand(1));
9784 EVT VT = Tmp0.getValueType();
9785 setValue(&I, DAG.getNode(Opcode, getCurSDLoc(), VT, Tmp0, Tmp1, Flags));
9786 return true;
9787}
9788
9789void SelectionDAGBuilder::visitCall(const CallInst &I) {
9790 // Handle inline assembly differently.
9791 if (I.isInlineAsm()) {
9792 visitInlineAsm(I);
9793 return;
9794 }
9795
9797
9798 if (Function *F = I.getCalledFunction()) {
9799 if (F->isDeclaration()) {
9800 // Is this an LLVM intrinsic?
9801 if (unsigned IID = F->getIntrinsicID()) {
9802 visitIntrinsicCall(I, IID);
9803 return;
9804 }
9805 }
9806
9807 // Check for well-known libc/libm calls. If the function is internal, it
9808 // can't be a library call. Don't do the check if marked as nobuiltin for
9809 // some reason.
9810 // This code should not handle libcalls that are already canonicalized to
9811 // intrinsics by the middle-end.
9812 LibFunc Func;
9813 if (!I.isNoBuiltin() && !F->hasLocalLinkage() && F->hasName() &&
9814 LibInfo->getLibFunc(*F, Func) && LibInfo->hasOptimizedCodeGen(Func)) {
9815 switch (Func) {
9816 default: break;
9817 case LibFunc_bcmp:
9818 if (visitMemCmpBCmpCall(I))
9819 return;
9820 break;
9821 case LibFunc_copysign:
9822 case LibFunc_copysignf:
9823 case LibFunc_copysignl:
9824 // We already checked this call's prototype; verify it doesn't modify
9825 // errno.
9826 if (I.onlyReadsMemory()) {
9827 SDValue LHS = getValue(I.getArgOperand(0));
9828 SDValue RHS = getValue(I.getArgOperand(1));
9830 LHS.getValueType(), LHS, RHS));
9831 return;
9832 }
9833 break;
9834 case LibFunc_sin:
9835 case LibFunc_sinf:
9836 case LibFunc_sinl:
9837 if (visitUnaryFloatCall(I, ISD::FSIN))
9838 return;
9839 break;
9840 case LibFunc_cos:
9841 case LibFunc_cosf:
9842 case LibFunc_cosl:
9843 if (visitUnaryFloatCall(I, ISD::FCOS))
9844 return;
9845 break;
9846 case LibFunc_tan:
9847 case LibFunc_tanf:
9848 case LibFunc_tanl:
9849 if (visitUnaryFloatCall(I, ISD::FTAN))
9850 return;
9851 break;
9852 case LibFunc_asin:
9853 case LibFunc_asinf:
9854 case LibFunc_asinl:
9855 if (visitUnaryFloatCall(I, ISD::FASIN))
9856 return;
9857 break;
9858 case LibFunc_acos:
9859 case LibFunc_acosf:
9860 case LibFunc_acosl:
9861 if (visitUnaryFloatCall(I, ISD::FACOS))
9862 return;
9863 break;
9864 case LibFunc_atan:
9865 case LibFunc_atanf:
9866 case LibFunc_atanl:
9867 if (visitUnaryFloatCall(I, ISD::FATAN))
9868 return;
9869 break;
9870 case LibFunc_atan2:
9871 case LibFunc_atan2f:
9872 case LibFunc_atan2l:
9873 if (visitBinaryFloatCall(I, ISD::FATAN2))
9874 return;
9875 break;
9876 case LibFunc_sinh:
9877 case LibFunc_sinhf:
9878 case LibFunc_sinhl:
9879 if (visitUnaryFloatCall(I, ISD::FSINH))
9880 return;
9881 break;
9882 case LibFunc_cosh:
9883 case LibFunc_coshf:
9884 case LibFunc_coshl:
9885 if (visitUnaryFloatCall(I, ISD::FCOSH))
9886 return;
9887 break;
9888 case LibFunc_tanh:
9889 case LibFunc_tanhf:
9890 case LibFunc_tanhl:
9891 if (visitUnaryFloatCall(I, ISD::FTANH))
9892 return;
9893 break;
9894 case LibFunc_sqrt:
9895 case LibFunc_sqrtf:
9896 case LibFunc_sqrtl:
9897 case LibFunc_sqrt_finite:
9898 case LibFunc_sqrtf_finite:
9899 case LibFunc_sqrtl_finite:
9900 if (visitUnaryFloatCall(I, ISD::FSQRT))
9901 return;
9902 break;
9903 case LibFunc_log2:
9904 case LibFunc_log2f:
9905 case LibFunc_log2l:
9906 if (visitUnaryFloatCall(I, ISD::FLOG2))
9907 return;
9908 break;
9909 case LibFunc_exp2:
9910 case LibFunc_exp2f:
9911 case LibFunc_exp2l:
9912 if (visitUnaryFloatCall(I, ISD::FEXP2))
9913 return;
9914 break;
9915 case LibFunc_exp10:
9916 case LibFunc_exp10f:
9917 case LibFunc_exp10l:
9918 if (visitUnaryFloatCall(I, ISD::FEXP10))
9919 return;
9920 break;
9921 case LibFunc_ldexp:
9922 case LibFunc_ldexpf:
9923 case LibFunc_ldexpl:
9924 if (visitBinaryFloatCall(I, ISD::FLDEXP))
9925 return;
9926 break;
9927 case LibFunc_strstr:
9928 if (visitStrstrCall(I))
9929 return;
9930 break;
9931 case LibFunc_memcmp:
9932 if (visitMemCmpBCmpCall(I))
9933 return;
9934 break;
9935 case LibFunc_memccpy:
9936 if (visitMemCCpyCall(I))
9937 return;
9938 break;
9939 case LibFunc_mempcpy:
9940 if (visitMemPCpyCall(I))
9941 return;
9942 break;
9943 case LibFunc_memchr:
9944 if (visitMemChrCall(I))
9945 return;
9946 break;
9947 case LibFunc_strcpy:
9948 if (visitStrCpyCall(I, false))
9949 return;
9950 break;
9951 case LibFunc_stpcpy:
9952 if (visitStrCpyCall(I, true))
9953 return;
9954 break;
9955 case LibFunc_strcmp:
9956 if (visitStrCmpCall(I))
9957 return;
9958 break;
9959 case LibFunc_strlen:
9960 if (visitStrLenCall(I))
9961 return;
9962 break;
9963 case LibFunc_strnlen:
9964 if (visitStrNLenCall(I))
9965 return;
9966 break;
9967 }
9968 }
9969 }
9970
9971 if (I.countOperandBundlesOfType(LLVMContext::OB_ptrauth)) {
9972 LowerCallSiteWithPtrAuthBundle(cast<CallBase>(I), /*EHPadBB=*/nullptr);
9973 return;
9974 }
9975
9976 // Deopt bundles are lowered in LowerCallSiteWithDeoptBundle, and we don't
9977 // have to do anything here to lower funclet bundles.
9978 // CFGuardTarget bundles are lowered in LowerCallTo.
9980 I, "calls",
9985
9986 SDValue Callee = getValue(I.getCalledOperand());
9987
9988 if (I.hasDeoptState())
9989 LowerCallSiteWithDeoptBundle(&I, Callee, nullptr);
9990 else
9991 // Check if we can potentially perform a tail call. More detailed checking
9992 // is be done within LowerCallTo, after more information about the call is
9993 // known.
9994 LowerCallTo(I, Callee, I.isTailCall(), I.isMustTailCall());
9995}
9996
9998 const CallBase &CB, const BasicBlock *EHPadBB) {
9999 auto PAB = CB.getOperandBundle("ptrauth");
10000 const Value *CalleeV = CB.getCalledOperand();
10001
10002 // Gather the call ptrauth data from the operand bundle:
10003 // [ i32 <key>, i64 <discriminator> ]
10004 const auto *Key = cast<ConstantInt>(PAB->Inputs[0]);
10005 const Value *Discriminator = PAB->Inputs[1];
10006
10007 assert(Key->getType()->isIntegerTy(32) && "Invalid ptrauth key");
10008 assert(Discriminator->getType()->isIntegerTy(64) &&
10009 "Invalid ptrauth discriminator");
10010
10011 // Look through ptrauth constants to find the raw callee.
10012 // Do a direct unauthenticated call if we found it and everything matches.
10013 if (const auto *CalleeCPA = dyn_cast<ConstantPtrAuth>(CalleeV))
10014 if (CalleeCPA->isKnownCompatibleWith(Key, Discriminator,
10015 DAG.getDataLayout()))
10016 return LowerCallTo(CB, getValue(CalleeCPA->getPointer()), CB.isTailCall(),
10017 CB.isMustTailCall(), EHPadBB);
10018
10019 // Functions should never be ptrauth-called directly.
10020 assert(!isa<Function>(CalleeV) && "invalid direct ptrauth call");
10021
10022 // Otherwise, do an authenticated indirect call.
10023 TargetLowering::PtrAuthInfo PAI = {Key->getZExtValue(),
10024 getValue(Discriminator)};
10025
10026 LowerCallTo(CB, getValue(CalleeV), CB.isTailCall(), CB.isMustTailCall(),
10027 EHPadBB, &PAI);
10028}
10029
10030namespace {
10031
10032/// AsmOperandInfo - This contains information for each constraint that we are
10033/// lowering.
10034class SDISelAsmOperandInfo : public TargetLowering::AsmOperandInfo {
10035public:
10036 /// CallOperand - If this is the result output operand or a clobber
10037 /// this is null, otherwise it is the incoming operand to the CallInst.
10038 /// This gets modified as the asm is processed.
10039 SDValue CallOperand;
10040
10041 /// AssignedRegs - If this is a register or register class operand, this
10042 /// contains the set of register corresponding to the operand.
10043 RegsForValue AssignedRegs;
10044
10045 explicit SDISelAsmOperandInfo(const TargetLowering::AsmOperandInfo &info)
10046 : TargetLowering::AsmOperandInfo(info), CallOperand(nullptr, 0) {
10047 }
10048
10049 /// Whether or not this operand accesses memory
10050 bool hasMemory(const TargetLowering &TLI) const {
10051 // Indirect operand accesses access memory.
10052 if (isIndirect)
10053 return true;
10054
10055 for (const auto &Code : Codes)
10057 return true;
10058
10059 return false;
10060 }
10061};
10062
10063
10064} // end anonymous namespace
10065
10066/// Make sure that the output operand \p OpInfo and its corresponding input
10067/// operand \p MatchingOpInfo have compatible constraint types (otherwise error
10068/// out).
10069static void patchMatchingInput(const SDISelAsmOperandInfo &OpInfo,
10070 SDISelAsmOperandInfo &MatchingOpInfo,
10071 SelectionDAG &DAG) {
10072 if (OpInfo.ConstraintVT == MatchingOpInfo.ConstraintVT)
10073 return;
10074
10076 const auto &TLI = DAG.getTargetLoweringInfo();
10077
10078 std::pair<unsigned, const TargetRegisterClass *> MatchRC =
10079 TLI.getRegForInlineAsmConstraint(TRI, OpInfo.ConstraintCode,
10080 OpInfo.ConstraintVT);
10081 std::pair<unsigned, const TargetRegisterClass *> InputRC =
10082 TLI.getRegForInlineAsmConstraint(TRI, MatchingOpInfo.ConstraintCode,
10083 MatchingOpInfo.ConstraintVT);
10084 const bool OutOpIsIntOrFP =
10085 OpInfo.ConstraintVT.isInteger() || OpInfo.ConstraintVT.isFloatingPoint();
10086 const bool InOpIsIntOrFP = MatchingOpInfo.ConstraintVT.isInteger() ||
10087 MatchingOpInfo.ConstraintVT.isFloatingPoint();
10088 if ((OutOpIsIntOrFP != InOpIsIntOrFP) || (MatchRC.second != InputRC.second)) {
10089 // FIXME: error out in a more elegant fashion
10090 report_fatal_error("Unsupported asm: input constraint"
10091 " with a matching output constraint of"
10092 " incompatible type!");
10093 }
10094 MatchingOpInfo.ConstraintVT = OpInfo.ConstraintVT;
10095}
10096
10097/// Get a direct memory input to behave well as an indirect operand.
10098/// This may introduce stores, hence the need for a \p Chain.
10099/// \return The (possibly updated) chain.
10100static SDValue getAddressForMemoryInput(SDValue Chain, const SDLoc &Location,
10101 SDISelAsmOperandInfo &OpInfo,
10102 SelectionDAG &DAG) {
10103 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10104
10105 // If we don't have an indirect input, put it in the constpool if we can,
10106 // otherwise spill it to a stack slot.
10107 // TODO: This isn't quite right. We need to handle these according to
10108 // the addressing mode that the constraint wants. Also, this may take
10109 // an additional register for the computation and we don't want that
10110 // either.
10111
10112 // If the operand is a float, integer, or vector constant, spill to a
10113 // constant pool entry to get its address.
10114 const Value *OpVal = OpInfo.CallOperandVal;
10115 if (isa<ConstantFP>(OpVal) || isa<ConstantInt>(OpVal) ||
10117 OpInfo.CallOperand = DAG.getConstantPool(
10118 cast<Constant>(OpVal), TLI.getPointerTy(DAG.getDataLayout()));
10119 return Chain;
10120 }
10121
10122 // Otherwise, create a stack slot and emit a store to it before the asm.
10123 Type *Ty = OpVal->getType();
10124 auto &DL = DAG.getDataLayout();
10125 TypeSize TySize = DL.getTypeAllocSize(Ty);
10128 int StackID = 0;
10129 if (TySize.isScalable())
10130 StackID = TFI->getStackIDForScalableVectors();
10131 int SSFI = MF.getFrameInfo().CreateStackObject(TySize.getKnownMinValue(),
10132 DL.getPrefTypeAlign(Ty), false,
10133 nullptr, StackID);
10134 SDValue StackSlot = DAG.getFrameIndex(SSFI, TLI.getFrameIndexTy(DL));
10135 Chain = DAG.getTruncStore(Chain, Location, OpInfo.CallOperand, StackSlot,
10137 TLI.getMemValueType(DL, Ty));
10138 OpInfo.CallOperand = StackSlot;
10139
10140 return Chain;
10141}
10142
10143/// GetRegistersForValue - Assign registers (virtual or physical) for the
10144/// specified operand. We prefer to assign virtual registers, to allow the
10145/// register allocator to handle the assignment process. However, if the asm
10146/// uses features that we can't model on machineinstrs, we have SDISel do the
10147/// allocation. This produces generally horrible, but correct, code.
10148///
10149/// OpInfo describes the operand
10150/// RefOpInfo describes the matching operand if any, the operand otherwise
10151static std::optional<unsigned>
10153 SDISelAsmOperandInfo &OpInfo,
10154 SDISelAsmOperandInfo &RefOpInfo) {
10155 LLVMContext &Context = *DAG.getContext();
10156 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10157
10161
10162 // No work to do for memory/address operands.
10163 if (OpInfo.ConstraintType == TargetLowering::C_Memory ||
10164 OpInfo.ConstraintType == TargetLowering::C_Address)
10165 return std::nullopt;
10166
10167 // If this is a constraint for a single physreg, or a constraint for a
10168 // register class, find it.
10169 unsigned AssignedReg;
10170 const TargetRegisterClass *RC;
10171 std::tie(AssignedReg, RC) = TLI.getRegForInlineAsmConstraint(
10172 &TRI, RefOpInfo.ConstraintCode, RefOpInfo.ConstraintVT);
10173 // RC is unset only on failure. Return immediately.
10174 if (!RC)
10175 return std::nullopt;
10176
10177 // Get the actual register value type. This is important, because the user
10178 // may have asked for (e.g.) the AX register in i32 type. We need to
10179 // remember that AX is actually i16 to get the right extension.
10180 const MVT RegVT = *TRI.legalclasstypes_begin(*RC);
10181
10182 if (OpInfo.ConstraintVT != MVT::Other && RegVT != MVT::Untyped) {
10183 // If this is an FP operand in an integer register (or visa versa), or more
10184 // generally if the operand value disagrees with the register class we plan
10185 // to stick it in, fix the operand type.
10186 //
10187 // If this is an input value, the bitcast to the new type is done now.
10188 // Bitcast for output value is done at the end of visitInlineAsm().
10189 if ((OpInfo.Type == InlineAsm::isOutput ||
10190 OpInfo.Type == InlineAsm::isInput) &&
10191 !TRI.isTypeLegalForClass(*RC, OpInfo.ConstraintVT)) {
10192 // Try to convert to the first EVT that the reg class contains. If the
10193 // types are identical size, use a bitcast to convert (e.g. two differing
10194 // vector types). Note: output bitcast is done at the end of
10195 // visitInlineAsm().
10196 if (RegVT.getSizeInBits() == OpInfo.ConstraintVT.getSizeInBits()) {
10197 // Exclude indirect inputs while they are unsupported because the code
10198 // to perform the load is missing and thus OpInfo.CallOperand still
10199 // refers to the input address rather than the pointed-to value.
10200 if (OpInfo.Type == InlineAsm::isInput && !OpInfo.isIndirect)
10201 OpInfo.CallOperand =
10202 DAG.getNode(ISD::BITCAST, DL, RegVT, OpInfo.CallOperand);
10203 OpInfo.ConstraintVT = RegVT;
10204 // If the operand is an FP value and we want it in integer registers,
10205 // use the corresponding integer type. This turns an f64 value into
10206 // i64, which can be passed with two i32 values on a 32-bit machine.
10207 } else if (RegVT.isInteger() && OpInfo.ConstraintVT.isFloatingPoint()) {
10208 MVT VT = MVT::getIntegerVT(OpInfo.ConstraintVT.getSizeInBits());
10209 if (OpInfo.Type == InlineAsm::isInput)
10210 OpInfo.CallOperand =
10211 DAG.getNode(ISD::BITCAST, DL, VT, OpInfo.CallOperand);
10212 OpInfo.ConstraintVT = VT;
10213 }
10214 }
10215 }
10216
10217 // No need to allocate a matching input constraint since the constraint it's
10218 // matching to has already been allocated.
10219 if (OpInfo.isMatchingInputConstraint())
10220 return std::nullopt;
10221
10222 EVT ValueVT = OpInfo.ConstraintVT;
10223 if (OpInfo.ConstraintVT == MVT::Other)
10224 ValueVT = RegVT;
10225
10226 // Initialize NumRegs.
10227 unsigned NumRegs = 1;
10228 if (OpInfo.ConstraintVT != MVT::Other)
10229 NumRegs = TLI.getNumRegisters(Context, OpInfo.ConstraintVT, RegVT);
10230
10231 // If this is a constraint for a specific physical register, like {r17},
10232 // assign it now.
10233
10234 // If this associated to a specific register, initialize iterator to correct
10235 // place. If virtual, make sure we have enough registers
10236
10237 // Initialize iterator if necessary
10240
10241 // Do not check for single registers.
10242 if (AssignedReg) {
10243 I = std::find(I, RC->end(), AssignedReg);
10244 if (I == RC->end()) {
10245 // RC does not contain the selected register, which indicates a
10246 // mismatch between the register and the required type/bitwidth.
10247 return {AssignedReg};
10248 }
10249 }
10250
10251 for (; NumRegs; --NumRegs, ++I) {
10252 assert(I != RC->end() && "Ran out of registers to allocate!");
10253 Register R = AssignedReg ? Register(*I) : RegInfo.createVirtualRegister(RC);
10254 Regs.push_back(R);
10255 }
10256
10257 OpInfo.AssignedRegs = RegsForValue(Regs, RegVT, ValueVT);
10258 return std::nullopt;
10259}
10260
10261static unsigned
10263 const std::vector<SDValue> &AsmNodeOperands) {
10264 // Scan until we find the definition we already emitted of this operand.
10265 unsigned CurOp = InlineAsm::Op_FirstOperand;
10266 for (; OperandNo; --OperandNo) {
10267 // Advance to the next operand.
10268 unsigned OpFlag = AsmNodeOperands[CurOp]->getAsZExtVal();
10269 const InlineAsm::Flag F(OpFlag);
10270 assert(
10271 (F.isRegDefKind() || F.isRegDefEarlyClobberKind() || F.isMemKind()) &&
10272 "Skipped past definitions?");
10273 CurOp += F.getNumOperandRegisters() + 1;
10274 }
10275 return CurOp;
10276}
10277
10278namespace {
10279
10280class ExtraFlags {
10281 unsigned Flags = 0;
10282
10283public:
10284 explicit ExtraFlags(const CallBase &Call) {
10285 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
10286 if (IA->hasSideEffects())
10288 if (IA->isAlignStack())
10290 if (IA->canThrow())
10292 if (Call.isConvergent())
10294 Flags |= IA->getDialect() * InlineAsm::Extra_AsmDialect;
10295 }
10296
10297 void update(const TargetLowering::AsmOperandInfo &OpInfo) {
10298 // Ideally, we would only check against memory constraints. However, the
10299 // meaning of an Other constraint can be target-specific and we can't easily
10300 // reason about it. Therefore, be conservative and set MayLoad/MayStore
10301 // for Other constraints as well.
10304 if (OpInfo.Type == InlineAsm::isInput)
10306 else if (OpInfo.Type == InlineAsm::isOutput)
10308 else if (OpInfo.Type == InlineAsm::isClobber)
10310 }
10311 }
10312
10313 unsigned get() const { return Flags; }
10314};
10315
10316} // end anonymous namespace
10317
10318static bool isFunction(SDValue Op) {
10319 if (Op && Op.getOpcode() == ISD::GlobalAddress) {
10320 if (auto *GA = dyn_cast<GlobalAddressSDNode>(Op)) {
10321 auto Fn = dyn_cast_or_null<Function>(GA->getGlobal());
10322
10323 // In normal "call dllimport func" instruction (non-inlineasm) it force
10324 // indirect access by specifing call opcode. And usually specially print
10325 // asm with indirect symbol (i.g: "*") according to opcode. Inline asm can
10326 // not do in this way now. (In fact, this is similar with "Data Access"
10327 // action). So here we ignore dllimport function.
10328 if (Fn && !Fn->hasDLLImportStorageClass())
10329 return true;
10330 }
10331 }
10332 return false;
10333}
10334
10335namespace {
10336
10337struct ConstraintDecisionInfo {
10338 SmallVector<SDISelAsmOperandInfo, 16> ConstraintOperands;
10339 std::vector<SDValue> AsmNodeOperands;
10340 SDValue Glue, Chain;
10341 bool HasSideEffect = false;
10342 MCSymbol *BeginLabel = nullptr;
10343
10344 SmallVector<char> Buffer;
10345 raw_svector_ostream ErrorMsg;
10346
10347 ConstraintDecisionInfo() : ErrorMsg(Buffer) {}
10348};
10349
10350} // end anonymous namespace
10351
10352/// Construct operand info objects.
10353static bool
10354constructOperandInfo(ConstraintDecisionInfo &Info,
10355 TargetLowering::AsmOperandInfoVector &TargetConstraints,
10356 SelectionDAGBuilder &Builder, const TargetLowering &TLI,
10357 ExtraFlags &ExtraInfo) {
10358 for (auto &T : TargetConstraints) {
10359 Info.ConstraintOperands.push_back(SDISelAsmOperandInfo(T));
10360 SDISelAsmOperandInfo &OpInfo = Info.ConstraintOperands.back();
10361
10362 if (OpInfo.CallOperandVal)
10363 OpInfo.CallOperand = Builder.getValue(OpInfo.CallOperandVal);
10364
10365 if (!Info.HasSideEffect)
10366 Info.HasSideEffect = OpInfo.hasMemory(TLI);
10367
10368 // Determine if this InlineAsm MayLoad or MayStore based on the constraints.
10369 // FIXME: Could we compute this on OpInfo rather than T?
10370
10371 // Compute the constraint code and ConstraintType to use.
10373
10374 if (T.ConstraintType == TargetLowering::C_Immediate && OpInfo.CallOperand &&
10375 !isa<ConstantSDNode>(OpInfo.CallOperand)) {
10376 // We've delayed emitting a diagnostic like the "n" constraint because
10377 // inlining could cause an integer showing up.
10378 Info.ErrorMsg << "constraint '" << T.ConstraintCode
10379 << "' expects an integer constant expression";
10380 return true;
10381 }
10382
10383 ExtraInfo.update(T);
10384 }
10385
10386 return false;
10387}
10388
10389/// Compute which constraint option to use for each operand.
10390static void
10391computeConstraintToUse(ConstraintDecisionInfo &Info, const CallBase &Call,
10392 TargetLowering::AsmOperandInfoVector &TargetConstraints,
10393 SelectionDAGBuilder &Builder, const TargetLowering &TLI,
10394 const TargetMachine &TM, SelectionDAG &DAG) {
10395 const auto *IA = cast<InlineAsm>(Call.getCalledOperand());
10397 IA->collectAsmStrs(AsmStrs);
10398
10399 int OpNo = -1;
10400 for (SDISelAsmOperandInfo &OpInfo : Info.ConstraintOperands) {
10401 if (OpInfo.hasArg() || OpInfo.Type == InlineAsm::isOutput)
10402 OpNo++;
10403
10404 // If this is an output operand with a matching input operand, look up the
10405 // matching input. If their types mismatch, e.g. one is an integer, the
10406 // other is floating point, or their sizes are different, flag it as an
10407 // error.
10408 if (OpInfo.hasMatchingInput()) {
10409 SDISelAsmOperandInfo &Input =
10410 Info.ConstraintOperands[OpInfo.MatchingInput];
10411 patchMatchingInput(OpInfo, Input, DAG);
10412 }
10413
10414 // Compute the constraint code and ConstraintType to use.
10415 TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
10416
10417 if ((OpInfo.ConstraintType == TargetLowering::C_Memory &&
10418 OpInfo.Type == InlineAsm::isClobber) ||
10419 OpInfo.ConstraintType == TargetLowering::C_Address)
10420 continue;
10421
10422 // In Linux PIC model, there are 4 cases about value/label addressing:
10423 //
10424 // 1: Function call or Label jmp inside the module.
10425 // 2: Data access (such as global variable, static variable) inside module.
10426 // 3: Function call or Label jmp outside the module.
10427 // 4: Data access (such as global variable) outside the module.
10428 //
10429 // Due to current llvm inline asm architecture designed to not "recognize"
10430 // the asm code, there are quite troubles for us to treat mem addressing
10431 // differently for same value/adress used in different instuctions.
10432 // For example, in pic model, call a func may in plt way or direclty
10433 // pc-related, but lea/mov a function adress may use got.
10434 //
10435 // Here we try to "recognize" function call for the case 1 and case 3 in
10436 // inline asm. And try to adjust the constraint for them.
10437 //
10438 // TODO: Due to current inline asm didn't encourage to jmp to the outsider
10439 // label, so here we don't handle jmp function label now, but we need to
10440 // enhance it (especilly in PIC model) if we meet meaningful requirements.
10441 if (OpInfo.isIndirect && isFunction(OpInfo.CallOperand) &&
10442 TLI.isInlineAsmTargetBranch(AsmStrs, OpNo) &&
10444 OpInfo.isIndirect = false;
10445 OpInfo.ConstraintType = TargetLowering::C_Address;
10446 }
10447
10448 // If this is a memory input, and if the operand is not indirect, do what we
10449 // need to provide an address for the memory input.
10450 if (OpInfo.ConstraintType == TargetLowering::C_Memory &&
10451 !OpInfo.isIndirect) {
10452 assert((OpInfo.isMultipleAlternative ||
10453 (OpInfo.Type == InlineAsm::isInput)) &&
10454 "Can only indirectify direct input operands!");
10455
10456 // Memory operands really want the address of the value.
10457 Info.Chain = getAddressForMemoryInput(Info.Chain, Builder.getCurSDLoc(),
10458 OpInfo, DAG);
10459
10460 // There is no longer a Value* corresponding to this operand.
10461 OpInfo.CallOperandVal = nullptr;
10462
10463 // It is now an indirect operand.
10464 OpInfo.isIndirect = true;
10465 }
10466 }
10467}
10468
10469/// Prepare DAG-level operands. As part of this, assign virtual and physical
10470/// registers for inputs and output.
10471static bool prepareDAGLevelOperands(ConstraintDecisionInfo &Info,
10472 const CallBase &Call,
10473 SelectionDAGBuilder &Builder,
10474 const TargetLowering &TLI,
10475 SelectionDAG &DAG) {
10476 SDLoc DL = Builder.getCurSDLoc();
10477 for (SDISelAsmOperandInfo &OpInfo : Info.ConstraintOperands) {
10478 // Assign Registers.
10479 SDISelAsmOperandInfo &RefOpInfo =
10480 OpInfo.isMatchingInputConstraint()
10481 ? Info.ConstraintOperands[OpInfo.getMatchedOperand()]
10482 : OpInfo;
10483 const auto RegError = getRegistersForValue(DAG, DL, OpInfo, RefOpInfo);
10484 if (RegError) {
10485 const MachineFunction &MF = DAG.getMachineFunction();
10487 const char *RegName = TRI.getName(*RegError);
10488 Info.ErrorMsg << "register '" << RegName << "' allocated for constraint '"
10489 << OpInfo.ConstraintCode
10490 << "' does not match required type";
10491 return true;
10492 }
10493
10494 auto DetectWriteToReservedRegister = [&]() {
10495 const MachineFunction &MF = DAG.getMachineFunction();
10497
10498 for (Register Reg : OpInfo.AssignedRegs.Regs) {
10499 if (Reg.isPhysical() && TRI.isInlineAsmReadOnlyReg(MF, Reg)) {
10500 Info.ErrorMsg << "write to reserved register '"
10501 << TRI.getRegAsmName(Reg) << "'";
10502 return true;
10503 }
10504 }
10505
10506 return false;
10507 };
10508 assert((OpInfo.ConstraintType != TargetLowering::C_Address ||
10509 (OpInfo.Type == InlineAsm::isInput &&
10510 !OpInfo.isMatchingInputConstraint())) &&
10511 "Only address as input operand is allowed.");
10512
10513 switch (OpInfo.Type) {
10515 if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
10516 const InlineAsm::ConstraintCode ConstraintID =
10517 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10519 "Failed to convert memory constraint code to constraint id.");
10520
10521 // Add information to the INLINEASM node to know about this output.
10523 OpFlags.setMemConstraint(ConstraintID);
10524 Info.AsmNodeOperands.push_back(
10525 DAG.getTargetConstant(OpFlags, DL, MVT::i32));
10526 Info.AsmNodeOperands.push_back(OpInfo.CallOperand);
10527 } else {
10528 // Otherwise, this outputs to a register (directly for C_Register /
10529 // C_RegisterClass, and a target-defined fashion for
10530 // C_Immediate/C_Other). Find a register that we can use.
10531 if (OpInfo.AssignedRegs.Regs.empty()) {
10532 Info.ErrorMsg << "could not allocate output register for "
10533 << "constraint '" << OpInfo.ConstraintCode << "'";
10534 return true;
10535 }
10536
10537 if (DetectWriteToReservedRegister())
10538 return true;
10539
10540 // Add information to the INLINEASM node to know that this register is
10541 // set.
10542 OpInfo.AssignedRegs.AddInlineAsmOperands(
10543 OpInfo.isEarlyClobber ? InlineAsm::Kind::RegDefEarlyClobber
10545 false, 0, DL, DAG, Info.AsmNodeOperands);
10546 }
10547 break;
10548
10549 case InlineAsm::isInput:
10550 case InlineAsm::isLabel: {
10551 SDValue InOperandVal = OpInfo.CallOperand;
10552
10553 if (OpInfo.isMatchingInputConstraint()) {
10554 // If this is required to match an output register we have already set,
10555 // just use its register.
10556 auto CurOp = findMatchingInlineAsmOperand(OpInfo.getMatchedOperand(),
10557 Info.AsmNodeOperands);
10558 InlineAsm::Flag Flag(Info.AsmNodeOperands[CurOp]->getAsZExtVal());
10559 if (Flag.isRegDefKind() || Flag.isRegDefEarlyClobberKind()) {
10560 if (OpInfo.isIndirect) {
10561 // This happens on gcc/testsuite/gcc.dg/pr8788-1.c
10562 Info.ErrorMsg << "inline asm not supported yet: cannot handle "
10563 << "tied indirect register inputs";
10564 return true;
10565 }
10566
10569 MachineRegisterInfo &MRI = MF.getRegInfo();
10571 auto *R = cast<RegisterSDNode>(Info.AsmNodeOperands[CurOp + 1]);
10572 Register TiedReg = R->getReg();
10573 MVT RegVT = R->getSimpleValueType(0);
10574 const TargetRegisterClass *RC =
10575 TiedReg.isVirtual() ? MRI.getRegClass(TiedReg)
10576 : RegVT != MVT::Untyped ? TLI.getRegClassFor(RegVT)
10577 : TRI.getMinimalPhysRegClass(TiedReg);
10578 for (unsigned I = 0, E = Flag.getNumOperandRegisters(); I != E; ++I)
10579 Regs.push_back(MRI.createVirtualRegister(RC));
10580
10581 RegsForValue MatchedRegs(Regs, RegVT, InOperandVal.getValueType());
10582
10583 // Use the produced MatchedRegs object to
10584 MatchedRegs.getCopyToRegs(InOperandVal, DAG, DL, Info.Chain,
10585 &Info.Glue, &Call);
10587 OpInfo.getMatchedOperand(), DL, DAG,
10588 Info.AsmNodeOperands);
10589 break;
10590 }
10591
10592 assert(Flag.isMemKind() && "Unknown matching constraint!");
10593 assert(Flag.getNumOperandRegisters() == 1 &&
10594 "Unexpected number of operands");
10595
10596 // Add information to the INLINEASM node to know about this input.
10597 // See InlineAsm.h isUseOperandTiedToDef.
10598 Flag.clearMemConstraint();
10599 Flag.setMatchingOp(OpInfo.getMatchedOperand());
10600 Info.AsmNodeOperands.push_back(DAG.getTargetConstant(
10601 Flag, DL, TLI.getPointerTy(DAG.getDataLayout())));
10602 Info.AsmNodeOperands.push_back(Info.AsmNodeOperands[CurOp + 1]);
10603 break;
10604 }
10605
10606 // Treat indirect 'X' constraint as memory.
10607 if (OpInfo.ConstraintType == TargetLowering::C_Other &&
10608 OpInfo.isIndirect)
10609 OpInfo.ConstraintType = TargetLowering::C_Memory;
10610
10611 if (OpInfo.ConstraintType == TargetLowering::C_Immediate ||
10612 OpInfo.ConstraintType == TargetLowering::C_Other) {
10613 std::vector<SDValue> Ops;
10614 TLI.LowerAsmOperandForConstraint(InOperandVal, OpInfo.ConstraintCode,
10615 Ops, DAG);
10616 if (Ops.empty()) {
10617 if (OpInfo.ConstraintType == TargetLowering::C_Immediate)
10618 if (isa<ConstantSDNode>(InOperandVal)) {
10619 Info.ErrorMsg << "value out of range for constraint '"
10620 << OpInfo.ConstraintCode << "'";
10621 return true;
10622 }
10623
10624 Info.ErrorMsg << "invalid operand for inline asm constraint '"
10625 << OpInfo.ConstraintCode << "'";
10626 return true;
10627 }
10628
10629 // Add information to the INLINEASM node to know about this input.
10630 InlineAsm::Flag ResOpType(InlineAsm::Kind::Imm, Ops.size());
10631 Info.AsmNodeOperands.push_back(DAG.getTargetConstant(
10632 ResOpType, DL, TLI.getPointerTy(DAG.getDataLayout())));
10633 llvm::append_range(Info.AsmNodeOperands, Ops);
10634 break;
10635 }
10636
10637 if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
10638 assert((OpInfo.isIndirect ||
10639 OpInfo.ConstraintType != TargetLowering::C_Memory) &&
10640 "Operand must be indirect to be a mem!");
10641 assert(InOperandVal.getValueType() ==
10642 TLI.getPointerTy(DAG.getDataLayout()) &&
10643 "Memory operands expect pointer values");
10644
10645 const InlineAsm::ConstraintCode ConstraintID =
10646 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10648 "Failed to convert memory constraint code to constraint id.");
10649
10650 // Add information to the INLINEASM node to know about this input.
10652 ResOpType.setMemConstraint(ConstraintID);
10653 Info.AsmNodeOperands.push_back(
10654 DAG.getTargetConstant(ResOpType, DL, MVT::i32));
10655 Info.AsmNodeOperands.push_back(InOperandVal);
10656 break;
10657 }
10658
10659 if (OpInfo.ConstraintType == TargetLowering::C_Address) {
10660 const InlineAsm::ConstraintCode ConstraintID =
10661 TLI.getInlineAsmMemConstraint(OpInfo.ConstraintCode);
10663 "Failed to convert memory constraint code to constraint id.");
10664
10666
10667 SDValue AsmOp = InOperandVal;
10668 if (isFunction(InOperandVal)) {
10669 auto *GA = cast<GlobalAddressSDNode>(InOperandVal);
10670 ResOpType = InlineAsm::Flag(InlineAsm::Kind::Func, 1);
10671 AsmOp = DAG.getTargetGlobalAddress(GA->getGlobal(), DL,
10672 InOperandVal.getValueType(),
10673 GA->getOffset());
10674 }
10675
10676 // Add information to the INLINEASM node to know about this input.
10677 ResOpType.setMemConstraint(ConstraintID);
10678
10679 Info.AsmNodeOperands.push_back(
10680 DAG.getTargetConstant(ResOpType, DL, MVT::i32));
10681 Info.AsmNodeOperands.push_back(AsmOp);
10682 break;
10683 }
10684
10685 if (OpInfo.ConstraintType != TargetLowering::C_RegisterClass &&
10686 OpInfo.ConstraintType != TargetLowering::C_Register) {
10687 Info.ErrorMsg << "unknown asm constraint '" << OpInfo.ConstraintCode
10688 << "'";
10689 return true;
10690 }
10691
10692 // TODO: Support this.
10693 if (OpInfo.isIndirect) {
10694 Info.ErrorMsg << "cannot handle indirect register inputs yet for "
10695 << "constraint '" << OpInfo.ConstraintCode << "'";
10696 return true;
10697 }
10698
10699 // Copy the input into the appropriate registers.
10700 if (OpInfo.AssignedRegs.Regs.empty()) {
10701 Info.ErrorMsg << "could not allocate input reg for constraint '"
10702 << OpInfo.ConstraintCode << "'";
10703 return true;
10704 }
10705
10706 if (DetectWriteToReservedRegister())
10707 return true;
10708
10709 OpInfo.AssignedRegs.getCopyToRegs(InOperandVal, DAG, DL, Info.Chain,
10710 &Info.Glue, &Call);
10711 OpInfo.AssignedRegs.AddInlineAsmOperands(
10712 InlineAsm::Kind::RegUse, false, 0, DL, DAG, Info.AsmNodeOperands);
10713 break;
10714 }
10715
10717 // Add the clobbered value to the operand list, so that the register
10718 // allocator is aware that the physreg got clobbered.
10719 if (!OpInfo.AssignedRegs.Regs.empty())
10720 OpInfo.AssignedRegs.AddInlineAsmOperands(
10721 InlineAsm::Kind::Clobber, false, 0, DL, DAG, Info.AsmNodeOperands);
10722 break;
10723 }
10724 }
10725
10726 return false;
10727}
10728
10729/// DetermineConstraints - Find the constraints to use for inline asm operands.
10730static bool
10731determineConstraints(ConstraintDecisionInfo &Info,
10732 TargetLowering::AsmOperandInfoVector &TargetConstraints,
10733 const CallBase &Call, SelectionDAGBuilder &Builder,
10734 const TargetLowering &TLI, const TargetMachine &TM,
10735 SelectionDAG &DAG, const BasicBlock *EHPadBB) {
10736 const auto *IA = cast<InlineAsm>(Call.getCalledOperand());
10737 ExtraFlags ExtraInfo(Call);
10738
10739 // First pass: Construct operand info objects.
10740 Info.HasSideEffect = IA->hasSideEffects();
10741 if (constructOperandInfo(Info, TargetConstraints, Builder, TLI, ExtraInfo))
10742 return true;
10743
10744 // We won't need to flush pending loads if this asm doesn't touch
10745 // memory and is nonvolatile.
10746 Info.Chain = Info.HasSideEffect ? Builder.getRoot() : DAG.getRoot();
10747
10748 bool IsCallBr = isa<CallBrInst>(Call);
10749 bool EmitEHLabels = isa<InvokeInst>(Call);
10750 if (IsCallBr || EmitEHLabels)
10751 // If this is a callbr or invoke we need to flush pending exports since
10752 // inlineasm_br and invoke are terminators.
10753 // We need to do this before nodes are glued to the inlineasm_br node.
10754 Info.Chain = Builder.getControlRoot();
10755
10756 if (EmitEHLabels)
10757 Info.Chain = Builder.lowerStartEH(Info.Chain, EHPadBB, Info.BeginLabel);
10758
10759 // Second pass: Compute which constraint option to use.
10760 computeConstraintToUse(Info, Call, TargetConstraints, Builder, TLI, TM, DAG);
10761
10762 // AsmNodeOperands - The operands for the ISD::INLINEASM node.
10763 Info.AsmNodeOperands.push_back(SDValue()); // reserve space for input chain
10764 Info.AsmNodeOperands.push_back(DAG.getTargetExternalSymbol(
10765 IA->getAsmString().data(), TLI.getProgramPointerTy(DAG.getDataLayout())));
10766
10767 // If we have a !srcloc metadata node associated with it, we want to attach
10768 // this to the ultimately generated inline asm machineinstr. To do this, we
10769 // pass in the third operand as this (potentially null) inline asm MDNode.
10770 const MDNode *SrcLoc = Call.getMetadata("srcloc");
10771 Info.AsmNodeOperands.push_back(DAG.getMDNode(SrcLoc));
10772
10773 // Remember the HasSideEffect, AlignStack, AsmDialect, MayLoad and MayStore
10774 // bits as operand 3.
10775 Info.AsmNodeOperands.push_back(
10776 DAG.getTargetConstant(ExtraInfo.get(), Builder.getCurSDLoc(),
10777 TLI.getPointerTy(DAG.getDataLayout())));
10778
10779 // Third pass: Prepare DAG-level operands
10780 return prepareDAGLevelOperands(Info, Call, Builder, TLI, DAG);
10781}
10782
10783/// visitInlineAsm - Handle a call to an InlineAsm object.
10784void SelectionDAGBuilder::visitInlineAsm(const CallBase &Call,
10785 const BasicBlock *EHPadBB) {
10786 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10788 DAG.getDataLayout(), DAG.getSubtarget().getRegisterInfo(), Call);
10789
10790 assert((!isa<InvokeInst>(Call) || EHPadBB) &&
10791 "InvokeInst must have an EHPadBB");
10792
10793 ConstraintDecisionInfo Info;
10794 if (determineConstraints(Info, TargetConstraints, Call, *this, TLI, TM, DAG,
10795 EHPadBB))
10796 return emitInlineAsmError(Call, Info.ErrorMsg.str());
10797
10798 SDValue Glue = Info.Glue;
10799 SDValue Chain = Info.Chain;
10800
10801 // Finish up input operands. Set the input chain and add the flag last.
10802 Info.AsmNodeOperands[InlineAsm::Op_InputChain] = Chain;
10803 if (Glue.getNode())
10804 Info.AsmNodeOperands.push_back(Glue);
10805
10806 bool IsCallBr = isa<CallBrInst>(Call);
10807 unsigned ISDOpc = IsCallBr ? ISD::INLINEASM_BR : ISD::INLINEASM;
10808 Chain =
10809 DAG.getNode(ISDOpc, getCurSDLoc(), DAG.getVTList(MVT::Other, MVT::Glue),
10810 Info.AsmNodeOperands);
10811 Glue = Chain.getValue(1);
10812
10813 // Do additional work to generate outputs.
10814
10815 SmallVector<EVT, 1> ResultVTs;
10816 SmallVector<SDValue, 1> ResultValues;
10817 SmallVector<SDValue, 8> OutChains;
10818
10819 llvm::Type *CallResultType = Call.getType();
10820 ArrayRef<Type *> ResultTypes;
10821 if (StructType *StructResult = dyn_cast<StructType>(CallResultType))
10822 ResultTypes = StructResult->elements();
10823 else if (!CallResultType->isVoidTy())
10824 ResultTypes = ArrayRef(CallResultType);
10825
10826 auto CurResultType = ResultTypes.begin();
10827 auto handleRegAssign = [&](SDValue V) {
10828 assert(CurResultType != ResultTypes.end() && "Unexpected value");
10829 assert((*CurResultType)->isSized() && "Unexpected unsized type");
10830 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), *CurResultType);
10831 ++CurResultType;
10832 // If the type of the inline asm call site return value is different but has
10833 // same size as the type of the asm output bitcast it. One example of this
10834 // is for vectors with different width / number of elements. This can
10835 // happen for register classes that can contain multiple different value
10836 // types. The preg or vreg allocated may not have the same VT as was
10837 // expected.
10838 //
10839 // This can also happen for a return value that disagrees with the register
10840 // class it is put in, eg. a double in a general-purpose register on a
10841 // 32-bit machine.
10842 if (ResultVT != V.getValueType() &&
10843 ResultVT.getSizeInBits() == V.getValueSizeInBits())
10844 V = DAG.getNode(ISD::BITCAST, getCurSDLoc(), ResultVT, V);
10845 else if (ResultVT != V.getValueType() && ResultVT.isInteger() &&
10846 V.getValueType().isInteger()) {
10847 // If a result value was tied to an input value, the computed result
10848 // may have a wider width than the expected result. Extract the
10849 // relevant portion.
10850 V = DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), ResultVT, V);
10851 }
10852 assert(ResultVT == V.getValueType() && "Asm result value mismatch!");
10853 ResultVTs.push_back(ResultVT);
10854 ResultValues.push_back(V);
10855 };
10856
10857 // Deal with output operands.
10858 for (SDISelAsmOperandInfo &OpInfo : Info.ConstraintOperands) {
10859 if (OpInfo.Type == InlineAsm::isOutput) {
10860 SDValue Val;
10861 // Skip trivial output operands.
10862 if (OpInfo.AssignedRegs.Regs.empty())
10863 continue;
10864
10865 switch (OpInfo.ConstraintType) {
10868 Val = OpInfo.AssignedRegs.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(),
10869 Chain, &Glue, &Call);
10870 break;
10873 Val = TLI.LowerAsmOutputForConstraint(Chain, Glue, getCurSDLoc(),
10874 OpInfo, DAG);
10875 break;
10877 break; // Already handled.
10879 break; // Silence warning.
10881 assert(false && "Unexpected unknown constraint");
10882 }
10883
10884 // Indirect output manifest as stores. Record output chains.
10885 if (OpInfo.isIndirect) {
10886 const Value *Ptr = OpInfo.CallOperandVal;
10887 assert(Ptr && "Expected value CallOperandVal for indirect asm operand");
10888 SDValue Store = DAG.getStore(Chain, getCurSDLoc(), Val, getValue(Ptr),
10889 MachinePointerInfo(Ptr));
10890 OutChains.push_back(Store);
10891 } else {
10892 // generate CopyFromRegs to associated registers.
10893 assert(!Call.getType()->isVoidTy() && "Bad inline asm!");
10894 if (Val.getOpcode() == ISD::MERGE_VALUES) {
10895 for (const SDValue &V : Val->op_values())
10896 handleRegAssign(V);
10897 } else
10898 handleRegAssign(Val);
10899 }
10900 }
10901 }
10902
10903 // Set results.
10904 if (!ResultValues.empty()) {
10905 assert(CurResultType == ResultTypes.end() &&
10906 "Mismatch in number of ResultTypes");
10907 assert(ResultValues.size() == ResultTypes.size() &&
10908 "Mismatch in number of output operands in asm result");
10909
10911 DAG.getVTList(ResultVTs), ResultValues);
10912 setValue(&Call, V);
10913 }
10914
10915 // Collect store chains.
10916 if (!OutChains.empty())
10917 Chain = DAG.getNode(ISD::TokenFactor, getCurSDLoc(), MVT::Other, OutChains);
10918
10919 if (const auto *II = dyn_cast<InvokeInst>(&Call))
10920 Chain = lowerEndEH(Chain, II, EHPadBB, Info.BeginLabel);
10921
10922 // Only Update Root if inline assembly has a memory effect.
10923 if (ResultValues.empty() || Info.HasSideEffect || !OutChains.empty() ||
10924 IsCallBr || isa<InvokeInst>(Call))
10925 DAG.setRoot(Chain);
10926}
10927
10928void SelectionDAGBuilder::emitInlineAsmError(const CallBase &Call,
10929 const Twine &Message) {
10930 LLVMContext &Ctx = *DAG.getContext();
10931 Ctx.diagnose(DiagnosticInfoInlineAsm(Call, Message));
10932
10933 // Make sure we leave the DAG in a valid state
10934 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10935 SmallVector<EVT, 1> ValueVTs;
10936 ComputeValueVTs(TLI, DAG.getDataLayout(), Call.getType(), ValueVTs);
10937
10938 if (ValueVTs.empty())
10939 return;
10940
10942 for (const EVT &VT : ValueVTs)
10943 Ops.push_back(DAG.getUNDEF(VT));
10944
10945 setValue(&Call, DAG.getMergeValues(Ops, getCurSDLoc()));
10946}
10947
10948void SelectionDAGBuilder::visitVAStart(const CallInst &I) {
10949 DAG.setRoot(DAG.getNode(ISD::VASTART, getCurSDLoc(),
10950 MVT::Other, getRoot(),
10951 getValue(I.getArgOperand(0)),
10952 DAG.getSrcValue(I.getArgOperand(0))));
10953}
10954
10955void SelectionDAGBuilder::visitVAArg(const VAArgInst &I) {
10956 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10957 const DataLayout &DL = DAG.getDataLayout();
10958 SDValue V = DAG.getVAArg(
10959 TLI.getMemValueType(DAG.getDataLayout(), I.getType()), getCurSDLoc(),
10960 getRoot(), getValue(I.getOperand(0)), DAG.getSrcValue(I.getOperand(0)),
10961 DL.getABITypeAlign(I.getType()).value());
10962 DAG.setRoot(V.getValue(1));
10963
10964 if (I.getType()->isPointerTy())
10965 V = DAG.getPtrExtOrTrunc(
10966 V, getCurSDLoc(), TLI.getValueType(DAG.getDataLayout(), I.getType()));
10967 setValue(&I, V);
10968}
10969
10970void SelectionDAGBuilder::visitVAEnd(const CallInst &I) {
10971 DAG.setRoot(DAG.getNode(ISD::VAEND, getCurSDLoc(),
10972 MVT::Other, getRoot(),
10973 getValue(I.getArgOperand(0)),
10974 DAG.getSrcValue(I.getArgOperand(0))));
10975}
10976
10977void SelectionDAGBuilder::visitVACopy(const CallInst &I) {
10978 DAG.setRoot(DAG.getNode(ISD::VACOPY, getCurSDLoc(),
10979 MVT::Other, getRoot(),
10980 getValue(I.getArgOperand(0)),
10981 getValue(I.getArgOperand(1)),
10982 DAG.getSrcValue(I.getArgOperand(0)),
10983 DAG.getSrcValue(I.getArgOperand(1))));
10984}
10985
10987 const Instruction &I,
10988 SDValue Op) {
10989 std::optional<ConstantRange> CR = getRange(I);
10990
10991 if (!CR || CR->isFullSet() || CR->isEmptySet() || CR->isUpperWrapped())
10992 return Op;
10993
10994 APInt Hi = CR->getUnsignedMax();
10995 unsigned Bits = std::max(Hi.getActiveBits(),
10996 static_cast<unsigned>(IntegerType::MIN_INT_BITS));
10997
10998 EVT SmallVT = EVT::getIntegerVT(*DAG.getContext(), Bits);
10999
11000 SDLoc SL = getCurSDLoc();
11001
11002 SDValue ZExt = DAG.getNode(ISD::AssertZext, SL, Op.getValueType(), Op,
11003 DAG.getValueType(SmallVT));
11004 unsigned NumVals = Op.getNode()->getNumValues();
11005 if (NumVals == 1)
11006 return ZExt;
11007
11009
11010 Ops.push_back(ZExt);
11011 for (unsigned I = 1; I != NumVals; ++I)
11012 Ops.push_back(Op.getValue(I));
11013
11014 return DAG.getMergeValues(Ops, SL);
11015}
11016
11018 SelectionDAG &DAG, const Instruction &I, SDValue Op) {
11019 FPClassTest Classes = getNoFPClass(I);
11020 if (Classes == fcNone)
11021 return Op;
11022
11023 SDLoc SL = getCurSDLoc();
11024 SDValue TestConst = DAG.getTargetConstant(Classes, SDLoc(), MVT::i32);
11025
11026 if (Op.getOpcode() != ISD::MERGE_VALUES) {
11027 return DAG.getNode(ISD::AssertNoFPClass, SL, Op.getValueType(), Op,
11028 TestConst);
11029 }
11030
11031 SmallVector<SDValue, 8> Ops(Op.getNumOperands());
11032 for (unsigned I = 0, E = Ops.size(); I != E; ++I) {
11033 SDValue MergeOp = Op.getOperand(I);
11034 Ops[I] = DAG.getNode(ISD::AssertNoFPClass, SL, MergeOp.getValueType(),
11035 MergeOp, TestConst);
11036 }
11037
11038 return DAG.getMergeValues(Ops, SL);
11039}
11040
11041/// Populate a CallLowerinInfo (into \p CLI) based on the properties of
11042/// the call being lowered.
11043///
11044/// This is a helper for lowering intrinsics that follow a target calling
11045/// convention or require stack pointer adjustment. Only a subset of the
11046/// intrinsic's operands need to participate in the calling convention.
11049 unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy,
11050 AttributeSet RetAttrs, bool IsPatchPoint) {
11052 Args.reserve(NumArgs);
11053
11054 // Populate the argument list.
11055 // Attributes for args start at offset 1, after the return attribute.
11056 for (unsigned ArgI = ArgIdx, ArgE = ArgIdx + NumArgs;
11057 ArgI != ArgE; ++ArgI) {
11058 const Value *V = Call->getOperand(ArgI);
11059
11060 assert(!V->getType()->isEmptyTy() && "Empty type passed to intrinsic.");
11061
11062 TargetLowering::ArgListEntry Entry(getValue(V), V->getType());
11063 Entry.setAttributes(Call, ArgI);
11064 Args.push_back(Entry);
11065 }
11066
11068 .setChain(getRoot())
11069 .setCallee(Call->getCallingConv(), ReturnTy, Callee, std::move(Args),
11070 RetAttrs)
11071 .setDiscardResult(Call->use_empty())
11072 .setIsPatchPoint(IsPatchPoint)
11074 Call->countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0);
11075}
11076
11077/// Add a stack map intrinsic call's live variable operands to a stackmap
11078/// or patchpoint target node's operand list.
11079///
11080/// Constants are converted to TargetConstants purely as an optimization to
11081/// avoid constant materialization and register allocation.
11082///
11083/// FrameIndex operands are converted to TargetFrameIndex so that ISEL does not
11084/// generate addess computation nodes, and so FinalizeISel can convert the
11085/// TargetFrameIndex into a DirectMemRefOp StackMap location. This avoids
11086/// address materialization and register allocation, but may also be required
11087/// for correctness. If a StackMap (or PatchPoint) intrinsic directly uses an
11088/// alloca in the entry block, then the runtime may assume that the alloca's
11089/// StackMap location can be read immediately after compilation and that the
11090/// location is valid at any point during execution (this is similar to the
11091/// assumption made by the llvm.gcroot intrinsic). If the alloca's location were
11092/// only available in a register, then the runtime would need to trap when
11093/// execution reaches the StackMap in order to read the alloca's location.
11094static void addStackMapLiveVars(const CallBase &Call, unsigned StartIdx,
11096 SelectionDAGBuilder &Builder) {
11097 SelectionDAG &DAG = Builder.DAG;
11098 for (unsigned I = StartIdx; I < Call.arg_size(); I++) {
11099 SDValue Op = Builder.getValue(Call.getArgOperand(I));
11100
11101 // Things on the stack are pointer-typed, meaning that they are already
11102 // legal and can be emitted directly to target nodes.
11104 Ops.push_back(DAG.getTargetFrameIndex(FI->getIndex(), Op.getValueType()));
11105 } else {
11106 // Otherwise emit a target independent node to be legalised.
11107 Ops.push_back(Builder.getValue(Call.getArgOperand(I)));
11108 }
11109 }
11110}
11111
11112/// Lower llvm.experimental.stackmap.
11113void SelectionDAGBuilder::visitStackmap(const CallInst &CI) {
11114 // void @llvm.experimental.stackmap(i64 <id>, i32 <numShadowBytes>,
11115 // [live variables...])
11116
11117 assert(CI.getType()->isVoidTy() && "Stackmap cannot return a value.");
11118
11119 SDValue Chain, InGlue, Callee;
11121
11122 SDLoc DL = getCurSDLoc();
11124
11125 // The stackmap intrinsic only records the live variables (the arguments
11126 // passed to it) and emits NOPS (if requested). Unlike the patchpoint
11127 // intrinsic, this won't be lowered to a function call. This means we don't
11128 // have to worry about calling conventions and target specific lowering code.
11129 // Instead we perform the call lowering right here.
11130 //
11131 // chain, flag = CALLSEQ_START(chain, 0, 0)
11132 // chain, flag = STACKMAP(id, nbytes, ..., chain, flag)
11133 // chain, flag = CALLSEQ_END(chain, 0, 0, flag)
11134 //
11135 Chain = DAG.getCALLSEQ_START(getRoot(), 0, 0, DL);
11136 InGlue = Chain.getValue(1);
11137
11138 // Add the STACKMAP operands, starting with DAG house-keeping.
11139 Ops.push_back(Chain);
11140 Ops.push_back(InGlue);
11141
11142 // Add the <id>, <numShadowBytes> operands.
11143 //
11144 // These do not require legalisation, and can be emitted directly to target
11145 // constant nodes.
11147 assert(ID.getValueType() == MVT::i64);
11148 SDValue IDConst =
11149 DAG.getTargetConstant(ID->getAsZExtVal(), DL, ID.getValueType());
11150 Ops.push_back(IDConst);
11151
11152 SDValue Shad = getValue(CI.getArgOperand(1));
11153 assert(Shad.getValueType() == MVT::i32);
11154 SDValue ShadConst =
11155 DAG.getTargetConstant(Shad->getAsZExtVal(), DL, Shad.getValueType());
11156 Ops.push_back(ShadConst);
11157
11158 // Add the live variables.
11159 addStackMapLiveVars(CI, 2, DL, Ops, *this);
11160
11161 // Create the STACKMAP node.
11162 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
11163 Chain = DAG.getNode(ISD::STACKMAP, DL, NodeTys, Ops);
11164 InGlue = Chain.getValue(1);
11165
11166 Chain = DAG.getCALLSEQ_END(Chain, 0, 0, InGlue, DL);
11167
11168 // Stackmaps don't generate values, so nothing goes into the NodeMap.
11169
11170 // Set the root to the target-lowered call chain.
11171 DAG.setRoot(Chain);
11172
11173 // Inform the Frame Information that we have a stackmap in this function.
11174 FuncInfo.MF->getFrameInfo().setHasStackMap();
11175}
11176
11177/// Lower llvm.experimental.patchpoint directly to its target opcode.
11178void SelectionDAGBuilder::visitPatchpoint(const CallBase &CB,
11179 const BasicBlock *EHPadBB) {
11180 // <ty> @llvm.experimental.patchpoint.<ty>(i64 <id>,
11181 // i32 <numBytes>,
11182 // i8* <target>,
11183 // i32 <numArgs>,
11184 // [Args...],
11185 // [live variables...])
11186
11188 bool IsAnyRegCC = CC == CallingConv::AnyReg;
11189 bool HasDef = !CB.getType()->isVoidTy();
11190 SDLoc dl = getCurSDLoc();
11192
11193 // Handle immediate and symbolic callees.
11194 if (auto* ConstCallee = dyn_cast<ConstantSDNode>(Callee))
11195 Callee = DAG.getIntPtrConstant(ConstCallee->getZExtValue(), dl,
11196 /*isTarget=*/true);
11197 else if (auto* SymbolicCallee = dyn_cast<GlobalAddressSDNode>(Callee))
11198 Callee = DAG.getTargetGlobalAddress(SymbolicCallee->getGlobal(),
11199 SDLoc(SymbolicCallee),
11200 SymbolicCallee->getValueType(0));
11201
11202 // Get the real number of arguments participating in the call <numArgs>
11204 unsigned NumArgs = NArgVal->getAsZExtVal();
11205
11206 // Skip the four meta args: <id>, <numNopBytes>, <target>, <numArgs>
11207 // Intrinsics include all meta-operands up to but not including CC.
11208 unsigned NumMetaOpers = PatchPointOpers::CCPos;
11209 assert(CB.arg_size() >= NumMetaOpers + NumArgs &&
11210 "Not enough arguments provided to the patchpoint intrinsic");
11211
11212 // For AnyRegCC the arguments are lowered later on manually.
11213 unsigned NumCallArgs = IsAnyRegCC ? 0 : NumArgs;
11214 Type *ReturnTy =
11215 IsAnyRegCC ? Type::getVoidTy(*DAG.getContext()) : CB.getType();
11216
11217 TargetLowering::CallLoweringInfo CLI(DAG);
11218 populateCallLoweringInfo(CLI, &CB, NumMetaOpers, NumCallArgs, Callee,
11219 ReturnTy, CB.getAttributes().getRetAttrs(), true);
11220 std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
11221
11222 SDNode *CallEnd = Result.second.getNode();
11223 if (CallEnd->getOpcode() == ISD::EH_LABEL)
11224 CallEnd = CallEnd->getOperand(0).getNode();
11225 if (HasDef && (CallEnd->getOpcode() == ISD::CopyFromReg))
11226 CallEnd = CallEnd->getOperand(0).getNode();
11227
11228 /// Get a call instruction from the call sequence chain.
11229 /// Tail calls are not allowed.
11230 assert(CallEnd->getOpcode() == ISD::CALLSEQ_END &&
11231 "Expected a callseq node.");
11232 SDNode *Call = CallEnd->getOperand(0).getNode();
11233 bool HasGlue = Call->getGluedNode();
11234
11235 // Replace the target specific call node with the patchable intrinsic.
11237
11238 // Push the chain.
11239 Ops.push_back(*(Call->op_begin()));
11240
11241 // Optionally, push the glue (if any).
11242 if (HasGlue)
11243 Ops.push_back(*(Call->op_end() - 1));
11244
11245 // Push the register mask info.
11246 if (HasGlue)
11247 Ops.push_back(*(Call->op_end() - 2));
11248 else
11249 Ops.push_back(*(Call->op_end() - 1));
11250
11251 // Add the <id> and <numBytes> constants.
11253 Ops.push_back(DAG.getTargetConstant(IDVal->getAsZExtVal(), dl, MVT::i64));
11255 Ops.push_back(DAG.getTargetConstant(NBytesVal->getAsZExtVal(), dl, MVT::i32));
11256
11257 // Add the callee.
11258 Ops.push_back(Callee);
11259
11260 // Adjust <numArgs> to account for any arguments that have been passed on the
11261 // stack instead.
11262 // Call Node: Chain, Target, {Args}, RegMask, [Glue]
11263 unsigned NumCallRegArgs = Call->getNumOperands() - (HasGlue ? 4 : 3);
11264 NumCallRegArgs = IsAnyRegCC ? NumArgs : NumCallRegArgs;
11265 Ops.push_back(DAG.getTargetConstant(NumCallRegArgs, dl, MVT::i32));
11266
11267 // Add the calling convention
11268 Ops.push_back(DAG.getTargetConstant((unsigned)CC, dl, MVT::i32));
11269
11270 // Add the arguments we omitted previously. The register allocator should
11271 // place these in any free register.
11272 if (IsAnyRegCC)
11273 for (unsigned i = NumMetaOpers, e = NumMetaOpers + NumArgs; i != e; ++i)
11274 Ops.push_back(getValue(CB.getArgOperand(i)));
11275
11276 // Push the arguments from the call instruction.
11277 SDNode::op_iterator e = HasGlue ? Call->op_end()-2 : Call->op_end()-1;
11278 Ops.append(Call->op_begin() + 2, e);
11279
11280 // Push live variables for the stack map.
11281 addStackMapLiveVars(CB, NumMetaOpers + NumArgs, dl, Ops, *this);
11282
11283 SDVTList NodeTys;
11284 if (IsAnyRegCC && HasDef) {
11285 // Create the return types based on the intrinsic definition
11286 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11287 SmallVector<EVT, 3> ValueVTs;
11288 ComputeValueVTs(TLI, DAG.getDataLayout(), CB.getType(), ValueVTs);
11289 assert(ValueVTs.size() == 1 && "Expected only one return value type.");
11290
11291 // There is always a chain and a glue type at the end
11292 ValueVTs.push_back(MVT::Other);
11293 ValueVTs.push_back(MVT::Glue);
11294 NodeTys = DAG.getVTList(ValueVTs);
11295 } else
11296 NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
11297
11298 // Replace the target specific call node with a PATCHPOINT node.
11299 SDValue PPV = DAG.getNode(ISD::PATCHPOINT, dl, NodeTys, Ops);
11300
11301 // Update the NodeMap.
11302 if (HasDef) {
11303 if (IsAnyRegCC)
11304 setValue(&CB, SDValue(PPV.getNode(), 0));
11305 else
11306 setValue(&CB, Result.first);
11307 }
11308
11309 // Fixup the consumers of the intrinsic. The chain and glue may be used in the
11310 // call sequence. Furthermore the location of the chain and glue can change
11311 // when the AnyReg calling convention is used and the intrinsic returns a
11312 // value.
11313 if (IsAnyRegCC && HasDef) {
11314 SDValue From[] = {SDValue(Call, 0), SDValue(Call, 1)};
11315 SDValue To[] = {PPV.getValue(1), PPV.getValue(2)};
11316 DAG.ReplaceAllUsesOfValuesWith(From, To, 2);
11317 } else
11318 DAG.ReplaceAllUsesWith(Call, PPV.getNode());
11319 DAG.DeleteNode(Call);
11320
11321 // Inform the Frame Information that we have a patchpoint in this function.
11322 FuncInfo.MF->getFrameInfo().setHasPatchPoint();
11323}
11324
11325void SelectionDAGBuilder::visitVectorReduce(const CallInst &I,
11326 unsigned Intrinsic) {
11327 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11328 SDValue Op1 = getValue(I.getArgOperand(0));
11329 SDValue Op2;
11330 if (I.arg_size() > 1)
11331 Op2 = getValue(I.getArgOperand(1));
11332 SDLoc dl = getCurSDLoc();
11333 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
11334 SDValue Res;
11335 SDNodeFlags SDFlags;
11336 if (auto *FPMO = dyn_cast<FPMathOperator>(&I))
11337 SDFlags.copyFMF(*FPMO);
11338
11339 switch (Intrinsic) {
11340 case Intrinsic::vector_reduce_fadd:
11341 if (SDFlags.hasAllowReassociation())
11342 Res = DAG.getNode(ISD::FADD, dl, VT, Op1,
11343 DAG.getNode(ISD::VECREDUCE_FADD, dl, VT, Op2, SDFlags),
11344 SDFlags);
11345 else
11346 Res = DAG.getNode(ISD::VECREDUCE_SEQ_FADD, dl, VT, Op1, Op2, SDFlags);
11347 break;
11348 case Intrinsic::vector_reduce_fmul:
11349 if (SDFlags.hasAllowReassociation())
11350 Res = DAG.getNode(ISD::FMUL, dl, VT, Op1,
11351 DAG.getNode(ISD::VECREDUCE_FMUL, dl, VT, Op2, SDFlags),
11352 SDFlags);
11353 else
11354 Res = DAG.getNode(ISD::VECREDUCE_SEQ_FMUL, dl, VT, Op1, Op2, SDFlags);
11355 break;
11356 case Intrinsic::vector_reduce_add:
11357 Res = DAG.getNode(ISD::VECREDUCE_ADD, dl, VT, Op1);
11358 break;
11359 case Intrinsic::vector_reduce_mul:
11360 Res = DAG.getNode(ISD::VECREDUCE_MUL, dl, VT, Op1);
11361 break;
11362 case Intrinsic::vector_reduce_and:
11363 Res = DAG.getNode(ISD::VECREDUCE_AND, dl, VT, Op1);
11364 break;
11365 case Intrinsic::vector_reduce_or:
11366 Res = DAG.getNode(ISD::VECREDUCE_OR, dl, VT, Op1);
11367 break;
11368 case Intrinsic::vector_reduce_xor:
11369 Res = DAG.getNode(ISD::VECREDUCE_XOR, dl, VT, Op1);
11370 break;
11371 case Intrinsic::vector_reduce_smax:
11372 Res = DAG.getNode(ISD::VECREDUCE_SMAX, dl, VT, Op1);
11373 break;
11374 case Intrinsic::vector_reduce_smin:
11375 Res = DAG.getNode(ISD::VECREDUCE_SMIN, dl, VT, Op1);
11376 break;
11377 case Intrinsic::vector_reduce_umax:
11378 Res = DAG.getNode(ISD::VECREDUCE_UMAX, dl, VT, Op1);
11379 break;
11380 case Intrinsic::vector_reduce_umin:
11381 Res = DAG.getNode(ISD::VECREDUCE_UMIN, dl, VT, Op1);
11382 break;
11383 case Intrinsic::vector_reduce_fmax:
11384 Res = DAG.getNode(ISD::VECREDUCE_FMAX, dl, VT, Op1, SDFlags);
11385 break;
11386 case Intrinsic::vector_reduce_fmin:
11387 Res = DAG.getNode(ISD::VECREDUCE_FMIN, dl, VT, Op1, SDFlags);
11388 break;
11389 case Intrinsic::vector_reduce_fmaximum:
11390 Res = DAG.getNode(ISD::VECREDUCE_FMAXIMUM, dl, VT, Op1, SDFlags);
11391 break;
11392 case Intrinsic::vector_reduce_fminimum:
11393 Res = DAG.getNode(ISD::VECREDUCE_FMINIMUM, dl, VT, Op1, SDFlags);
11394 break;
11395 default:
11396 llvm_unreachable("Unhandled vector reduce intrinsic");
11397 }
11398 setValue(&I, Res);
11399}
11400
11401/// Returns an AttributeList representing the attributes applied to the return
11402/// value of the given call.
11405 if (CLI.RetSExt)
11406 Attrs.push_back(Attribute::SExt);
11407 if (CLI.RetZExt)
11408 Attrs.push_back(Attribute::ZExt);
11409 if (CLI.IsInReg)
11410 Attrs.push_back(Attribute::InReg);
11411
11412 return AttributeList::get(CLI.RetTy->getContext(), AttributeList::ReturnIndex,
11413 Attrs);
11414}
11415
11416/// TargetLowering::LowerCallTo - This is the default LowerCallTo
11417/// implementation, which just calls LowerCall.
11418/// FIXME: When all targets are
11419/// migrated to using LowerCall, this hook should be integrated into SDISel.
11420std::pair<SDValue, SDValue>
11422 LLVMContext &Context = CLI.RetTy->getContext();
11423
11424 // Handle the incoming return values from the call.
11425 CLI.Ins.clear();
11426 SmallVector<Type *, 4> RetOrigTys;
11428 auto &DL = CLI.DAG.getDataLayout();
11429 ComputeValueTypes(DL, CLI.OrigRetTy, RetOrigTys, &Offsets);
11430
11431 SmallVector<EVT, 4> RetVTs;
11432 if (CLI.RetTy != CLI.OrigRetTy) {
11433 assert(RetOrigTys.size() == 1 &&
11434 "Only supported for non-aggregate returns");
11435 RetVTs.push_back(getValueType(DL, CLI.RetTy));
11436 } else {
11437 for (Type *Ty : RetOrigTys)
11438 RetVTs.push_back(getValueType(DL, Ty));
11439 }
11440
11441 if (CLI.IsPostTypeLegalization) {
11442 // If we are lowering a libcall after legalization, split the return type.
11443 SmallVector<Type *, 4> OldRetOrigTys;
11444 SmallVector<EVT, 4> OldRetVTs;
11445 SmallVector<TypeSize, 4> OldOffsets;
11446 RetOrigTys.swap(OldRetOrigTys);
11447 RetVTs.swap(OldRetVTs);
11448 Offsets.swap(OldOffsets);
11449
11450 for (size_t i = 0, e = OldRetVTs.size(); i != e; ++i) {
11451 EVT RetVT = OldRetVTs[i];
11452 uint64_t Offset = OldOffsets[i];
11453 MVT RegisterVT = getRegisterType(Context, RetVT);
11454 unsigned NumRegs = getNumRegisters(Context, RetVT);
11455 unsigned RegisterVTByteSZ = RegisterVT.getSizeInBits() / 8;
11456 RetOrigTys.append(NumRegs, OldRetOrigTys[i]);
11457 RetVTs.append(NumRegs, RegisterVT);
11458 for (unsigned j = 0; j != NumRegs; ++j)
11459 Offsets.push_back(TypeSize::getFixed(Offset + j * RegisterVTByteSZ));
11460 }
11461 }
11462
11464 GetReturnInfo(CLI.CallConv, CLI.RetTy, getReturnAttrs(CLI), Outs, *this, DL);
11465
11466 bool CanLowerReturn =
11468 CLI.IsVarArg, Outs, Context, CLI.RetTy);
11469
11470 SDValue DemoteStackSlot;
11471 int DemoteStackIdx = -100;
11472 if (!CanLowerReturn) {
11473 // FIXME: equivalent assert?
11474 // assert(!CS.hasInAllocaArgument() &&
11475 // "sret demotion is incompatible with inalloca");
11476 uint64_t TySize = DL.getTypeAllocSize(CLI.RetTy);
11477 Align Alignment = DL.getPrefTypeAlign(CLI.RetTy);
11479 DemoteStackIdx =
11480 MF.getFrameInfo().CreateStackObject(TySize, Alignment, false);
11481 Type *StackSlotPtrType = PointerType::get(Context, DL.getAllocaAddrSpace());
11482
11483 DemoteStackSlot = CLI.DAG.getFrameIndex(DemoteStackIdx, getFrameIndexTy(DL));
11484 ArgListEntry Entry(DemoteStackSlot, StackSlotPtrType);
11485 Entry.IsSRet = true;
11486 Entry.Alignment = Alignment;
11487 CLI.getArgs().insert(CLI.getArgs().begin(), Entry);
11488 CLI.NumFixedArgs += 1;
11489 CLI.getArgs()[0].IndirectType = CLI.RetTy;
11490 CLI.RetTy = CLI.OrigRetTy = Type::getVoidTy(Context);
11491
11492 // sret demotion isn't compatible with tail-calls, since the sret argument
11493 // points into the callers stack frame.
11494 CLI.IsTailCall = false;
11495 } else {
11496 bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
11497 CLI.RetTy, CLI.CallConv, CLI.IsVarArg, DL);
11498 for (unsigned I = 0, E = RetVTs.size(); I != E; ++I) {
11499 ISD::ArgFlagsTy Flags;
11500 if (NeedsRegBlock) {
11501 Flags.setInConsecutiveRegs();
11502 if (I == RetVTs.size() - 1)
11503 Flags.setInConsecutiveRegsLast();
11504 }
11505 EVT VT = RetVTs[I];
11506 MVT RegisterVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11507 unsigned NumRegs =
11508 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11509 for (unsigned i = 0; i != NumRegs; ++i) {
11510 ISD::InputArg Ret(Flags, RegisterVT, VT, RetOrigTys[I],
11512 if (CLI.RetTy->isPointerTy()) {
11513 Ret.Flags.setPointer();
11515 cast<PointerType>(CLI.RetTy)->getAddressSpace());
11516 }
11517 if (CLI.RetSExt)
11518 Ret.Flags.setSExt();
11519 if (CLI.RetZExt)
11520 Ret.Flags.setZExt();
11521 if (CLI.IsInReg)
11522 Ret.Flags.setInReg();
11523 CLI.Ins.push_back(Ret);
11524 }
11525 }
11526 }
11527
11528 // We push in swifterror return as the last element of CLI.Ins.
11529 ArgListTy &Args = CLI.getArgs();
11530 if (supportSwiftError()) {
11531 for (const ArgListEntry &Arg : Args) {
11532 if (Arg.IsSwiftError) {
11533 ISD::ArgFlagsTy Flags;
11534 Flags.setSwiftError();
11536 PointerType::getUnqual(Context),
11537 /*Used=*/true, ISD::InputArg::NoArgIndex, 0);
11538 CLI.Ins.push_back(Ret);
11539 }
11540 }
11541 }
11542
11543 // Handle all of the outgoing arguments.
11544 CLI.Outs.clear();
11545 CLI.OutVals.clear();
11546 for (unsigned i = 0, e = Args.size(); i != e; ++i) {
11547 SmallVector<Type *, 4> OrigArgTys;
11548 ComputeValueTypes(DL, Args[i].OrigTy, OrigArgTys);
11549 // FIXME: Split arguments if CLI.IsPostTypeLegalization
11550 Type *FinalType = Args[i].Ty;
11551 if (Args[i].IsByVal)
11552 FinalType = Args[i].IndirectType;
11553 bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
11554 FinalType, CLI.CallConv, CLI.IsVarArg, DL);
11555 for (unsigned Value = 0, NumValues = OrigArgTys.size(); Value != NumValues;
11556 ++Value) {
11557 Type *OrigArgTy = OrigArgTys[Value];
11558 Type *ArgTy = OrigArgTy;
11559 if (Args[i].Ty != Args[i].OrigTy) {
11560 assert(Value == 0 && "Only supported for non-aggregate arguments");
11561 ArgTy = Args[i].Ty;
11562 }
11563
11564 EVT VT = getValueType(DL, ArgTy);
11565 SDValue Op = SDValue(Args[i].Node.getNode(),
11566 Args[i].Node.getResNo() + Value);
11567 ISD::ArgFlagsTy Flags;
11568
11569 // Certain targets (such as MIPS), may have a different ABI alignment
11570 // for a type depending on the context. Give the target a chance to
11571 // specify the alignment it wants.
11572 const Align OriginalAlignment(getABIAlignmentForCallingConv(ArgTy, DL));
11573 Flags.setOrigAlign(OriginalAlignment);
11574
11575 if (i >= CLI.NumFixedArgs)
11576 Flags.setVarArg();
11577 if (ArgTy->isPointerTy()) {
11578 Flags.setPointer();
11579 Flags.setPointerAddrSpace(cast<PointerType>(ArgTy)->getAddressSpace());
11580 }
11581 if (Args[i].IsZExt)
11582 Flags.setZExt();
11583 if (Args[i].IsSExt)
11584 Flags.setSExt();
11585 if (Args[i].IsNoExt)
11586 Flags.setNoExt();
11587 if (Args[i].IsInReg) {
11588 // If we are using vectorcall calling convention, a structure that is
11589 // passed InReg - is surely an HVA
11591 isa<StructType>(FinalType)) {
11592 // The first value of a structure is marked
11593 if (0 == Value)
11594 Flags.setHvaStart();
11595 Flags.setHva();
11596 }
11597 // Set InReg Flag
11598 Flags.setInReg();
11599 }
11600 if (Args[i].IsSRet)
11601 Flags.setSRet();
11602 if (Args[i].IsSwiftSelf)
11603 Flags.setSwiftSelf();
11604 if (Args[i].IsSwiftAsync)
11605 Flags.setSwiftAsync();
11606 if (Args[i].IsSwiftError)
11607 Flags.setSwiftError();
11608 if (Args[i].IsCFGuardTarget)
11609 Flags.setCFGuardTarget();
11610 if (Args[i].IsByVal)
11611 Flags.setByVal();
11612 if (Args[i].IsByRef)
11613 Flags.setByRef();
11614 if (Args[i].IsPreallocated) {
11615 Flags.setPreallocated();
11616 // Set the byval flag for CCAssignFn callbacks that don't know about
11617 // preallocated. This way we can know how many bytes we should've
11618 // allocated and how many bytes a callee cleanup function will pop. If
11619 // we port preallocated to more targets, we'll have to add custom
11620 // preallocated handling in the various CC lowering callbacks.
11621 Flags.setByVal();
11622 }
11623 if (Args[i].IsInAlloca) {
11624 Flags.setInAlloca();
11625 // Set the byval flag for CCAssignFn callbacks that don't know about
11626 // inalloca. This way we can know how many bytes we should've allocated
11627 // and how many bytes a callee cleanup function will pop. If we port
11628 // inalloca to more targets, we'll have to add custom inalloca handling
11629 // in the various CC lowering callbacks.
11630 Flags.setByVal();
11631 }
11632 Align MemAlign;
11633 if (Args[i].IsByVal || Args[i].IsInAlloca || Args[i].IsPreallocated) {
11634 unsigned FrameSize = DL.getTypeAllocSize(Args[i].IndirectType);
11635 Flags.setByValSize(FrameSize);
11636
11637 // info is not there but there are cases it cannot get right.
11638 if (auto MA = Args[i].Alignment)
11639 MemAlign = *MA;
11640 else
11641 MemAlign = getByValTypeAlignment(Args[i].IndirectType, DL);
11642 } else if (auto MA = Args[i].Alignment) {
11643 MemAlign = *MA;
11644 } else {
11645 MemAlign = OriginalAlignment;
11646 }
11647 Flags.setMemAlign(MemAlign);
11648 if (Args[i].IsNest)
11649 Flags.setNest();
11650 if (NeedsRegBlock)
11651 Flags.setInConsecutiveRegs();
11652
11653 MVT PartVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11654 unsigned NumParts =
11655 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11656 SmallVector<SDValue, 4> Parts(NumParts);
11657 ISD::NodeType ExtendKind = ISD::ANY_EXTEND;
11658
11659 if (Args[i].IsSExt)
11660 ExtendKind = ISD::SIGN_EXTEND;
11661 else if (Args[i].IsZExt)
11662 ExtendKind = ISD::ZERO_EXTEND;
11663
11664 // Conservatively only handle 'returned' on non-vectors that can be lowered,
11665 // for now.
11666 if (Args[i].IsReturned && !Op.getValueType().isVector() &&
11668 assert((CLI.RetTy == Args[i].Ty ||
11669 (CLI.RetTy->isPointerTy() && Args[i].Ty->isPointerTy() &&
11671 Args[i].Ty->getPointerAddressSpace())) &&
11672 RetVTs.size() == NumValues && "unexpected use of 'returned'");
11673 // Before passing 'returned' to the target lowering code, ensure that
11674 // either the register MVT and the actual EVT are the same size or that
11675 // the return value and argument are extended in the same way; in these
11676 // cases it's safe to pass the argument register value unchanged as the
11677 // return register value (although it's at the target's option whether
11678 // to do so)
11679 // TODO: allow code generation to take advantage of partially preserved
11680 // registers rather than clobbering the entire register when the
11681 // parameter extension method is not compatible with the return
11682 // extension method
11683 if ((NumParts * PartVT.getSizeInBits() == VT.getSizeInBits()) ||
11684 (ExtendKind != ISD::ANY_EXTEND && CLI.RetSExt == Args[i].IsSExt &&
11685 CLI.RetZExt == Args[i].IsZExt))
11686 Flags.setReturned();
11687 }
11688
11689 getCopyToParts(CLI.DAG, CLI.DL, Op, &Parts[0], NumParts, PartVT, CLI.CB,
11690 CLI.CallConv, ExtendKind);
11691
11692 for (unsigned j = 0; j != NumParts; ++j) {
11693 // if it isn't first piece, alignment must be 1
11694 // For scalable vectors the scalable part is currently handled
11695 // by individual targets, so we just use the known minimum size here.
11696 ISD::OutputArg MyFlags(
11697 Flags, Parts[j].getValueType().getSimpleVT(), VT, OrigArgTy, i,
11698 j * Parts[j].getValueType().getStoreSize().getKnownMinValue());
11699 if (NumParts > 1 && j == 0)
11700 MyFlags.Flags.setSplit();
11701 else if (j != 0) {
11702 MyFlags.Flags.setOrigAlign(Align(1));
11703 if (j == NumParts - 1)
11704 MyFlags.Flags.setSplitEnd();
11705 }
11706
11707 CLI.Outs.push_back(MyFlags);
11708 CLI.OutVals.push_back(Parts[j]);
11709 }
11710
11711 if (NeedsRegBlock && Value == NumValues - 1)
11712 CLI.Outs[CLI.Outs.size() - 1].Flags.setInConsecutiveRegsLast();
11713 }
11714 }
11715
11717 CLI.Chain = LowerCall(CLI, InVals);
11718
11719 // Update CLI.InVals to use outside of this function.
11720 CLI.InVals = InVals;
11721
11722 // Verify that the target's LowerCall behaved as expected.
11723 assert(CLI.Chain.getNode() && CLI.Chain.getValueType() == MVT::Other &&
11724 "LowerCall didn't return a valid chain!");
11725 assert((!CLI.IsTailCall || InVals.empty()) &&
11726 "LowerCall emitted a return value for a tail call!");
11727 assert((CLI.IsTailCall || InVals.size() == CLI.Ins.size()) &&
11728 "LowerCall didn't emit the correct number of values!");
11729
11730 // For a tail call, the return value is merely live-out and there aren't
11731 // any nodes in the DAG representing it. Return a special value to
11732 // indicate that a tail call has been emitted and no more Instructions
11733 // should be processed in the current block.
11734 if (CLI.IsTailCall) {
11735 CLI.DAG.setRoot(CLI.Chain);
11736 return std::make_pair(SDValue(), SDValue());
11737 }
11738
11739#ifndef NDEBUG
11740 for (unsigned i = 0, e = CLI.Ins.size(); i != e; ++i) {
11741 assert(InVals[i].getNode() && "LowerCall emitted a null value!");
11742 assert(EVT(CLI.Ins[i].VT) == InVals[i].getValueType() &&
11743 "LowerCall emitted a value with the wrong type!");
11744 }
11745#endif
11746
11747 SmallVector<SDValue, 4> ReturnValues;
11748 if (!CanLowerReturn) {
11749 // The instruction result is the result of loading from the
11750 // hidden sret parameter.
11751 MVT PtrVT = getPointerTy(DL, DL.getAllocaAddrSpace());
11752
11753 unsigned NumValues = RetVTs.size();
11754 ReturnValues.resize(NumValues);
11755 SmallVector<SDValue, 4> Chains(NumValues);
11756
11757 // An aggregate return value cannot wrap around the address space, so
11758 // offsets to its parts don't wrap either.
11760 Align HiddenSRetAlign = MF.getFrameInfo().getObjectAlign(DemoteStackIdx);
11761 for (unsigned i = 0; i < NumValues; ++i) {
11763 DemoteStackSlot, CLI.DAG.getConstant(Offsets[i], CLI.DL, PtrVT),
11765 SDValue L = CLI.DAG.getLoad(
11766 RetVTs[i], CLI.DL, CLI.Chain, Add,
11768 DemoteStackIdx, Offsets[i]),
11769 HiddenSRetAlign);
11770 ReturnValues[i] = L;
11771 Chains[i] = L.getValue(1);
11772 }
11773
11774 CLI.Chain = CLI.DAG.getNode(ISD::TokenFactor, CLI.DL, MVT::Other, Chains);
11775 } else {
11776 // Collect the legal value parts into potentially illegal values
11777 // that correspond to the original function's return values.
11778 std::optional<ISD::NodeType> AssertOp;
11779 if (CLI.RetSExt)
11780 AssertOp = ISD::AssertSext;
11781 else if (CLI.RetZExt)
11782 AssertOp = ISD::AssertZext;
11783 unsigned CurReg = 0;
11784 for (EVT VT : RetVTs) {
11785 MVT RegisterVT = getRegisterTypeForCallingConv(Context, CLI.CallConv, VT);
11786 unsigned NumRegs =
11787 getNumRegistersForCallingConv(Context, CLI.CallConv, VT);
11788
11789 ReturnValues.push_back(getCopyFromParts(
11790 CLI.DAG, CLI.DL, &InVals[CurReg], NumRegs, RegisterVT, VT, nullptr,
11791 CLI.Chain, CLI.CallConv, AssertOp));
11792 CurReg += NumRegs;
11793 }
11794
11795 // For a function returning void, there is no return value. We can't create
11796 // such a node, so we just return a null return value in that case. In
11797 // that case, nothing will actually look at the value.
11798 if (ReturnValues.empty())
11799 return std::make_pair(SDValue(), CLI.Chain);
11800 }
11801
11802 SDValue Res = CLI.DAG.getNode(ISD::MERGE_VALUES, CLI.DL,
11803 CLI.DAG.getVTList(RetVTs), ReturnValues);
11804 return std::make_pair(Res, CLI.Chain);
11805}
11806
11807/// Places new result values for the node in Results (their number
11808/// and types must exactly match those of the original return values of
11809/// the node), or leaves Results empty, which indicates that the node is not
11810/// to be custom lowered after all.
11813 SelectionDAG &DAG) const {
11814 SDValue Res = LowerOperation(SDValue(N, 0), DAG);
11815
11816 if (!Res.getNode())
11817 return;
11818
11819 // If the original node has one result, take the return value from
11820 // LowerOperation as is. It might not be result number 0.
11821 if (N->getNumValues() == 1) {
11822 Results.push_back(Res);
11823 return;
11824 }
11825
11826 // If the original node has multiple results, then the return node should
11827 // have the same number of results.
11828 assert((N->getNumValues() == Res->getNumValues()) &&
11829 "Lowering returned the wrong number of results!");
11830
11831 // Places new result values base on N result number.
11832 for (unsigned I = 0, E = N->getNumValues(); I != E; ++I)
11833 Results.push_back(Res.getValue(I));
11834}
11835
11837 llvm_unreachable("LowerOperation not implemented for this target!");
11838}
11839
11841 Register Reg,
11842 ISD::NodeType ExtendType) {
11844 assert((Op.getOpcode() != ISD::CopyFromReg ||
11845 cast<RegisterSDNode>(Op.getOperand(1))->getReg() != Reg) &&
11846 "Copy from a reg to the same reg!");
11847 assert(!Reg.isPhysical() && "Is a physreg");
11848
11849 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11850 // If this is an InlineAsm we have to match the registers required, not the
11851 // notional registers required by the type.
11852
11853 RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), Reg, V->getType(),
11854 std::nullopt); // This is not an ABI copy.
11855 SDValue Chain = DAG.getEntryNode();
11856
11857 if (ExtendType == ISD::ANY_EXTEND) {
11858 auto PreferredExtendIt = FuncInfo.PreferredExtendType.find(V);
11859 if (PreferredExtendIt != FuncInfo.PreferredExtendType.end())
11860 ExtendType = PreferredExtendIt->second;
11861 }
11862 RFV.getCopyToRegs(Op, DAG, getCurSDLoc(), Chain, nullptr, V, ExtendType);
11863 PendingExports.push_back(Chain);
11864}
11865
11867
11868/// isOnlyUsedInEntryBlock - If the specified argument is only used in the
11869/// entry block, return true. This includes arguments used by switches, since
11870/// the switch may expand into multiple basic blocks.
11871static bool isOnlyUsedInEntryBlock(const Argument *A, bool FastISel) {
11872 // With FastISel active, we may be splitting blocks, so force creation
11873 // of virtual registers for all non-dead arguments.
11874 if (FastISel)
11875 return A->use_empty();
11876
11877 const BasicBlock &Entry = A->getParent()->front();
11878 for (const User *U : A->users())
11879 if (cast<Instruction>(U)->getParent() != &Entry || isa<SwitchInst>(U))
11880 return false; // Use not in entry block.
11881
11882 return true;
11883}
11884
11886 DenseMap<const Argument *,
11887 std::pair<const AllocaInst *, const StoreInst *>>;
11888
11889/// Scan the entry block of the function in FuncInfo for arguments that look
11890/// like copies into a local alloca. Record any copied arguments in
11891/// ArgCopyElisionCandidates.
11892static void
11894 FunctionLoweringInfo *FuncInfo,
11895 ArgCopyElisionMapTy &ArgCopyElisionCandidates) {
11896 // Record the state of every static alloca used in the entry block. Argument
11897 // allocas are all used in the entry block, so we need approximately as many
11898 // entries as we have arguments.
11899 enum StaticAllocaInfo { Unknown, Clobbered, Elidable };
11901 unsigned NumArgs = FuncInfo->Fn->arg_size();
11902 StaticAllocas.reserve(NumArgs * 2);
11903
11904 auto GetInfoIfStaticAlloca = [&](const Value *V) -> StaticAllocaInfo * {
11905 if (!V)
11906 return nullptr;
11907 V = V->stripPointerCasts();
11908 const auto *AI = dyn_cast<AllocaInst>(V);
11909 if (!AI || !AI->isStaticAlloca() || !FuncInfo->StaticAllocaMap.count(AI))
11910 return nullptr;
11911 auto Iter = StaticAllocas.insert({AI, Unknown});
11912 return &Iter.first->second;
11913 };
11914
11915 // Look for stores of arguments to static allocas. Look through bitcasts and
11916 // GEPs to handle type coercions, as long as the alloca is fully initialized
11917 // by the store. Any non-store use of an alloca escapes it and any subsequent
11918 // unanalyzed store might write it.
11919 // FIXME: Handle structs initialized with multiple stores.
11920 for (const Instruction &I : FuncInfo->Fn->getEntryBlock()) {
11921 // Look for stores, and handle non-store uses conservatively.
11922 const auto *SI = dyn_cast<StoreInst>(&I);
11923 if (!SI) {
11924 // We will look through cast uses, so ignore them completely.
11925 if (I.isCast())
11926 continue;
11927 // Ignore debug info and pseudo op intrinsics, they don't escape or store
11928 // to allocas.
11929 if (I.isDebugOrPseudoInst())
11930 continue;
11931 // This is an unknown instruction. Assume it escapes or writes to all
11932 // static alloca operands.
11933 for (const Use &U : I.operands()) {
11934 if (StaticAllocaInfo *Info = GetInfoIfStaticAlloca(U))
11935 *Info = StaticAllocaInfo::Clobbered;
11936 }
11937 continue;
11938 }
11939
11940 // If the stored value is a static alloca, mark it as escaped.
11941 if (StaticAllocaInfo *Info = GetInfoIfStaticAlloca(SI->getValueOperand()))
11942 *Info = StaticAllocaInfo::Clobbered;
11943
11944 // Check if the destination is a static alloca.
11945 const Value *Dst = SI->getPointerOperand()->stripPointerCasts();
11946 StaticAllocaInfo *Info = GetInfoIfStaticAlloca(Dst);
11947 if (!Info)
11948 continue;
11949 const AllocaInst *AI = cast<AllocaInst>(Dst);
11950
11951 // Skip allocas that have been initialized or clobbered.
11952 if (*Info != StaticAllocaInfo::Unknown)
11953 continue;
11954
11955 // Check if the stored value is an argument, and that this store fully
11956 // initializes the alloca.
11957 // If the argument type has padding bits we can't directly forward a pointer
11958 // as the upper bits may contain garbage.
11959 // Don't elide copies from the same argument twice.
11960 const Value *Val = SI->getValueOperand()->stripPointerCasts();
11961 const auto *Arg = dyn_cast<Argument>(Val);
11962 std::optional<TypeSize> AllocaSize = AI->getAllocationSize(DL);
11963 if (!Arg || Arg->hasPassPointeeByValueCopyAttr() ||
11964 Arg->getType()->isEmptyTy() || !AllocaSize ||
11965 DL.getTypeStoreSize(Arg->getType()) != *AllocaSize ||
11966 !DL.typeSizeEqualsStoreSize(Arg->getType()) ||
11967 ArgCopyElisionCandidates.count(Arg)) {
11968 *Info = StaticAllocaInfo::Clobbered;
11969 continue;
11970 }
11971
11972 LLVM_DEBUG(dbgs() << "Found argument copy elision candidate: " << *AI
11973 << '\n');
11974
11975 // Mark this alloca and store for argument copy elision.
11976 *Info = StaticAllocaInfo::Elidable;
11977 ArgCopyElisionCandidates.insert({Arg, {AI, SI}});
11978
11979 // Stop scanning if we've seen all arguments. This will happen early in -O0
11980 // builds, which is useful, because -O0 builds have large entry blocks and
11981 // many allocas.
11982 if (ArgCopyElisionCandidates.size() == NumArgs)
11983 break;
11984 }
11985}
11986
11987/// Try to elide argument copies from memory into a local alloca. Succeeds if
11988/// ArgVal is a load from a suitable fixed stack object.
11991 DenseMap<int, int> &ArgCopyElisionFrameIndexMap,
11992 SmallPtrSetImpl<const Instruction *> &ElidedArgCopyInstrs,
11993 ArgCopyElisionMapTy &ArgCopyElisionCandidates, const Argument &Arg,
11994 ArrayRef<SDValue> ArgVals, bool &ArgHasUses) {
11995 // Check if this is a load from a fixed stack object.
11996 auto *LNode = dyn_cast<LoadSDNode>(ArgVals[0]);
11997 if (!LNode)
11998 return;
11999 auto *FINode = dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode());
12000 if (!FINode)
12001 return;
12002
12003 // Check that the fixed stack object is the right size and alignment.
12004 // Look at the alignment that the user wrote on the alloca instead of looking
12005 // at the stack object.
12006 auto ArgCopyIter = ArgCopyElisionCandidates.find(&Arg);
12007 assert(ArgCopyIter != ArgCopyElisionCandidates.end());
12008 const AllocaInst *AI = ArgCopyIter->second.first;
12009 int FixedIndex = FINode->getIndex();
12010 int &AllocaIndex = FuncInfo.StaticAllocaMap[AI];
12011 int OldIndex = AllocaIndex;
12012 MachineFrameInfo &MFI = FuncInfo.MF->getFrameInfo();
12013 if (MFI.getObjectSize(FixedIndex) != MFI.getObjectSize(OldIndex)) {
12014 LLVM_DEBUG(
12015 dbgs() << " argument copy elision failed due to bad fixed stack "
12016 "object size\n");
12017 return;
12018 }
12019 Align RequiredAlignment = AI->getAlign();
12020 if (MFI.getObjectAlign(FixedIndex) < RequiredAlignment) {
12021 LLVM_DEBUG(dbgs() << " argument copy elision failed: alignment of alloca "
12022 "greater than stack argument alignment ("
12023 << DebugStr(RequiredAlignment) << " vs "
12024 << DebugStr(MFI.getObjectAlign(FixedIndex)) << ")\n");
12025 return;
12026 }
12027
12028 // Perform the elision. Delete the old stack object and replace its only use
12029 // in the variable info map. Mark the stack object as mutable and aliased.
12030 LLVM_DEBUG({
12031 dbgs() << "Eliding argument copy from " << Arg << " to " << *AI << '\n'
12032 << " Replacing frame index " << OldIndex << " with " << FixedIndex
12033 << '\n';
12034 });
12035 MFI.RemoveStackObject(OldIndex);
12036 MFI.setIsImmutableObjectIndex(FixedIndex, false);
12037 MFI.setIsAliasedObjectIndex(FixedIndex, true);
12038 AllocaIndex = FixedIndex;
12039 ArgCopyElisionFrameIndexMap.insert({OldIndex, FixedIndex});
12040 for (SDValue ArgVal : ArgVals)
12041 Chains.push_back(ArgVal.getValue(1));
12042
12043 // Avoid emitting code for the store implementing the copy.
12044 const StoreInst *SI = ArgCopyIter->second.second;
12045 ElidedArgCopyInstrs.insert(SI);
12046
12047 // Check for uses of the argument again so that we can avoid exporting ArgVal
12048 // if it is't used by anything other than the store.
12049 for (const Value *U : Arg.users()) {
12050 if (U != SI) {
12051 ArgHasUses = true;
12052 break;
12053 }
12054 }
12055}
12056
12057void SelectionDAGISel::LowerArguments(const Function &F) {
12058 SelectionDAG &DAG = SDB->DAG;
12059 SDLoc dl = SDB->getCurSDLoc();
12060 const DataLayout &DL = DAG.getDataLayout();
12062
12063 // In Naked functions we aren't going to save any registers.
12064 if (F.hasFnAttribute(Attribute::Naked))
12065 return;
12066
12067 if (!FuncInfo->CanLowerReturn) {
12068 // Put in an sret pointer parameter before all the other parameters.
12069 MVT ValueVT = TLI->getPointerTy(DL, DL.getAllocaAddrSpace());
12070
12071 ISD::ArgFlagsTy Flags;
12072 Flags.setSRet();
12073 MVT RegisterVT = TLI->getRegisterType(*DAG.getContext(), ValueVT);
12074 ISD::InputArg RetArg(Flags, RegisterVT, ValueVT, F.getReturnType(), true,
12076 Ins.push_back(RetArg);
12077 }
12078
12079 // Look for stores of arguments to static allocas. Mark such arguments with a
12080 // flag to ask the target to give us the memory location of that argument if
12081 // available.
12082 ArgCopyElisionMapTy ArgCopyElisionCandidates;
12084 ArgCopyElisionCandidates);
12085
12086 // Set up the incoming argument description vector.
12087 for (const Argument &Arg : F.args()) {
12088 unsigned ArgNo = Arg.getArgNo();
12090 ComputeValueTypes(DAG.getDataLayout(), Arg.getType(), Types);
12091 bool isArgValueUsed = !Arg.use_empty();
12092 Type *FinalType = Arg.getType();
12093 if (Arg.hasAttribute(Attribute::ByVal))
12094 FinalType = Arg.getParamByValType();
12095 bool NeedsRegBlock = TLI->functionArgumentNeedsConsecutiveRegisters(
12096 FinalType, F.getCallingConv(), F.isVarArg(), DL);
12097 for (unsigned Value = 0, NumValues = Types.size(); Value != NumValues;
12098 ++Value) {
12099 Type *ArgTy = Types[Value];
12100 EVT VT = TLI->getValueType(DL, ArgTy);
12101 ISD::ArgFlagsTy Flags;
12102
12103 if (ArgTy->isPointerTy()) {
12104 Flags.setPointer();
12105 Flags.setPointerAddrSpace(cast<PointerType>(ArgTy)->getAddressSpace());
12106 }
12107 if (Arg.hasAttribute(Attribute::ZExt))
12108 Flags.setZExt();
12109 if (Arg.hasAttribute(Attribute::SExt))
12110 Flags.setSExt();
12111 if (Arg.hasAttribute(Attribute::InReg)) {
12112 // If we are using vectorcall calling convention, a structure that is
12113 // passed InReg - is surely an HVA
12114 if (F.getCallingConv() == CallingConv::X86_VectorCall &&
12115 isa<StructType>(Arg.getType())) {
12116 // The first value of a structure is marked
12117 if (0 == Value)
12118 Flags.setHvaStart();
12119 Flags.setHva();
12120 }
12121 // Set InReg Flag
12122 Flags.setInReg();
12123 }
12124 if (Arg.hasAttribute(Attribute::StructRet))
12125 Flags.setSRet();
12126 if (Arg.hasAttribute(Attribute::SwiftSelf))
12127 Flags.setSwiftSelf();
12128 if (Arg.hasAttribute(Attribute::SwiftAsync))
12129 Flags.setSwiftAsync();
12130 if (Arg.hasAttribute(Attribute::SwiftError))
12131 Flags.setSwiftError();
12132 if (Arg.hasAttribute(Attribute::ByVal))
12133 Flags.setByVal();
12134 if (Arg.hasAttribute(Attribute::ByRef))
12135 Flags.setByRef();
12136 if (Arg.hasAttribute(Attribute::InAlloca)) {
12137 Flags.setInAlloca();
12138 // Set the byval flag for CCAssignFn callbacks that don't know about
12139 // inalloca. This way we can know how many bytes we should've allocated
12140 // and how many bytes a callee cleanup function will pop. If we port
12141 // inalloca to more targets, we'll have to add custom inalloca handling
12142 // in the various CC lowering callbacks.
12143 Flags.setByVal();
12144 }
12145 if (Arg.hasAttribute(Attribute::Preallocated)) {
12146 Flags.setPreallocated();
12147 // Set the byval flag for CCAssignFn callbacks that don't know about
12148 // preallocated. This way we can know how many bytes we should've
12149 // allocated and how many bytes a callee cleanup function will pop. If
12150 // we port preallocated to more targets, we'll have to add custom
12151 // preallocated handling in the various CC lowering callbacks.
12152 Flags.setByVal();
12153 }
12154
12155 // Certain targets (such as MIPS), may have a different ABI alignment
12156 // for a type depending on the context. Give the target a chance to
12157 // specify the alignment it wants.
12158 const Align OriginalAlignment(
12159 TLI->getABIAlignmentForCallingConv(ArgTy, DL));
12160 Flags.setOrigAlign(OriginalAlignment);
12161
12162 Align MemAlign;
12163 Type *ArgMemTy = nullptr;
12164 if (Flags.isByVal() || Flags.isInAlloca() || Flags.isPreallocated() ||
12165 Flags.isByRef()) {
12166 if (!ArgMemTy)
12167 ArgMemTy = Arg.getPointeeInMemoryValueType();
12168
12169 uint64_t MemSize = DL.getTypeAllocSize(ArgMemTy);
12170
12171 // For in-memory arguments, size and alignment should be passed from FE.
12172 // BE will guess if this info is not there but there are cases it cannot
12173 // get right.
12174 if (auto ParamAlign = Arg.getParamStackAlign())
12175 MemAlign = *ParamAlign;
12176 else if ((ParamAlign = Arg.getParamAlign()))
12177 MemAlign = *ParamAlign;
12178 else
12179 MemAlign = TLI->getByValTypeAlignment(ArgMemTy, DL);
12180 if (Flags.isByRef())
12181 Flags.setByRefSize(MemSize);
12182 else
12183 Flags.setByValSize(MemSize);
12184 } else if (auto ParamAlign = Arg.getParamStackAlign()) {
12185 MemAlign = *ParamAlign;
12186 } else {
12187 MemAlign = OriginalAlignment;
12188 }
12189 Flags.setMemAlign(MemAlign);
12190
12191 if (Arg.hasAttribute(Attribute::Nest))
12192 Flags.setNest();
12193 if (NeedsRegBlock)
12194 Flags.setInConsecutiveRegs();
12195 if (ArgCopyElisionCandidates.count(&Arg))
12196 Flags.setCopyElisionCandidate();
12197 if (Arg.hasAttribute(Attribute::Returned))
12198 Flags.setReturned();
12199
12200 MVT RegisterVT = TLI->getRegisterTypeForCallingConv(
12201 *CurDAG->getContext(), F.getCallingConv(), VT);
12202 unsigned NumRegs = TLI->getNumRegistersForCallingConv(
12203 *CurDAG->getContext(), F.getCallingConv(), VT);
12204 for (unsigned i = 0; i != NumRegs; ++i) {
12205 // For scalable vectors, use the minimum size; individual targets
12206 // are responsible for handling scalable vector arguments and
12207 // return values.
12208 ISD::InputArg MyFlags(
12209 Flags, RegisterVT, VT, ArgTy, isArgValueUsed, ArgNo,
12210 i * RegisterVT.getStoreSize().getKnownMinValue());
12211 if (NumRegs > 1 && i == 0)
12212 MyFlags.Flags.setSplit();
12213 // if it isn't first piece, alignment must be 1
12214 else if (i > 0) {
12215 MyFlags.Flags.setOrigAlign(Align(1));
12216 if (i == NumRegs - 1)
12217 MyFlags.Flags.setSplitEnd();
12218 }
12219 Ins.push_back(MyFlags);
12220 }
12221 if (NeedsRegBlock && Value == NumValues - 1)
12222 Ins[Ins.size() - 1].Flags.setInConsecutiveRegsLast();
12223 }
12224 }
12225
12226 // Call the target to set up the argument values.
12228 SDValue NewRoot = TLI->LowerFormalArguments(
12229 DAG.getRoot(), F.getCallingConv(), F.isVarArg(), Ins, dl, DAG, InVals);
12230
12231 // Verify that the target's LowerFormalArguments behaved as expected.
12232 assert(NewRoot.getNode() && NewRoot.getValueType() == MVT::Other &&
12233 "LowerFormalArguments didn't return a valid chain!");
12234 assert(InVals.size() == Ins.size() &&
12235 "LowerFormalArguments didn't emit the correct number of values!");
12236 assert(all_of(InVals, [](SDValue InVal) { return InVal.getNode(); }) &&
12237 "LowerFormalArguments emitted a null value!");
12238
12239 // Update the DAG with the new chain value resulting from argument lowering.
12240 DAG.setRoot(NewRoot);
12241
12242 // Set up the argument values.
12243 unsigned i = 0;
12244 if (!FuncInfo->CanLowerReturn) {
12245 // Create a virtual register for the sret pointer, and put in a copy
12246 // from the sret argument into it.
12247 MVT VT = TLI->getPointerTy(DL, DL.getAllocaAddrSpace());
12248 MVT RegVT = TLI->getRegisterType(*CurDAG->getContext(), VT);
12249 std::optional<ISD::NodeType> AssertOp;
12250 SDValue ArgValue =
12251 getCopyFromParts(DAG, dl, &InVals[0], 1, RegVT, VT, nullptr, NewRoot,
12252 F.getCallingConv(), AssertOp);
12253
12254 MachineFunction& MF = SDB->DAG.getMachineFunction();
12255 MachineRegisterInfo& RegInfo = MF.getRegInfo();
12256 Register SRetReg =
12257 RegInfo.createVirtualRegister(TLI->getRegClassFor(RegVT));
12258 FuncInfo->DemoteRegister = SRetReg;
12259 NewRoot =
12260 SDB->DAG.getCopyToReg(NewRoot, SDB->getCurSDLoc(), SRetReg, ArgValue);
12261 DAG.setRoot(NewRoot);
12262
12263 // i indexes lowered arguments. Bump it past the hidden sret argument.
12264 ++i;
12265 }
12266
12268 DenseMap<int, int> ArgCopyElisionFrameIndexMap;
12269 for (const Argument &Arg : F.args()) {
12270 SmallVector<SDValue, 4> ArgValues;
12271 SmallVector<EVT, 4> ValueVTs;
12272 ComputeValueVTs(*TLI, DAG.getDataLayout(), Arg.getType(), ValueVTs);
12273 unsigned NumValues = ValueVTs.size();
12274 if (NumValues == 0)
12275 continue;
12276
12277 bool ArgHasUses = !Arg.use_empty();
12278
12279 // Elide the copying store if the target loaded this argument from a
12280 // suitable fixed stack object.
12281 if (Ins[i].Flags.isCopyElisionCandidate()) {
12282 unsigned NumParts = 0;
12283 for (EVT VT : ValueVTs)
12284 NumParts += TLI->getNumRegistersForCallingConv(*CurDAG->getContext(),
12285 F.getCallingConv(), VT);
12286
12287 tryToElideArgumentCopy(*FuncInfo, Chains, ArgCopyElisionFrameIndexMap,
12288 ElidedArgCopyInstrs, ArgCopyElisionCandidates, Arg,
12289 ArrayRef(&InVals[i], NumParts), ArgHasUses);
12290 }
12291
12292 // If this argument is unused then remember its value. It is used to generate
12293 // debugging information.
12294 bool isSwiftErrorArg =
12295 TLI->supportSwiftError() &&
12296 Arg.hasAttribute(Attribute::SwiftError);
12297 if (!ArgHasUses && !isSwiftErrorArg) {
12298 SDB->setUnusedArgValue(&Arg, InVals[i]);
12299
12300 // Also remember any frame index for use in FastISel.
12301 if (FrameIndexSDNode *FI =
12303 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12304 }
12305
12306 for (unsigned Val = 0; Val != NumValues; ++Val) {
12307 EVT VT = ValueVTs[Val];
12308 MVT PartVT = TLI->getRegisterTypeForCallingConv(*CurDAG->getContext(),
12309 F.getCallingConv(), VT);
12310 unsigned NumParts = TLI->getNumRegistersForCallingConv(
12311 *CurDAG->getContext(), F.getCallingConv(), VT);
12312
12313 // Even an apparent 'unused' swifterror argument needs to be returned. So
12314 // we do generate a copy for it that can be used on return from the
12315 // function.
12316 if (ArgHasUses || isSwiftErrorArg) {
12317 std::optional<ISD::NodeType> AssertOp;
12318 if (Arg.hasAttribute(Attribute::SExt))
12319 AssertOp = ISD::AssertSext;
12320 else if (Arg.hasAttribute(Attribute::ZExt))
12321 AssertOp = ISD::AssertZext;
12322
12323 SDValue OutVal =
12324 getCopyFromParts(DAG, dl, &InVals[i], NumParts, PartVT, VT, nullptr,
12325 NewRoot, F.getCallingConv(), AssertOp);
12326
12327 FPClassTest NoFPClass = Arg.getNoFPClass();
12328 if (NoFPClass != fcNone) {
12329 SDValue SDNoFPClass = DAG.getTargetConstant(
12330 static_cast<uint64_t>(NoFPClass), dl, MVT::i32);
12331 OutVal = DAG.getNode(ISD::AssertNoFPClass, dl, OutVal.getValueType(),
12332 OutVal, SDNoFPClass);
12333 }
12334 ArgValues.push_back(OutVal);
12335 }
12336
12337 i += NumParts;
12338 }
12339
12340 // We don't need to do anything else for unused arguments.
12341 if (ArgValues.empty())
12342 continue;
12343
12344 // Note down frame index.
12345 if (FrameIndexSDNode *FI =
12346 dyn_cast<FrameIndexSDNode>(ArgValues[0].getNode()))
12347 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12348
12349 SDValue Res = DAG.getMergeValues(ArrayRef(ArgValues.data(), NumValues),
12350 SDB->getCurSDLoc());
12351
12352 SDB->setValue(&Arg, Res);
12353 if (!TM.Options.EnableFastISel && Res.getOpcode() == ISD::BUILD_PAIR) {
12354 // We want to associate the argument with the frame index, among
12355 // involved operands, that correspond to the lowest address. The
12356 // getCopyFromParts function, called earlier, is swapping the order of
12357 // the operands to BUILD_PAIR depending on endianness. The result of
12358 // that swapping is that the least significant bits of the argument will
12359 // be in the first operand of the BUILD_PAIR node, and the most
12360 // significant bits will be in the second operand.
12361 unsigned LowAddressOp = DAG.getDataLayout().isBigEndian() ? 1 : 0;
12362 if (LoadSDNode *LNode =
12363 dyn_cast<LoadSDNode>(Res.getOperand(LowAddressOp).getNode()))
12364 if (FrameIndexSDNode *FI =
12365 dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
12366 FuncInfo->setArgumentFrameIndex(&Arg, FI->getIndex());
12367 }
12368
12369 // Analyses past this point are naive and don't expect an assertion.
12370 if (Res.getOpcode() == ISD::AssertZext)
12371 Res = Res.getOperand(0);
12372
12373 // Update the SwiftErrorVRegDefMap.
12374 if (Res.getOpcode() == ISD::CopyFromReg && isSwiftErrorArg) {
12375 Register Reg = cast<RegisterSDNode>(Res.getOperand(1))->getReg();
12376 if (Reg.isVirtual())
12377 SwiftError->setCurrentVReg(FuncInfo->MBB, SwiftError->getFunctionArg(),
12378 Reg);
12379 }
12380
12381 // If this argument is live outside of the entry block, insert a copy from
12382 // wherever we got it to the vreg that other BB's will reference it as.
12383 if (Res.getOpcode() == ISD::CopyFromReg) {
12384 // If we can, though, try to skip creating an unnecessary vreg.
12385 // FIXME: This isn't very clean... it would be nice to make this more
12386 // general.
12387 Register Reg = cast<RegisterSDNode>(Res.getOperand(1))->getReg();
12388 if (Reg.isVirtual()) {
12389 FuncInfo->ValueMap[&Arg] = Reg;
12390 continue;
12391 }
12392 }
12393 if (!isOnlyUsedInEntryBlock(&Arg, TM.Options.EnableFastISel)) {
12394 FuncInfo->InitializeRegForValue(&Arg);
12395 SDB->CopyToExportRegsIfNeeded(&Arg);
12396 }
12397 }
12398
12399 if (!Chains.empty()) {
12400 Chains.push_back(NewRoot);
12401 NewRoot = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chains);
12402 }
12403
12404 DAG.setRoot(NewRoot);
12405
12406 assert(i == InVals.size() && "Argument register count mismatch!");
12407
12408 // If any argument copy elisions occurred and we have debug info, update the
12409 // stale frame indices used in the dbg.declare variable info table.
12410 if (!ArgCopyElisionFrameIndexMap.empty()) {
12411 for (MachineFunction::VariableDbgInfo &VI :
12412 MF->getInStackSlotVariableDbgInfo()) {
12413 auto I = ArgCopyElisionFrameIndexMap.find(VI.getStackSlot());
12414 if (I != ArgCopyElisionFrameIndexMap.end())
12415 VI.updateStackSlot(I->second);
12416 }
12417 }
12418
12419 // Finally, if the target has anything special to do, allow it to do so.
12421}
12422
12423/// Handle PHI nodes in successor blocks. Emit code into the SelectionDAG to
12424/// ensure constants are generated when needed. Remember the virtual registers
12425/// that need to be added to the Machine PHI nodes as input. We cannot just
12426/// directly add them, because expansion might result in multiple MBB's for one
12427/// BB. As such, the start of the BB might correspond to a different MBB than
12428/// the end.
12429void
12430SelectionDAGBuilder::HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) {
12431 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
12432
12433 SmallPtrSet<MachineBasicBlock *, 4> SuccsHandled;
12434
12435 // Check PHI nodes in successors that expect a value to be available from this
12436 // block.
12437 for (const BasicBlock *SuccBB : successors(LLVMBB->getTerminator())) {
12438 if (!isa<PHINode>(SuccBB->begin())) continue;
12439 MachineBasicBlock *SuccMBB = FuncInfo.getMBB(SuccBB);
12440
12441 // If this terminator has multiple identical successors (common for
12442 // switches), only handle each succ once.
12443 if (!SuccsHandled.insert(SuccMBB).second)
12444 continue;
12445
12447
12448 // At this point we know that there is a 1-1 correspondence between LLVM PHI
12449 // nodes and Machine PHI nodes, but the incoming operands have not been
12450 // emitted yet.
12451 for (const PHINode &PN : SuccBB->phis()) {
12452 // Ignore dead phi's.
12453 if (PN.use_empty())
12454 continue;
12455
12456 // Skip empty types
12457 if (PN.getType()->isEmptyTy())
12458 continue;
12459
12460 Register Reg;
12461 const Value *PHIOp = PN.getIncomingValueForBlock(LLVMBB);
12462
12463 if (const auto *C = dyn_cast<Constant>(PHIOp)) {
12464 Register &RegOut = ConstantsOut[C];
12465 if (!RegOut) {
12466 RegOut = FuncInfo.CreateRegs(&PN);
12467 // We need to zero/sign extend ConstantInt phi operands to match
12468 // assumptions in FunctionLoweringInfo::ComputePHILiveOutRegInfo.
12469 ISD::NodeType ExtendType = ISD::ANY_EXTEND;
12470 if (auto *CI = dyn_cast<ConstantInt>(C))
12471 ExtendType = TLI.signExtendConstant(CI) ? ISD::SIGN_EXTEND
12473 CopyValueToVirtualRegister(C, RegOut, ExtendType);
12474 }
12475 Reg = RegOut;
12476 } else {
12477 auto I = FuncInfo.ValueMap.find(PHIOp);
12478 if (I != FuncInfo.ValueMap.end())
12479 Reg = I->second;
12480 else {
12481 assert(isa<AllocaInst>(PHIOp) &&
12482 FuncInfo.StaticAllocaMap.count(cast<AllocaInst>(PHIOp)) &&
12483 "Didn't codegen value into a register!??");
12484 Reg = FuncInfo.CreateRegs(&PN);
12486 }
12487 }
12488
12489 // Remember that this register needs to added to the machine PHI node as
12490 // the input for this MBB.
12491 SmallVector<EVT, 4> ValueVTs;
12492 ComputeValueVTs(TLI, DAG.getDataLayout(), PN.getType(), ValueVTs);
12493 for (EVT VT : ValueVTs) {
12494 const unsigned NumRegisters = TLI.getNumRegisters(*DAG.getContext(), VT);
12495 for (unsigned i = 0; i != NumRegisters; ++i)
12496 FuncInfo.PHINodesToUpdate.emplace_back(&*MBBI++, Reg + i);
12497 Reg += NumRegisters;
12498 }
12499 }
12500 }
12501
12502 ConstantsOut.clear();
12503}
12504
12505MachineBasicBlock *SelectionDAGBuilder::NextBlock(MachineBasicBlock *MBB) {
12507 if (++I == FuncInfo.MF->end())
12508 return nullptr;
12509 return &*I;
12510}
12511
12512/// During lowering new call nodes can be created (such as memset, etc.).
12513/// Those will become new roots of the current DAG, but complications arise
12514/// when they are tail calls. In such cases, the call lowering will update
12515/// the root, but the builder still needs to know that a tail call has been
12516/// lowered in order to avoid generating an additional return.
12517void SelectionDAGBuilder::updateDAGForMaybeTailCall(SDValue MaybeTC) {
12518 // If the node is null, we do have a tail call.
12519 if (MaybeTC.getNode() != nullptr)
12520 DAG.setRoot(MaybeTC);
12521 else
12522 HasTailCall = true;
12523}
12524
12525void SelectionDAGBuilder::lowerWorkItem(SwitchWorkListItem W, Value *Cond,
12526 MachineBasicBlock *SwitchMBB,
12527 MachineBasicBlock *DefaultMBB) {
12528 MachineFunction *CurMF = FuncInfo.MF;
12529 MachineBasicBlock *NextMBB = nullptr;
12531 if (++BBI != FuncInfo.MF->end())
12532 NextMBB = &*BBI;
12533
12534 unsigned Size = W.LastCluster - W.FirstCluster + 1;
12535
12536 BranchProbabilityInfo *BPI = FuncInfo.BPI;
12537
12538 if (Size == 2 && W.MBB == SwitchMBB) {
12539 // If any two of the cases has the same destination, and if one value
12540 // is the same as the other, but has one bit unset that the other has set,
12541 // use bit manipulation to do two compares at once. For example:
12542 // "if (X == 6 || X == 4)" -> "if ((X|2) == 6)"
12543 // TODO: This could be extended to merge any 2 cases in switches with 3
12544 // cases.
12545 // TODO: Handle cases where W.CaseBB != SwitchBB.
12546 CaseCluster &Small = *W.FirstCluster;
12547 CaseCluster &Big = *W.LastCluster;
12548
12549 if (Small.Low == Small.High && Big.Low == Big.High &&
12550 Small.MBB == Big.MBB) {
12551 const APInt &SmallValue = Small.Low->getValue();
12552 const APInt &BigValue = Big.Low->getValue();
12553
12554 // Check that there is only one bit different.
12555 APInt CommonBit = BigValue ^ SmallValue;
12556 if (CommonBit.isPowerOf2()) {
12557 SDValue CondLHS = getValue(Cond);
12558 EVT VT = CondLHS.getValueType();
12559 SDLoc DL = getCurSDLoc();
12560
12561 SDValue Or = DAG.getNode(ISD::OR, DL, VT, CondLHS,
12562 DAG.getConstant(CommonBit, DL, VT));
12563 SDValue Cond = DAG.getSetCC(
12564 DL, MVT::i1, Or, DAG.getConstant(BigValue | SmallValue, DL, VT),
12565 ISD::SETEQ);
12566
12567 // Update successor info.
12568 // Both Small and Big will jump to Small.BB, so we sum up the
12569 // probabilities.
12570 addSuccessorWithProb(SwitchMBB, Small.MBB, Small.Prob + Big.Prob);
12571 if (BPI)
12572 addSuccessorWithProb(
12573 SwitchMBB, DefaultMBB,
12574 // The default destination is the first successor in IR.
12575 BPI->getEdgeProbability(SwitchMBB->getBasicBlock(), (unsigned)0));
12576 else
12577 addSuccessorWithProb(SwitchMBB, DefaultMBB);
12578
12579 // Insert the true branch.
12580 SDValue BrCond =
12581 DAG.getNode(ISD::BRCOND, DL, MVT::Other, getControlRoot(), Cond,
12582 DAG.getBasicBlock(Small.MBB));
12583 // Insert the false branch.
12584 BrCond = DAG.getNode(ISD::BR, DL, MVT::Other, BrCond,
12585 DAG.getBasicBlock(DefaultMBB));
12586
12587 DAG.setRoot(BrCond);
12588 return;
12589 }
12590 }
12591 }
12592
12593 if (TM.getOptLevel() != CodeGenOptLevel::None) {
12594 // Here, we order cases by probability so the most likely case will be
12595 // checked first. However, two clusters can have the same probability in
12596 // which case their relative ordering is non-deterministic. So we use Low
12597 // as a tie-breaker as clusters are guaranteed to never overlap.
12598 llvm::sort(W.FirstCluster, W.LastCluster + 1,
12599 [](const CaseCluster &a, const CaseCluster &b) {
12600 return a.Prob != b.Prob ?
12601 a.Prob > b.Prob :
12602 a.Low->getValue().slt(b.Low->getValue());
12603 });
12604
12605 // Rearrange the case blocks so that the last one falls through if possible
12606 // without changing the order of probabilities.
12607 for (CaseClusterIt I = W.LastCluster; I > W.FirstCluster; ) {
12608 --I;
12609 if (I->Prob > W.LastCluster->Prob)
12610 break;
12611 if (I->Kind == CC_Range && I->MBB == NextMBB) {
12612 std::swap(*I, *W.LastCluster);
12613 break;
12614 }
12615 }
12616 }
12617
12618 // Compute total probability.
12619 BranchProbability DefaultProb = W.DefaultProb;
12620 BranchProbability UnhandledProbs = DefaultProb;
12621 for (CaseClusterIt I = W.FirstCluster; I <= W.LastCluster; ++I)
12622 UnhandledProbs += I->Prob;
12623
12624 MachineBasicBlock *CurMBB = W.MBB;
12625 for (CaseClusterIt I = W.FirstCluster, E = W.LastCluster; I <= E; ++I) {
12626 bool FallthroughUnreachable = false;
12627 MachineBasicBlock *Fallthrough;
12628 if (I == W.LastCluster) {
12629 // For the last cluster, fall through to the default destination.
12630 Fallthrough = DefaultMBB;
12631 FallthroughUnreachable = isa<UnreachableInst>(
12632 DefaultMBB->getBasicBlock()->getFirstNonPHIOrDbg());
12633 } else {
12634 Fallthrough = CurMF->CreateMachineBasicBlock(CurMBB->getBasicBlock());
12635 CurMF->insert(BBI, Fallthrough);
12636 // Put Cond in a virtual register to make it available from the new blocks.
12638 }
12639 UnhandledProbs -= I->Prob;
12640
12641 switch (I->Kind) {
12642 case CC_JumpTable: {
12643 // FIXME: Optimize away range check based on pivot comparisons.
12644 JumpTableHeader *JTH = &SL->JTCases[I->JTCasesIndex].first;
12645 SwitchCG::JumpTable *JT = &SL->JTCases[I->JTCasesIndex].second;
12646
12647 // The jump block hasn't been inserted yet; insert it here.
12648 MachineBasicBlock *JumpMBB = JT->MBB;
12649 CurMF->insert(BBI, JumpMBB);
12650
12651 auto JumpProb = I->Prob;
12652 auto FallthroughProb = UnhandledProbs;
12653
12654 // If the default statement is a target of the jump table, we evenly
12655 // distribute the default probability to successors of CurMBB. Also
12656 // update the probability on the edge from JumpMBB to Fallthrough.
12657 for (MachineBasicBlock::succ_iterator SI = JumpMBB->succ_begin(),
12658 SE = JumpMBB->succ_end();
12659 SI != SE; ++SI) {
12660 if (*SI == DefaultMBB) {
12661 JumpProb += DefaultProb / 2;
12662 FallthroughProb -= DefaultProb / 2;
12663 JumpMBB->setSuccProbability(SI, DefaultProb / 2);
12664 JumpMBB->normalizeSuccProbs();
12665 break;
12666 }
12667 }
12668
12669 // If the default clause is unreachable, propagate that knowledge into
12670 // JTH->FallthroughUnreachable which will use it to suppress the range
12671 // check.
12672 //
12673 // However, don't do this if we're doing branch target enforcement,
12674 // because a table branch _without_ a range check can be a tempting JOP
12675 // gadget - out-of-bounds inputs that are impossible in correct
12676 // execution become possible again if an attacker can influence the
12677 // control flow. So if an attacker doesn't already have a BTI bypass
12678 // available, we don't want them to be able to get one out of this
12679 // table branch.
12680 if (FallthroughUnreachable) {
12681 Function &CurFunc = CurMF->getFunction();
12682 if (!CurFunc.hasFnAttribute("branch-target-enforcement"))
12683 JTH->FallthroughUnreachable = true;
12684 }
12685
12686 if (!JTH->FallthroughUnreachable)
12687 addSuccessorWithProb(CurMBB, Fallthrough, FallthroughProb);
12688 addSuccessorWithProb(CurMBB, JumpMBB, JumpProb);
12689 CurMBB->normalizeSuccProbs();
12690
12691 // The jump table header will be inserted in our current block, do the
12692 // range check, and fall through to our fallthrough block.
12693 JTH->HeaderBB = CurMBB;
12694 JT->Default = Fallthrough; // FIXME: Move Default to JumpTableHeader.
12695
12696 // If we're in the right place, emit the jump table header right now.
12697 if (CurMBB == SwitchMBB) {
12698 visitJumpTableHeader(*JT, *JTH, SwitchMBB);
12699 JTH->Emitted = true;
12700 }
12701 break;
12702 }
12703 case CC_BitTests: {
12704 // FIXME: Optimize away range check based on pivot comparisons.
12705 BitTestBlock *BTB = &SL->BitTestCases[I->BTCasesIndex];
12706
12707 // The bit test blocks haven't been inserted yet; insert them here.
12708 for (BitTestCase &BTC : BTB->Cases)
12709 CurMF->insert(BBI, BTC.ThisBB);
12710
12711 // Fill in fields of the BitTestBlock.
12712 BTB->Parent = CurMBB;
12713 BTB->Default = Fallthrough;
12714
12715 BTB->DefaultProb = UnhandledProbs;
12716 // If the cases in bit test don't form a contiguous range, we evenly
12717 // distribute the probability on the edge to Fallthrough to two
12718 // successors of CurMBB.
12719 if (!BTB->ContiguousRange) {
12720 BTB->Prob += DefaultProb / 2;
12721 BTB->DefaultProb -= DefaultProb / 2;
12722 }
12723
12724 if (FallthroughUnreachable)
12725 BTB->FallthroughUnreachable = true;
12726
12727 // If we're in the right place, emit the bit test header right now.
12728 if (CurMBB == SwitchMBB) {
12729 visitBitTestHeader(*BTB, SwitchMBB);
12730 BTB->Emitted = true;
12731 }
12732 break;
12733 }
12734 case CC_Range: {
12735 const Value *RHS, *LHS, *MHS;
12736 ISD::CondCode CC;
12737 if (I->Low == I->High) {
12738 // Check Cond == I->Low.
12739 CC = ISD::SETEQ;
12740 LHS = Cond;
12741 RHS=I->Low;
12742 MHS = nullptr;
12743 } else {
12744 // Check I->Low <= Cond <= I->High.
12745 CC = ISD::SETLE;
12746 LHS = I->Low;
12747 MHS = Cond;
12748 RHS = I->High;
12749 }
12750
12751 // If Fallthrough is unreachable, fold away the comparison.
12752 if (FallthroughUnreachable)
12753 CC = ISD::SETTRUE;
12754
12755 // The false probability is the sum of all unhandled cases.
12756 CaseBlock CB(CC, LHS, RHS, MHS, I->MBB, Fallthrough, CurMBB,
12757 getCurSDLoc(), I->Prob, UnhandledProbs);
12758
12759 if (CurMBB == SwitchMBB)
12760 visitSwitchCase(CB, SwitchMBB);
12761 else
12762 SL->SwitchCases.push_back(CB);
12763
12764 break;
12765 }
12766 }
12767 CurMBB = Fallthrough;
12768 }
12769}
12770
12771void SelectionDAGBuilder::splitWorkItem(SwitchWorkList &WorkList,
12772 const SwitchWorkListItem &W,
12773 Value *Cond,
12774 MachineBasicBlock *SwitchMBB) {
12775 assert(W.FirstCluster->Low->getValue().slt(W.LastCluster->Low->getValue()) &&
12776 "Clusters not sorted?");
12777 assert(W.LastCluster - W.FirstCluster + 1 >= 2 && "Too small to split!");
12778
12779 auto [LastLeft, FirstRight, LeftProb, RightProb] =
12780 SL->computeSplitWorkItemInfo(W);
12781
12782 // Use the first element on the right as pivot since we will make less-than
12783 // comparisons against it.
12784 CaseClusterIt PivotCluster = FirstRight;
12785 assert(PivotCluster > W.FirstCluster);
12786 assert(PivotCluster <= W.LastCluster);
12787
12788 CaseClusterIt FirstLeft = W.FirstCluster;
12789 CaseClusterIt LastRight = W.LastCluster;
12790
12791 const ConstantInt *Pivot = PivotCluster->Low;
12792
12793 // New blocks will be inserted immediately after the current one.
12795 ++BBI;
12796
12797 // We will branch to the LHS if Value < Pivot. If LHS is a single cluster,
12798 // we can branch to its destination directly if it's squeezed exactly in
12799 // between the known lower bound and Pivot - 1.
12800 MachineBasicBlock *LeftMBB;
12801 if (FirstLeft == LastLeft && FirstLeft->Kind == CC_Range &&
12802 FirstLeft->Low == W.GE &&
12803 (FirstLeft->High->getValue() + 1LL) == Pivot->getValue()) {
12804 LeftMBB = FirstLeft->MBB;
12805 } else {
12806 LeftMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
12807 FuncInfo.MF->insert(BBI, LeftMBB);
12808 WorkList.push_back(
12809 {LeftMBB, FirstLeft, LastLeft, W.GE, Pivot, W.DefaultProb / 2});
12810 // Put Cond in a virtual register to make it available from the new blocks.
12812 }
12813
12814 // Similarly, we will branch to the RHS if Value >= Pivot. If RHS is a
12815 // single cluster, RHS.Low == Pivot, and we can branch to its destination
12816 // directly if RHS.High equals the current upper bound.
12817 MachineBasicBlock *RightMBB;
12818 if (FirstRight == LastRight && FirstRight->Kind == CC_Range &&
12819 W.LT && (FirstRight->High->getValue() + 1ULL) == W.LT->getValue()) {
12820 RightMBB = FirstRight->MBB;
12821 } else {
12822 RightMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
12823 FuncInfo.MF->insert(BBI, RightMBB);
12824 WorkList.push_back(
12825 {RightMBB, FirstRight, LastRight, Pivot, W.LT, W.DefaultProb / 2});
12826 // Put Cond in a virtual register to make it available from the new blocks.
12828 }
12829
12830 // Create the CaseBlock record that will be used to lower the branch.
12831 CaseBlock CB(ISD::SETLT, Cond, Pivot, nullptr, LeftMBB, RightMBB, W.MBB,
12832 getCurSDLoc(), LeftProb, RightProb);
12833
12834 if (W.MBB == SwitchMBB)
12835 visitSwitchCase(CB, SwitchMBB);
12836 else
12837 SL->SwitchCases.push_back(CB);
12838}
12839
12840// Scale CaseProb after peeling a case with the probablity of PeeledCaseProb
12841// from the swith statement.
12843 BranchProbability PeeledCaseProb) {
12844 if (PeeledCaseProb == BranchProbability::getOne())
12846 BranchProbability SwitchProb = PeeledCaseProb.getCompl();
12847
12848 uint32_t Numerator = CaseProb.getNumerator();
12849 uint32_t Denominator = SwitchProb.scale(CaseProb.getDenominator());
12850 return BranchProbability(Numerator, std::max(Numerator, Denominator));
12851}
12852
12853// Try to peel the top probability case if it exceeds the threshold.
12854// Return current MachineBasicBlock for the switch statement if the peeling
12855// does not occur.
12856// If the peeling is performed, return the newly created MachineBasicBlock
12857// for the peeled switch statement. Also update Clusters to remove the peeled
12858// case. PeeledCaseProb is the BranchProbability for the peeled case.
12859MachineBasicBlock *SelectionDAGBuilder::peelDominantCaseCluster(
12860 const SwitchInst &SI, CaseClusterVector &Clusters,
12861 BranchProbability &PeeledCaseProb) {
12862 MachineBasicBlock *SwitchMBB = FuncInfo.MBB;
12863 // Don't perform if there is only one cluster or optimizing for size.
12864 if (SwitchPeelThreshold > 100 || !FuncInfo.BPI || Clusters.size() < 2 ||
12865 TM.getOptLevel() == CodeGenOptLevel::None ||
12866 SwitchMBB->getParent()->getFunction().hasMinSize())
12867 return SwitchMBB;
12868
12869 BranchProbability TopCaseProb = BranchProbability(SwitchPeelThreshold, 100);
12870 unsigned PeeledCaseIndex = 0;
12871 bool SwitchPeeled = false;
12872 for (unsigned Index = 0; Index < Clusters.size(); ++Index) {
12873 CaseCluster &CC = Clusters[Index];
12874 if (CC.Prob < TopCaseProb)
12875 continue;
12876 TopCaseProb = CC.Prob;
12877 PeeledCaseIndex = Index;
12878 SwitchPeeled = true;
12879 }
12880 if (!SwitchPeeled)
12881 return SwitchMBB;
12882
12883 LLVM_DEBUG(dbgs() << "Peeled one top case in switch stmt, prob: "
12884 << TopCaseProb << "\n");
12885
12886 // Record the MBB for the peeled switch statement.
12887 MachineFunction::iterator BBI(SwitchMBB);
12888 ++BBI;
12889 MachineBasicBlock *PeeledSwitchMBB =
12890 FuncInfo.MF->CreateMachineBasicBlock(SwitchMBB->getBasicBlock());
12891 FuncInfo.MF->insert(BBI, PeeledSwitchMBB);
12892
12893 ExportFromCurrentBlock(SI.getCondition());
12894 auto PeeledCaseIt = Clusters.begin() + PeeledCaseIndex;
12895 SwitchWorkListItem W = {SwitchMBB, PeeledCaseIt, PeeledCaseIt,
12896 nullptr, nullptr, TopCaseProb.getCompl()};
12897 lowerWorkItem(W, SI.getCondition(), SwitchMBB, PeeledSwitchMBB);
12898
12899 Clusters.erase(PeeledCaseIt);
12900 for (CaseCluster &CC : Clusters) {
12901 LLVM_DEBUG(
12902 dbgs() << "Scale the probablity for one cluster, before scaling: "
12903 << CC.Prob << "\n");
12904 CC.Prob = scaleCaseProbality(CC.Prob, TopCaseProb);
12905 LLVM_DEBUG(dbgs() << "After scaling: " << CC.Prob << "\n");
12906 }
12907 PeeledCaseProb = TopCaseProb;
12908 return PeeledSwitchMBB;
12909}
12910
12911void SelectionDAGBuilder::visitSwitch(const SwitchInst &SI) {
12912 // Extract cases from the switch.
12913 BranchProbabilityInfo *BPI = FuncInfo.BPI;
12914 CaseClusterVector Clusters;
12915 Clusters.reserve(SI.getNumCases());
12916 for (auto I : SI.cases()) {
12917 MachineBasicBlock *Succ = FuncInfo.getMBB(I.getCaseSuccessor());
12918 const ConstantInt *CaseVal = I.getCaseValue();
12919 BranchProbability Prob =
12920 BPI ? BPI->getEdgeProbability(SI.getParent(), I.getSuccessorIndex())
12921 : BranchProbability(1, SI.getNumCases() + 1);
12922 Clusters.push_back(CaseCluster::range(CaseVal, CaseVal, Succ, Prob));
12923 }
12924
12925 MachineBasicBlock *DefaultMBB = FuncInfo.getMBB(SI.getDefaultDest());
12926
12927 // Cluster adjacent cases with the same destination. We do this at all
12928 // optimization levels because it's cheap to do and will make codegen faster
12929 // if there are many clusters.
12930 sortAndRangeify(Clusters);
12931
12932 // The branch probablity of the peeled case.
12933 BranchProbability PeeledCaseProb = BranchProbability::getZero();
12934 MachineBasicBlock *PeeledSwitchMBB =
12935 peelDominantCaseCluster(SI, Clusters, PeeledCaseProb);
12936
12937 // If there is only the default destination, jump there directly.
12938 MachineBasicBlock *SwitchMBB = FuncInfo.MBB;
12939 if (Clusters.empty()) {
12940 assert(PeeledSwitchMBB == SwitchMBB);
12941 SwitchMBB->addSuccessor(DefaultMBB);
12942 if (DefaultMBB != NextBlock(SwitchMBB)) {
12943 DAG.setRoot(DAG.getNode(ISD::BR, getCurSDLoc(), MVT::Other,
12944 getControlRoot(), DAG.getBasicBlock(DefaultMBB)));
12945 }
12946 return;
12947 }
12948
12949 SL->findJumpTables(Clusters, &SI, getCurSDLoc(), DefaultMBB, DAG.getPSI(),
12950 DAG.getBFI());
12951 SL->findBitTestClusters(Clusters, &SI);
12952
12953 LLVM_DEBUG({
12954 dbgs() << "Case clusters: ";
12955 for (const CaseCluster &C : Clusters) {
12956 if (C.Kind == CC_JumpTable)
12957 dbgs() << "JT:";
12958 if (C.Kind == CC_BitTests)
12959 dbgs() << "BT:";
12960
12961 C.Low->getValue().print(dbgs(), true);
12962 if (C.Low != C.High) {
12963 dbgs() << '-';
12964 C.High->getValue().print(dbgs(), true);
12965 }
12966 dbgs() << ' ';
12967 }
12968 dbgs() << '\n';
12969 });
12970
12971 assert(!Clusters.empty());
12972 SwitchWorkList WorkList;
12973 CaseClusterIt First = Clusters.begin();
12974 CaseClusterIt Last = Clusters.end() - 1;
12975 auto DefaultProb = getEdgeProbability(PeeledSwitchMBB, DefaultMBB);
12976 // Scale the branchprobability for DefaultMBB if the peel occurs and
12977 // DefaultMBB is not replaced.
12978 if (PeeledCaseProb != BranchProbability::getZero() &&
12979 DefaultMBB == FuncInfo.getMBB(SI.getDefaultDest()))
12980 DefaultProb = scaleCaseProbality(DefaultProb, PeeledCaseProb);
12981 WorkList.push_back(
12982 {PeeledSwitchMBB, First, Last, nullptr, nullptr, DefaultProb});
12983
12984 while (!WorkList.empty()) {
12985 SwitchWorkListItem W = WorkList.pop_back_val();
12986 unsigned NumClusters = W.LastCluster - W.FirstCluster + 1;
12987
12988 if (NumClusters > 3 && TM.getOptLevel() != CodeGenOptLevel::None &&
12989 !DefaultMBB->getParent()->getFunction().hasMinSize()) {
12990 // For optimized builds, lower large range as a balanced binary tree.
12991 splitWorkItem(WorkList, W, SI.getCondition(), SwitchMBB);
12992 continue;
12993 }
12994
12995 lowerWorkItem(W, SI.getCondition(), SwitchMBB, DefaultMBB);
12996 }
12997}
12998
12999void SelectionDAGBuilder::visitStepVector(const CallInst &I) {
13000 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
13001 auto DL = getCurSDLoc();
13002 EVT ResultVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
13003 setValue(&I, DAG.getStepVector(DL, ResultVT));
13004}
13005
13006void SelectionDAGBuilder::visitVectorReverse(const CallInst &I) {
13007 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
13008 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
13009
13010 SDLoc DL = getCurSDLoc();
13011 SDValue V = getValue(I.getOperand(0));
13012 assert(VT == V.getValueType() && "Malformed vector.reverse!");
13013
13014 if (VT.isScalableVector()) {
13015 setValue(&I, DAG.getNode(ISD::VECTOR_REVERSE, DL, VT, V));
13016 return;
13017 }
13018
13019 // Use VECTOR_SHUFFLE for the fixed-length vector
13020 // to maintain existing behavior.
13021 SmallVector<int, 8> Mask;
13022 unsigned NumElts = VT.getVectorMinNumElements();
13023 for (unsigned i = 0; i != NumElts; ++i)
13024 Mask.push_back(NumElts - 1 - i);
13025
13026 setValue(&I, DAG.getVectorShuffle(VT, DL, V, DAG.getUNDEF(VT), Mask));
13027}
13028
13029void SelectionDAGBuilder::visitVectorDeinterleave(const CallInst &I,
13030 unsigned Factor) {
13031 auto DL = getCurSDLoc();
13032 SDValue InVec = getValue(I.getOperand(0));
13033
13034 SmallVector<EVT, 4> ValueVTs;
13035 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
13036 ValueVTs);
13037
13038 EVT OutVT = ValueVTs[0];
13039 unsigned OutNumElts = OutVT.getVectorMinNumElements();
13040
13041 SmallVector<SDValue, 4> SubVecs(Factor);
13042 for (unsigned i = 0; i != Factor; ++i) {
13043 assert(ValueVTs[i] == OutVT && "Expected VTs to be the same");
13044 SubVecs[i] = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, OutVT, InVec,
13045 DAG.getVectorIdxConstant(OutNumElts * i, DL));
13046 }
13047
13048 // Use VECTOR_SHUFFLE for fixed-length vectors with factor of 2 to benefit
13049 // from existing legalisation and combines.
13050 if (OutVT.isFixedLengthVector() && Factor == 2) {
13051 SDValue Even = DAG.getVectorShuffle(OutVT, DL, SubVecs[0], SubVecs[1],
13052 createStrideMask(0, 2, OutNumElts));
13053 SDValue Odd = DAG.getVectorShuffle(OutVT, DL, SubVecs[0], SubVecs[1],
13054 createStrideMask(1, 2, OutNumElts));
13055 SDValue Res = DAG.getMergeValues({Even, Odd}, getCurSDLoc());
13056 setValue(&I, Res);
13057 return;
13058 }
13059
13060 SDValue Res = DAG.getNode(ISD::VECTOR_DEINTERLEAVE, DL,
13061 DAG.getVTList(ValueVTs), SubVecs);
13062 setValue(&I, Res);
13063}
13064
13065void SelectionDAGBuilder::visitVectorInterleave(const CallInst &I,
13066 unsigned Factor) {
13067 auto DL = getCurSDLoc();
13068 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
13069 EVT InVT = getValue(I.getOperand(0)).getValueType();
13070 EVT OutVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
13071
13072 SmallVector<SDValue, 8> InVecs(Factor);
13073 for (unsigned i = 0; i < Factor; ++i) {
13074 InVecs[i] = getValue(I.getOperand(i));
13075 assert(InVecs[i].getValueType() == InVecs[0].getValueType() &&
13076 "Expected VTs to be the same");
13077 }
13078
13079 // Use VECTOR_SHUFFLE for fixed-length vectors with factor of 2 to benefit
13080 // from existing legalisation and combines.
13081 if (OutVT.isFixedLengthVector() && Factor == 2) {
13082 unsigned NumElts = InVT.getVectorMinNumElements();
13083 SDValue V = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, InVecs);
13084 setValue(&I, DAG.getVectorShuffle(OutVT, DL, V, DAG.getUNDEF(OutVT),
13085 createInterleaveMask(NumElts, 2)));
13086 return;
13087 }
13088
13089 SmallVector<EVT, 8> ValueVTs(Factor, InVT);
13090 SDValue Res =
13091 DAG.getNode(ISD::VECTOR_INTERLEAVE, DL, DAG.getVTList(ValueVTs), InVecs);
13092
13094 for (unsigned i = 0; i < Factor; ++i)
13095 Results[i] = Res.getValue(i);
13096
13097 Res = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, Results);
13098 setValue(&I, Res);
13099}
13100
13101void SelectionDAGBuilder::visitFreeze(const FreezeInst &I) {
13102 SmallVector<EVT, 4> ValueVTs;
13103 ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(),
13104 ValueVTs);
13105 unsigned NumValues = ValueVTs.size();
13106 if (NumValues == 0) return;
13107
13109 SDValue Op = getValue(I.getOperand(0));
13110
13111 for (unsigned i = 0; i != NumValues; ++i)
13112 Values[i] = DAG.getNode(ISD::FREEZE, getCurSDLoc(), ValueVTs[i],
13113 SDValue(Op.getNode(), Op.getResNo() + i));
13114
13116 DAG.getVTList(ValueVTs), Values));
13117}
13118
13119void SelectionDAGBuilder::visitVectorSplice(const CallInst &I) {
13120 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
13121 EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());
13122
13123 SDLoc DL = getCurSDLoc();
13124 SDValue V1 = getValue(I.getOperand(0));
13125 SDValue V2 = getValue(I.getOperand(1));
13126 const bool IsLeft = I.getIntrinsicID() == Intrinsic::vector_splice_left;
13127
13128 // VECTOR_SHUFFLE doesn't support a scalable or non-constant mask.
13129 if (VT.isScalableVector() || !isa<ConstantInt>(I.getOperand(2))) {
13130 SDValue Offset = DAG.getZExtOrTrunc(
13131 getValue(I.getOperand(2)), DL, TLI.getVectorIdxTy(DAG.getDataLayout()));
13132 setValue(&I, DAG.getNode(IsLeft ? ISD::VECTOR_SPLICE_LEFT
13134 DL, VT, V1, V2, Offset));
13135 return;
13136 }
13137 uint64_t Imm = cast<ConstantInt>(I.getOperand(2))->getZExtValue();
13138
13139 unsigned NumElts = VT.getVectorNumElements();
13140
13141 uint64_t Idx = IsLeft ? Imm : NumElts - Imm;
13142
13143 // Use VECTOR_SHUFFLE to maintain original behaviour for fixed-length vectors.
13144 SmallVector<int, 8> Mask;
13145 for (unsigned i = 0; i < NumElts; ++i)
13146 Mask.push_back(Idx + i);
13147 setValue(&I, DAG.getVectorShuffle(VT, DL, V1, V2, Mask));
13148}
13149
13150// Consider the following MIR after SelectionDAG, which produces output in
13151// phyregs in the first case or virtregs in the second case.
13152//
13153// INLINEASM_BR ..., implicit-def $ebx, ..., implicit-def $edx
13154// %5:gr32 = COPY $ebx
13155// %6:gr32 = COPY $edx
13156// %1:gr32 = COPY %6:gr32
13157// %0:gr32 = COPY %5:gr32
13158//
13159// INLINEASM_BR ..., def %5:gr32, ..., def %6:gr32
13160// %1:gr32 = COPY %6:gr32
13161// %0:gr32 = COPY %5:gr32
13162//
13163// Given %0, we'd like to return $ebx in the first case and %5 in the second.
13164// Given %1, we'd like to return $edx in the first case and %6 in the second.
13165//
13166// If a callbr has outputs, it will have a single mapping in FuncInfo.ValueMap
13167// to a single virtreg (such as %0). The remaining outputs monotonically
13168// increase in virtreg number from there. If a callbr has no outputs, then it
13169// should not have a corresponding callbr landingpad; in fact, the callbr
13170// landingpad would not even be able to refer to such a callbr.
13173 // There is definitely at least one copy.
13174 assert(MI->getOpcode() == TargetOpcode::COPY &&
13175 "start of copy chain MUST be COPY");
13176 Reg = MI->getOperand(1).getReg();
13177
13178 // If the copied register in the first copy must be virtual.
13179 assert(Reg.isVirtual() && "expected COPY of virtual register");
13180 MI = MRI.def_begin(Reg)->getParent();
13181
13182 // There may be an optional second copy.
13183 if (MI->getOpcode() == TargetOpcode::COPY) {
13184 assert(Reg.isVirtual() && "expected COPY of virtual register");
13185 Reg = MI->getOperand(1).getReg();
13186 assert(Reg.isPhysical() && "expected COPY of physical register");
13187 } else {
13188 // The start of the chain must be an INLINEASM_BR.
13189 assert(MI->getOpcode() == TargetOpcode::INLINEASM_BR &&
13190 "end of copy chain MUST be INLINEASM_BR");
13191 }
13192
13193 return Reg;
13194}
13195
13196// We must do this walk rather than the simpler
13197// setValue(&I, getCopyFromRegs(CBR, CBR->getType()));
13198// otherwise we will end up with copies of virtregs only valid along direct
13199// edges.
13200void SelectionDAGBuilder::visitCallBrLandingPad(const CallInst &I) {
13201 SmallVector<EVT, 8> ResultVTs;
13202 SmallVector<SDValue, 8> ResultValues;
13203 const auto *CBR =
13204 cast<CallBrInst>(I.getParent()->getUniquePredecessor()->getTerminator());
13205
13206 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
13207 const TargetRegisterInfo *TRI = DAG.getSubtarget().getRegisterInfo();
13208 MachineRegisterInfo &MRI = DAG.getMachineFunction().getRegInfo();
13209
13210 Register InitialDef = FuncInfo.ValueMap[CBR];
13211 SDValue Chain = DAG.getRoot();
13212
13213 // Re-parse the asm constraints string.
13214 TargetLowering::AsmOperandInfoVector TargetConstraints =
13215 TLI.ParseConstraints(DAG.getDataLayout(), TRI, *CBR);
13216 for (auto &T : TargetConstraints) {
13217 SDISelAsmOperandInfo OpInfo(T);
13218 if (OpInfo.Type != InlineAsm::isOutput)
13219 continue;
13220
13221 // Pencil in OpInfo.ConstraintType and OpInfo.ConstraintVT based on the
13222 // individual constraint.
13223 TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
13224
13225 switch (OpInfo.ConstraintType) {
13228 // Fill in OpInfo.AssignedRegs.Regs.
13229 getRegistersForValue(DAG, getCurSDLoc(), OpInfo, OpInfo);
13230
13231 // getRegistersForValue may produce 1 to many registers based on whether
13232 // the OpInfo.ConstraintVT is legal on the target or not.
13233 for (Register &Reg : OpInfo.AssignedRegs.Regs) {
13234 Register OriginalDef = FollowCopyChain(MRI, InitialDef++);
13235 if (OriginalDef.isPhysical())
13236 FuncInfo.MBB->addLiveIn(OriginalDef);
13237 // Update the assigned registers to use the original defs.
13238 Reg = OriginalDef;
13239 }
13240
13241 SDValue V = OpInfo.AssignedRegs.getCopyFromRegs(
13242 DAG, FuncInfo, getCurSDLoc(), Chain, nullptr, CBR);
13243 ResultValues.push_back(V);
13244 ResultVTs.push_back(OpInfo.ConstraintVT);
13245 break;
13246 }
13248 SDValue Flag;
13249 SDValue V = TLI.LowerAsmOutputForConstraint(Chain, Flag, getCurSDLoc(),
13250 OpInfo, DAG);
13251 ++InitialDef;
13252 ResultValues.push_back(V);
13253 ResultVTs.push_back(OpInfo.ConstraintVT);
13254 break;
13255 }
13256 default:
13257 break;
13258 }
13259 }
13261 DAG.getVTList(ResultVTs), ResultValues);
13262 setValue(&I, V);
13263}
return SDValue()
static unsigned getIntrinsicID(const SDNode *N)
unsigned RegSize
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static msgpack::DocNode getNode(msgpack::DocNode DN, msgpack::Type Type, MCValue Val)
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
Function Alias Analysis Results
Atomic ordering constants.
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
#define X(NUM, ENUM, NAME)
Definition ELF.h:856
This file implements the BitVector class.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
dxil translate DXIL Translate Metadata
static AttributeList getReturnAttrs(FastISel::CallLoweringInfo &CLI)
Returns an AttributeList representing the attributes applied to the return value of the given call.
Definition FastISel.cpp:942
#define Check(C,...)
static Value * getCondition(Instruction *I)
Hexagon Common GEP
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Module.h This file contains the declarations for the Module class.
static void getRegistersForValue(MachineFunction &MF, MachineIRBuilder &MIRBuilder, GISelAsmOperandInfo &OpInfo, GISelAsmOperandInfo &RefOpInfo)
Assign virtual/physical registers for the specified register operand.
static void computeConstraintToUse(const TargetLowering *TLI, TargetLowering::AsmOperandInfo &OpInfo)
This file defines an InstructionCost class that is used when calculating the cost of an instruction,...
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define RegName(no)
lazy value info
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Machine Check Debug Module
static bool isUndef(const MachineInstr &MI)
Register Reg
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
static const Function * getCalledFunction(const Value *V)
This file provides utility analysis objects describing memory locations.
This file provides utility for Memory Model Relaxation Annotations (MMRAs).
This file contains the declarations for metadata subclasses.
Type::TypeID TypeID
#define T
#define T1
static MCRegister getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
static unsigned getAddressSpace(const Value *V, unsigned MaxLookup)
MachineInstr unsigned OpIdx
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t High
uint64_t IntrinsicInst * II
OptimizedStructLayoutField Field
#define P(N)
if(PassOpts->AAPipeline)
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
static Type * getValueType(Value *V, bool LookThroughCmp=false)
Returns the "element type" of the given value/instruction V.
This file contains some templates that are useful if you are working with the STL at all.
static bool hasOnlySelectUsers(const Value *Cond)
static SDValue getLoadStackGuard(SelectionDAG &DAG, const SDLoc &DL, SDValue &Chain)
Create a LOAD_STACK_GUARD node, and let it carry the target specific global variable if there exists ...
static bool getUniformBase(const Value *Ptr, SDValue &Base, SDValue &Index, SDValue &Scale, SelectionDAGBuilder *SDB, const BasicBlock *CurBB, uint64_t ElemSize)
static void failForInvalidBundles(const CallBase &I, StringRef Name, ArrayRef< uint32_t > AllowedBundles)
static void addStackMapLiveVars(const CallBase &Call, unsigned StartIdx, const SDLoc &DL, SmallVectorImpl< SDValue > &Ops, SelectionDAGBuilder &Builder)
Add a stack map intrinsic call's live variable operands to a stackmap or patchpoint target node's ope...
static const unsigned MaxParallelChains
static SDValue expandPow(const SDLoc &dl, SDValue LHS, SDValue RHS, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
visitPow - Lower a pow intrinsic.
static const CallBase * FindPreallocatedCall(const Value *PreallocatedSetup)
Given a @llvm.call.preallocated.setup, return the corresponding preallocated call.
static cl::opt< unsigned > SwitchPeelThreshold("switch-peel-threshold", cl::Hidden, cl::init(66), cl::desc("Set the case probability threshold for peeling the case from a " "switch statement. A value greater than 100 will void this " "optimization"))
static cl::opt< bool > InsertAssertAlign("insert-assert-align", cl::init(true), cl::desc("Insert the experimental `assertalign` node."), cl::ReallyHidden)
static unsigned getISDForVPIntrinsic(const VPIntrinsic &VPIntrin)
static bool handleDanglingVariadicDebugInfo(SelectionDAG &DAG, DILocalVariable *Variable, DebugLoc DL, unsigned Order, SmallVectorImpl< Value * > &Values, DIExpression *Expression)
static bool prepareDAGLevelOperands(ConstraintDecisionInfo &Info, const CallBase &Call, SelectionDAGBuilder &Builder, const TargetLowering &TLI, SelectionDAG &DAG)
Prepare DAG-level operands.
static unsigned findMatchingInlineAsmOperand(unsigned OperandNo, const std::vector< SDValue > &AsmNodeOperands)
static void patchMatchingInput(const SDISelAsmOperandInfo &OpInfo, SDISelAsmOperandInfo &MatchingOpInfo, SelectionDAG &DAG)
Make sure that the output operand OpInfo and its corresponding input operand MatchingOpInfo have comp...
static void findUnwindDestinations(FunctionLoweringInfo &FuncInfo, const BasicBlock *EHPadBB, BranchProbability Prob, SmallVectorImpl< std::pair< MachineBasicBlock *, BranchProbability > > &UnwindDests)
When an invoke or a cleanupret unwinds to the next EH pad, there are many places it could ultimately ...
static unsigned FixedPointIntrinsicToOpcode(unsigned Intrinsic)
static BranchProbability scaleCaseProbality(BranchProbability CaseProb, BranchProbability PeeledCaseProb)
static SDValue expandExp2(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandExp2 - Lower an exp2 intrinsic.
static SDValue expandDivFix(unsigned Opcode, const SDLoc &DL, SDValue LHS, SDValue RHS, SDValue Scale, SelectionDAG &DAG, const TargetLowering &TLI)
static SDValue getF32Constant(SelectionDAG &DAG, unsigned Flt, const SDLoc &dl)
getF32Constant - Get 32-bit floating point constant.
static SDValue widenVectorToPartType(SelectionDAG &DAG, SDValue Val, const SDLoc &DL, EVT PartVT)
static SDValue expandLog10(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandLog10 - Lower a log10 intrinsic.
DenseMap< const Argument *, std::pair< const AllocaInst *, const StoreInst * > > ArgCopyElisionMapTy
static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &dl, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, const Value *V, std::optional< CallingConv::ID > CallConv)
getCopyToPartsVector - Create a series of nodes that contain the specified value split into legal par...
static void getUnderlyingArgRegs(SmallVectorImpl< std::pair< Register, TypeSize > > &Regs, const SDValue &N)
static void getCopyToParts(SelectionDAG &DAG, const SDLoc &DL, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, const Value *V, std::optional< CallingConv::ID > CallConv=std::nullopt, ISD::NodeType ExtendKind=ISD::ANY_EXTEND)
getCopyToParts - Create a series of nodes that contain the specified value split into legal parts.
static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT, SelectionDAGBuilder &Builder)
static SDValue expandLog2(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandLog2 - Lower a log2 intrinsic.
static SDValue getAddressForMemoryInput(SDValue Chain, const SDLoc &Location, SDISelAsmOperandInfo &OpInfo, SelectionDAG &DAG)
Get a direct memory input to behave well as an indirect operand.
static bool isOnlyUsedInEntryBlock(const Argument *A, bool FastISel)
isOnlyUsedInEntryBlock - If the specified argument is only used in the entry block,...
static void diagnosePossiblyInvalidConstraint(LLVMContext &Ctx, const Value *V, const Twine &ErrMsg)
static bool collectInstructionDeps(SmallMapVector< const Instruction *, bool, 8 > *Deps, const Value *V, SmallMapVector< const Instruction *, bool, 8 > *Necessary=nullptr, unsigned Depth=0)
static void findArgumentCopyElisionCandidates(const DataLayout &DL, FunctionLoweringInfo *FuncInfo, ArgCopyElisionMapTy &ArgCopyElisionCandidates)
Scan the entry block of the function in FuncInfo for arguments that look like copies into a local all...
static bool isFunction(SDValue Op)
static SDValue GetExponent(SelectionDAG &DAG, SDValue Op, const TargetLowering &TLI, const SDLoc &dl)
GetExponent - Get the exponent:
static Register FollowCopyChain(MachineRegisterInfo &MRI, Register Reg)
static SDValue ExpandPowI(const SDLoc &DL, SDValue LHS, SDValue RHS, SelectionDAG &DAG)
ExpandPowI - Expand a llvm.powi intrinsic.
static SDValue expandLog(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandLog - Lower a log intrinsic.
static SDValue getCopyFromParts(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V, SDValue InChain, std::optional< CallingConv::ID > CC=std::nullopt, std::optional< ISD::NodeType > AssertOp=std::nullopt)
getCopyFromParts - Create a value that contains the specified legal parts combined into the value the...
static SDValue getLimitedPrecisionExp2(SDValue t0, const SDLoc &dl, SelectionDAG &DAG)
static bool determineConstraints(ConstraintDecisionInfo &Info, TargetLowering::AsmOperandInfoVector &TargetConstraints, const CallBase &Call, SelectionDAGBuilder &Builder, const TargetLowering &TLI, const TargetMachine &TM, SelectionDAG &DAG, const BasicBlock *EHPadBB)
DetermineConstraints - Find the constraints to use for inline asm operands.
static bool constructOperandInfo(ConstraintDecisionInfo &Info, TargetLowering::AsmOperandInfoVector &TargetConstraints, SelectionDAGBuilder &Builder, const TargetLowering &TLI, ExtraFlags &ExtraInfo)
Construct operand info objects.
static SDValue GetSignificand(SelectionDAG &DAG, SDValue Op, const SDLoc &dl)
GetSignificand - Get the significand and build it into a floating-point number with exponent of 1:
static SDValue expandExp(const SDLoc &dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI, SDNodeFlags Flags)
expandExp - Lower an exp intrinsic.
static const MDNode * getRangeMetadata(const Instruction &I)
static cl::opt< unsigned, true > LimitFPPrecision("limit-float-precision", cl::desc("Generate low-precision inline sequences " "for some float libcalls"), cl::location(LimitFloatPrecision), cl::Hidden, cl::init(0))
static void tryToElideArgumentCopy(FunctionLoweringInfo &FuncInfo, SmallVectorImpl< SDValue > &Chains, DenseMap< int, int > &ArgCopyElisionFrameIndexMap, SmallPtrSetImpl< const Instruction * > &ElidedArgCopyInstrs, ArgCopyElisionMapTy &ArgCopyElisionCandidates, const Argument &Arg, ArrayRef< SDValue > ArgVals, bool &ArgHasUses)
Try to elide argument copies from memory into a local alloca.
static unsigned LimitFloatPrecision
LimitFloatPrecision - Generate low-precision inline sequences for some float libcalls (6,...
static SDValue getCopyFromPartsVector(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V, SDValue InChain, std::optional< CallingConv::ID > CC)
getCopyFromPartsVector - Create a value that contains the specified legal parts combined into the val...
static bool InBlock(const Value *V, const BasicBlock *BB)
static FPClassTest getNoFPClass(const Instruction &I)
static LLVM_ATTRIBUTE_ALWAYS_INLINE MVT::SimpleValueType getSimpleVT(const uint8_t *MatcherTable, size_t &MatcherIndex)
getSimpleVT - Decode a value in MatcherTable, if it's a VBR encoded value, use GetVBR to decode it.
This file defines the SmallPtrSet class.
This file contains some functions that are useful when dealing with strings.
#define LLVM_DEBUG(...)
Definition Debug.h:119
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
This pass exposes codegen information to IR-level passes.
uint16_t RegSizeInBits(const MCRegisterInfo &MRI, MCRegister RegNo)
Value * RHS
Value * LHS
The Input class is used to parse a yaml document into in-memory structs and vectors.
static const fltSemantics & IEEEsingle()
Definition APFloat.h:297
static LLVM_ABI Semantics SemanticsToEnum(const llvm::fltSemantics &Sem)
Definition APFloat.cpp:170
static LLVM_ABI const fltSemantics * getArbitraryFPSemantics(StringRef Format)
Returns the fltSemantics for a given arbitrary FP format string, or nullptr if invalid.
Definition APFloat.cpp:6028
Class for arbitrary precision integers.
Definition APInt.h:78
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:335
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:441
an instruction to allocate memory on the stack
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
LLVM_ABI std::optional< TypeSize > getAllocationSize(const DataLayout &DL) const
Get allocation size in bytes.
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
LLVM_ABI bool hasAttribute(Attribute::AttrKind Kind) const
Check if an argument has a given attribute.
Definition Function.cpp:333
unsigned getArgNo() const
Return the index of this formal argument in its containing function.
Definition Argument.h:50
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator end() const
Definition ArrayRef.h:130
size_t size() const
Get the array size.
Definition ArrayRef.h:141
iterator begin() const
Definition ArrayRef.h:129
A cache of @llvm.assume calls within a function.
An instruction that atomically checks whether a specified value is in a memory location,...
an instruction that atomically reads a memory location, combines it with another value,...
@ Add
*p = old + v
@ FAdd
*p = old + v
@ USubCond
Subtract only if no unsigned overflow.
@ FMinimum
*p = minimum(old, v) minimum matches the behavior of llvm.minimum.
@ Min
*p = old <signed v ? old : v
@ Sub
*p = old - v
@ And
*p = old & v
@ Xor
*p = old ^ v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ FMaximum
*p = maximum(old, v) maximum matches the behavior of llvm.maximum.
@ FSub
*p = old - v
@ UIncWrap
Increment one up to a maximum value.
@ Max
*p = old >signed v ? old : v
@ UMin
*p = old <unsigned v ? old : v
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
@ UMax
*p = old >unsigned v ? old : v
@ FMaximumNum
*p = maximumnum(old, v) maximumnum matches the behavior of llvm.maximumnum.
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
@ FMinimumNum
*p = minimumnum(old, v) minimumnum matches the behavior of llvm.minimumnum.
@ Nand
*p = ~(old & v)
This class holds the attributes for a particular argument, parameter, function, or return value.
Definition Attributes.h:407
LLVM Basic Block Representation.
Definition BasicBlock.h:62
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
InstListType::const_iterator const_iterator
Definition BasicBlock.h:171
LLVM_ABI bool isEntryBlock() const
Return true if this is the entry block of the containing function.
LLVM_ABI InstListType::const_iterator getFirstNonPHIOrDbg(bool SkipPseudoOp=true) const
Returns a pointer to the first instruction in this block that is not a PHINode or a debug intrinsic,...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
This class represents a no-op cast from one type to another.
The address of a basic block.
Definition Constants.h:1088
Analysis providing branch probability information.
LLVM_ABI BranchProbability getEdgeProbability(const BasicBlock *Src, unsigned IndexInSuccessors) const
Get an edge's probability, relative to other out-edges of the Src.
LLVM_ABI bool isEdgeHot(const BasicBlock *Src, const BasicBlock *Dst) const
Test if an edge is hot relative to other out-edges of the Src.
static constexpr BranchProbability getOne()
static uint32_t getDenominator()
static constexpr BranchProbability getUnknown()
static constexpr BranchProbability getZero()
uint32_t getNumerator() const
LLVM_ABI uint64_t scale(uint64_t Num) const
Scale a large integer.
BranchProbability getCompl() const
static void normalizeProbabilities(ProbabilityIter Begin, ProbabilityIter End)
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
std::optional< OperandBundleUse > getOperandBundle(StringRef Name) const
Return an operand bundle by name, if present.
CallingConv::ID getCallingConv() const
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
LLVM_ABI bool isMustTailCall() const
Tests if this call site must be tail call optimized.
LLVM_ABI bool isIndirectCall() const
Return true if the callsite is an indirect call.
unsigned countOperandBundlesOfType(StringRef Name) const
Return the number of operand bundles with the tag Name attached to this instruction.
Value * getCalledOperand() const
Value * getArgOperand(unsigned i) const
User::op_iterator arg_end()
Return the iterator pointing to the end of the argument list.
bool isConvergent() const
Determine if the invoke is convergent.
FunctionType * getFunctionType() const
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
LLVM_ABI bool isTailCall() const
Tests if this call site is marked as a tail call.
CallBr instruction, tracking function calls that may not return control but instead transfer it to a ...
This class represents a function call, abstracting a target machine's calling convention.
This class is the base class for the comparison instructions.
Definition InstrTypes.h:728
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
Conditional Branch instruction.
Class for constant bytes.
Definition Constants.h:281
ConstantDataSequential - A vector or array constant whose element type is a simple 1/2/4/8-byte integ...
Definition Constants.h:755
A constant value that is initialized with an expression using other constant values.
Definition Constants.h:1316
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:420
This is the shared class of boolean and integer constants.
Definition Constants.h:87
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition Constants.h:219
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
Definition Constants.h:168
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
A signed pointer, in the ptrauth sense.
Definition Constants.h:1223
uint64_t getZExtValue() const
Constant Vector Declarations.
Definition Constants.h:674
This is an important base class in LLVM.
Definition Constant.h:43
This is the common base class for constrained floating point intrinsics.
LLVM_ABI std::optional< fp::ExceptionBehavior > getExceptionBehavior() const
LLVM_ABI unsigned getNonMetadataArgCount() const
DWARF expression.
LLVM_ABI bool isEntryValue() const
Check if the expression consists of exactly one entry value operand.
static bool fragmentsOverlap(const FragmentInfo &A, const FragmentInfo &B)
Check if fragments overlap between a pair of FragmentInfos.
static LLVM_ABI DIExpression * appendOpsToArg(const DIExpression *Expr, ArrayRef< uint64_t > Ops, unsigned ArgNo, bool StackValue=false)
Create a copy of Expr by appending the given list of Ops to each instance of the operand DW_OP_LLVM_a...
static LLVM_ABI std::optional< FragmentInfo > getFragmentInfo(expr_op_iterator Start, expr_op_iterator End)
Retrieve the details of this fragment expression.
LLVM_ABI uint64_t getNumLocationOperands() const
Return the number of unique location operands referred to (via DW_OP_LLVM_arg) in this expression; th...
static LLVM_ABI std::optional< DIExpression * > createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits)
Create a DIExpression to describe one part of an aggregate variable that is fragmented across multipl...
static LLVM_ABI const DIExpression * convertToUndefExpression(const DIExpression *Expr)
Removes all elements from Expr that do not apply to an undef debug value, which includes every operat...
static LLVM_ABI DIExpression * prepend(const DIExpression *Expr, uint8_t Flags, int64_t Offset=0)
Prepend DIExpr with a deref and offset operation and optionally turn it into a stack value or/and an ...
static LLVM_ABI DIExpression * prependOpcodes(const DIExpression *Expr, SmallVectorImpl< uint64_t > &Ops, bool StackValue=false, bool EntryValue=false)
Prepend DIExpr with the given opcodes and optionally turn it into a stack value.
Base class for variables.
LLVM_ABI std::optional< uint64_t > getSizeInBits() const
Determines the size of the variable's type.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
bool isBigEndian() const
Definition DataLayout.h:218
Records a position in IR for a source label (DILabel).
Base class for non-instruction debug metadata records that have positions within IR.
DebugLoc getDebugLoc() const
Record of a variable value-assignment, aka a non instruction representation of the dbg....
LLVM_ABI Value * getVariableLocationOp(unsigned OpIdx) const
DIExpression * getExpression() const
DILocalVariable * getVariable() const
LLVM_ABI iterator_range< location_op_iterator > location_ops() const
Get the locations corresponding to the variable referenced by the debug info intrinsic.
A debug info location.
Definition DebugLoc.h:126
LLVM_ABI DILocation * getInlinedAt() const
Definition DebugLoc.cpp:58
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:223
bool empty() const
Definition DenseMap.h:171
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT, true > const_iterator
Definition DenseMap.h:134
iterator end()
Definition DenseMap.h:141
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:284
void reserve(size_type NumEntries)
Grow the densemap so that it can contain at least NumEntries items before resizing again.
Definition DenseMap.h:176
Diagnostic information for inline asm reporting.
static constexpr ElementCount getFixed(ScalarTy MinVal)
Definition TypeSize.h:309
static constexpr ElementCount get(ScalarTy MinVal, bool Scalable)
Definition TypeSize.h:315
constexpr bool isScalar() const
Exactly one element.
Definition TypeSize.h:320
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
Class representing an expression and its matching format.
This instruction extracts a struct member or array element value from an aggregate value.
This instruction compares its operands according to the predicate given to the constructor.
This is a fast-path instruction selection class that generates poor code and doesn't support illegal ...
Definition FastISel.h:67
bool allowReassoc() const
Flag queries.
Definition FMF.h:64
An instruction for ordering other memory operations.
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
Definition Type.cpp:867
This class represents a freeze function that returns random concrete value if an operand is either a ...
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
BranchProbabilityInfo * BPI
MachineBasicBlock * getMBB(const BasicBlock *BB) const
DenseMap< const AllocaInst *, int > StaticAllocaMap
StaticAllocaMap - Keep track of frame indices for fixed sized allocas in the entry block.
const LiveOutInfo * GetLiveOutRegInfo(Register Reg)
GetLiveOutRegInfo - Gets LiveOutInfo for a register, returning NULL if the register is a PHI destinat...
MachineBasicBlock * MBB
MBB - The current block.
Class to represent function types.
unsigned getNumParams() const
Return the number of fixed parameters this function type requires.
Type * getParamType(unsigned i) const
Parameter type accessors.
Type * getReturnType() const
Data structure describing the variable locations in a function.
const BasicBlock & getEntryBlock() const
Definition Function.h:783
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Definition Function.h:211
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
Definition Function.h:246
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition Function.h:685
bool hasParamAttribute(unsigned ArgNo, Attribute::AttrKind Kind) const
check if an attributes is in the list of attributes.
Definition Function.cpp:735
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
Definition Function.h:272
Constant * getPersonalityFn() const
Get the personality function associated with this function.
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:328
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
Definition Function.h:251
size_t arg_size() const
Definition Function.h:875
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:723
Garbage collection metadata for a single function.
Definition GCMetadata.h:80
bool hasNoUnsignedSignedWrap() const
bool hasNoUnsignedWrap() const
bool isInBounds() const
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
bool hasDLLImportStorageClass() const
Module * getParent()
Get the module that this global value is contained inside of...
This instruction compares its operands according to the predicate given to the constructor.
Indirect Branch Instruction.
void setMemConstraint(ConstraintCode C)
setMemConstraint - Augment an existing flag with the constraint code for a memory constraint.
Definition InlineAsm.h:414
This instruction inserts a struct field of array element value into an aggregate value.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
LLVM_ABI FastMathFlags getFastMathFlags() const LLVM_READONLY
Convenience function for getting all the fast-math flags, which must be an operator which supports th...
LLVM_ABI AAMDNodes getAAMetadata() const
Returns the AA metadata for this instruction.
@ MIN_INT_BITS
Minimum number of bits that can be specified.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
Invoke instruction.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
LLVM_ABI void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
The landingpad instruction holds all of the information necessary to generate correct exception handl...
A helper class to return the specified delimiter string after the first invocation of operator String...
An instruction for reading from memory.
static LocationSize precise(uint64_t Value)
static constexpr LocationSize beforeOrAfterPointer()
Any location before or after the base pointer (but still within the underlying object).
static LocationSize upperBound(uint64_t Value)
LLVM_ABI MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
LLVM_ABI MCSymbol * getOrCreateFrameAllocSymbol(const Twine &FuncName, unsigned Idx)
Gets a symbol that will be defined to the final stack offset of a local variable after codegen.
unsigned getID() const
getID() - Return the register class ID number.
const MCPhysReg * iterator
iterator begin() const
begin/end - Return all of the registers in this class.
iterator end() const
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
Metadata node.
Definition Metadata.h:1069
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1426
LLVM_ABI StringRef getString() const
Definition Metadata.cpp:632
Machine Value Type.
@ INVALID_SIMPLE_VALUE_TYPE
uint64_t getScalarSizeInBits() const
unsigned getVectorNumElements() const
bool isVector() const
Return true if this is a vector value type.
bool isInteger() const
Return true if this is an integer or a vector integer type.
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
ElementCount getVectorElementCount() const
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
bool bitsGE(MVT VT) const
Return true if this has no less bits than VT.
bool isScalarInteger() const
Return true if this is an integer, not including vectors.
static MVT getVectorVT(MVT VT, unsigned NumElements)
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
static MVT getIntegerVT(unsigned BitWidth)
void normalizeSuccProbs()
Normalize probabilities of all successors so that the sum of them becomes one.
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
LLVM_ABI void setSuccProbability(succ_iterator I, BranchProbability Prob)
Set successor probability of a given iterator.
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
SmallVectorImpl< MachineBasicBlock * >::iterator succ_iterator
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
void setIsEHContTarget(bool V=true)
Indicates if this is a target of Windows EH Continuation Guard.
void setIsEHFuncletEntry(bool V=true)
Indicates if this is the entry block of an EH funclet.
MachineInstrBundleIterator< MachineInstr > iterator
void setIsEHScopeEntry(bool V=true)
Indicates if this is the entry block of an EH scope, i.e., the block that that used to have a catchpa...
void setMachineBlockAddressTaken()
Set this block to indicate that its address is used as something other than the target of a terminato...
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
void setIsImmutableObjectIndex(int ObjectIdx, bool IsImmutable)
Marks the immutability of an object.
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
bool hasOpaqueSPAdjustment() const
Returns true if the function contains opaque dynamic stack adjustments.
int getStackProtectorIndex() const
Return the index for the stack protector object.
void setIsAliasedObjectIndex(int ObjectIdx, bool IsAliased)
Set "maybe pointed to by an LLVM IR value" for an object.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
void RemoveStackObject(int ObjectIdx)
Remove or mark dead a statically sized stack object.
void setFunctionContextIndex(int I)
const WinEHFuncInfo * getWinEHFuncInfo() const
getWinEHFuncInfo - Return information about how the current function uses Windows exception handling.
bool useDebugInstrRef() const
Returns true if the function's variable locations are tracked with instruction referencing.
void setCallSiteBeginLabel(MCSymbol *BeginLabel, unsigned Site)
Map the begin label for a call site.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, Align base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MCContext & getContext() const
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
void addCodeViewAnnotation(MCSymbol *Label, MDNode *MD)
Record annotations associated with a particular label.
Function & getFunction()
Return the LLVM function that this machine code represents.
BasicBlockListType::iterator iterator
void setHasEHContTarget(bool V)
void addInvoke(MachineBasicBlock *LandingPad, MCSymbol *BeginLabel, MCSymbol *EndLabel)
Provide the begin and end labels of an invoke style call and associate it with a try landing pad bloc...
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineInstr - Allocate a new MachineInstr.
void insert(iterator MBBI, MachineBasicBlock *MBB)
const MachineInstrBuilder & addSym(MCSymbol *Sym, unsigned char TargetFlags=0) const
const MachineInstrBuilder & addFrameIndex(int Idx) const
Representation of each machine instruction.
A description of a memory reference used in the backend.
Flags
Flags values. These may be or'd together.
@ MOVolatile
The memory access is volatile.
@ MODereferenceable
The memory access is dereferenceable (i.e., doesn't trap).
@ MOLoad
The memory access reads data.
@ MONonTemporal
The memory access is non-temporal.
@ MOInvariant
The memory access always returns the same value (or traps).
@ MOStore
The memory access writes data.
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
static MachineOperand CreateReg(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false, bool isRenamable=false)
static MachineOperand CreateFI(int Idx)
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
def_iterator def_begin(Register RegNo) const
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
LLVM_ABI MCRegister getLiveInPhysReg(Register VReg) const
getLiveInPhysReg - If VReg is a live-in virtual register, return the corresponding live-in physical r...
An SDNode that represents everything that will be needed to construct a MachineInstr.
std::pair< iterator, bool > try_emplace(const KeyT &Key, Ts &&...Args)
Definition MapVector.h:118
bool contains(const KeyT &Key) const
Definition MapVector.h:148
static MemoryLocation getAfter(const Value *Ptr, const AAMDNodes &AATags=AAMDNodes())
Return a location that may access any location after Ptr, while remaining within the underlying objec...
Metadata wrapper in the Value hierarchy.
Definition Metadata.h:184
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
constexpr bool isValid() const
Definition Register.h:112
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:79
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Definition Register.h:83
Resume the propagation of an exception.
Return a value (possibly void), from a function.
Holds the information from a dbg_label node through SDISel.
static SDDbgOperand fromNode(SDNode *Node, unsigned ResNo)
static SDDbgOperand fromFrameIdx(unsigned FrameIdx)
static SDDbgOperand fromVReg(Register VReg)
static SDDbgOperand fromConst(const Value *Const)
Holds the information from a dbg_value node through SDISel.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
iterator_range< value_op_iterator > op_values() const
unsigned getIROrder() const
Return the node ordering.
uint64_t getAsZExtVal() const
Helper method returns the zero-extended integer value of a ConstantSDNode.
unsigned getNumValues() const
Return the number of values defined/returned by this operator.
const SDValue & getOperand(unsigned Num) const
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDNode * getNode() const
get the SDNode which holds the desired result
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
TypeSize getValueSizeInBits() const
Returns the size of the value in bits.
const SDValue & getOperand(unsigned i) const
unsigned getResNo() const
get the index which selects a specific result in the SDNode
MVT getSimpleValueType() const
Return the simple ValueType of the referenced return value.
unsigned getOpcode() const
SelectionDAGBuilder - This is the common target-independent lowering implementation that is parameter...
SDValue getValue(const Value *V)
getValue - Return an SDValue for the given Value.
bool shouldKeepJumpConditionsTogether(const FunctionLoweringInfo &FuncInfo, const CondBrInst &I, Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs, TargetLoweringBase::CondMergingParams Params) const
DenseMap< const Constant *, Register > ConstantsOut
void addDanglingDebugInfo(SmallVectorImpl< Value * > &Values, DILocalVariable *Var, DIExpression *Expr, bool IsVariadic, DebugLoc DL, unsigned Order)
Register a dbg_value which relies on a Value which we have not yet seen.
void visitDbgInfo(const Instruction &I)
void clearDanglingDebugInfo()
Clear the dangling debug information map.
SDValue lowerStartEH(SDValue Chain, const BasicBlock *EHPadBB, MCSymbol *&BeginLabel)
void LowerCallTo(const CallBase &CB, SDValue Callee, bool IsTailCall, bool IsMustTailCall, const BasicBlock *EHPadBB=nullptr, const TargetLowering::PtrAuthInfo *PAI=nullptr)
void clear()
Clear out the current SelectionDAG and the associated state and prepare this SelectionDAGBuilder obje...
void visitBitTestHeader(SwitchCG::BitTestBlock &B, MachineBasicBlock *SwitchBB)
visitBitTestHeader - This function emits necessary code to produce value suitable for "bit tests"
void LowerStatepoint(const GCStatepointInst &I, const BasicBlock *EHPadBB=nullptr)
std::unique_ptr< SDAGSwitchLowering > SL
SDValue lowerRangeToAssertZExt(SelectionDAG &DAG, const Instruction &I, SDValue Op)
bool HasTailCall
This is set to true if a call in the current block has been translated as a tail call.
bool ShouldEmitAsBranches(const std::vector< SwitchCG::CaseBlock > &Cases)
If the set of cases should be emitted as a series of branches, return true.
void EmitBranchForMergedCondition(const Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB, BranchProbability TProb, BranchProbability FProb, bool InvertCond)
EmitBranchForMergedCondition - Helper method for FindMergedConditions.
void LowerDeoptimizeCall(const CallInst *CI)
void LowerCallSiteWithDeoptBundle(const CallBase *Call, SDValue Callee, const BasicBlock *EHPadBB)
SwiftErrorValueTracking & SwiftError
Information about the swifterror values used throughout the function.
SDValue getNonRegisterValue(const Value *V)
getNonRegisterValue - Return an SDValue for the given Value, but don't look in FuncInfo....
const TargetTransformInfo * TTI
DenseMap< MachineBasicBlock *, SmallVector< unsigned, 4 > > LPadToCallSiteMap
Map a landing pad to the call site indexes.
SDValue lowerNoFPClassToAssertNoFPClass(SelectionDAG &DAG, const Instruction &I, SDValue Op)
void handleDebugDeclare(Value *Address, DILocalVariable *Variable, DIExpression *Expression, DebugLoc DL)
StatepointLoweringState StatepointLowering
State used while lowering a statepoint sequence (gc_statepoint, gc_relocate, and gc_result).
void visitBitTestCase(SwitchCG::BitTestBlock &BB, MachineBasicBlock *NextMBB, BranchProbability BranchProbToNext, Register Reg, SwitchCG::BitTestCase &B, MachineBasicBlock *SwitchBB)
visitBitTestCase - this function produces one "bit test"
bool canTailCall(const CallBase &CB) const
void populateCallLoweringInfo(TargetLowering::CallLoweringInfo &CLI, const CallBase *Call, unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy, AttributeSet RetAttrs, bool IsPatchPoint)
Populate a CallLowerinInfo (into CLI) based on the properties of the call being lowered.
void CopyValueToVirtualRegister(const Value *V, Register Reg, ISD::NodeType ExtendType=ISD::ANY_EXTEND)
void salvageUnresolvedDbgValue(const Value *V, DanglingDebugInfo &DDI)
For the given dangling debuginfo record, perform last-ditch efforts to resolve the debuginfo to somet...
SmallVector< SDValue, 8 > PendingLoads
Loads are not emitted to the program immediately.
GCFunctionInfo * GFI
Garbage collection metadata for the function.
void init(GCFunctionInfo *gfi, BatchAAResults *BatchAA, AssumptionCache *AC, const TargetLibraryInfo *li, const TargetTransformInfo &TTI)
SDValue getRoot()
Similar to getMemoryRoot, but also flushes PendingConstrainedFP(Strict) items.
void ExportFromCurrentBlock(const Value *V)
ExportFromCurrentBlock - If this condition isn't known to be exported from the current basic block,...
void resolveOrClearDbgInfo()
Evict any dangling debug information, attempting to salvage it first.
std::pair< SDValue, SDValue > lowerInvokable(TargetLowering::CallLoweringInfo &CLI, const BasicBlock *EHPadBB=nullptr)
SDValue getMemoryRoot()
Return the current virtual root of the Selection DAG, flushing any PendingLoad items.
void resolveDanglingDebugInfo(const Value *V, SDValue Val)
If we saw an earlier dbg_value referring to V, generate the debug data structures now that we've seen...
void visit(const Instruction &I)
void dropDanglingDebugInfo(const DILocalVariable *Variable, const DIExpression *Expr)
If we have dangling debug info that describes Variable, or an overlapping part of variable considerin...
SDValue getCopyFromRegs(const Value *V, Type *Ty)
If there was virtual register allocated for the value V emit CopyFromReg of the specified type Ty.
void CopyToExportRegsIfNeeded(const Value *V)
CopyToExportRegsIfNeeded - If the given value has virtual registers created for it,...
void handleKillDebugValue(DILocalVariable *Var, DIExpression *Expr, DebugLoc DbgLoc, unsigned Order)
Create a record for a kill location debug intrinsic.
void visitJumpTable(SwitchCG::JumpTable &JT)
visitJumpTable - Emit JumpTable node in the current MBB
SDValue getFPOperationRoot(fp::ExceptionBehavior EB)
Return the current virtual root of the Selection DAG, flushing PendingConstrainedFP or PendingConstra...
void visitJumpTableHeader(SwitchCG::JumpTable &JT, SwitchCG::JumpTableHeader &JTH, MachineBasicBlock *SwitchBB)
visitJumpTableHeader - This function emits necessary code to produce index in the JumpTable from swit...
void LowerCallSiteWithPtrAuthBundle(const CallBase &CB, const BasicBlock *EHPadBB)
static const unsigned LowestSDNodeOrder
Lowest valid SDNodeOrder.
FunctionLoweringInfo & FuncInfo
Information about the function as a whole.
void setValue(const Value *V, SDValue NewN)
void FindMergedConditions(const Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB, Instruction::BinaryOps Opc, BranchProbability TProb, BranchProbability FProb, bool InvertCond)
const TargetLibraryInfo * LibInfo
bool isExportableFromCurrentBlock(const Value *V, const BasicBlock *FromBB)
void visitSPDescriptorParent(StackProtectorDescriptor &SPD, MachineBasicBlock *ParentBB)
Codegen a new tail for a stack protector check ParentMBB which has had its tail spliced into a stack ...
bool handleDebugValue(ArrayRef< const Value * > Values, DILocalVariable *Var, DIExpression *Expr, DebugLoc DbgLoc, unsigned Order, bool IsVariadic)
For a given list of Values, attempt to create and record a SDDbgValue in the SelectionDAG.
SDValue getControlRoot()
Similar to getRoot, but instead of flushing all the PendingLoad items, flush all the PendingExports (...
void UpdateSplitBlock(MachineBasicBlock *First, MachineBasicBlock *Last)
When an MBB was split during scheduling, update the references that need to refer to the last resulti...
SDValue getValueImpl(const Value *V)
getValueImpl - Helper function for getValue and getNonRegisterValue.
void visitSwitchCase(SwitchCG::CaseBlock &CB, MachineBasicBlock *SwitchBB)
visitSwitchCase - Emits the necessary code to represent a single node in the binary search tree resul...
void visitSPDescriptorFailure(StackProtectorDescriptor &SPD)
Codegen the failure basic block for a stack protector check.
std::unique_ptr< FunctionLoweringInfo > FuncInfo
SmallPtrSet< const Instruction *, 4 > ElidedArgCopyInstrs
const TargetLowering * TLI
MachineRegisterInfo * RegInfo
std::unique_ptr< SwiftErrorValueTracking > SwiftError
virtual void emitFunctionEntryCode()
std::unique_ptr< SelectionDAGBuilder > SDB
virtual std::pair< SDValue, SDValue > EmitTargetCodeForMemccpy(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, SDValue C, SDValue Size, const CallInst *CI) const
Emit target-specific code that performs a memccpy, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrnlen(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src, SDValue MaxLength, MachinePointerInfo SrcPtrInfo) const
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrlen(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Src, const CallInst *CI) const
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrstr(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, const CallInst *CI) const
Emit target-specific code that performs a strstr, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForMemchr(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Src, SDValue Char, SDValue Length, MachinePointerInfo SrcPtrInfo) const
Emit target-specific code that performs a memchr, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrcmp(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, MachinePointerInfo Op1PtrInfo, MachinePointerInfo Op2PtrInfo, const CallInst *CI) const
Emit target-specific code that performs a strcmp, in cases where that is faster than a libcall.
virtual std::pair< SDValue, SDValue > EmitTargetCodeForMemcmp(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, SDValue Op3, const CallInst *CI) const
Emit target-specific code that performs a memcmp/bcmp, in cases where that is faster than a libcall.
virtual SDValue EmitTargetCodeForSetTag(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Addr, SDValue Size, MachinePointerInfo DstPtrInfo, bool ZeroData) const
virtual std::pair< SDValue, SDValue > EmitTargetCodeForStrcpy(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dest, SDValue Src, MachinePointerInfo DestPtrInfo, MachinePointerInfo SrcPtrInfo, bool isStpcpy, const CallInst *CI) const
Emit target-specific code that performs a strcpy or stpcpy, in cases where that is faster than a libc...
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
SDValue getTargetGlobalAddress(const GlobalValue *GV, const SDLoc &DL, EVT VT, int64_t offset=0, unsigned TargetFlags=0)
SDValue getExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT, unsigned Opcode)
Convert Op, which must be of integer type, to the integer type VT, by either any/sign/zero-extending ...
const SDValue & getRoot() const
Return the root tag of the SelectionDAG.
const TargetSubtargetInfo & getSubtarget() const
SDValue getCopyToReg(SDValue Chain, const SDLoc &dl, Register Reg, SDValue N)
LLVM_ABI SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
LLVM_ABI SDValue getShiftAmountConstant(uint64_t Val, EVT VT, const SDLoc &DL)
LLVM_ABI MachineSDNode * getMachineNode(unsigned Opcode, const SDLoc &dl, EVT VT)
These are used for target selectors to create a new node with specified return type(s),...
LLVM_ABI void ExtractVectorElements(SDValue Op, SmallVectorImpl< SDValue > &Args, unsigned Start=0, unsigned Count=0, EVT EltVT=EVT())
Append the extracted elements from Start to Count out of the vector Op in Args.
LLVM_ABI SDValue getConstantPool(const Constant *C, EVT VT, MaybeAlign Align=std::nullopt, int Offs=0, bool isT=false, unsigned TargetFlags=0)
LLVM_ABI SDValue getConstantFP(double Val, const SDLoc &DL, EVT VT, bool isTarget=false)
Create a ConstantFPSDNode wrapping a constant value.
LLVM_ABI SDValue getRegister(Register Reg, EVT VT)
LLVM_ABI SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr)
Loads are not normal binary operators: their result type is not determined by their operands,...
LLVM_ABI Align getEVTAlign(EVT MemoryVT) const
Compute the default alignment value for the given type.
LLVM_ABI bool shouldOptForSize() const
const TargetLowering & getTargetLoweringInfo() const
static constexpr unsigned MaxRecursionDepth
LLVM_ABI void AddDbgValue(SDDbgValue *DB, bool isParameter)
Add a dbg_value SDNode.
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Ops)
Return an ISD::BUILD_VECTOR node.
LLVM_ABI SDValue getBitcast(EVT VT, SDValue V)
Return a bitcast using the SDLoc of the value operand, and casting to the provided type.
LLVM_ABI SDDbgValue * getDbgValueList(DIVariable *Var, DIExpression *Expr, ArrayRef< SDDbgOperand > Locs, ArrayRef< SDNode * > Dependencies, bool IsIndirect, const DebugLoc &DL, unsigned O, bool IsVariadic)
Creates a SDDbgValue node from a list of locations.
SDValue getCopyFromReg(SDValue Chain, const SDLoc &dl, Register Reg, EVT VT)
LLVM_ABI void setNodeMemRefs(MachineSDNode *N, ArrayRef< MachineMemOperand * > NewMemRefs)
Mutate the specified machine node's memory references to the provided list.
const DataLayout & getDataLayout() const
SDValue getTargetFrameIndex(int FI, EVT VT)
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getMemBasePlusOffset(SDValue Base, TypeSize Offset, const SDLoc &DL, const SDNodeFlags Flags=SDNodeFlags())
Returns sum of the base pointer and offset.
LLVM_ABI SDValue getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
LLVM_ABI SDValue getMDNode(const MDNode *MD)
Return an MDNodeSDNode which holds an MDNode.
LLVM_ABI SDValue getBasicBlock(MachineBasicBlock *MBB)
LLVM_ABI SDValue getEHLabel(const SDLoc &dl, SDValue Root, MCSymbol *Label)
LLVM_ABI SDValue getPtrExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either truncating it or perform...
LLVM_ABI SDValue getAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either any-extending or truncat...
const LibcallLoweringInfo & getLibcalls() const
LLVM_ABI SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI SDValue getValueType(EVT)
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
LLVM_ABI SDValue getFPExtendOrRound(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of float type, to the float type VT, by either extending or rounding (by tr...
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
LLVM_ABI SDValue getVectorIdxConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
MachineFunction & getMachineFunction() const
LLVM_ABI SDValue getFrameIndex(int FI, EVT VT, bool isTarget=false)
LLVM_ABI SDValue getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either zero-extending or trunca...
LLVMContext * getContext() const
const SDValue & setRoot(SDValue N)
Set the current root tag of the SelectionDAG.
LLVM_ABI SDValue getTargetExternalSymbol(const char *Sym, EVT VT, unsigned TargetFlags=0)
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void swap(SmallVectorImpl &RHS)
void resize(size_type N)
void push_back(const T &Elt)
pointer data()
Return a pointer to the vector's buffer, even if empty().
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Encapsulates all of the information needed to generate a stack protector check, and signals to isel w...
MachineBasicBlock * getSuccessMBB()
MachineBasicBlock * getFailureMBB()
MachineBasicBlock * getParentMBB()
bool shouldEmitFunctionBasedCheckStackProtector() const
An instruction for storing to memory.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr bool empty() const
Check if the string is empty.
Definition StringRef.h:141
constexpr const char * data() const
Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:138
Multiway switch.
Information about stack frame layout on the target.
virtual TargetStackID::Value getStackIDForScalableVectors() const
Returns the StackID that scalable vectors should be associated with.
Provides information about what library functions are available for the current target.
virtual Align getByValTypeAlignment(Type *Ty, const DataLayout &DL) const
Returns the desired alignment for ByVal or InAlloca aggregate function arguments in the caller parame...
virtual bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF, EVT) const
Return true if an FMA operation is faster than a pair of fmul and fadd instructions.
EVT getMemValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Function * getSSPStackGuardCheck(const Module &M, const LibcallLoweringInfo &Libcalls) const
If the target has a standard stack protection check function that performs validation and error handl...
EVT getValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Return the EVT corresponding to this LLVM type.
LegalizeAction
This enum indicates whether operations are valid for a target, and if not, what action should be used...
virtual const TargetRegisterClass * getRegClassFor(MVT VT, bool isDivergent=false) const
Return the register class that should be used for the specified value type.
virtual bool isLegalScaleForGatherScatter(uint64_t Scale, uint64_t ElemSize) const
virtual bool isSExtCheaperThanZExt(EVT FromTy, EVT ToTy) const
Return true if sign-extension from FromTy to ToTy is cheaper than zero-extension.
MVT getVectorIdxTy(const DataLayout &DL) const
Returns the type to be used for the index operand of: ISD::INSERT_VECTOR_ELT, ISD::EXTRACT_VECTOR_ELT...
virtual unsigned getNumRegistersForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain targets require unusual breakdowns of certain types.
virtual bool isZExtFree(Type *FromTy, Type *ToTy) const
Return true if any actual instruction that defines a value of type FromTy implicitly zero-extends the...
virtual MVT getRegisterTypeForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain combinations of ABIs, Targets and features require that types are legal for some operations a...
virtual bool useStackGuardMixFP() const
If this function returns true, stack protection checks should mix the frame pointer (or whichever poi...
virtual unsigned getNumRegisters(LLVMContext &Context, EVT VT, std::optional< MVT > RegisterVT=std::nullopt) const
Return the number of registers that this ValueType will eventually require.
MachineMemOperand::Flags getLoadMemOperandFlags(const LoadInst &LI, const DataLayout &DL, AssumptionCache *AC=nullptr, const TargetLibraryInfo *LibInfo=nullptr, CodeGenOptLevel OptLevel=CodeGenOptLevel::Default) const
virtual bool shouldExtendGSIndex(EVT VT, EVT &EltTy) const
Returns true if the index type for a masked gather/scatter requires extending.
virtual unsigned getVectorTypeBreakdownForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const
Certain targets such as MIPS require that some types such as vectors are always broken down into scal...
Register getStackPointerRegisterToSaveRestore() const
If a physical register, this specifies the register that llvm.savestack/llvm.restorestack should save...
LegalizeAction getFixedPointOperationAction(unsigned Op, EVT VT, unsigned Scale) const
Some fixed point operations may be natively supported by the target but only for specific scales.
MachineMemOperand::Flags getAtomicMemOperandFlags(const Instruction &AI, const DataLayout &DL) const
virtual bool allowsMisalignedMemoryAccesses(EVT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *=nullptr) const
Determine if the target supports unaligned memory accesses.
bool isOperationCustom(unsigned Op, EVT VT) const
Return true if the operation uses custom lowering, regardless of whether the type is legal or not.
bool hasBigEndianPartOrdering(EVT VT, const DataLayout &DL) const
When splitting a value of the specified type into parts, does the Lo or Hi part come first?
EVT getShiftAmountTy(EVT LHSTy, const DataLayout &DL) const
Returns the type for the shift amount of a shift opcode.
virtual Align getABIAlignmentForCallingConv(Type *ArgTy, const DataLayout &DL) const
Certain targets have context sensitive alignment requirements, where one type has the alignment requi...
MachineMemOperand::Flags getVPIntrinsicMemOperandFlags(const VPIntrinsic &VPIntrin) const
virtual bool shouldExpandGetActiveLaneMask(EVT VT, EVT OpVT) const
Return true if the @llvm.get.active.lane.mask intrinsic should be expanded using generic code in Sele...
virtual EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const
Return the ValueType of the result of SETCC operations.
virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
MVT getProgramPointerTy(const DataLayout &DL) const
Return the type for code pointers, which is determined by the program address space specified through...
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
bool isOperationLegal(unsigned Op, EVT VT) const
Return true if the specified operation is legal on this target.
virtual bool shouldExpandVectorMatch(EVT VT, unsigned SearchSize) const
Return true if the @llvm.experimental.vector.match intrinsic should be expanded for vector type ‘VT’ ...
virtual bool isProfitableToCombineMinNumMaxNum(EVT VT) const
virtual MVT getFenceOperandTy(const DataLayout &DL) const
Return the type for operands of fence.
virtual bool shouldExpandGetVectorLength(EVT CountVT, unsigned VF, bool IsScalable) const
bool isOperationLegalOrCustom(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal with custom lower...
virtual MVT hasFastEqualityCompare(unsigned NumBits) const
Return the preferred operand type if the target has a quick way to compare integer values of the give...
MachineMemOperand::Flags getStoreMemOperandFlags(const StoreInst &SI, const DataLayout &DL) const
virtual void getTgtMemIntrinsic(SmallVectorImpl< IntrinsicInfo > &Infos, const CallBase &I, MachineFunction &MF, unsigned Intrinsic) const
Given an intrinsic, checks if on the target the intrinsic will need to map to a MemIntrinsicNode (tou...
virtual bool signExtendConstant(const ConstantInt *C) const
Return true if this constant should be sign extended when promoting to a larger type.
virtual Value * getSDagStackGuard(const Module &M, const LibcallLoweringInfo &Libcalls) const
Return the variable that's previously inserted by insertSSPDeclarations, if any, otherwise return nul...
LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const
Return how we should legalize values of this type, either it is already legal (return 'Legal') or we ...
virtual Register getExceptionPointerRegister(const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception address on entry to an ...
bool supportsUnalignedAtomics() const
Whether the target supports unaligned atomic operations.
std::vector< ArgListEntry > ArgListTy
bool isBeneficialToExpandPowI(int64_t Exponent, bool OptForSize) const
Return true if it is beneficial to expand an @llvm.powi.
MVT getFrameIndexTy(const DataLayout &DL) const
Return the type for frame index, which is determined by the alloca address space specified through th...
virtual Register getExceptionSelectorRegister(const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception typeid on entry to a la...
virtual MVT getPointerMemTy(const DataLayout &DL, uint32_t AS=0) const
Return the in-memory pointer type for the given address space, defaults to the pointer type from the ...
MVT getRegisterType(MVT VT) const
Return the type of registers that this ValueType will eventually require.
unsigned getVectorTypeBreakdown(LLVMContext &Context, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const
Vector types are broken down into some number of legal first class types.
virtual MVT getVPExplicitVectorLengthTy() const
Returns the type to be used for the EVL/AVL operand of VP nodes: ISD::VP_ADD, ISD::VP_SUB,...
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
virtual bool supportKCFIBundles() const
Return true if the target supports kcfi operand bundles.
virtual bool supportPtrAuthBundles() const
Return true if the target supports ptrauth operand bundles.
virtual bool supportSwiftError() const
Return true if the target supports swifterror attribute.
virtual SDValue visitMaskedLoad(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, MachineMemOperand *MMO, SDValue &NewLoad, SDValue Ptr, SDValue PassThru, SDValue Mask) const
virtual EVT getTypeForExtReturn(LLVMContext &Context, EVT VT, ISD::NodeType) const
Return the type that should be used to zero or sign extend a zeroext/signext integer return value.
virtual Register getRegisterByName(const char *RegName, LLT Ty, const MachineFunction &MF) const
Return the register ID of the name passed in.
virtual InlineAsm::ConstraintCode getInlineAsmMemConstraint(StringRef ConstraintCode) const
std::vector< AsmOperandInfo > AsmOperandInfoVector
SDValue expandIS_FPCLASS(EVT ResultVT, SDValue Op, FPClassTest Test, SDNodeFlags Flags, const SDLoc &DL, SelectionDAG &DAG) const
Expand check for floating point class.
virtual SDValue prepareVolatileOrAtomicLoad(SDValue Chain, const SDLoc &DL, SelectionDAG &DAG) const
This callback is used to prepare for a volatile or atomic load.
virtual SDValue emitStackGuardMixFP(SelectionDAG &DAG, SDValue Val, const SDLoc &DL) const
virtual ConstraintType getConstraintType(StringRef Constraint) const
Given a constraint, return the type of constraint it is for this target.
virtual bool splitValueIntoRegisterParts(SelectionDAG &DAG, const SDLoc &DL, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, std::optional< CallingConv::ID > CC) const
Target-specific splitting of values into parts that fit a register storing a legal type.
virtual SDValue joinRegisterPartsIntoValue(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, std::optional< CallingConv::ID > CC) const
Target-specific combining of register parts into its original value.
virtual SDValue LowerCall(CallLoweringInfo &, SmallVectorImpl< SDValue > &) const
This hook must be implemented to lower calls into the specified DAG.
std::pair< SDValue, SDValue > LowerCallTo(CallLoweringInfo &CLI) const
This function lowers an abstract call to a function into an actual call.
virtual SDValue LowerAsmOutputForConstraint(SDValue &Chain, SDValue &Glue, const SDLoc &DL, const AsmOperandInfo &OpInfo, SelectionDAG &DAG) const
virtual std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const
Given a physical register constraint (e.g.
virtual AsmOperandInfoVector ParseConstraints(const DataLayout &DL, const TargetRegisterInfo *TRI, const CallBase &Call) const
Split up the constraint string from the inline assembly value into the specific constraints and their...
virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const
This callback is invoked for operations that are unsupported by the target, which are registered to u...
virtual bool functionArgumentNeedsConsecutiveRegisters(Type *Ty, CallingConv::ID CallConv, bool isVarArg, const DataLayout &DL) const
For some targets, an LLVM struct type must be broken down into multiple simple types,...
virtual void ComputeConstraintToUse(AsmOperandInfo &OpInfo, SDValue Op, SelectionDAG *DAG=nullptr) const
Determines the constraint code and constraint type to use for the specific AsmOperandInfo,...
virtual void CollectTargetIntrinsicOperands(const CallInst &I, SmallVectorImpl< SDValue > &Ops, SelectionDAG &DAG) const
virtual SDValue visitMaskedStore(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, MachineMemOperand *MMO, SDValue Ptr, SDValue Val, SDValue Mask) const
virtual bool useLoadStackGuardNode(const Module &M) const
If this function returns true, SelectionDAGBuilder emits a LOAD_STACK_GUARD node when it is lowering ...
SDValue annotateStackObjectPointer(SDValue Ptr, SelectionDAG &DAG, const SDLoc &DL, Align Alignment) const
Annotate a stack object pointer with known-bits assertions.
virtual void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint, std::vector< SDValue > &Ops, SelectionDAG &DAG) const
Lower the specified operand into the Ops vector.
std::pair< SDValue, SDValue > makeLibCall(SelectionDAG &DAG, RTLIB::LibcallImpl LibcallImpl, EVT RetVT, ArrayRef< SDValue > Ops, MakeLibCallOptions CallOptions, const SDLoc &dl, SDValue Chain=SDValue()) const
Returns a pair of (return value, chain).
virtual void LowerOperationWrapper(SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG) const
This callback is invoked by the type legalizer to legalize nodes with an illegal operand type but leg...
virtual bool isInlineAsmTargetBranch(const SmallVectorImpl< StringRef > &AsmStrs, unsigned OpNo) const
On x86, return true if the operand with index OpNo is a CALL or JUMP instruction, which can use eithe...
virtual MVT getJumpTableRegTy(const DataLayout &DL) const
virtual bool CanLowerReturn(CallingConv::ID, MachineFunction &, bool, const SmallVectorImpl< ISD::OutputArg > &, LLVMContext &, const Type *RetTy) const
This hook should be implemented to check whether the return values described by the Outs array can fi...
Primary interface to the complete machine description for the target machine.
CodeGenOptLevel getOptLevel() const
Returns the optimization level: None, Less, Default, or Aggressive.
CodeModel::Model getCodeModel() const
Returns the code model.
unsigned NoTrapAfterNoreturn
Do not emit a trap instruction for 'unreachable' IR instructions behind noreturn calls,...
unsigned TrapUnreachable
Emit target-specific trap instruction for 'unreachable' IR instructions.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
@ TCK_Latency
The latency of instruction.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:343
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
LLVM_ABI bool isEmptyTy() const
Return true if this type is empty, that is, it has no elements or all of its elements are empty.
Definition Type.cpp:180
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:288
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:282
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:282
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:368
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:130
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:306
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:257
bool isTokenTy() const
Return true if this is 'token'.
Definition Type.h:236
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
Definition Type.cpp:313
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Definition Type.h:227
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:141
Unconditional Branch instruction.
This function has undefined behavior.
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
op_iterator op_begin()
Definition User.h:259
Value * getOperand(unsigned i) const
Definition User.h:207
unsigned getNumOperands() const
Definition User.h:229
op_iterator op_end()
Definition User.h:261
This class represents the va_arg llvm instruction, which returns an argument of the specified type gi...
LLVM_ABI CmpInst::Predicate getPredicate() const
This is the common base class for vector predication intrinsics.
static LLVM_ABI std::optional< unsigned > getVectorLengthParamPos(Intrinsic::ID IntrinsicID)
LLVM_ABI MaybeAlign getPointerAlignment() const
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:439
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:258
iterator_range< user_iterator > users()
Definition Value.h:426
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:713
bool use_empty() const
Definition Value.h:346
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
Base class of all SIMD vector types.
Type * getElementType() const
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:230
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
const ParentTy * getParent() const
Definition ilist_node.h:34
A raw_ostream that writes to an std::string.
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char SymbolName[]
Key for Kernel::Metadata::mSymbolName.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
Definition CallingConv.h:60
@ AMDGPU_CS_Chain
Used on AMDGPUs to give the middle-end more control over argument placement.
@ X86_VectorCall
MSVC calling convention that passes vectors and vector aggregates in SSE registers.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:41
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition ISDOpcodes.h:261
@ STACKRESTORE
STACKRESTORE has two operands, an input chain and a pointer to restore to it returns an output chain.
@ STACKSAVE
STACKSAVE - STACKSAVE has one operand, an input chain.
@ CONVERGENCECTRL_ANCHOR
The llvm.experimental.convergence.* intrinsics.
@ STRICT_FSETCC
STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used for floating-point operands only.
Definition ISDOpcodes.h:513
@ DELETED_NODE
DELETED_NODE - This is an illegal value that is used to catch errors.
Definition ISDOpcodes.h:45
@ SET_FPENV
Sets the current floating-point environment.
@ ATOMIC_LOAD_FMINIMUMNUM
@ LOOP_DEPENDENCE_RAW_MASK
@ VECREDUCE_SEQ_FADD
Generic reduction nodes.
@ COND_LOOP
COND_LOOP is a conditional branch to self, used for implementing efficient conditional traps.
@ EH_SJLJ_LONGJMP
OUTCHAIN = EH_SJLJ_LONGJMP(INCHAIN, buffer) This corresponds to the eh.sjlj.longjmp intrinsic.
Definition ISDOpcodes.h:168
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition ISDOpcodes.h:602
@ STACKADDRESS
STACKADDRESS - Represents the llvm.stackaddress intrinsic.
Definition ISDOpcodes.h:127
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:789
@ SMULFIX
RESULT = [US]MULFIX(LHS, RHS, SCALE) - Perform fixed point multiplication on 2 integers with the same...
Definition ISDOpcodes.h:394
@ VAEND
VAEND, VASTART - VAEND and VASTART have three operands: an input chain, pointer, and a SRCVALUE.
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, val, ptr) This corresponds to "store atomic" instruction.
@ RESET_FPENV
Set floating-point environment to default state.
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:264
@ SMULFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
Definition ISDOpcodes.h:400
@ SET_FPMODE
Sets the current dynamic floating-point control modes.
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:863
@ CTTZ_ELTS
Returns the number of number of trailing (least significant) zero elements in a vector.
@ ATOMIC_LOAD_USUB_COND
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:520
@ VECTOR_FIND_LAST_ACTIVE
Finds the index of the last active mask element Operands: Mask.
@ FMODF
FMODF - Decomposes the operand into integral and fractional parts, each having the same type and sign...
@ FATAN2
FATAN2 - atan2, inspired by libm.
@ FSINCOSPI
FSINCOSPI - Compute both the sine and cosine times pi more accurately than FSINCOS(pi*x),...
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition ISDOpcodes.h:220
@ EH_SJLJ_SETUP_DISPATCH
OUTCHAIN = EH_SJLJ_SETUP_DISPATCH(INCHAIN) The target initializes the dispatch table here.
Definition ISDOpcodes.h:172
@ GlobalAddress
Definition ISDOpcodes.h:88
@ ATOMIC_CMP_SWAP_WITH_SUCCESS
Val, Success, OUTCHAIN = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) N.b.
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
Definition ISDOpcodes.h:890
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition ISDOpcodes.h:586
@ VECREDUCE_FMAX
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:417
@ VECREDUCE_FMAXIMUM
FMINIMUM/FMAXIMUM nodes propatate NaNs and signed zeroes using the llvm.minimum and llvm....
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
Definition ISDOpcodes.h:749
@ ATOMIC_FENCE
OUTCHAIN = ATOMIC_FENCE(INCHAIN, ordering, scope) This corresponds to the fence instruction.
@ RESET_FPMODE
Sets default dynamic floating-point control modes.
@ FMULADD
FMULADD - Performs a * b + c, with, or without, intermediate rounding.
Definition ISDOpcodes.h:530
@ FPTRUNC_ROUND
FPTRUNC_ROUND - This corresponds to the fptrunc_round intrinsic.
Definition ISDOpcodes.h:517
@ FAKE_USE
FAKE_USE represents a use of the operand but does not do anything.
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
Definition ISDOpcodes.h:254
@ CLMUL
Carry-less multiplication operations.
Definition ISDOpcodes.h:780
@ INIT_TRAMPOLINE
INIT_TRAMPOLINE - This corresponds to the init_trampoline intrinsic.
@ FLDEXP
FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
@ SDIVFIX
RESULT = [US]DIVFIX(LHS, RHS, SCALE) - Perform fixed point division on 2 integers with the same width...
Definition ISDOpcodes.h:407
@ CONVERT_FROM_ARBITRARY_FP
CONVERT_FROM_ARBITRARY_FP - This operator converts from an arbitrary floating-point represented as an...
@ EH_LABEL
EH_LABEL - Represents a label in mid basic block used to track locations needed for debug and excepti...
@ ATOMIC_LOAD_USUB_SAT
@ CTLZ_ZERO_POISON
Definition ISDOpcodes.h:798
@ EH_RETURN
OUTCHAIN = EH_RETURN(INCHAIN, OFFSET, HANDLER) - This node represents 'eh_return' gcc dwarf builtin,...
Definition ISDOpcodes.h:156
@ ANNOTATION_LABEL
ANNOTATION_LABEL - Represents a mid basic block label used by annotations.
@ SET_ROUNDING
Set rounding mode.
Definition ISDOpcodes.h:985
@ CONVERGENCECTRL_GLUE
This does not correspond to any convergence control intrinsic.
@ PARTIAL_REDUCE_UMLA
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:854
@ PREALLOCATED_SETUP
PREALLOCATED_SETUP - This has 2 operands: an input chain and a SRCVALUE with the preallocated call Va...
@ READSTEADYCOUNTER
READSTEADYCOUNTER - This corresponds to the readfixedcounter intrinsic.
@ ADDROFRETURNADDR
ADDROFRETURNADDR - Represents the llvm.addressofreturnaddress intrinsic.
Definition ISDOpcodes.h:117
@ CONVERGENCECTRL_ENTRY
@ BR
Control flow instructions. These all have token chains.
@ VECREDUCE_FADD
These reductions have relaxed evaluation order semantics, and have a single vector operand.
@ PARTIAL_REDUCE_FMLA
@ PREFETCH
PREFETCH - This corresponds to a prefetch intrinsic.
@ FSINCOS
FSINCOS - Compute both fsin and fcos as a single operation.
@ SSUBO
Same for subtraction.
Definition ISDOpcodes.h:352
@ PREALLOCATED_ARG
PREALLOCATED_ARG - This has 3 operands: an input chain, a SRCVALUE with the preallocated call Value,...
@ BRIND
BRIND - Indirect branch.
@ BR_JT
BR_JT - Jumptable branch.
@ VECTOR_INTERLEAVE
VECTOR_INTERLEAVE(VEC1, VEC2, ...) - Returns N vectors from N input vectors, where N is the factor to...
Definition ISDOpcodes.h:637
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition ISDOpcodes.h:543
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
Definition ISDOpcodes.h:550
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition ISDOpcodes.h:374
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:806
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
Definition ISDOpcodes.h:247
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition ISDOpcodes.h:674
@ VACOPY
VACOPY - VACOPY has 5 operands: an input chain, a destination pointer, a source pointer,...
@ GET_ACTIVE_LANE_MASK
GET_ACTIVE_LANE_MASK - this corrosponds to the llvm.get.active.lane.mask intrinsic.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition ISDOpcodes.h:230
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition ISDOpcodes.h:348
@ ARITH_FENCE
ARITH_FENCE - This corresponds to a arithmetic fence intrinsic.
@ VECREDUCE_ADD
Integer reductions may have a result type larger than the vector element type.
@ GET_ROUNDING
Returns current rounding mode: -1 Undefined 0 Round to 0 1 Round to nearest, ties to even 2 Round to ...
Definition ISDOpcodes.h:980
@ CLEANUPRET
CLEANUPRET - Represents a return from a cleanup block funclet.
@ ATOMIC_LOAD_FMAXIMUM
@ GET_FPMODE
Reads the current dynamic floating-point control modes.
@ GET_FPENV
Gets the current floating-point environment.
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:771
@ AssertNoFPClass
AssertNoFPClass - These nodes record if a register contains a float value that is known to be not som...
Definition ISDOpcodes.h:78
@ PtrAuthGlobalAddress
A ptrauth constant.
Definition ISDOpcodes.h:100
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition ISDOpcodes.h:616
@ EntryToken
EntryToken - This is the marker used to indicate the start of a region.
Definition ISDOpcodes.h:48
@ READ_REGISTER
READ_REGISTER, WRITE_REGISTER - This node represents llvm.register on the DAG, which implements the n...
Definition ISDOpcodes.h:139
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition ISDOpcodes.h:578
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:860
@ DEBUGTRAP
DEBUGTRAP - Trap intended to get the attention of a debugger.
@ VSCALE
VSCALE(IMM) - Returns the runtime scaling factor used to calculate the number of elements within a sc...
@ LOCAL_RECOVER
LOCAL_RECOVER - Represents the llvm.localrecover intrinsic.
Definition ISDOpcodes.h:135
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum maximum on two values, following IEEE-754 definition...
@ UBSANTRAP
UBSANTRAP - Trap with an immediate describing the kind of sanitizer failure.
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
Definition ISDOpcodes.h:386
@ PATCHPOINT
The llvm.experimental.patchpoint.
@ SMULO
Same for multiplication.
Definition ISDOpcodes.h:356
@ ATOMIC_LOAD_FMINIMUM
@ DYNAMIC_STACKALLOC
DYNAMIC_STACKALLOC - Allocate some number of bytes on the stack aligned to a specified boundary.
@ VECTOR_SPLICE_LEFT
VECTOR_SPLICE_LEFT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1, VEC2) left by OFFSET elements an...
Definition ISDOpcodes.h:655
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:729
@ MASKED_UDIV
Masked vector arithmetic that returns poison on disabled lanes.
@ VECTOR_REVERSE
VECTOR_REVERSE(VECTOR) - Returns a vector, of the same type as VECTOR, whose elements are shuffled us...
Definition ISDOpcodes.h:642
@ SDIVFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
Definition ISDOpcodes.h:413
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:988
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition ISDOpcodes.h:815
@ PCMARKER
PCMARKER - This corresponds to the pcmarker intrinsic.
@ INLINEASM_BR
INLINEASM_BR - Branching version of inline asm. Used by asm-goto.
@ ATOMIC_LOAD_FMAXIMUMNUM
@ EH_DWARF_CFA
EH_DWARF_CFA - This node represents the pointer to the DWARF Canonical Frame Address (CFA),...
Definition ISDOpcodes.h:150
@ FRAMEADDR
FRAMEADDR, RETURNADDR - These nodes represent llvm.frameaddress and llvm.returnaddress on the DAG.
Definition ISDOpcodes.h:110
@ ATOMIC_LOAD_UDEC_WRAP
@ PEXT
Parallel bit extract (compress) and parallel bit deposit (expand).
Definition ISDOpcodes.h:785
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition ISDOpcodes.h:502
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:936
@ READCYCLECOUNTER
READCYCLECOUNTER - This corresponds to the readcyclecounter intrinsic.
@ RELOC_NONE
Issue a no-op relocation against a given symbol at the current location.
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:741
@ TRAP
TRAP - Trapping instruction.
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition ISDOpcodes.h:205
@ SCMP
[US]CMP - 3-way comparison of signed or unsigned integers.
Definition ISDOpcodes.h:737
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1,VEC2) right by OFFSET elements a...
Definition ISDOpcodes.h:659
@ STRICT_FADD
Constrained versions of the binary floating point operators.
Definition ISDOpcodes.h:427
@ STACKMAP
The llvm.experimental.stackmap intrinsic.
@ FREEZE
FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or is evaluated to UNDEF),...
Definition ISDOpcodes.h:241
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition ISDOpcodes.h:567
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:53
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
@ CTTZ_ZERO_POISON
Bit counting operators with a poisoned result for zero inputs.
Definition ISDOpcodes.h:797
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition ISDOpcodes.h:969
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
Definition ISDOpcodes.h:701
@ SPONENTRY
SPONENTRY - Represents the llvm.sponentry intrinsic.
Definition ISDOpcodes.h:122
@ CLEAR_CACHE
llvm.clear_cache intrinsic Operands: Input Chain, Start Addres, End Address Outputs: Output Chain
@ CONVERGENCECTRL_LOOP
@ INLINEASM
INLINEASM - Represents an inline asm block.
@ FP_TO_SINT_SAT
FP_TO_[US]INT_SAT - Convert floating point value in operand 0 to a signed or unsigned scalar integer ...
Definition ISDOpcodes.h:955
@ VECREDUCE_FMINIMUM
@ EH_SJLJ_SETJMP
RESULT, OUTCHAIN = EH_SJLJ_SETJMP(INCHAIN, buffer) This corresponds to the eh.sjlj....
Definition ISDOpcodes.h:162
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:866
@ BRCOND
BRCOND - Conditional branch.
@ VECREDUCE_SEQ_FMUL
@ CONVERT_TO_ARBITRARY_FP
CONVERT_TO_ARBITRARY_FP - Converts a native FP value to an arbitrary floating-point format,...
@ CATCHRET
CATCHRET - Represents a return from a catch block funclet.
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition ISDOpcodes.h:62
@ ATOMIC_LOAD_UINC_WRAP
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition ISDOpcodes.h:536
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition ISDOpcodes.h:365
@ VECTOR_DEINTERLEAVE
VECTOR_DEINTERLEAVE(VEC1, VEC2, ...) - Returns N vectors from N input vectors, where N is the factor ...
Definition ISDOpcodes.h:626
@ GET_DYNAMIC_AREA_OFFSET
GET_DYNAMIC_AREA_OFFSET - get offset from native SP to the address of the most recent dynamic alloca.
@ CTTZ_ELTS_ZERO_POISON
@ FMINIMUMNUM
FMINIMUMNUM/FMAXIMUMNUM - minimumnum/maximumnum that is same with FMINNUM_IEEE and FMAXNUM_IEEE besid...
@ ADJUST_TRAMPOLINE
ADJUST_TRAMPOLINE - This corresponds to the adjust_trampoline intrinsic.
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition ISDOpcodes.h:213
@ ABS_MIN_POISON
ABS with a poison result for INT_MIN.
Definition ISDOpcodes.h:753
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:558
@ LOOP_DEPENDENCE_WAR_MASK
The llvm.loop.dependence.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM.
Flag
These should be considered private to the implementation of the MCInstrDesc class.
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
bool match(Val *V, const Pattern &P)
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
TwoOps_match< Val_t, Idx_t, Instruction::ExtractElement > m_ExtractElt(const Val_t &Val, const Idx_t &Idx)
Matches ExtractElementInst.
auto m_Value()
Match an arbitrary value and ignore it.
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
auto m_VScale()
Matches a call to llvm.vscale().
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
Offsets
Offsets in bytes from the start of the input buffer.
std::pair< JumpTableHeader, JumpTable > JumpTableBlock
LLVM_ABI void sortAndRangeify(CaseClusterVector &Clusters)
Sort Clusters and merge adjacent cases.
std::vector< CaseCluster > CaseClusterVector
@ CC_Range
A cluster of adjacent case labels with the same destination, or just one case.
@ CC_JumpTable
A cluster of cases suitable for jump table lowering.
@ CC_BitTests
A cluster of cases suitable for bit test lowering.
SmallVector< SwitchWorkListItem, 4 > SwitchWorkList
CaseClusterVector::iterator CaseClusterIt
initializer< Ty > init(const Ty &Val)
LocationClass< Ty > location(Ty &L)
@ DW_OP_LLVM_arg
Only used in LLVM metadata.
Definition Dwarf.h:149
ExceptionBehavior
Exception behavior used for floating point operations.
Definition FPEnv.h:39
@ ebStrict
This corresponds to "fpexcept.strict".
Definition FPEnv.h:42
@ ebMayTrap
This corresponds to "fpexcept.maytrap".
Definition FPEnv.h:41
@ ebIgnore
This corresponds to "fpexcept.ignore".
Definition FPEnv.h:40
constexpr float log2ef
Definition MathExtras.h:51
constexpr double e
constexpr float ln2f
Definition MathExtras.h:49
NodeAddr< FuncNode * > Func
Definition RDFGraph.h:395
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:573
@ Length
Definition DWP.cpp:573
LLVM_ABI ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred)
getICmpCondCode - Return the ISD condition code corresponding to the given LLVM IR integer condition ...
Definition Analysis.cpp:237
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
Definition STLExtras.h:1669
SDValue peekThroughFreeze(SDValue V)
Return the non-frozen source operand of V if it exists.
LLVM_ABI void GetReturnInfo(CallingConv::ID CC, Type *ReturnType, AttributeList attr, SmallVectorImpl< ISD::OutputArg > &Outs, const TargetLowering &TLI, const DataLayout &DL)
Given an LLVM IR type and return type attributes, compute the return value EVTs and flags,...
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
RelativeUniformCounterPtr Values
Definition InstrProf.h:91
LLVM_ABI bool isOnlyUsedInZeroEqualityComparison(const Instruction *CxtI)
LLVM_ABI void ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, Type *Ty, SmallVectorImpl< EVT > &ValueVTs, SmallVectorImpl< EVT > *MemVTs=nullptr, SmallVectorImpl< TypeSize > *Offsets=nullptr, TypeSize StartingOffset=TypeSize::getZero())
ComputeValueVTs - Given an LLVM IR type, compute a sequence of EVTs that represent all the individual...
Definition Analysis.cpp:119
LLVM_ABI SDValue peekThroughBitcasts(SDValue V)
Return the non-bitcasted source operand of V if it exists.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
@ Done
Definition Threading.h:60
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition bit.h:315
LLVM_ABI void diagnoseDontCall(const CallInst &CI)
auto successors(const MachineBasicBlock *BB)
bool isIntOrFPConstant(SDValue V)
Return true if V is either a integer or FP constant.
static ConstantRange getRange(Value *Op, SCCPSolver &Solver, const SmallPtrSetImpl< Value * > &InsertedValues)
Helper for getting ranges from Solver.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2208
Value * GetPointerBaseWithConstantOffset(Value *Ptr, int64_t &Offset, const DataLayout &DL, bool AllowNonInbounds=true)
Analyze the specified pointer to see if it can be expressed as a base pointer plus a constant offset.
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition MathExtras.h:243
auto cast_or_null(const Y &Val)
Definition Casting.h:714
constexpr T alignDown(U Value, V Align, W Skew=0)
Returns the largest unsigned integer less than or equal to Value and is Skew mod Align.
Definition MathExtras.h:546
gep_type_iterator gep_type_end(const User *GEP)
LLVM_ABI LLT getLLTForMVT(MVT Ty)
Get a rough equivalent of an LLT for a given MVT.
constexpr auto equal_to(T &&Arg)
Functor variant of std::equal_to that can be used as a UnaryPredicate in functional algorithms like a...
Definition STLExtras.h:2173
constexpr int popcount(T Value) noexcept
Count the number of set bits in a value.
Definition bit.h:156
LLVM_ABI ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
detail::concat_range< ValueT, RangeTs... > concat(RangeTs &&...Ranges)
Returns a concatenated range across two or more ranges.
Definition STLExtras.h:1151
bool isScopedEHPersonality(EHPersonality Pers)
Returns true if this personality uses scope-style EH IR instructions: catchswitch,...
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition bit.h:204
LLVM_ABI void ComputeValueTypes(const DataLayout &DL, Type *Ty, SmallVectorImpl< Type * > &Types, SmallVectorImpl< TypeSize > *Offsets=nullptr, TypeSize StartingOffset=TypeSize::getZero())
Given an LLVM IR type, compute non-aggregate subtypes.
Definition Analysis.cpp:72
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
LLVM_ABI llvm::SmallVector< int, 16 > createStrideMask(unsigned Start, unsigned Stride, unsigned VF)
Create a stride shuffle mask.
@ SPF_ABS
Floating point maxnum.
@ SPF_NABS
Absolute value.
@ SPF_FMAXNUM
Floating point minnum.
@ SPF_UMIN
Signed minimum.
@ SPF_UMAX
Signed maximum.
@ SPF_SMAX
Unsigned minimum.
@ SPF_FMINNUM
Unsigned maximum.
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
detail::zippy< detail::zip_first, T, U, Args... > zip_first(T &&t, U &&u, Args &&...args)
zip iterator that, for the sake of efficiency, assumes the first iteratee to be the shortest.
Definition STLExtras.h:853
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1636
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI SelectPatternResult matchSelectPattern(Value *V, Value *&LHS, Value *&RHS, Instruction::CastOps *CastOp=nullptr, unsigned Depth=0)
Pattern match integer [SU]MIN, [SU]MAX and ABS idioms, returning the kind and providing the out param...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:144
generic_gep_type_iterator<> gep_type_iterator
auto succ_size(const MachineBasicBlock *BB)
bool hasSingleElement(ContainerTy &&C)
Returns true if the given container only contains a single element.
Definition STLExtras.h:299
LLVM_ABI ISD::CondCode getFCmpCondCode(FCmpInst::Predicate Pred)
getFCmpCondCode - Return the ISD condition code corresponding to the given LLVM IR floating-point con...
Definition Analysis.cpp:203
LLVM_ABI EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
LLVM_ABI Value * salvageDebugInfoImpl(Instruction &I, uint64_t CurrentLocOps, SmallVectorImpl< uint64_t > &Ops, SmallVectorImpl< Value * > &AdditionalValues)
Definition Local.cpp:2313
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Global
Append to llvm.global_dtors.
AtomicOrdering
Atomic ordering for LLVM's memory model.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
bool isFuncletEHPersonality(EHPersonality Pers)
Returns true if this is a personality function that invokes handler funclets (which must return to it...
LLVM_ABI bool isAssignmentTrackingEnabled(const Module &M)
Return true if assignment tracking is enabled for module M.
LLVM_ABI llvm::SmallVector< int, 16 > createInterleaveMask(unsigned VF, unsigned NumVecs)
Create an interleave shuffle mask.
@ UMin
Unsigned integer min implemented in terms of select(cmp()).
@ Or
Bitwise or logical OR of integers.
@ Mul
Product of integers.
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
@ SPNB_RETURNS_NAN
NaN behavior not applicable.
@ SPNB_RETURNS_OTHER
Given one NaN input, returns the NaN.
@ SPNB_RETURNS_ANY
Given one NaN input, returns the non-NaN.
LLVM_ABI bool isInTailCallPosition(const CallBase &Call, const TargetMachine &TM, bool ReturnsFirstArg=false)
Test if the given instruction is in a position to be optimized with a tail-call.
Definition Analysis.cpp:539
DWARFExpression::Operation Op
@ Dynamic
Denotes mode unknown at compile time.
LLVM_ABI ISD::CondCode getFCmpCodeWithoutNaN(ISD::CondCode CC)
getFCmpCodeWithoutNaN - Given an ISD condition code comparing floats, return the equivalent code if w...
Definition Analysis.cpp:225
ArrayRef(const T &OneElt) -> ArrayRef< T >
bool isAsynchronousEHPersonality(EHPersonality Pers)
Returns true if this personality function catches asynchronous exceptions.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isKnownNeverNaN(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the floating-point scalar value is not a NaN or if the floating-point vector value has...
LLVM_ABI std::optional< RoundingMode > convertStrToRoundingMode(StringRef)
Returns a valid RoundingMode enumerator when given a string that is valid as input in constrained int...
Definition FPEnv.cpp:25
gep_type_iterator gep_type_begin(const User *GEP)
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
Definition STLExtras.h:2192
LLVM_ABI GlobalValue * ExtractTypeInfo(Value *V)
ExtractTypeInfo - Returns the type info, possibly bitcast, encoded in V.
Definition Analysis.cpp:181
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:201
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
Definition STLExtras.h:2166
LLVM_ABI Constant * ConstantFoldLoadFromConstPtr(Constant *C, Type *Ty, APInt Offset, const DataLayout &DL)
Return the value that a load from C with offset Offset would produce if it is constant and determinab...
LLVM_ABI unsigned ComputeLinearIndex(Type *Ty, const unsigned *Indices, const unsigned *IndicesEnd, unsigned CurIndex=0)
Compute the linearized index of a member in a nested aggregate/struct/array.
Definition Analysis.cpp:33
T bit_floor(T Value)
Returns the largest integral power of two no greater than Value if Value is nonzero.
Definition bit.h:347
@ Default
The result value is uniform if and only if all operands are uniform.
Definition Uniformity.h:20
MCRegisterClass TargetRegisterClass
Definition FastISel.h:58
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:862
#define N
#define NC
Definition regutils.h:42
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:77
Extended Value Type.
Definition ValueTypes.h:35
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
Definition ValueTypes.h:418
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
Definition ValueTypes.h:145
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
Definition ValueTypes.h:70
uint64_t getScalarStoreSize() const
Definition ValueTypes.h:425
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition ValueTypes.h:307
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:323
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition ValueTypes.h:155
ElementCount getVectorElementCount() const
Definition ValueTypes.h:373
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:396
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition ValueTypes.h:382
uint64_t getScalarSizeInBits() const
Definition ValueTypes.h:408
static LLVM_ABI EVT getEVT(Type *Ty, bool HandleUnknown=false)
Return the value type corresponding to the specified type.
EVT changeVectorElementType(LLVMContext &Context, EVT EltVT) const
Return a VT for a vector type whose attributes match ourselves with the exception of the element type...
Definition ValueTypes.h:98
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:339
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition ValueTypes.h:61
bool isRISCVVectorTuple() const
Return true if this is a vector value type.
Definition ValueTypes.h:197
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
Definition ValueTypes.h:404
bool isFixedLengthVector() const
Definition ValueTypes.h:199
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:176
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition ValueTypes.h:346
bool bitsGE(EVT VT) const
Return true if this has no less bits than VT.
Definition ValueTypes.h:315
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
Definition ValueTypes.h:187
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:351
EVT changeElementType(LLVMContext &Context, EVT EltVT) const
Return a VT for a type whose attributes match ourselves with the exception of the element type that i...
Definition ValueTypes.h:121
bool isScalarInteger() const
Return true if this is an integer, but not a vector.
Definition ValueTypes.h:165
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition ValueTypes.h:359
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition ValueTypes.h:160
void setPointerAddrSpace(unsigned AS)
InputArg - This struct carries flags and type information about a single incoming (formal) argument o...
static const unsigned NoArgIndex
Sentinel value for implicit machine-level input arguments.
OutputArg - This struct carries flags and a value for a single outgoing (actual) argument or outgoing...
ConstraintPrefix Type
Type - The basic type of the constraint: input/output/clobber/label.
Definition InlineAsm.h:128
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
Definition KnownBits.h:262
This class contains a discriminated union of information about pointers in memory operands,...
static LLVM_ABI MachinePointerInfo getUnknownStack(MachineFunction &MF)
Stack memory without other information.
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
A lightweight accessor for an operand bundle meant to be passed around by value.
This struct represents the registers (physical or virtual) that a particular set of values is assigne...
SmallVector< std::pair< Register, TypeSize >, 4 > getRegsAndSizes() const
Return a list of registers and their sizes.
RegsForValue()=default
SmallVector< unsigned, 4 > RegCount
This list holds the number of registers for each value.
SmallVector< EVT, 4 > ValueVTs
The value types of the values, which may not be legal, and may need be promoted or synthesized from o...
SmallVector< Register, 4 > Regs
This list holds the registers assigned to the values.
void AddInlineAsmOperands(InlineAsm::Kind Code, bool HasMatching, unsigned MatchingIdx, const SDLoc &dl, SelectionDAG &DAG, std::vector< SDValue > &Ops) const
Add this value to the specified inlineasm node operand list.
SDValue getCopyFromRegs(SelectionDAG &DAG, FunctionLoweringInfo &FuncInfo, const SDLoc &dl, SDValue &Chain, SDValue *Glue, const Value *V=nullptr) const
Emit a series of CopyFromReg nodes that copies from this value and returns the result as a ValueVTs v...
SmallVector< MVT, 4 > RegVTs
The value types of the registers.
void getCopyToRegs(SDValue Val, SelectionDAG &DAG, const SDLoc &dl, SDValue &Chain, SDValue *Glue, const Value *V=nullptr, ISD::NodeType PreferredExtendType=ISD::ANY_EXTEND) const
Emit a series of CopyToReg nodes that copies the specified value into the registers specified by this...
std::optional< CallingConv::ID > CallConv
Records if this value needs to be treated in an ABI dependant manner, different to normal type legali...
bool occupiesMultipleRegs() const
Check if the total RegCount is greater than one.
These are IR-level optimization flags that may be propagated to SDNodes.
void copyFMF(const FPMathOperator &FPMO)
Propagate the fast-math-flags from an IR FPMathOperator.
void setUnpredictable(bool b)
bool hasAllowReassociation() const
void setNoUnsignedWrap(bool b)
void setNoSignedWrap(bool b)
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
A MapVector that performs no allocations if smaller than a certain size.
Definition MapVector.h:342
This structure is used to communicate between SelectionDAGBuilder and SDISel for the code generation ...
SDLoc DL
The debug location of the instruction this CaseBlock was produced from.
static CaseCluster range(const ConstantInt *Low, const ConstantInt *High, MachineBasicBlock *MBB, BranchProbability Prob)
Register Reg
The virtual register containing the index of the jump table entry to jump to.
MachineBasicBlock * Default
The MBB of the default bb, which is a successor of the range check MBB.
unsigned JTI
The JumpTableIndex for this jump table in the function.
MachineBasicBlock * MBB
The MBB into which to emit the code for the indirect jump.
std::optional< SDLoc > SL
The debug location of the instruction this JumpTable was produced from.
This contains information for each constraint that we are lowering.
TargetLowering::ConstraintType ConstraintType
Information about the constraint code, e.g.
This structure contains all information that is necessary for lowering calls.
CallLoweringInfo & setConvergent(bool Value=true)
CallLoweringInfo & setDeactivationSymbol(GlobalValue *Sym)
CallLoweringInfo & setCFIType(const ConstantInt *Type)
SmallVector< ISD::InputArg, 32 > Ins
Type * OrigRetTy
Original unlegalized return type.
CallLoweringInfo & setDiscardResult(bool Value=true)
CallLoweringInfo & setIsPatchPoint(bool Value=true)
CallLoweringInfo & setDebugLoc(const SDLoc &dl)
CallLoweringInfo & setTailCall(bool Value=true)
CallLoweringInfo & setIsPreallocated(bool Value=true)
CallLoweringInfo & setConvergenceControlToken(SDValue Token)
SmallVector< ISD::OutputArg, 32 > Outs
Type * RetTy
Same as OrigRetTy, or partially legalized for soft float libcalls.
CallLoweringInfo & setChain(SDValue InChain)
CallLoweringInfo & setPtrAuth(PtrAuthInfo Value)
CallLoweringInfo & setCallee(CallingConv::ID CC, Type *ResultType, SDValue Target, ArgListTy &&ArgsList, AttributeSet ResultAttrs={})
This structure is used to pass arguments to makeLibCall function.
MakeLibCallOptions & setDiscardResult(bool Value=true)
This structure contains the information necessary for lowering pointer-authenticating indirect calls.
LLVM_ABI void addIPToStateRange(const InvokeInst *II, MCSymbol *InvokeBegin, MCSymbol *InvokeEnd)